第一部分的内容:
SQL(2)DQL语言 条件查询+排序查询+常见函数+分组查询+连接查询
SQL(3)DQL语言 子查询+分页查询+联合查询
SQL(4)DML语言 增删改
SQL(5) DDL语言 库和表的创建,修改和删除
感谢以下链接的教学分享,很好的视频和资源,笔记记录在这里,便于日后查看
新i版-链接: https://pan.baidu.com/s/1GDhRzV_3lUQaETsH4CM8zQ 提取码: rpte
常见约束
/*
含义:一种限制,用于限制表中的数据,为了保证表中数据的准确和可靠性一致性
六大约束:
NOT NULL:该字段不能为空
DEFAULT:有默认值
PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
unique:唯一键,用于保证字段唯一,可以为空
check :检查约束【mysql不支持,但不报错】
foreign key :外键,用于限制两个表的关系,用于保证该字段的值来自于主表的关联列的值
在从表添加外键约束,用于引用副表中某列的值,比如,专业编号,员工表的部门标号等
添加约束一般是在创建表或者添加数据之前修改表
位置 支持的约束类型 是否可以起约束名
约束的分类:列约束: 列的后面 除了外键,语法都支持,但主键没效果 不可以
表约束: 所有列的下面 默认和非空不支持 可以(主键没效果)
CREATE TABLE 表名(
字段名 字段类型 列级约束,
字段名 字段类型 列级约束,
表级约束
)
# 主键和唯一的对比
保证唯一性 是否可以为空 一个表中可以有多少个 是否可以组合
主键 是 否 至多一个 可以(不推荐,不稳定)
唯一 是 是 可以多个 可以(不推荐,不稳定)
组合主键指的是 PRIMARY KEY(id,stuName)
把两个当一个主键,就是当两个都相同的时候才报错
外键:
1.用于限制两个表的关系,从表的字段值引用了主表的某字段值
2.从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称可以不同
3.主表的关联列必须是一个key(一般是主键或者唯一键)
4.插入数据时,先插入主表,在插入从表
删除数据时,先删除从表,在删除主表
*/
一 创建表时添加约束
#1.添加列级约束
/*
语法:
直接在字段名和类型后面 追加约束类型即可,不支持 check和外键
*/
CREATE DATABASE students;
USE studentsCREATE TABLE stuifo(
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 marjor(id)
)
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
); DESC stuifo;
#产看表中索引
SHOW INDEX FROM stuifo;
#2.添加表级约束
/*
语法:在所有字段之后添加 【constraint 约束名】 约束类型(字段名)
*/
CREATE DATABASE students;
USE studentsDROP TABLE IF EXISTS stuifo;
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 IN ('男','女')),
CONSTRAINT fk_sutinfo_major FOREIGN KEY(majorId) REFERENCES major(id)
)
SHOW INDEX FROM stuinfo;
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);#通用写法
CREATE TABLE IF NOT EXISTS 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,
CONSTRAINT fk_sutinfo_major FOREIGN KEY(majorId) REFERENCES major(id)
)
二 修改表时添加约束
/*
1.添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束
2.添加表级约束
alter table 表名 add [constraiant 约束别名] 约束类型(字段名)【外键的引用】
*/
DROP TABLE IF EXISTS stuifo;
CREATE TABLE stuinfo(
id INT,
stuName VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorId INT,
)
DESC
#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 ADD PRIMARY KEY(id);
#4.添加唯一约束
ALTER TABLE stuinfo ADD UNIQUE(seat);
#5.添加外键
ALTER TABLE stuinfo ADD FOREIGN KEY(majorId) REFERENCES major(id);
三.修改表时删除约束
/*
1.删除列级约束
alter table 表名 modify column 字段名 字段类型;
2.删除表级约束
alter table 表名 DROP PRIMARY KEY/ drop index 别名/ drop FOREIGN KEY 别名;
✳主键只能通过drop删除
别名 可以通过 SHOW INDEX FROM 表名; 查index
*/
#1 删除非空约束ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
#2.删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
#3.删除主键约束
ALTER TABLE stuinfo DROP PRIMARY KEY;
#4.删除唯一约束
ALTER TABLE stuinfo DROP INDEX 索引名;
# 可以通过以下查看index名
SHOW INDEX FROM stuinfo;#5.删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY 外键名;
【补充】
以学生表和专业表为例,如果按照上边所述的方式设置外键,如果此时想删除major表中专业为3的专业是不能实现的,因为主表中还有3号专业的学生。此时可以采用两种办法。
原方式:
ALTER TABLE stuinfo ADD constraint FOREIGN KEY(majorId) REFERENCES major(id)
delete from major where id =3 ; 报错,不能删除
方式一:级联删除
ALTER TABLE stuinfo ADD constraint FOREIGN KEY(majorId) REFERENCES major(id) on delete cascade;
在添加外键的时候,后增加on delete cascade; 即可实现将从表和主表中满足条件的都删除
delete from major where id =3 ;
方式二:级联置空
ALTER TABLE stuinfo ADD constraint FOREIGN KEY(majorId) REFERENCES major(id) on delete set null;
在添加外键的时候,后增加on delete set null; 即可实现将从表删除,但主表中的相关内容设置为空
delete from major where id =3 ;
标识列
/*
自增长列
含义:可以不用手动的插入值
特点:
1.标识列不一定非和主键搭配,但一定和键搭配
2.至多一个标识列
3.标识列的类型只能是数值型,一般是int
4.标识列可以通过 SET auto_increment_increment = 3 设置步长,也可以手动设置起始值
*/
一 创建表的时候设置标识列
DROP TABLE IF EXISTS tab_identify
CREATE TABLE tab_identify(
id INT 约束 AUTO_INCREMENT;,
NAME VARCHAR(20)
);
INSERT INTO tab_identify VALUES(NULL,'john')
SHOW VARIABLES LIKE '%auto_increment%'
#可以设置步长,但一般不更改,起始值不能用或者方式更改
SET auto_increment_increment = 3;
二 修改表的时候设置标识列
ALTER TABLE tab_identify MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
三 修改表的时删除标识列
ALTER TABLE tab_identify MODIFY COLUMN id INT;