【MySQL数据库】第三章:DDL语言(数据库定义语言)

前言

各章节笔记对应链接:

【MySQL数据库】第一章:DQL语言(数据库查询语言)

【MySQL数据库】第二章:DML语言(数据库操作语言)

【MySQL数据库】第三章:DDL语言(数据库定义语言)

【MySQL数据库】第四章:TCL语言(事务控制语言)

【MySQL数据库】第五章(上):视图、变量

【MySQL数据库】第五章(下):存储过程和函数、流程控制结构


3 DDL语言

  • DDL —— Data Define Language数据库定义语言(库、表的定义、删除等)

  • 用于库和表的管理(创建、修改、删除)

    • 创建:create
    • 修改:alter(结构)
    • 删除:drop(删表、库)
  • 注意:if [not] exists 只用于库和表的创建、删除(增加容错性判断)

3.1 库的管理

1.库的创建

  • 语法:create database [if not exists]库名 【character set 字符集名】;
#案例:创建库Books
CREATE DATABASE IF NOT EXISTS books;

2.库的修改

  • 库一般不修改,容易出错(就会丢失数据)
#1.名字不能改(只能停止mysql服务,再修改文件名名,但不建议改)
#2、更改库的字符集
ALTER DATABASE books CHARACTER SET gbk;

#3、库的删除
DROP DATABASE IF EXISTS books;

3.2 表的管理

1.表的创建

  • 语法:create tableif not exists】表名(
    列名 列的类型【(长度) 约束】,
    列名 列的类型【(长度) 约束】,

    列名 列的类型【(长度) 约束】);
#案例:创建表Book
CREATE TABLE book(
	id INT, #编号
	bName VARCHAR(20), #图书名(最长的长度)
	price DOUBLE, #价格
	authorID INT, #作者编号
	publishDate DATETIME #出版日期
);

#案例:创建表author
CREATE TABLE IF NOT EXISTS author(
	id INT,
	au_name VARCHAR(20),
	nation VARCHAR(10)
);

2.表的修改

语法:alter table表名add|drop|modify|change column 列名 类型 【约束】

  • 将新增列放在指定列前或后,加【first | after 字段名】(较少用)
#①修改列名(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;

#⑤修改表名:【to】可以省略
ALTER TABLE author RENAME TO book_author;

3.表的删除

DROP TABLE IF EXISTS book_author;

#通用的写法:
DROP DATABASES IF EXISTS 旧库名;
CREATE DATABASE 新库名;

DROP TABLE IF EXISTS 旧表名;
CREATE TABLE 表名();

4.表的复制

INSERT INTO author VALUES
(1, '村上春树', '日本'),
(2, '莫言', '中国'),
(3, '冯唐', '中国'),
(4, '金庸', '中国');


#4.1 仅仅复制表的结构
CREATE TABLE copy LIKE author;

#4.2复制表的结构+数据
CREATE TABLE copy2
SELECT * FROM author
【where 筛选】;

#只复制部分数据
CREATE TABLE copy3
SELECT id, au_name
FROM author
WHERE nation='中国';

#仅复制某些字段(仅复制结构,不复制数据)
CREATE TABLE copy4
SELECT id, au_name
FROM author
WHERE 0;

3.3 常见的数据类型

数值型

  • 整型
  • 小数:定点数、浮点数

字符型:

  • 较短的文本:charvarchar
  • 较长的文本:textblob(较长的二进制数据)

日期型

3.3.1 整型

分类:tinyint(1)、smallubt(2)、mediumint(3)、int/integer(4)、bigint(8)

特点:

  1. 若不设置有无符号,则默认有符号;若想设置无符号,加关键字 unsigned
  2. 如果插入的数值超出了整型的范围,会报警告(out of range),并且插入临界值
  3. 长度可以不指定,会有默认的长度
    长度:显示的最大宽度,若不够 会用0在左边填充,但需搭配zerofill使用;
    且搭配zerofill之后,就设置为无符号数了
#1.如何设置无符号和有符号
DROP TABLE IF EXISTS tab_int;
CREATE TABLE tab_int(
	t1 INT(7) ZEROFILL,
	t2 INT(7) UNSIGNED  #无符号
);
DESC tab_int;

#t2无符号,超过下限,显示为临界值
INSERT INTO tab_int VALUES(-123456);
INSERT INTO tab_int VALUES(-123456, -123456);
INSERT INTO tab_int VALUES(2147483648, 4294967296);

INSERT INTO tab_int VALUES(123, 123);

SELECT * FROM tab_int;

3.3.2 小数

分类:

  1. 浮点型:float(M,D)double(M,D)
  2. 定点型:dec(M,D)decimal(M,D)

特点:

  1. M 和 D(如果超过范围,则插入临界值)

    • M:代表整数+小数的总长度
    • D:小数部位长度
  2. M 和 D 的都可以省略

    • 如果是decimal,则 M 默认为10,D默认为0
    • 如果是floatdouble,则会根据插入的数值的精度来决定精度
  3. 定点型的精确度较高,若要求插入数值的精度较高则考虑使用,如:货币运算等

DROP TABLE IF EXISTS tab_float;
#测试M和D
CREATE TABLE tab_float(
	f1 FLOAT,
	f2 DOUBLE,
	f3 DECIMAL

);
DESC tab_float;
SELECT * FROM tab_float;

INSERT INTO tab_float VALUES(123.4523, 123.4523, 123.4523);
INSERT INTO tab_float VALUES(123.456, 123.456, 123.456);
INSERT INTO tab_float VALUES(123.4, 123.4, 123.4);
INSERT INTO tab_float VALUES(1523.4, 1523.4, 1523.4);

类型选取原则:所选择的类型越简单越好,能保存数值的类型越小越好

3.3.3 字符型

较短的文本:charvarchar

其他:

  • binaryvarbinary用于保存较短的二进制
  • Enum用于保存枚举
  • Set用于保存集合

较长的文本:textblob(存储较长的二进制数据)

特点:

写法M的意思特点空间耗费效率
char(M)最大的字符数(可省,默认为1)固定长度的字符较高
varchar(M)最大的字符数(不可省略)可变长度的字符较低
  • Enum类型:枚举,定义时加上值列表,若插入的值不在列表中,则失败
  • Set类型:和Enum相似,里面可保存0-64个成员
  • 区别:Set类型一次可选取多个成员,而Enum只能选一个
CREATE TABLE tab_char(
	c1 ENUM('a', 'b', 'c')

)
INSERT INTO tab_char VALUES('a');
INSERT INTO tab_char VALUES('b');
INSERT INTO tab_char VALUES('c');
INSERT INTO tab_char VALUES('m'); #超过列表值,插入失败
INSERT INTO tab_char VALUES('A'); #插入成功,不区分大小写

SELECT * FROM tab_char;


CREATE TABLE tab_set(
	s1 SET('a', 'b', 'c', 'd')
);
INSERT INTO tab_set VALUES('a');
INSERT INTO tab_set VALUES('a,b');
INSERT INTO tab_set VALUES('a,c,d');
SELECT * FROM tab_set;

3.3.4 日期型

分类:date只保存日期、time只保存时间、year只保存年

datetime保存日期+时间、timestamp保存日期+时间 (时间戳、受时区等影响)

特点:

字节范围时区等的影响
datetime81000-9999不受
timestamp41970-2038
CREATE TABLE tab_date(
	t1 DATETIME,
	t2 TIMESTAMP
);

INSERT INTO tab_date VALUES(NOW(), NOW());

SELECT * FROM tab_date;

SHOW VARIABLES LIKE 'time_zone';
SET time_zone='+9:00';

3.4 常见约束

含义:一种限制,用于限制表中的数据,为了保证添加到表中的数据的准确和可靠性

分类:六大约束

  • NOT NULL:非空,保证该字段的值不能为空;如:姓名、学号等
  • DEFAULT:默认,用于保证该字段有默认值;如:性别
  • PRIMARY KEY:主键,用于保证该字段的值具有唯一性,且非空
    • 如:学号、员工编号等
  • UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空
    • 如:座位号
  • CHECK:检查约束(mysql不支持);如:年龄、性别
  • FOREIGN KEY:外键,用于限制两个表的关系
    • 保证该字段的值必须来自于主表的关联列的值
    • 在从表添加外键约束,用于引用主表中某列的值
    • 如:学生表的专业编号,员工表的部门编号、工种编号

添加约束的时机:1.创建表时,2.修改表时

约束的添加分类:

  • 列级约束:六大约束都可以写,但外键约束没有效果
  • 表级约束:除了非空、默认,其他的都支持

语法:

CREATE TABLE 表名(
	字段名 字段类型 列级约束,
	字段名 字段类型,
	表级约束
);
位置支持的约束类型是否可以起约束别名
列级约束列的后面语法都支持,但外键没效果不可以
表级约束所有列的下面默认和非空不支持,其它支持可以 (对主键无效)

主键和唯一的比较:(null可重复)

保证唯一性是否允许为空一个表中可有几个是否允许组合
主键×至多有1个√(但不推荐)
唯一可以有多个√(但不推荐)

外键:用于限制两表关系,从表的字段值引用了主表的某字段值

  1. 要求在从表设置外关系
  2. 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
  3. 主表的关联列必须是一个key(一般是主键或唯一)
  4. 插入数据时,应先插入主表,再插入从表
    删除数据时,先删除从表,再删除主表

3.4.1 创建表时添加约束

#1.添加列级约束
/*
语法:直接在字段名和类型后追加 约束类型即可;

只支持:默认、非空、主键、唯一(外键无效,检查mysql不支持)
*/

CREATE TABLE stuinfo(
	id INT PRIMARY KEY, #主键
	stuName VARCHAR(20) NOT NULL UNIQUE, #非空、唯一(可添加多个约束)
	gender CHAR(1) CHECK(gender='男1' OR gender='女'), #check检查约束
	seat INT UNIQUE, #唯一
	age INT DEFAULT 18, #默认约束
	majorID INT REFERENCES major(id) #外健
);

CREATE TABLE major(
	id INT PRIMARY KEY,
	majorName VARCHAR(20)
);

DESC stuinfo;
#查看stuinfo表中的所有索引:包括主键、外键、唯一
SHOW INDEX FROM stuinfo; #索引


#2.添加表级约束
/*
语法:在各个字段的最下面
【constraint 约束别名】 约束类型(字段名)
外键:【constraint 约束别名】 foreign key(字段名) references 主表名(关联列)
*/

DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
	id INT,
	stuname VARCHAR(20),
	gender CHAR(1),
	seat INT,
	age INT,
	majorid INT,
	
	CONSTRAINT pk PRIMARY KEY(id), #主键
	CONSTRAINT uq UNIQUE(seat), #唯一键
	CHECK(gender='男' OR gender='女'), #检查
	FOREIGN KEY(majorid) REFERENCES major(id) #外键
);

SHOW INDEX FROM stuinfo;


#通用的写法:
/*
1.外键约束写在表级约束处(并起别名)
2.其余约束写在列级约束
*/
CREATE TABLE IF NOT EXISTS stuinfo(
	id INT PRIMARY KEY,
	stuname VARCHAR(20) NOT NULL,
	gender CHAR(1),
	age INT DEFAULT 18,
	seat INT UNIQUE,
	majorid INT,
	CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) 
);

3.4.2 修改表时添加约束

/*
语法:
1.添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;

2.添加表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用(若为外键)】;
*/

DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
	id INT,
	stuname VARCHAR(20),
	gender CHAR(1),
	seat INT,
	age INT,
	majorid INT
);

DESC stuinfo;
#1.添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;

#2.添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;

#3.添加主键
#①列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#②表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);

#4.添加唯一
#①列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#②表级约束
ALTER TABLE stuinfo ADD UNIQUE(seat);

#5.添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);

3.4.3 修改表时删除约束

#1.删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
#或直接不写null,默认为可以空

#2.删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;

#3.删除主键
ALTER TABLE stuinfo MODIFY COLUMN id INT;
ALTER TABLE stuinfo DROP PRIMARY KEY;

#4.删除唯一
ALTER TABLE stuinfo DROP INDEX seat;

#5.删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;

SHOW INDEX FROM stuinfo;

3.4.4 外键(补充)

#方式一:级联删除
ALTER TABLE stuinfo ADD CONSTRAINT fk_sty_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;

#方式二:级联置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_sty_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;

3.5 标识列

含义:又称为自增长列;可以不用手动插入值,系统提供默认的序列值,默认从1开始,步长为1

  • 若要更改起始值:手动插入值
  • 若要更改步长:设置系统变量 SET auto_increment_increment=3;

特点:

  1. 标识列不是必须和主键搭配的,但要求是一个key(主键、唯一、外键)

  2. 一个表至多一个自增长列

  3. 标识列的类型只能是数值型(一般为int)

#一、创建表时设置标识列
DROP TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
	id INT primary key auto_increment,
	NAME VARCHAR(20),
	seat INT
);
TRUNCATE TABLE tab_identity;
INSERT INTO tab_identity VALUES(NULL, 'john'); #id列自增长
INSERT INTO tab_identity(NAME) VALUES('lucy');

SELECT * FROM tab_identity;

#修改自增长的步长,一般不会改(影响所有表)
SHOW VARIABLES LIKE '%auto_increment%';
SET auto_increment_increment=3;


#二、修改表时设置标识列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;

#三、修改表时删除标识列
ALTER TABLE tab_identity MODIFY COLUMN id INT;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bryant、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值