MySQL复习笔记(十一):DDL、数据库和表的管理、常见数据类型、常见约束、自增
程序员文章站
2022-05-30 17:13:41
...
DDL语言
数据定义语言(Data Define Language):库和表的管理操作
- 创建:create
- 修改:alter
- 删除:drop
数据库的管理
一、数据库的创建
语法:
create database 【if not exists】库名;
1、不存在的情况下,创建数据库books
create database if not exists books;
二、库的修改
1、更改库的字符集
ALTER DATABASE books CHARACTER SET UTF-8;
三、删除数据库
DROP DATABASE IF EXISTS books;
表的管理
一、表的创建 ★
语法:
create table IF NOT EXISTS 表名(
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
...
列名 列的类型【(长度) 约束】
)
1、创建book表
create table book(
id INT, #编号
bk_name VARCHAR(50), #书名
price DOUBLE, #价格
author_id INT, #作者id
publish_date DATETIME #出版日期
);
2、创建作者表
create table author(
id INT, #作者id
au_name VARCHAR(20), #作者姓名
nation VARCHAR(10) #作者国际
)
二、表的修改
语法:
ALTER TABLE 表名 CHANGE|RENAME|MODIFY|ADD|DROP|RENAME COLUMN 【列名 列类型 约束】
1、修改列名
#修改列名publish_date为pub_date
ALTER TABLE book CHANGE COLUMN publish_date pub_date DATETIME;
2、修改列的类型或约束
#修改pub_date的类型为TIMESTAMP
ALTER TABLE book MODIFY COLUMN pub_date TIMESTAMP;
3、添加新列
#添加作家年薪列:annual
ALTER TABLE book ADD COLUMN annual DOUBLE 【first|after+字段名】; #使用first或者after+字段名可以改变新字段插入的位置
4、删除列
#删除作家年薪列:annual
ALTER TABLE book DROP COLUMN annual;
5、修改表名
ALTER TABLE author RENAME TO book_author
三、删除表
DROP TABLE IF EXISTS book_author
四、表的复制
1、仅仅复制表结构
CREATE TABLE copy LIKE book;
2、复制表结构+数据
CREATE TABLE copy SELECT * FROM book;
3、只复制部分数据
CREATE TABLE cpoy
SELECT id, au_name
FROM author
WHERE nation='中国';
4、仅仅复制某些字段,而且不要数据
CREATE TABLE copy
SELECT id,au_name
FROM author
WHERE 1=2; #设置恒为false的条件
常见数据类型
- 数值型
- 整数型
- 小数
- 定点数
- 浮点数
- 字符型
- 较短的文本:char,varchar
- 较长的问题:text,blob(较长的二进制数据)
- 日期型
原则:选择的类型越简单越好,能保存的数值类型越小越好
一、整数型
分类:
tinyint | smallint | mediumint | int/integer | bigint | |
---|---|---|---|---|---|
字节数 | 1 | 2 | 3 | 4 | 8 |
特点
- 如果不设置无符号和有符号,默认是有符号。如果需要设置无符号需要追加unsigned关键字
- 如果插入的数值超出临对应整型的范围,会报out of range异常,并且插入临界值
- 如果不设置长度,会有默认的长度
1、设置有符号和无符号
create table tab_int(
t1 int, #默认为有符号
t2 int unsigned #无符号
)
二、小数
分类:
float(M,D) | double(M,D) | DEC(M,D) / DECIMAL(M,D) | |
---|---|---|---|
字节 | 4 | 8 | — |
说明 | 较小的浮点数 | 较大浮点数 | 定点数,取值范围和double相同,有效范围由M和D决定 |
特点
- M:整数长度+小数长度,D:小数部分长度。如果超出范围,则插入临界值
- M和D都可以省略。如果是DECIMAL,默认是(10,0)。如果是float和double,则会根据插入数值的精度来决定精度
- 定点型的精度较高,如果插入数值的精度要求较高,如货币运算,则考虑使用。
三、字符型
- 较短的文本:char,varchar
- 较长的问题:text,blob(较长的二进制数据)
- binary和varbinary用于保存较短的二进制
- enum用于保存枚举,插入值时只能从枚举的数据中取,而且只能去一个
- set用于保存集合,插入值时只能从枚举的数据中取,可以取多个
特点:
CHAR | V | |
---|---|---|
写法 | CAHR(M) | VARCHAR(M) |
M的含义 | 最大字符数,可以省略,默认为1 | 最大字符数,不可以省略 |
特点 | 固定长度字符 | 可变长度字符 |
空间消耗 | 比较耗费空间 | 比较节省空间 |
效率 | 高 | 低 |
1、enum举例
create table tab_enum(
e1 enum('男','女')
);
insert into tab_enum value('男'); #可以
insert into tab_enum value('女'); #可以
insert into tab_enum value('中'); #不可以,值为空
2、set举例
create table tab_set(
s1 set('a','b','c')
);
insert into tab_set value('a'); #可以
insert into tab_set value('a,b,c'); #可以
insert into tab_set value('d'); #不可以
四、日期型
分类:
- date:只保存日期
- time:只保存时间
- year:只保存年
- datetime:保存日期+时间
- timestamp:保存日期+时间
特点
字节 | 范围 | 是否受时区的影响 | |
---|---|---|---|
datetime | 8 | 1000-9999 | × |
timestamp | 4 | 1970-2038 | √ |
常见约束
含义:用于限制表中数据的限制,为了保证表中的数据的准确和可靠性
分类:六大约束
- NOT NULL:非空约束,用于保证该字段的值不能为空。比如姓名、学号
- DEFAULT:默认约束,用于保证该字段有默认值,比如性别
- PRIMARY KEY:主键,用于保证该字段的值具有唯一性。比如学号,员工编号
- UNQIUE:唯一,用于保证该字段的值具有唯一性,但是可以为空,比如座位号
- CHECK:检查约束【MySQL不支持】,用于指定值必须在某个范围内,比如年龄、性别。
- FOREING KEY:外键,用于限制两个表得关系。在从表中添加外键约束,用于引用主表中某列的值。比如学生表的专业编号
添加约束的时机:
- 创建表时
- 修改表时
约束的添加分类:
- 列级约束:六大约束语法上都支持,但是外键约束没有效果
- 表级约束:除了默认、非空,其他都支持
Create table 表名(
字段名 字段类型 列级约束,
字段名 字段类型,
...
表级约束
)
列级约束 | 表级约束 | |
---|---|---|
位置 | 列的后面 | 所有列的最下面 |
支持的约束类型 | 语法都支持,但是外键没有效果 | 除了默认、非空,都支持 |
是否可以起约束名 | 不可以 | 可以 |
一、创建表时如何添加约束
添加列级约束
语法:直接在字段名或者类型后面追加约束类型。
只支持:主键、唯一、默认、非空
栗子:
#准备
create database students;
use students;
create table major(
id INT PRIMARY KEY,
major_name VARCHAR(20)
)
#添加常见列级约束
create table stuinfo(
id INT PRIMARY KEY, #主键约束
stuName VARCHAR(30) NOT NULL, #非空约束
gender CHAR(1) CHECK(gender IN ('男','女')), #检查,MySQL不支持
seat INT UNIQUE, #唯一约束
age INT DEFAULT 18, #默认约束
majorId INT REFERENCES majar(id) #外键,在这里加其实是无效的,不过不会报错
)
添加列级约束
语法:在所有字段最下面
【CONSTRAINT 约束名】 约束类型(字段名)
例子:
#准备
DROP TABLE IF EXISTS stuinfo;
create table stuinfo(
id INT,
gender CHAR(1),
seat INT,
majorId INT,
CONSTRAINT pk PRIMARY KEY(id), #主键
CONSTRAINT uq UNIQUE(seat), #唯一
CONSTRAINT ck CHECK(gender IN ('男','女')), #检查
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id) #外键
)
通常的写法
- 主键、唯一、非空、默认添加在列级上
- 外键添加在表级上
例子:
create table stuinfo(
id INT PRIMARY KEY, #主键约束
stuName VARCHAR(30) NOT NULL, #非空约束
gender CHAR(1)
seat INT UNIQUE, #唯一约束
age INT DEFAULT 18, #默认约束
majorId INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorID) REFERENCES major(id) #外键
)
主键 VS 唯一(面试题)
主键 | 唯一键 | |
---|---|---|
保证唯一性 | √ | √ |
是否允许为空 | × | √ |
一个表中可以有多少个 | 至多为一1个 | 可以有多个 |
是否允许组合 | 可以,但不推荐 | 可以,但不推荐 |
外键特点
- 要求在从表设置外键关系
- 从表的外键列的数据类型要求和主表的关联列数据类型一致或兼容,名称无要求
- 主表中的关联列必须是一个key(一般是主键或者唯一)
- 插入数据时,要先插入主表数据,在插入从表数据。删除数据时,先删除从表数据,再删除主表数据
二、修改表时添加约束
语法:
- 添加列级约束
ALTER TABLE 表名 MODEIFY COLUMN 列名 列类型 新约束;
- 添加表级约束
ALTER TABLE 表名 ADD 【CONSTRAINT 约束名】 约束类型(列名) 【外键的引用】
1、添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
2、添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age DEFAULT 18L
3、添加主键
#列级约束
ALTER TABLE stuinfo MODIFY COLUMN ID PRIMARY KEY;
#表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(ID);
4、添加唯一键
#列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat UNIQUE;
#表级约束
ALTER TABLE stuinfo ADD UNIQUE(SEAT);
5、添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id);
三、修改表时删除约束
1、删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20);
2、删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age
3、删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY
4、删除唯一
ALTER TABLE stuinfo DROP INDEX SEAT
5、删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major
标识列
含义:又称为自增长列,可以不用手动的插入值,系统提供默认的序列值
特点:
- 标识列必须和主键搭配吗?不一定,但是要求必须是一个key
- 一个表可以有多少个自增长列?至多一个
- 标识列的类型必须是数值型
- 标识列可以通过set_auto_increment_increment = 3设置步长。可以通过手动插入值设置起始值
例子:
1、创建表时设置标识列
create table stu(
id int primary key auto_increment,
name varchar(20)
)
2、修改表时添加标识列
alter table stu modify column id int primary key auto_increment;
3、修改表时删除标识列
alter table stu modify column id int primary key;