您的位置:首页 > 数据库 > MySQL

MySQL传智播客--Lession4-Lession12笔记

2016-07-03 11:40 411 查看
create database php_1;

alter database php_1 character set gbk;

varchar(20) // 表示20个字符,即无论是数字,字母,汉字都是可以存20个

// 字符:人们使用的记号,抽象意义上的一个符号。

// “字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。

// “编码”的概念就是把“字符”转化成“字节”

============================ 04讲==表创建=============================

create table php_one.php_class(

class_no varchar(20),           

date_start date

);

// 遇到数据库和表名都所特殊符号时要分开用

// 反引号包裹,若不分开一起包裹会被认为是一个表的名字

// 如下:

create table `1234`.`itcast_class`(

class_no varchar(20),

date_start date

);

=============================== 05讲====crud=====2016-6-23==================

// 创建学生管理

create table info_student(

name varchar(20),

stu_no varchar(20)

);

// 创建在线考试

create table exam_student(

name varchar(20),

stu_no varchar(20),

score int

);

create table exam_question(

content varchar(100),

answer varchar(20)

);

// 显示前缀为 exam_ 的表

show tables like 'exam_%'; // % 为通配符,任意字符任意个数的组合叫通配符

// 某表的创建信息

show create table table_name;

show create table table_name \G

show create table exam_student;

show create table exam_student \G

// 描述表结构

describe table_name;

desc table_name; // 简写

desc exam_student;

// 删除表

drop table table_name;

// 完整的删除表的表述

drop table if exists table_name;

// 适用与数据库database

drop database if exists db_name;

// 修改表

rename table oldname to newname; 

// 支持同时修改多个表

rename table t1 to tx, t2 to ty;

// 延伸:交换两个表的名称,只要两个数据库在同一个磁盘上,

// 也可以从一个数据库更名到另一个数据库

// 创建一个新的数据库,旧数据库内到表,都可以rename到新的数据库内,删除旧的数据库

// 交换2个表old_table和new_table的表名

rename table old_table to backup_table, 

->new_table to old_table, 

->backup_talbe to new_table;

// 修改列定义

// 修改表结构,上面的是子命令,上级是,alter table table_name add | drop | change | modify

// 增加一个新的列

Add

alter table exam_student add height int;

// 删除一个列

Drop

alter table exam_student drop height;

// 修改一个列的定义

Modify

alter table exam_student modify stu_no varchar(40); // 原来stu_no varchar(20)

// 重命名一个列

Change (注意和modify的对比)

alter table exam_student change score fenshu int; // 将列名score改为fenshu

修改表选项

alter table tbl_name新的表选项

alter table exam_student character set utf8; // 同样适用与数据库

============================== 06讲=简单操作=====2016-6-24==================

数据操作

创建数据(插入数据),获得数据(查询数据),删数据,修改数据

创建数据:

Insert into 表名(字段列表)values(值列表)

insert into exam_student(name,stu_no)values('xiaowang','php0331_001');

insert into exam_student values('xiaowu','php0331_002',98);

insert into exam_student values('xiaoqiang','php0331_003',58);

获得数据:

select字段列表from表名 查询条件。

// 字段列表,可以使用*代替,表示所有到字段,

select * from exam_student;

// 查询条件可以省略,表示所有的记录都获得,相当于where 1;

select name, stu_no from exam_student;

// 与上一条语句的效果等价

select name, stu_no from exam_student where 1;

// 有条件的查询

select * from exam_student where fenshu >= 72;

删除数据:

Delete from表名 条件

delete from exam_student where fenshu < 72;

// 删除需要在逻辑上给条件,否则容易造成数据误操作。导致损失。

// 语法上可以没有where

// 可以:如果需要删除所有数据,使用where 1;

修改数据:

Update 表名 set 字段 = 新值,... 条件

update exam_student set fenshu=100 where fenshu >= 72;

============================== 07讲=练习=====2016-6-25==================

//交换两个表的操作

rename table old_table to backup_table, 

->new_table to old_table, 

->backup_talbe to new_table;

设计几个表:

学生:

教室:

讲师:

班级:

(体现出来它们之间的一些对应关系)

============================== 08讲=校对规则=====2016-6-25==================

show variables;

show variables like 'character_set%';

校对规则:

每一套,编码字符集都有与之相关的校对规则。

什么是校对规则,在当前编码下,字符之间的比较顺序是什么?

每个字符集都支持不定数量到校对规则,可以通过如下指令:

show collation;

可以看到:

...

latin1_bin

utf8_unicode_ci

latin7_general_cs 

...

字符集_地区名_比较规则(ci,cs,bin)//ci不区分大小写,cs区分大小写,bin字节比较

可以使用like:

show collation like 'utf8%';

show collation like 'gbk%';

alter database test1 character set utf8;

在设置字符集的时候,可以设置当前字符集所采用的校对规则,如果不设置校对规则,

每一个字符集,都有一个默认的校对规则。

// 以gbk为例,比较chinese_ci ,bin之间的区别

create table tb13(

name varchar(10)

) character set gbk collate gbk_chinese_ci;

create table tb14(

name varchar(10)

) character set gbk collate gbk_bin;

insert into tb13 values('a');

insert into tb13 values('B');

insert into tb13 values('c');

insert into tb14 values('a');

insert into tb14 values('B');

insert into tb14 values('c');

// Order by 关键字,可以在获得数据时,将数据进行按照某个字段的排序。

select * from tb13 order by name;

============================== 09讲=数值类型=====2016-6-27==================

《一》整型

tinyint: 

1个字节:

-128 -- 127有正负(有符号)

0--255(无符号)

//是否有符号,可以在定义时,使用 unigned标识,没有符号,不写就认为有符号

create table tbl_int(

a tinyint unsigned,

b tinyint

);

insert into tbl_int values(255, 127);

insert into tbl_int values(256, 128);

//定义显示宽度

通过规定数据的显示宽度,达到统一显示的目的 

类型(M)M表示显示的最小宽度是多少。

需要使用前导零填充达到目的。称之为zerofill

alter table tbl_int add c tinyint(2) zerofill;

insert into tbl_int values(0, 127, 1);

insert into tbl_int values(0, 127, 9);

insert into tbl_int values(0, 127, 10);

insert into tbl_int values(0, 127, 123);

注意:

1.不影响数的范围

2.宽度大的不影响,不会截取

也存在布尔bool类型,但是就是tinyint(1)的别名

《二》小数:

// 1.浮点:小数位数可以变化。

float单精度:默认精度位数6位左右

double双精度:默认精度位数15位左右

create table num_2(

a float,

b double);

insert into num_2 values(123456789.012345679,1234567890.123456789);

mysql> select * from num_2;

+-------------+------------------+

| a           | b                |

+-------------+------------------+

| 1.23457e+08 | 1234567890.12346 | 

+-------------+------------------+

支持,控制数值的范围。

Type(M,D)

M,表示所有的数值位数(不包括小数点,和符号)

D,表示允许的小数位数

如:

M,D

5,2

-999.99 to 999.99

8,3

-99999.999 to 99999.999

create table num_3(

a float(5,2),

b double(8,3)

);

insert into num_3 values(567.12,1234.589);

insert into num_3 values(567.12,123456.5);

浮点数支持科学计数法

insert into num_3 values(0.23E3,456.7E2);

结果如下:

| 230.00 | 45670.000 | 

+--------+-----------+

// 2.定点数:

decimal(M,D)

M总位数

D小数位数。(范围存在)

M默认为10,D默认为0

create table num_4(

send_money decimal(10,2)

);

insert into num_4 values(1234.56);

insert into num_4 values(1234.567);

insert into num_4 values(12345678.56);

小数也支持zerofill

alter table num_4 add money decimal(10, 2) zerofill;

insert into num_4 values(1234.56, 1234.56);

支持无符号

========================MySQL_10讲=时间类型===============================

日期时间:

年月日时分秒: Datetime

时间戳:Timestamp //存储时,整型,但是表示时,日期时间 只能从1970.1.1 00:00:00 到
//2038-01-19 03:14:07 

create table dt_1(

a datetime,

b timestamp

);

insert into dt_1 values('2016-7-1 20:06:20', '2016-7-1 20:06:22');

insert into dt_1 values('2039-01-19 03:14:08', '2039-01-19 03:14:08');

检索列时,+0 可以检索当前的时间戳

检索不加 0:

mysql> select * from dt_1;

+---------------------+---------------------+

| a                   | b                   |

+---------------------+---------------------+

| 2016-07-01 20:06:20 | 0000-00-00 00:00:00 | 

| 2016-07-01 20:06:20 | 2016-07-01 20:06:22 | 

| 2038-01-19 03:14:08 | 2038-01-19 03:14:08 | 

| 2039-01-19 03:14:08 | 0000-00-00 00:00:00 | 

+---------------------+---------------------+

检索加 0:

mysql> select a,b+0 from dt_1;

+---------------------+----------------+

| a                   | b+0            |

+---------------------+----------------+

| 2016-07-01 20:06:20 |              0 | 

| 2016-07-01 20:06:20 | 20160701200622 | 

| 2038-01-19 03:14:08 | 20380119031408 | 

| 2039-01-19 03:14:08 |              0 | 

+---------------------+----------------+

支持任意分割符的日期

insert into dt_1 values('2016:01:19 03:14:08', '2016:01:19 03:14:08');

mysql> select * from dt_1;

+---------------------+---------------------+

| a                   | b                   |

+---------------------+---------------------+

| 2016-07-01 20:06:20 | 0000-00-00 00:00:00 | 

| 2016-07-01 20:06:20 | 2016-07-01 20:06:22 | 

| 2038-01-19 03:14:08 | 2038-01-19 03:14:08 | 

| 2039-01-19 03:14:08 | 0000-00-00 00:00:00 | 

| 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 

| 2016-01-19 03:14:08 | 2016-01-19 03:14:08 | 

+---------------------+---------------------+

支持2位年份:

70-69 1970-2069

70-99 19xx

0-99  20xx

不建议使用

insert into dt_1 values('20:01:19 03:14:08', '2016:01:19 03:14:08');

insert into dt_1 values('89:01:19 03:14:08', '2016:01:19 03:14:08');

mysql> select * from dt_1;

| 2020-01-19 03:14:08 | 2016-01-19 03:14:08 | 

| 1989-01-19 03:14:08 | 2016-01-19 03:14:08 | 

+---------------------+---------------------+

支持0值:

表示当前是没有规定:

2014-04-0 表示4月整个月。(逻辑想法)

====================MySQL_11讲=时间类型+字符串类型===========================

Time类型:

表示意义:

1.一天中的时间

2.表示时间间隔,在表示间隔时,可以使用天来表示。

格式:

D HH:MM:SS

D 天

create table t_1(ago time);

insert into t_1 values('23:12:11');

insert into t_1 values('231212');

insert into t_1 values('23,12,13');

insert into t_1 values('23 12 14');

mysql> select * from t_1;

+-----------+

| ago       |

+-----------+

| 23:12:11  | 

| 23:12:12  | 

| 00:00:23  | 

| 564:00:00 | 

+-----------+

insert into t_1  values('5 12:34:11');

| 132:34:11 | 

+-----------+

Year类型:(日期范围:1901-2155一个字节表示)

create table y_1(`begin` year);

insert into y_1 values(1234);

insert into y_1 values(1985);

mysql> select * from y_1;

+-------+

| begin |

+-------+

|  0000 | 

|  1985 | 

+-------+

如果做一个PHP项目,通常,保存时间都是时间戳,是unix时间戳,直接以整型的形式保存在数

据库内,不是mysql提供timestamp类型

--------------字符串类型:--------------------------

char(M)

varchar(M)

M表示允许的字符串长度。

M在varchar中的表示,是允许的最大长度。

char内M表示严格限定的长度

varchar对存储空间的控制要比char好(存长度不固定的数据)

char   存储操作速度快(一般存固定的长度的如身份证号,学号,手机号码)

alter database test1 character set utf8;

mysql> alter database test1 character set utf8;

create table s_1(

a char(18),

b varchar(18)

);

create table s_2(a varchar(65535));

ERROR 1074 (42000): Column length too big for column 'a' (max = 21845); 

use BLOB or TEXT instead // 因为utf8是3个字节表示一个字符65535=21845*3

create table s_2(a varchar(65535)) character set gbk;

ERROR 1074 (42000): Column length too big for column 'a' (max = 32767); 

use BLOB or TEXT instead// 因gbk是3个字节表示一个字符65535/2=32767

create table s_2(

a varchar(21845)

)character set utf8;

ERROR 1118 (42000): Row size too large. The maximum row size for the used 

table type, not counting BLOBs, is 65535. You have to change some columns to 

TEXT or BLOBs

// 因为行的最大的长度也是有规定的varchar(21845) character set utf8; 太大了

注意:字段的最大长度,除了类型本身限制之外,记录的总长度也有限制

create table s_2(

a varchar(21844)

)character set utf8; // 则可以

mysql> create table s_3(

    -> a varchar(65532)

    -> )character set latin1;

Query OK, 0 rows affected (0.04 sec)

create table s_3(

a varchar(65532)

)character set latin1; // 可以创建成功

create table s_4(

a varchar(65533)

)character set latin1; // 不可以创建成功

mysql> create table s_4(

    -> a varchar(65533)

    -> )character set latin1;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

create table s_4(

a varchar(65533) not null

)character set latin1; // 可以创建成功

mysql> create table s_4(

    -> a varchar(65533) not null

    -> )character set latin1;

Query OK, 0 rows affected (0.01 sec)

真是的varchar的长度:

总长度65535

varchar特点,当类型数据超过255个字符时,采用2个字节表示长度。 65535-2=65533

整条记录,需要一个额外的字节,用于保存当前字段的null值。

除非==所有的字段==都不能为null,这个字节才可以省略。

一个记录,不论有多少个字段,存在null,都是使用统一的字节来表示。

而不是每一个字段一个字节

create table s_6(

a varchar(65532) not null,

b tinyint //====

)character set latin1;

ERROR 1118 (42000): Row size too large. The maximum row size for the used 

table type, not counting BLOBs, is 65535. You have to change some columns to 

TEXT or BLOBs

create table s_6(

a varchar(65532) not null,

b tinyint not null //====

)character set latin1;

Query OK, 0 rows affected (0.08 sec)

Text类型:

2^16

文本,有很多兄弟类型

Tinytext longtext

表示的字符串长度不一样

create table s_7(

a text,

b text

)character set latin1;

enum枚举类型:

create table s_8(

gender enum('female', 'male')

);

insert into s_8 values('female');

insert into s_8 values('male');

insert into s_8 values('other');

mysql> select * from s_8;

+--------+

| gender |

+--------+

| female | 

| male   | 

+--------+

2 rows in set (0.00 sec)

select gender+0 from s_8;

mysql> select gender+0 from s_8;

+----------+

| gender+0 |

+----------+

|        1 | 

|        2 | 

+----------+

2 rows in set (0.03 sec)

mysql> insert into s_8 values('2');

Query OK, 1 row affected (0.00 sec)

mysql> select * from s_8;

+--------+

| gender |

+--------+

| female | 

| male   | 

| male   | 

+--------+

set集合类型 (8个字节,8*8==64个状态)

create  table s_9(

hobby set('basket','football','pingpang')

); //用位或来存储1,10,100

insert into s_9 values('basket,football');

mysql> select * from s_9;

+-----------------+

| hobby           |

+-----------------+

| basket,football | 

+-----------------+

mysql> select hobby+0 from s_9;

+---------+

| hobby+0 |

+---------+

|       3 | // bit:1 | 10 == 11 == 3

+---------+

insert into s_9 values('basket,pingpang');

mysql> select hobby+0 from s_9;

+---------+

| hobby+0 |

+---------+

|       3 | 

|       5 | // bit: 1 | 100 ==  101 == 5

+---------+

================12讲==选择类型=================

列类型-如何选择

参考原因:

选择列类型:

1.尽量精确(如身份证选char(18),人的年龄用tinyint)--最重要的

2.考虑应用语言处理(考虑数据库和语言的特性)

3.考虑兼容性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: