==DDL(Data Define Language)==数据定义语言
库和表的管理
创建 create修改 alter删除 drop库存放路径C:\ProgramData\MySQL\MySQL Server 5.7\Data
#案例:1、创建库Books CREATE DATABASE IF NOT EXISTS books; #2、库的修改 RENAME DATABASE books TO 新库名; # 一般不会修改库的信息 #更改库的字符集(改也就只可能改字符集) ALTER DATABASE books CHARACTER SET gbk; #3、库的删除 DROP DATABASE IF EXISTS books;语法: create table 表名( 列名 列的类型【(长度) 约束】, 列名 列的类型【(长度) 约束】, 列名 列的类型【(长度) 约束】, … 列名 列的类型【(长度) 约束】
)
#案例:创建表Book CREATE TABLE book ( id INT, # 编号 bName VARCHAR(20), # 书名 price DOUBLE, # 价格 authorID INT, # 作者编号 publishDate DATETIME # 出版日期 ); DESC book; # 查看表的描述 #案例:创建表author CREATE TABLE author( id INT , au_name VARCHAR(20), nation VARCHAR(10) ); DESC author;语法 alter table 表名 add|drop|modify|change column 列名 【列类型 约束】;
#①修改列名 ALTER TABLE book CHANGE COLUMN publishDate pubDate DATETIME; #②修改列的类型或约束 ALTER TABLE book MODIFY COLUMN pubDate TIMESTAMP; #③添加新列 ALTER TABLE book ADD COLUMN annual DOUBLE; #④删除列 ALTER TABLE book DROP COLUMN annual; #⑤修改表名 ALTER TABLE author RENAME TO book_author; DESC book_author; # ⑥在某个字段位置添加列 # 语法: alter table 表名 add column 列名 类型 【first|after 字段名】 ALTER TABLE author ADD COLUMN birthday DATETIME FIRST ;数值型:
整数小数: 定点数浮点数字符型:
较短的文本:char、varchar较长的文本:text、blob(较长的二进制数据)日期型
选择的原则:
所选择的类型越简单越好能保存数值的类型越小越好 1 2 3 4 8
特点: 如果不设置无符号还是有符号,系统默认是有符号,如果想设置无符号,需要添加unsigned关键字如果插入的数值超出了整型的范围,会报out of range异常,并且插入临界值如果不设置长度,会有默认的长度,长度代表显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用。 #1.如何设置无符号和有符号 DROP TABLE IF EXISTS tab_int; CREATE TABLE tab_int( t1 INT(7) ZEROFILL, t2 INT(7) ZEROFILL ); DESC tab_int; 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;①M和D的含义:
M:整数部位+小数部位
D:小数部位
如果超出范围,则插入临界值
(M, D)都可以省略
如果是DEC,则(M, D)默认是(10,0)
如果是float,double,则会根据插入的数据来决定精度
定点型的精度较高,如果要求插入数值的精度较高如货币运算则考虑使用。
#测试M和D CREATE TABLE tab_float ( f1 FLOAT(5, 3), f2 DOUBLE(5, 3), f3 DEC(5, 3) ); SELECT * FROM tab_float; DESC tab_float; INSERT INTO tab_float VALUES(123.4523,123.4523,123.4523); INSERT INTO tab_float VALUES(123.45,123.45,123.45); INSERT INTO tab_float VALUES(123.4,123.4,123.4); INSERT INTO tab_float VALUES(129783.4,172983.4,127893.4); #原则: /* 所选择的类型越简单越好,能保存数值的类型越小越好 */较短的文本
char(M) M表示最多的字符数(M可以省略,默认为1) 固定长度的字符 比较耗费空间 高效率
varchar(M) M不可以省略 可变长度的字符 比较节省空间 低效率
binary和varbinary(较短的二进制)
Enum类型(枚举型)每次只选择一个成员
# 枚举型实例 CREATE TABLE tab_char( c1 ENUM('a','b','c') # 放一个列表 ); INSERT INTO tab_char VALUES('a'); # 成功a INSERT INTO tab_char VALUES('b'); # 成功b INSERT INTO tab_char VALUES('c'); # 成功c INSERT INTO tab_char VALUES('m'); # 失败,空 INSERT INTO tab_char VALUES('A'); # 成功aset类型,可以选择多个成员
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');较长的文本
textblob(较长的二进制)datatime和timestamp区别:
字节 范围 时区等的影响
datetime 8 1000——9999 不受 timestamp 4 1970-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';含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
NOT NULL:非空,用于保证该字段的值b不能为空
比如姓名,学号等
DEFAULT:默认,用于保证该字段有默认值
比如性别
PRIMARY KEY:主键,用于保证该字段具有唯一性,并且非空
比如学号,员工编号等
UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空
比如年龄,性别,配偶
CHECK:检查约束【MYSQL不支持】
比如年龄、性别
FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联列的值
比如学生表的专业编号,员工表的部门编号,员工表的工种编号
添加约束的时机:
创建表时修改表时约束的添加分类:
列级约束
六大约束语法上都支持,但外键约束没有效果表级约束
除了非空、默认,其他的都支持 create table 表名( 字段名 字段类型 列级约束, 字段名 字段类型, 表级约束 )主键和唯一的大对比:
保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合 主键 √ × 至多有1个 √,但不推荐 唯一 √ √ 可以有多个 √,但不推荐外键: 1、要求在从表设置外键关系 2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求 3、主表的关联列必须是一个key(一般是主键或唯一) 4、插入数据时,先插入主表,再插入从表 删除数据时,先删除从表,再删除主表
注意!!!外键的引用列必须是键列!!!
CREATE DATABASE students; # 创建库添加列级约束
语法:
直接在字段名和类型后面追加 约束类型即可。
只支持:默认、非空、主键、唯一
USE students; # 使用库 DROP TABLE stuinfo; # 删除表 CREATE TABLE stuinfo( id INT PRIMARY KEY, # 主键 stuName VARCHAR(20) NOT NULL, # 非空 gender CHAR(1) CHECK(gender='男' OR gender = '女'), # 检查(没用!) seat INT UNIQUE, # 唯一 age INT DEFAULT 18, # 默认约束 majorID INT REFERENCES major(id) # 外键(没用!) ); CREATE TABLE major( id INT PRIMARY KEY, majorName VARCHAR(20) ); # 外键时候使用的major表 #查看stuinfo中的所有索引,包括主键、外键、唯一 SHOW INDEX FROM stuinfo; 添加表级约束语法:在各个字段的最下面 【constraint 约束名】 约束类型(字段名) 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),#唯一键 CONSTRAINT ck CHECK(gender ='男' OR gender = '女'),#检查 CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外键 ); SHOW INDEX FROM stuinfo;通用的写法
只有外键使用表级约束,其他的使用列级约束。
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) # 外键 );**概念:**标识列,又称为自增长列,即可以不用手动的插入值,系统提供默认的序列值
注意!标识列可以使用null,但是不加auto_increase的
特点:
标识列必须和主键搭配吗?不一定,但要求是一个key一个表可以有几个标识列?至多一个!标识列的类型只能是数值型标识列可以通过 SET auto_increment_increment=3;设置步长 可以通过 手动插入值,设置起始值首先在test库下,创建表stuinfo,和major
CREATE TABLE stuinfo (id INT unique auto_increment , stuname VARCHAR(20), gender CHAR(1), seat INT, age INT , majorid INT); # id 自增长列 CREATE TABLE major (id INT PRIMARY KEY, majorName VARCHAR(20)); # 添加主键 # 查看键 SHOW INDEX FROM major; SHOW INDEX FROM stuinfo;给上述两个表添加外键,因为表已经创建,传统的修改表时添加外键方式。
alter table stuinfo add constraint fk_stu_major foreign key(majorid) references major(id); # 删除外键 alter table stuinfo drop foreign key fk_stu_major;插入数据
INSERT INTO major VALUES(1, 'java'),(2, 'h5'), (3, '大数据'); INSERT INTO stuinfo VALUES(NULL, 'java1', 'M', NULL, NULL, 1); INSERT INTO stuinfo VALUES(NULL, 'java1', 'M', NULL, NULL, 3); INSERT INTO stuinfo VALUES(NULL, 'java1', 'M', NULL, NULL, 1); INSERT INTO stuinfo VALUES(NULL, 'java1', 'M', NULL, NULL, 3); INSERT INTO stuinfo VALUES(NULL, 'java1', 'M', NULL, NULL, 2); INSERT INTO stuinfo VALUES(NULL, 'java1', 'M', NULL, NULL, 2); INSERT INTO stuinfo VALUES(NULL, 'java1', 'M', NULL, NULL, 2); INSERT INTO stuinfo VALUES(NULL, 'java1', 'M', NULL, NULL, 1); INSERT INTO stuinfo VALUES(NULL, 'java1', 'M', NULL, NULL, 1); INSERT INTO stuinfo VALUES(NULL, 'java1', 'M', NULL, NULL, 1); SELECT * FROM major; SELECT * FROM stuinfo;如果想删除3号专业,那么会发现是删除不了的!这是因为存在外键的限制。
那么解决的方法有两种:
1 是删掉3号专业和具有3号专业的学生信息;
2 是删除3号专业,并且让带有3号专业的学生的majorid这一栏置空;