1.25日学习内容:
数据表的创建与操作
一、数据类型
大致分为三类:
数值类型、日期和时间类型、字符串(字符)类型
1.数值类型
(1)整数类型
类型名称 | 说明 | 存储字节 |
---|---|---|
TINYINT | 很小的整数 | 1 |
SMALLINT | 小的整数 | 2 |
MEDIUMINT | 中等大小的整数 | 3 |
INT | 普通大小的整数 | 4 |
BIGINT | 大整数 | 8 |
可在关键字后面的括号内指定整数值的显示宽度,如 INT(4) 最大显示宽度是4。
(2)浮点数类型
类型名称 | 存储字节 |
---|---|
FLOAT | 4 |
DOUBLE | 8 |
浮点数类型可以用(M,D)来表示
M:精度,表示总共的位数
D:标度,表示小数的位数
(3)定点数类型
MySQL中,表示小数除了用浮点数类型,还可以使用定点数。
定点数类型只有一种:DECIMAL。定点数也可用(M,D)来表示,其默认D值为0,M值为10。
DECIMAL实际是以字符串存储的,存储空间并不是固定的,而是由精度值M决定,占用M+2个字节。
若进行数值比较,最好使用DECIMAL类型,而非浮点数。
2.日期和时间类型
类型名称 | 日期格式 | 日期范围 | 存储字节 |
---|---|---|---|
YEAR | YYYY | 1901~2155 | 1 |
TIME | HH:MM:SS | -838:59:59~838:59:59 | 3 |
DATE | YYYY-MM-DD | 1000-01-01~9999-12-31 | 3 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 8 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:001~2038-01-19 03:14:07 | 4 |
DATETIME与TIMESTAMP区别:
DATETIME
与时区无关,存入的是什么值就是什么值,不会根据当前时区进行转换。
datetime(n),n不是存储长度,而是显示的小数位数,即使小数位数是0,存储是也是存储的6位小数,仅仅显示0位而已;要想显示小数,设置datetime(n),n=3显示小数点后3位,毫秒,n=6显示小数点后6位,微秒。
TIMESTAMP
存入的是自1970-01-01午夜(格林尼治标准时间)以来的秒数,它和unix时间戳相同。所以它与时区有关,查询时转为相应的时区时间。比如,存储的是1970-01-01 00:00:00,客户端是北京,那么就加8个时区的小时1970-01-01 08:00:00。
当插入一条记录并没有指定TIMESTAMP这个列值时,MySQL会把TIMESTAMP列设为当前的时间。
3.字符串类型
MySQL支持两类字符串数据:文本字符串和二进制字符串。
类型名称 | 说明 | 存储需求 |
---|---|---|
CHAR(M) | 固定长度非二进制字符串 | M字节,1<=M<=255 |
VARCHAR(M) | 变长非二进制字符串 | L+1字节,其中L<=M,1<=M<=255 |
TINYTEXT | 非常小的非二进制字符串 | L+1字节,其中L<28 |
TEXT | 小的非二进制字符串 | L+2字节,其中L<216 |
MEDIUMTEXT | 中等大小的非二进制字符串 | L+3字节,其中L<224 |
LONGTEXT | 大的非二进制字符串 | L+4字节,其中L<232 |
ENUM | 枚举类型,只能有一个枚举字符串值 | 1或2字节,取决于枚举值的数目(最大值65535) |
SET | 一个集合,字符串对象可以有零个或多个SET成员 | 1,2,3,4,或8字节,取决于集合成员的数量(最多64个成员) |
注:VARCHAR和TEXT是变长类型,存储需求取决于值的实际长度,而不是取决于类型的最大可能长度。
二、创建数据表
数据表属于数据库,在创建数据表之前,应使用语句“USE <数据库名>”指定操作是在哪个数据库进行。若未选择数据库,系统会显示No database selected的错误。
创建数据表 CREATE TABLE
CREAT TABLE<表名>
(
字段名1 数据类型[完整性约束条件],
字段名2 数据类型[完整性约束条件],
字段名3 数据类型
···
);
字段名:规定数据表中列的名称。
若创建多个列,需要用逗号隔开。
三、查看数据表结构
1.查看表基本结构
包括字段名、字段数据类型、是否为主键、是否有默认值等。
语法格式:
describe 表名;
或简写为 desc 表名;
-
Null: 表示该列是否可以存储NULL值。
-
Key: 表示该列是否已编制索引。
PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。 -
Default: 表示该列是否有默认值,如果有的话值是多少。
-
Extra: 表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。
2.查看表详细结构
语法格式:
show create table <表名>\G
执行结果
四、修改数据表
1.修改名称
数据库系统通过表名来区分不同的表。
修改表名 语法结构:
alter table <旧表名> rename [to] <新表名>;
- to: 可选参数,其是否在语句中出现,不会影响执行结果。
2.修改字段数据类型
语法结构:
alter table <表名> modify <字段名> <新数据类型>;
3.修改数据表的字段名
语法结构:
alter table <表名> change <旧字段名> <新字段名> <新数据类型>;
- 若不需要修改数据类型,可以设置为与原来一样,但数据类型不能为空。
- 不同类型数据在机器中存储方式及长度不同,修改数据类型可能破坏原有数据。因此,数据库中已有数据时,不要轻易修改数据类型。
4.在数据表中添加字段
语法结构:
alter table <表名> add <新字段名> <数据类型> [约束条件][first|after 已经存在的字段名];
- first: 可选参数,作用是将新添加的字段设置为表的第一个字段。
- after:可选参数,作用是将新添加字段添加到指定的“已存在字段名”的后面。
5.修改字段排序方式
语法格式:
alter table <表名> modify <字段1> <数据类型> first|after <字段2>;
- 字段1:要修改位置的字段。
- first: 可选参数,将"字段1"修改为表的第一个字段。
- after 字段2: 将“字段1”插入到“字段2”后面。
6.删除字段
语法结构:
alter table <表名> drop <字段名>;
五、删除数据表
1.删除没有被关联的表
语法结构:
drop table [if exists] 表1,表2,···,表n;
2.删除被其他表关联的主表
若数据表之间存在外键关联,不能直接删除父表,因为会破坏表的参照完整性。可以先删除与它关联的子表,再删除父表。如果想单独删除父表,只需将关联的表的外键约束条件取消,然后再删除父表。