数据定义语言(DDl)
1、数据库
1.1 创建数据库
CREATE DATABASE <数据库名称>
:使用默认的数据库字符集和排序规则创建数据库;指定字符集创建数据库的语句为:CREATE DATABASE databast_name DEFAULT CHARACTER SET 字符编码;
但是如果该数据库已经存在,再新建数据库,则会出现错误 Err:database exists
,可以加上IF NOT EXTSIS
字段,不存在时再创建数据库。如:CREATE DATABASE IF NOT EXISTS my_db;
1.2 删除数据库
直接使用DROP DATABASE <数据库名称>
语句删除数据库。需要注意,删除的数据库是无法恢复的。
2、表
2.1 表的创建
表是一个二维表,由列和行组成。所谓表的创建,实际是创建表中每个列的名字、列允许的数据类型和列的约束条件。 创建表的CREATE TABLE语句:
CREATE TABLE <表名>
(<列名1> <数据类型> <列所需约束> ,
<列名2> <数据类型> <列所需约束> ,
... ...
<表约束1>,<表约束2>,...)
2.2 数据类型
2.2.1 数值类型
MySQL支持所有标准SQL数值数据类型,作为SQL标准的扩展,MySQL也支持整数类型 TINYINT、MEDIUMINT和 BIGINT
。
MySQL数据类型 | 含义(有符号) |
---|---|
tinyint(m) | 1个字节,范围(-128~127) |
smallint(m) | 2个字节,范围(-32768~32767) |
mediumint(m) | 3个字节,范围(-8388608~8388607) |
int(m) | 4个字节,范围(-2147483648 ~2147483648) |
bigint(m) | 8个字节,范围(± 9.22*10^18) |
数据类型中的长度 m 是指显示长度,并不表示存储长度,只有字段指定 zerofill
时有用。比如:int(3),如果实际值是2,如果列指定了 zerofill
查询结果就是 002,左边用 0 来填充。
create table t(num int(3) zerofill);
insert into t values(2);
select * from t;
+------+
| num |
+------+
| 002 |
+------+
2.2.2 浮点型
数据类型 | |
---|---|
float(m,d) | 4字节,单精度浮点型,8位精度 |
double(m,d) | 8字节,双精度浮点型 16位精度 |
m为总长度,d为小数位。比如:float(6,2)——9999.99
2.2.3 字符串型
数据类型 | |
---|---|
char(n) | 固定填充,最多255个字符 |
varchar(n) | 可变长度,最多65535个字符 |
tinytext | 可变长度,最多255个字符 |
text | 可变长度,最多65536个字符 |
mediumtext | 可变长度,最多2^24-1个字符 |
longtext | 可变长度,最多2^32-1个字符 |
n为存字符串的长度。在Oracle中,char类型存储的是字节,一个中文占3个字节,MySQL中 char 存储的是字符,所以一个中文算一个字符;换句话说,在MySQL中 char(n)
可以存 n 个中文,而Oracle中只能存 n/3
个中文。
char和varchar
char(n)
:若存入字符数小于n,则用空格补齐于其后,查询之时再将空格去掉,所以 char 数据类型存储的字符串末尾不能有空格;char
:字符串检索速度要比varchar
类型的快;
varchar和text
varchar
可指定n,text不能指定,内部存储varchar
是存入实际字符数 +1 个字节(n≤255)或2个字节(n>255),text 是实际字符数 +2 个字节;- text类型不能有默认值;
varchar
可创建索引,text 创建索引要指定前多少个字符。varchar
查询速度快于 text ,在都创建索引的情况下, text 的索引似乎不起作用;
2.2.4 日期类型
数据类型 | |
---|---|
date | 日期 |
time | 时间 |
datetime | 日期时间 |
timestamp | 功能与datetime相同,范围较小 |
year | 年份(可2位数、可4位数表示) |
2.2.5 二进制数据(BLOB)
- BLOB和TEXT存储方式不同,TEXT 以文本方式存储,因为区分大小写,而BLOB是以二进制方式存储,不区分大小写;
- BLOB存储的数据只能整体读出;
- TEXT 可以指定字符集,BLOB不用指定字符集;
2.3 更改表名
在创建表的时候,如果手误将表名打错了,是否需要删除掉重新创建表呢?答案:不需要。
可以使用 RENAME TABLE <变更前表名> TO <变更后表名>
语句进行修改表名。 例如,我需要将上面的表Product更改为Commodity,如下:
mysql> RENAME TABLE Product TO Commodity;
2.4 更新表
使用 ALTER TABLE
可以对表进行修改。
添加列
当创建新表之后,需要添加新列,这时可以结合 ADD
关键字添加新列。
添加新列的语句是:
ALTER TABLE <表名> ADD COLUMN (<列名> <数据类型> <约束>)
可以注意到添加新列时,需要设置其数据类型和约束。当然,约束是可以不设置的。
2.5 修改约束
在MySQL中,有以下约束:
约束类型 | 主键 | 默认值 | 唯一值 | 外键 | 非空 |
---|---|---|---|---|---|
关键字: | PRIMARY KEY | DEFAULT | UNIQUE | FOREIGN KEY | NOT NULL |
- 主键:用于约束表中的行。主键不能有重复记录并不能为空
- 默认值:当插入数据为空时,将使用默认值
- 唯一值:指定一列的值不能有重复值
- 外键:确保数据完整性,表现表之间的关系 ;
CONSTRAINT <外键名字> FOREIGN KEY(要设为外键的列) REFERENCES <参考表名>(该表的列)
- 非空:插入值时不能为空
-- (1)添加主键约束
alter table table_name add primary key(column_name);
-- (2)添加自动增长
alter table table_name modify column_name type auto_increment;
-- (3)删除主键约束,如果主键具备自动增长能力,需要首先去掉自动增长,然后删除主键
-- A.去除自动增长
alter table table_name modify column_name type;
-- B.删除主键
alter table table_name drop primary key;
-- (4)为列指定非空约束
alter table table_name modify column_name not null;
-- (5)删除列的非空约束
alter table table_name modify column_name type null;
-- (6)指定唯一性约束
alter table table_name add constraint "约束名" unique(column1,..);
-- (7)删除唯一性约束
alter table table_name drop key "约束名";
-- (8)指定外键约束
alter table table_name add constraint "约束名" foreign key(column) references ref_table_name(ref_column_name);
-- (9)删除外键约束
alter table table_name drop foreign key "约束名";
注意:MySQL在创建外键时,会将外键放到一个外键索引中,所以直接删除外键是不成功的,需要先删除外键索引(索引名与外键约束相同)。
-- 删除外键索引
alter table table_name drop index "索引名"
2.6 删除列
结合 DROP
将表格中不需要的列给删除掉。
删除列的语句是:
ALTER TABLE <表名> DROP COLUMN <列名>
- 注意:表变更之后,数据无法恢复。
2.7 删除表
此前的内容介绍了表的创建和内容的修改,最后来了解一下表的删除。
表的删除很简单,与数据库的删除相同,只需将 DATABASE
更改为 TABLE
。即: DROP TABLE <表名>