描述
DDL,数据定义语言;
数据库的管理:创建、删除、修改
数据表的管理:创建、删除、修改
创建:CREATE
修改:ALTER
删除:DROP
数据库管理
创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名;
案例:创建数据库Books,如果不存在的话。
CREATE DATABASE IF NOT EXISTS Books;
案例:创建数据库Shoes
CREATE DATABASE Shoes;
更改指定数据库的字符集
ALTER DATABASE Books CHARACTER SET gbk;
删除数据库
DROP DATABASE Books;
DROP DATABASE IF EXISTS Books;
数据表管理
创建数据表
CREATE TABLE [IF NOT EXISTS] 表名(
列名 数据类型 [长度,约束],
列名 数据类型 [长度,约束],
···
列名 数据类型 [长度,约束]
);
案例:在数据库Books中,创建表Person
CREATE TABLE Person(
id int,# 编号
name VARCHAR(20),#名称
age int
);
修改数据表
ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 列名 [列类型 约束]
(1)修改列名
ALTER TABLE Person CHANGE COLUMN name stuName VARCHAR(20);
(2)修改列的类型或者约束
ALTER TABLE Person MODIFY COLUMN age VARCHAR(2);
(3)添加列
ALTER TABLE Person ADD grade VARCHAR(10);
(4)删除列
ALTER TABLE Person DROP COLUMN grade;
(5)修改表名
ALTER TABLE Person RENAME TO PersonInfo;
删除数据表
DROP TABLE [IF EXISTS] PersonInfo;
表的复制
(1) 复制表的结构
CREATE TABLE PersonInfo_copy LIKE PersonInfo;
(2) 复制表的结构和数据
CREATE TABLE PersonInfo_copy1 SELECT * FROM PersonInfo;
(3) 复制表的结构和部分数据
CREATE TABLE PersonInfo_copy2 SELECT id,name FROM PersonInfo WHERE age > 20;
常见的数据类型
数值型:整型、小数(定点数、浮点数)
字符型:较短文本(CHAR、VARCHAR)、较长文本(TEXT、BLOB)
日期型
**整型 **
分类:tinyint、smallint、mediumint、int/integer、bigint
特点:
(1) 如果不设置无符号还是有符号,默认是有符号。如果想设置无符号,需要添加UNSIGNED关键字;
(2) 如果插入的数值超出了整型的范围,OUT OF RANGE警告,默认插入临界值;
(3) 如果不设置长度,根据类型的不同默认长度也不同;
如何设置无符号和有符号
DROP TABLE IF EXISTS PersionInfo;
CREATE TABLE PersionInfo(
id INT,
age INT UNSIGNED
);
如果向无符号列中插入有符号的数值,默认值将会是0
INSERT INTO PersionInfo VALUES(-123,-1234);
如果向列中插入超过整型范围的数值,将会插入最大|最小的临界值
INERT INTO PersionInfo VALUES(2147483648,4294967296);
指定整型的数据类型长度,位数不够时使用0填充,这时默认是无符号。
CREATE TABLE number_info(
id INT(2) ZEROFILL,
money INT(10) ZEROFILL
);
INSERT INTO number_info VALUES(1,100),(2,100000);
小数
分类:
浮点型:FLOAT(M,D)、DOUBLE(M,D)
定点型:DEC(M,D)、DECIMAL(M,D)
特点:
(1) M代表整数位数+小数位数
(2) D代表小数的精度
(3) 如果插入的数值超过了M的位数,默认插入M位数的临界值
(4) M、D都可以省略,Decimal类型的(M默认为10,D默认为0)
CREATE TABLE table_float(
a FLOAT,
b DOUBLE,
c DECIMAL(5,2)
);
如果插入数值超过M指定的位数,那么将会插入M位数的临界值
INSERT INTO table_float VALUES(12.2,16.6,12345.26);
如果插入数值的精度超过D指定的位数,那么会将数值的D位后的数值进行四舍五入
INSERT INTO table_float VALUES(10.1,11.1,123.446);
字符型
分类:
较短文本:CHAR、VARCHAR
较长文本:TEXT、BLOB(二进制)
其他:
BINARY、VARBINARY用于保存较短的二进制
ENUM用于保存枚举
SET用于保存集合
CHAR,固定长度的字符,比较耗费空间,效率高。
VARCHAR,可变长度的字符,比较节省空间,效率低。
CREATE TABLE table_char(
name VARCHAR(10),
sex ENUM('男','女'),
location SET('山东','济南','德州','聊城')
);
向表中插入枚举值
INSERT INTO table_char VALUES('胖虎','男'),('静香','女');
向表中插入集合
INSERT INTO table_char VALUES('大雄','男','山东,聊城');
日期型
分类:DATE、TIME、YEAR、DATETIME,TIMESTAMP
DATETIME和TIMESTAMP的特点
类型 | 字节数 | 范围 |
---|---|---|
DATETIME | 8 | 1000 ~ 9999 |
TIMESTAMP | 4 | 1970 ~ 2038 |
CREATE TABLE table_date(
date1 DATETIME,
date2 TIMESTAMP
);
INSERT INTO table_date VALUES(NOW(),NOW());
常见约束
约束插入的数据的完整性和正确性。
分类:
- NOT NULL:非空约束,该列的值不能为空
- DEFAULT:默认值。一般用于性别(男、女)。
- PRIMARY KEY:主键,必填,保证字段值在一个表中的唯一性。
- UNIQUE:唯一约束,可空,保证字段值在表中的唯一性。
- CHECK:检查约束[mysql不支持该类型约束]
- FOREIGN KEY:外键,保证两个表的关系。
CREATE TABLE 表名(
字段名 字段类型 列级约束,
字段名 字段类型 列级约束,
表级约束
);
案例:添加列级约束
# 创建学生信息表
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
gender CHAR(1) CHECK(gender='男' OR gender ='女'),
seat INT UNIQUE,
age INT DEFAULT 18,
grade_id INT
);
# 查看表的结构信息
DESC student;
# 查看表中的索引信息
SHOW INDEX FROM student;
添加表级约束
# 创建年级信息表
CREATE TABLE grade(
id INT,
name VARCHAR(20)
);
# 创建学生信息表
CREATE TABLE student(
id INT,
name VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
grade_id INT,
CONSTRAINT id_pk PRIMARY KEY(id),
CONSTRAINT name_unique UNIQUE(name),
CONSTRAINT ck_gender CHECK(gender='男' OR gender ='女'),
CONSTRAINT fk_grade_id FOREIGN KEY(grade_id) REFERENCES grade(id)
);
# 查看student表的索引
SHOW INDEX FROM student;
主键和唯一约束的区别
类型 | 是否唯一 | 是否允许为NULL | 说明 |
---|---|---|---|
主键约束 | 是 | 否 | 表中允许有一个 |
唯一约束 | 是 | 是 | 表中允许有多个 |
外键的特点
- 要求在从表添加
- 从表的外键列的类型和主表的关联列的类型兼容
- 主表的关联列必须是主键
- 插入数据时,先插入主表,再插入从表,删除数据时,先删除从表,再删除主表。
修改表时添加约束
# 列级约束
ALTER TABLE student MODIFY COLUMN name VARCHAR(50) NOT NULL;
ALTER TABLE student MODIFY COLUMN age INT DEFAULT 20;
# 表级约束
ALTER TABLE student ADD PRIMARY KEY(id);
# 给student表添加外键
ALTER TABLE student ADD FOREIGN KEY(grade_id) REFERENCES grade(id);
修改表时删除约束
# 删除非空约束
ALTER TABLE student MODIFY COLUMN name VARCHAR(20) [NULL];
# 删除主键
ALTER TABLE student DROP PRIMARY KEY;
# 删除唯一约束
ALTER TABLE student DROP INDEX age;
# 删除外键,注意这里是约束名称,不是外键列的名称
ALTER TABLE student DROP FOREIGN KEY fk_grade_id;
标识列
自增长列,自动增长,一般用于列类型为数值类型。
案例:创建表时设置标识列
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL
);
# 修改自增长列的增长值大小
SHOW VARIABLES LIKE '%auto_increment%';
SET auto_increment_increment=3;
修改表时设置标识列
ALTER TABLE student MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
SHOW INDEX FROM student;
修改表时删除标识列
ALTER TABLE student MODIFY COLUMN id INT PRIMARY KEY;