根据尚硅谷的视频教程学习MySQL,学习记录-11-DDL语言,数据库定义语言。
库的管理:创建、修改、删除,以及常见的数据类型、约束、标识列
Create database 库名;
CREATE DATABASE IF NOT EXISTS 库名;
不建议修改库名,以下主要为修改库的字符集
ALTER DATABASE 库名 CHARACTER SET 新字符;
DROP DATABASE 库名;
DROP DATABASE IF EXISTS 库名;
CREATE TABLE IF NOT EXISTS 表名(
列名 列的类型 【(长度) 约束】,
列名 列的类型 【(长度) 约束】,
...)
练习:创建BOOK表
CREATE TABLE book(
id INT , #编号
bname VARCHAR(20),
price double,
authorid INT,
publishdate DATETIME)
练习:查看book表的结构
DESC book;
练习:创建author表
CREATE TABLE author(
id INT,
au_name VARCHAR(20),
nation VARCHAR(20)
)
表的修改
ALTER TABLE 表名 ADD | DROP | MODIFY | CHANGE COLUMN 列名 【列类型 约束】;
ALTER TABLE book CHANGE COLUMN publishdate pubdate DATETIME;
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP;
ALTER TABLE author ADD COLUMN annual DOUBLE;
ALTER TABLE author DROP COLUMN annual;
ALTER TABLE author RENAME TO book_author;
DROP TABLE book_author;
DROP TABLE IF EXISTS 表名;
CREATE TABLE copy LIKE author;
CREATE TABLE copy2 SELECT * FROM author;
CREATE TABLE copy3 SELECT id, au_name FROM author WHERE nation = 'China';
CREATE TABLE copy4
SELECT id, au_name
FROM author WHERE 0;
数值型:整型 | 定点型 | 浮点型
字符型:较短的文本: CHAR | VARCHAR;较长的文本:TEXT | BLOB
日期型
特点
- 都可以设置无符号和有符号,默认有符号,通过unsigned设置无符号
- 如果超出了范围,会报 out of range异常,插入临界值
- 长度可以不指定,默认会有一个长度,长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofill,并且默认为无符号整型
特点:
- M代表整数部位+小数部位的个数,D代表小数部位
- 如果超出范围,则报 out of range一场,并且插入临界值
- M和D都可以省略,但对于定点数,M默认为10,D默认为0
- 如果精度要求较高,则优先考虑使用定点数
char:固定长度的字符,写法CHAR(M), 最大长度不能超过M,其中M可以省略,默认为1
varchar:可变长度的字符,写法VARCHAR(M),最大长度不能超过M,其中M不可以省略
含义:一种限制,限制表中的数据,为了保证表中的数据准确和可靠性
分类 - 六大约束:
1 not null:非空,用于保证该字段的值不能为空,比如姓名、学号等
2 default:默认,用于保证该字段有默认值,比如城市
3 primary key:主键,用于保证该字段的值具有唯一性,且非空,如员工编号等
4.unique:唯一,用于保证该字段的值具有唯一性,但可以为空,如手机号
5.check:检查约束【mysql中不支持】
6.foreign key:外键,用于限制两个表的关系,保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,比如学生表的课程编号,员工表的部门编号
添加约束的时机:
1. 创建表时
2. 修改表时
约束的添加分类:
列级约束:六大约束语法上都支持,但是外键约束没有效果
表级约束:除了非空、默认,其他的都支持
CREATE TABLE 表名(
字段名 字段类型 列级约束,
字段名 字段类型 列级约束,
表级约束
)
表级约束:CONSTRAINT 约束名 约束类型(字段名)
CREATE TABLE stuinfo (
id INT PRIMARY KEY, #主键❤
sname VARCHAR(20) NOT NULL, #非空❤
gender CHAR(1) CHECK(gender in ('男','女')), #检查
seat INT UNIQUE, # 唯一❤
age INT DEFAULT 18, #默认❤
majorid INT REFERENCES major(id) #外键
)
CREATE TABLE stuinfo(
id INT,
sname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY (id), #主键
CONSTRAINT uq UNIQUE (seat), #唯一
CONSTRAINT fk_stuinfo_major FOREIGN KEY (majorid) REFERENCES major(id) #外键
)
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
sname VARCHAR(20) NOT NULL,
gender CHAR(1) CHECK(gender in ('男','女')),
seat INT UNIQUE,
age INT DEFAULT 18,
majorid INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) #外键约束
);
主键和唯一的对比
1 主键:保证唯一性,不允许为空,一个表中只能有一列设定主键约束,允许多个列组合为一个主键,但不推荐primary key (id, sname) --将id 和 sname合并内容作为一个主键,此时id可以重复,sname可以重复,但是id 与 sname合并的结果不允许重复
2 唯一:保证唯一性,允许为空,但只有一个空值,一个表中可以有多列设定唯一约束,允许多个列组合唯一,但不推荐
外键的特点:
1 要求在从表设置外键关系
2 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
3 主表的关联列必须是一个key(一般是主键或唯一)
4 插入数据时,先插入主表数据,再插入从表
5 删除数据时,先删除从表,再删除主表
列级约束:
ALTER TABLE 表名 MODIFY COLUMN 列名 字符类型 约束;
表级约束:
ALTER TABLE 表名 ADD 约束类型(字段名) 【外键的引用】;
ALTER TABLE stuinfo MODIFY COLUMN sname VARCHAR(20) NOT NULL; #非空
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;#默认
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;#主键
ALTER TABLE stuinfo ADD PRIMARY KEY (id);#主键2
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE; #唯一
ALTER TABLE stuinfo ADD UNIQUE(seat); #唯一2
ALTER TABLE stuifo ADD FOREIGN KEY(majorid) REFERENCES major(id); # 外键
ALTER TABLE stuinfo MODIFY COLUMN sname VARCHAR(20) NULL; #删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN age INT; #删除默认约束;
ALTER TABLE stuinfo DROP PRIMARY KEY; #删除主键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major; #删除外键
含义:自增长列,可以不用手动的插入值,系统提供默认的序列值,特点如下:
-> 标识列不一定和主键搭配,但一定要求是唯一值,一个key
-> 一个表至多一个标识列
-> 标识列的类型只能是数值型,一般为INT
-> 标识列可通过SET auto_increment_increment = 3;
设置步长
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT,
uname VARCHAR(20)
); #创建表
INSERT INTO tab_identity VALUES (NULL, 'John'),(NULL,'Jack'),(null,'Rose'); #插入数据,注意,ID列全部输入null,会自增长填充
SELECT * FROM tab_identity;#查看数据表
可更改步长
SHOW VARIABLES LIKE '%auto_increment%';
SET auto_increment_increment = 3; #将自增长的步长调整为3
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY;