课程笔记Day27

  • 约束
  • 多表关系

第一章 约束

第01节 基础理论

1、约束概述

什么是约束呢?约束有什么作用呢?

生活当中的约束:法律的约束、道德的约束前面学习过的约束:XML当中 DTD约束、Schema约束约束:可以保证数据的完整性、正确性。例如:1、身份证号码,不能重复。我们会使用到 不能重复的约束,就是 唯一约束2、姓名,不能为null。我们会使用到 不能为空的约束,就是 非空约束3、表和表之间建立的关系,可以使用到 主键和外键等约束
2、约束分类
(1) 非空约束:建表时添加、建表后添加、删除操作
(2) 唯一约束:建表时添加、建表后添加、删除操作
(3) 主键约束:建表时添加、建表后添加、删除操作
(4) 外键约束:建表时添加、建表后添加、删除操作

第02节 非空约束

1、建表时添加非空约束

语法格式

-- 语法格式
CREATE TABLE 表名称(列名1  数据类型1,列名2  数据类型2  NOT NULL,列名3  数据类型3
);-- 举例说明
CREATE TABLE IF NOT EXISTS BiaoOne(uid INT,uname VARCHAR(20) NOT NULL,uage INT
);

案例代码

-- 1. 创建表的时候,添加非空约束
CREATE TABLE IF NOT EXISTS BiaoOne(uid INT,uname VARCHAR(20) NOT NULL,uage INT
);-- 2. 添加数据
INSERT INTO BiaoOne VALUES (1,'张三',23);
INSERT INTO BiaoOne VALUES (2,NULL,24);
INSERT INTO BiaoOne VALUES (3,'王五',25);-- 3. 查询表
SELECT * FROM BiaoOne;-- 4. 查询非空约束SQL语句,查询表结构
DESC BiaoOne;
2、建表后添加非空约束

语法格式

-- 语法格式
ALTER TABLE 表名称 MODIFY 列名 数据类型 NOT NULL;-- 举例说明
ALTER TABLE BiaoOne MODIFY uage INT NOT NULL;

案例代码

-- 1. 查看表结构
DESC BiaoOne;-- 2. 给uage这一列添加非空约束
ALTER TABLE BiaoOne MODIFY uage INT NOT NULL;-- 3. 查询表
SELECT * FROM BiaoOne;-- 4. 插入数据
INSERT INTO BiaoOne VALUES (4,'赵六',NULL);/*注意事项:如果我们采用的是建表之后,再去添加非空约束 NOT NULL需要注意,如果之前存在 NULL 值,则添加非空约束会出错。
*/
3、删除非空约束

语法格式

-- 语法格式
ALTER TABLE 表名称 MODIFY 列名 数据类型;-- 举例说明
ALTER TABLE BiaoOne MODIFY uage INT;

案例代码

-- 1. 创建表的时候,添加非空约束。
CREATE TABLE IF NOT EXISTS BiaoOne(id INT,uname VARCHAR(20) NOT NULL
);
-- 2. 查看表信息,查看非空约束的情况
DESC BiaoOne;
-- 3. 删除非空约束
ALTER TABLE BiaoOne MODIFY uname VARCHAR(20);
-- 4. 插入数据,插入非空的值 和 为空的值
INSERT INTO BiaoOne VALUES (1,'张三'),(2,NULL);
-- 5. 添加非空约束
ALTER TABLE BiaoOne MODIFY uname VARCHAR(20) NOT NULL;
-- 6. 修改值,修改为为不为空的情况
UPDATE BiaoOne SET uname='李四' WHERE id=2;
-- 7. 查询表
SELECT * FROM BiaoOne;
-- 8. 删除非空约束
ALTER TABLE BiaoOne MODIFY uname VARCHAR(20);

第03节 唯一约束

1、建表时添加唯一约束

语法格式

-- 语法格式
CREATE TABLE IF NOT EXISTS 表名称(列名1  数据类型1,列名2  数据类型2  UNIQUE,列名3  数据类型3
);-- 举例说明
CREATE TABLE IF NOT EXISTS BiaoTwo(id INT,uname VARCHAR(20) UNIQUE,uage INT
);

案例代码

-- 1. 删除表,如果存在则删除
DROP TABLE IF EXISTS BiaoTwo;-- 2. 创建数据表的时候,添加唯一约束
CREATE TABLE IF NOT EXISTS BiaoTwo(id INT,uname VARCHAR(20) UNIQUE,uage INT
);-- 3. 查看表结构,查询表
DESC BiaoTwo;
SELECT * FROM BiaoTwo;-- 4. 添加数据
INSERT INTO BiaoTwo VALUES (1,'张三',23);
INSERT INTO BiaoTwo VALUES (2,'李四',24);
INSERT INTO BiaoTwo VALUES (3,'王五',25);
INSERT INTO BiaoTwo VALUES (4,'张三',26);
INSERT INTO BiaoTwo VALUES (5,NULL,27);
INSERT INTO BiaoTwo VALUES (6,NULL,28);/*注意事项:如果我们采用创建表的形式,添加唯一约束的话。为 null 的值,可以添加N个,不会被唯一约束限定。
*/
2、建表后添加唯一约束

语法格式

-- 语法格式
ALTER TABLE 表名称 MODIFY 列名 数据类型 UNIQUE;-- 举例说明
ALTER TABLE BiaoTwo MODIFY uage INT UNIQUE;

案例代码

-- 1. 删除表,如果存在则删除
DROP TABLE IF EXISTS BiaoTwo;
-- 2. 创建数据表的时候
CREATE TABLE IF NOT EXISTS BiaoTwo(id INT,uname VARCHAR(20),uage INT
);
-- 3. 查看表结构,查询表
DESC BiaoTwo;
SELECT * FROM BiaoTwo;
-- 4. 添加唯一约束
ALTER TABLE BiaoTwo MODIFY uage INT UNIQUE;
-- 5. 添加数据
INSERT INTO BiaoTwo VALUES (1,'张三',23);
INSERT INTO BiaoTwo VALUES (2,'李四',24);
INSERT INTO BiaoTwo VALUES (3,'王五',25);
INSERT INTO BiaoTwo VALUES (4,'赵六',25);
INSERT INTO BiaoTwo VALUES (5,'前妻',NULL);
INSERT INTO BiaoTwo VALUES (6,'王八',NULL);/**注意事项1: 如果建表后,添加唯一约束,NULL值,无视限定,仍然可以添加NULL重复注意事项2:如果建表后,表当中列存在重复值,给这列添加唯一约束,会报错。注意事项3:如果建表后,表当中的列存在重复的 NULL值,这列添加唯一约束,不会报错。
**/
3、删除唯一约束

语法格式

-- 语法格式
ALTER TABLE 表名称 DROP INDEX 列名;-- 举例说明
ALTER TABLE BiaoTwo DROP INDEX uname;

案例代码

-- 1. 删除表,如果存在则删除
DROP TABLE IF EXISTS BiaoTwo;
-- 2. 创建数据表的时候,添加唯一约束
CREATE TABLE IF NOT EXISTS BiaoTwo(id INT,uname VARCHAR(20) UNIQUE,uage INT
);
-- 3. 查看表结构,查看表信息
DESC BiaoTwo;
SELECT * FROM BiaoTwo;
-- 4. 删除唯一约束
ALTER TABLE BiaoTwo DROP INDEX uname;
-- 5. 添加唯一约束
ALTER TABLE BiaoTwo MODIFY uname VARCHAR(20) UNIQUE;
-- 6. 插入数据
INSERT INTO BiaoTwo VALUES (1,'张三',23);
INSERT INTO BiaoTwo VALUES (2,'李四',24);
INSERT INTO BiaoTwo VALUES (3,'王五',25);
INSERT INTO BiaoTwo VALUES (4,'张三',26);
INSERT INTO BiaoTwo VALUES (5,NULL,27);
INSERT INTO BiaoTwo VALUES (6,NULL,28);
-- 7. 删除记录
DELETE FROM BiaoTwo WHERE id=4;

第04节 主键约束

1、建表时添加主键约束

语法格式(非自增形式的主键)

-- 语法格式
CREATE TABLE IF 表名称(列名1 数据类型1 PRIMARY KEY,列名2 数据类型2,列名3 数据类型3
);-- 举例说明CREATE TABLE IF NOT EXISTS BiaoThree(id INT PRIMARY KEY,uname VARCHAR(20)
);

主键的特点:

1、非空且唯一 主键所在的列,要求不能为 NULL 值,而且不能出现重复的数据。

2、一张表当中,只能存在一个主键。

3、我们可以通过主键,去确定这一行的信息。

案例代码

-- 1. 删除表
DROP TABLE IF EXISTS BiaoThree;
-- 2. 创建表
CREATE TABLE IF NOT EXISTS BiaoThree(id INT PRIMARY KEY,uname VARCHAR(20)
);
-- 3. 查看表 看结构、看内容
DESC BiaoThree;
SELECT * FROM BiaoThree;
-- 4. 插入数据
INSERT INTO BiaoThree VALUES (1,'孙佳佳');
INSERT INTO BiaoThree VALUES (2,'彭俊杰');
INSERT INTO BiaoThree VALUES (2,'定浩');
INSERT INTO BiaoThree VALUES (NULL,'腚耗');
INSERT INTO BiaoThree VALUES (NULL,'郭龙');/*主键的特点: 1. 非空且唯一2. 不能存在两个主键在同一个表当中
*/

语法格式(自增形式的主键)

-- 语法格式
CREATE TABLE IF 表名称(列名1 数据类型1 PRIMARY KEY AUTO_INCREMENT,列名2 数据类型2,列名3 数据类型3
);-- 举例说明CREATE TABLE IF NOT EXISTS BiaoFour(id INT PRIMARY KEY AUTO_INCREMENT,uname VARCHAR(20)
);

设置自增之后,注意事项:

1、如果添加主键为 NULL 值,默认从1开始

2、如果这条记录删除,下次添加会跳过删除这行记录。(之前 id为2的删除,下次添加 id为3)

3、如果跳过某些顺序添加,则看上一行 id值。(直接添加 id为10,下次添加为NULL,则 id为11)

4、如果跳过某些顺序添加,则看上一行 id值。(直接添加 id为10,下次添加为 2,则id为2,放在id为1的后面)

案例代码

-- 1. 删除表
DROP TABLE IF EXISTS BiaoFour;
-- 2. 创建表
CREATE TABLE IF NOT EXISTS BiaoFour(id INT PRIMARY KEY AUTO_INCREMENT,uname VARCHAR(20)
);-- 3. 查看表 看结构、看内容
DESC BiaoFour;
SELECT * FROM BiaoFour;-- 4. 插入数据
INSERT INTO BiaoFour VALUES (1,'孙佳佳');
INSERT INTO BiaoFour VALUES (2,'彭俊杰');
INSERT INTO BiaoFour VALUES (NULL,'定浩');
INSERT INTO BiaoFour VALUES (NULL,'腚耗');
INSERT INTO BiaoFour VALUES (NULL,'郭龙');
INSERT INTO BiaoFour VALUES (10,'黄杰');
-- 5. 删除表记录
DELETE FROM BiaoFour WHERE id = 4;
2、建表后添加主键约束

语法格式(自增形式的主键)

-- 语法格式
ALTER TABLE 表名称 MODIFY 列名 数据类型 PRIMARY KEY AUTO_INCREMENT;-- 举例说明
ALTER TABLE BiaoFour MODIFY id INT PRIMARY KEY AUTO_INCREMENT;

案例代码

-- 1. 删除表
DROP TABLE IF EXISTS BiaoFour;
-- 2. 创建表
CREATE TABLE IF NOT EXISTS BiaoFour(id INT,uname VARCHAR(20)
);-- 3. 查看表 看结构、看内容
DESC BiaoFour;
SELECT * FROM BiaoFour;-- 4. 添加主键约束
ALTER TABLE BiaoFour MODIFY id INT PRIMARY KEY AUTO_INCREMENT;-- 5. 插入数据
INSERT INTO BiaoFour VALUES (1,'孙佳佳');
INSERT INTO BiaoFour VALUES (2,'彭俊杰');
INSERT INTO BiaoFour VALUES (NULL,'定浩');
INSERT INTO BiaoFour VALUES (NULL,'腚耗');
INSERT INTO BiaoFour VALUES (NULL,'郭龙');
INSERT INTO BiaoFour VALUES (10,'黄杰');
INSERT INTO BiaoFour VALUES (10,'佑威');
-- 6. 删除表记录
DELETE FROM BiaoFour WHERE id = 4;/*注意事项1: 如果我们已经添加了NULL值,再去添加主键约束,不会报错,自动改变为主键的值注意事项2: 如果我们已经添加了重复的非NULL值,再去添加主键约束,会报错。
*/
3、删除主键约束

语法格式(自增形式的主键)

-- 语法格式 (先删除自动增长,再删除主键约束)
ALTER TABLE 表名称 MODIFY 列名 数据类型;
ALTER TABLE 表名称 DROP PRIMARY KEY;-- 举例说明 删除主键约束(在删除主键约束之前,先要删除自动增长)
ALTER TABLE BiaoFour MODIFY id INT;
ALTER TABLE BiaoFour DROP PRIMARY KEY;

案例代码

-- 1. 删除表
DROP TABLE IF EXISTS BiaoFour;
-- 2. 创建表
CREATE TABLE IF NOT EXISTS BiaoFour(id INT PRIMARY KEY AUTO_INCREMENT,uname VARCHAR(20)
);
-- 3. 查看表,看表结构,看表数据
DESC BiaoFour;
SELECT * FROM BiaoFour;-- 4. 删除主键约束(在删除主键约束之前,先要删除自动增长)
ALTER TABLE BiaoFour MODIFY id INT;
ALTER TABLE BiaoFour DROP PRIMARY KEY;-- 5. 插入数据
INSERT INTO BiaoFour VALUES (1,'孙佳佳');
INSERT INTO BiaoFour VALUES (2,'彭俊杰');
INSERT INTO BiaoFour VALUES (NULL,'定浩');
INSERT INTO BiaoFour VALUES (NULL,'腚耗');
INSERT INTO BiaoFour VALUES (NULL,'郭龙');
INSERT INTO BiaoFour VALUES (10,'黄杰');
INSERT INTO BiaoFour VALUES (10,'佑威');

第05节 外键约束

1、为什么需要使用外键

案例代码

/*为什么会存在外键约束呢?主要是为了保证数据的合法性。说白一点,就是说,一张表的数据,对另外的表数据有影响。做增删改操作的过程当中,影响的数据的正确性。
*/
DROP TABLE IF EXISTS bumen;
CREATE TABLE IF NOT EXISTS bumen(bumen_id  INT,bumen_name VARCHAR(20)
);
INSERT INTO bumen VALUES (1,'财务部'),(2,'生产部'),(3,'销售部');
SELECT * FROM bumen;DROP TABLE IF EXISTS yuangong;
CREATE TABLE IF NOT EXISTS yuangong(yuangong_id INT,yuangong_name VARCHAR(20),yuangong_bumen_id  INT
);
INSERT INTO yuangong VALUES (1,'定浩',1);
INSERT INTO yuangong VALUES (2,'腚耗',2);
INSERT INTO yuangong VALUES (3,'郭龙',3);
INSERT INTO yuangong VALUES (4,'黄杰',2);
INSERT INTO yuangong VALUES (5,'佑威',4);
SELECT * FROM yuangong;

外键约束应该具备有什么特点?

1、用于建立两张表之间的关联关系。

2、副表的外键,需要关联 主表的主键,或者是主表的唯一索引列。

3、如果建立了主外键关系的表,做 增删改的时候,就需要注意完整性正确性。

2、建表时添加外键约束

语法格式(外键需要关联主键)

-- 语法格式
CONSTRAINT 外键自定义的名称 FOREIGN KEY (外键列的名称) REFERENCES 主表的名称(主表的主键列名称)
FOREIGN KEY (外键列的名称) REFERENCES 主表的名称(主表的主键列名称) -- 举例说明
CONSTRAINT 'yuangong_ibfk_1' FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id)
FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id)

案例代码

-- 1. 创建部门表
DROP TABLE IF EXISTS bumen;
CREATE TABLE IF NOT EXISTS bumen(bumen_id  INT PRIMARY KEY AUTO_INCREMENT,   -- 部门表主键IDbumen_name VARCHAR(20)
);
INSERT INTO bumen VALUES (1,'财务部'),(2,'生产部'),(3,'销售部');
SELECT * FROM bumen;
DESC bumen;-- 2. 创建员工表
DROP TABLE IF EXISTS yuangong;
CREATE TABLE IF NOT EXISTS yuangong(yuangong_id INT,yuangong_name VARCHAR(20),yuangong_bumen_id  INT,FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id)
);
INSERT INTO yuangong VALUES (1,'定浩',1);
INSERT INTO yuangong VALUES (2,'腚耗',2);
INSERT INTO yuangong VALUES (3,'郭龙',3);
INSERT INTO yuangong VALUES (4,'黄杰',2);
INSERT INTO yuangong VALUES (5,'佑威',4);   -- 这条记录,添加失败,因为外键关系
SELECT * FROM yuangong;
DESC yuangong;
3、建表后添加外键约束

语法格式(外键需要关联主键)

-- 语法格式
ALTER TABLE 副表的名称 ADD FOREIGN KEY (副表的外键列名称) REFERENCES 主表的名称(主表的主键列名);-- 举例说明
ALTER TABLE yuangong ADD FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id);

案例代码

-- 1. 创建部门表
DROP TABLE IF EXISTS bumen;
CREATE TABLE IF NOT EXISTS bumen(bumen_id  INT PRIMARY KEY AUTO_INCREMENT,   -- 部门表主键IDbumen_name VARCHAR(20)
);
INSERT INTO bumen VALUES (1,'财务部'),(2,'生产部'),(3,'销售部');
SELECT * FROM bumen;
DESC bumen;-- 2. 创建员工表
DROP TABLE IF EXISTS yuangong;
CREATE TABLE IF NOT EXISTS yuangong(yuangong_id INT,yuangong_name VARCHAR(20),yuangong_bumen_id  INT
);
-- 3. 添加外键约束
ALTER TABLE yuangong ADD FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id);INSERT INTO yuangong VALUES (1,'定浩',1);
INSERT INTO yuangong VALUES (2,'腚耗',2);
INSERT INTO yuangong VALUES (3,'郭龙',3);
INSERT INTO yuangong VALUES (4,'黄杰',2);
INSERT INTO yuangong VALUES (5,'佑威',4);
SELECT * FROM yuangong;
DESC yuangong;
4、删除外键约束

语法格式(外键需要关联主键)

-- 查询外键的名称
SELECT  CONSTRAINT_NAME FROM information_schema.key_column_usage t
WHERE t.constraint_schema = '数据库的名称' AND TABLE_NAME = '数据表的名称';-- 语法格式
ALTER TABLE 副表名称 DROP FOREIGN KEY 外键的名字;-- 举例说明
ALTER TABLE yuangong DROP FOREIGN KEY yuangong_ibfk_1;

案例代码

-- 1. 创建部门表
DROP TABLE IF EXISTS bumen;
CREATE TABLE IF NOT EXISTS bumen(bumen_id  INT PRIMARY KEY AUTO_INCREMENT,   -- 部门表主键IDbumen_name VARCHAR(20)
);
INSERT INTO bumen VALUES (1,'财务部'),(2,'生产部'),(3,'销售部');
SELECT * FROM bumen;
DESC bumen;-- 2. 创建员工表
DROP TABLE IF EXISTS yuangong;
CREATE TABLE IF NOT EXISTS yuangong(yuangong_id INT,yuangong_name VARCHAR(20),yuangong_bumen_id  INT
);
-- 3. 添加外键约束
ALTER TABLE yuangong ADD FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id);-- 补充:查看当前表的外键名称
SELECT  CONSTRAINT_NAME FROM information_schema.key_column_usage t
WHERE t.constraint_schema = 'mydb06' AND TABLE_NAME = 'yuangong';-- 4. 删除外键约束
ALTER TABLE yuangong DROP FOREIGN KEY yuangong_ibfk_1;INSERT INTO yuangong VALUES (1,'定浩',1);
INSERT INTO yuangong VALUES (2,'腚耗',2);
INSERT INTO yuangong VALUES (3,'郭龙',3);
INSERT INTO yuangong VALUES (4,'黄杰',2);
INSERT INTO yuangong VALUES (5,'佑威',4);
SELECT * FROM yuangong;
DESC yuangong;
5、级联更新和级联删除

语法格式

-- 语法格式
ON UPDATE CASCADE     -- 级联更新
ON DELETE CASCADE     -- 级联删除-- 举例说明
ALTER TABLE emp ADD FOREIGN KEY (emp_dept_id) REFERENCES dept(dept_id) ON UPDATE CASCADE;
ALTER TABLE emp ADD FOREIGN KEY (emp_dept_id) REFERENCES dept(dept_id) ON DELETE CASCADE;
ALTER TABLE emp ADD FOREIGN KEY (emp_dept_id) REFERENCES dept(dept_id) ON DELETE CASCADE ON UPDATE CASCADE;

特征:

我们如果添加了级联的操作(级联更新或者级联删除) 直接操作主表的时候,副表也会跟着变化。

这种操作,我们一般不建议使用,不推荐使用 级联的操作。(因为太危险了,很容易丢失数据)

案例代码

-- 1. 创建部门表
DROP TABLE IF EXISTS bumen;
CREATE TABLE IF NOT EXISTS bumen(bumen_id  INT PRIMARY KEY AUTO_INCREMENT,   -- 部门表主键IDbumen_name VARCHAR(20)
);
INSERT INTO bumen VALUES (1,'财务部'),(2,'生产部'),(3,'销售部');
SELECT * FROM bumen;
DESC bumen;-- 2. 创建员工表
DROP TABLE IF EXISTS yuangong;
CREATE TABLE IF NOT EXISTS yuangong(yuangong_id INT,yuangong_name VARCHAR(20),yuangong_bumen_id  INT
);
-- 3. 添加外键约束
ALTER TABLE yuangong ADD FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id);
ALTER TABLE yuangong ADD FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id) ON UPDATE CASCADE;
-- 补充:查看当前表的外键名称
SELECT  CONSTRAINT_NAME FROM information_schema.key_column_usage t
WHERE t.constraint_schema = 'mydb06' AND TABLE_NAME = 'yuangong';
-- 4. 删除外键约束
ALTER TABLE yuangong DROP FOREIGN KEY yuangong_ibfk_1;INSERT INTO yuangong VALUES (1,'定浩',1);
INSERT INTO yuangong VALUES (2,'腚耗',2);
INSERT INTO yuangong VALUES (3,'郭龙',3);
INSERT INTO yuangong VALUES (4,'黄杰',2);
INSERT INTO yuangong VALUES (5,'佑威',4);
SELECT * FROM yuangong;
DESC yuangong;-- 需求:想要把部门的id进行修改,销售部的id由3变成5,怎么办呢?
UPDATE bumen SET bumen_id = 5 WHERE bumen_name = '销售部';

第二章 多表关系

第01节 基础理论

1、理论概述

什么是多表关系呢?

多表关系 指的是 多张表之间存在的数据联系。MySQL 称之为 "关系型数据库" 指的是 数据之间会存在 关联关系的。
例如: 主键和外键关联当中,提到的两个表 "部门表" 和  "员工表" 他们就存在关联关系
2、常见关系

常见的关系有哪些呢?

(1) 一对一  例如: 身份证号码和人的关系
(2) 一对多  例如: 部门和员工的关系
(3) 多对多  例如: 学生和课程的关系

分析过程1

思考的过程:身份证号码和人为例

1、一个身份证号码对应一个人 OK 吗 ? OK的

2、一个人对应一个身份证号码吗? OK的

因此他们是 一对一的关系

分析过程2

思考的过程:部门和员工的关系为例

1、一个部门对应多个员工OK吗 ? OK的

2、一个员工对应多个部门OK吗? NO

因此他们是 一对多的关系

分析过程3

思考的过程:学生和课程的关系为例

1、一个学生对应多个课程OK吗 ? OK的

2、一个课程对应多个学生OK吗? OK的

因此他们是 多对多的关系

第02节 具体操作

1、一对一关系

举例

人和身份证号码的关系

操作

方式一: 在人这个表当中,建立主键,去关联 身份证表的外键。
方式二: 在身份证这个表当中,建立主键,去关联 人表的外键。更多情况下,我们会 将两个信息,合并在一张表当中。
2、一对多关系

举例

部门和员工的关系

操作

在部门表当中,建立主键,在员工表当中,建立外键。
由外键去关联主键。

画图

建表的原则:

1、在 1 的一方,建立 主键

2、在 N 的一方,建立 外键,由外键关联 1 的主键

3、多对多关系

举例

学生和课程的关系

操作

1、需要在 学生表当中建立 主键
2、需要在 课程表当中建立 主键
3、建立一个中间表(例如:学生选课表)至少包含两列,分别作为外键,去关联各自的主键。

画图

今日总结:

我认为主要知识点:外键约束、多表关系

1、为什么需要使用外键

/*为什么会存在外键约束呢?主要是为了保证数据的合法性。说白一点,就是说,一张表的数据,对另外的表数据有影响。做增删改操作的过程当中,影响的数据的正确性。
*/
-- 语法格式
ALTER TABLE 副表的名称 ADD FOREIGN KEY (副表的外键列名称) REFERENCES 主表的名称(主表的主键列名);-- 举例说明
ALTER TABLE yuangong ADD FOREIGN KEY (yuangong_bumen_id) REFERENCES bumen(bumen_id);

外键约束应该具备有什么特点?

1、用于建立两张表之间的关联关系。

2、副表的外键,需要关联 主表的主键,或者是主表的唯一索引列。

3、如果建立了主外键关系的表,做 增删改的时候,就需要注意完整性正确性。

2.多表关系

常见的关系有哪些呢?

(1) 一对一  例如: 身份证号码和人的关系
(2) 一对多  例如: 部门和员工的关系
(3) 多对多  例如: 学生和课程的关系

主要说一下多对多
举例

学生和课程的关系
1、需要在 学生表当中建立 主键
2、需要在 课程表当中建立 主键
3、建立一个中间表(例如:学生选课表)至少包含两列,分别作为外键,去关联各自的主键。

sql语句练习

数据准备:


-- 学生表
DROP TABLE IF EXISTS Student;
create table IF NOT EXISTS Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-05-20' , '男');
insert into Student values('04' , '李云' , '1990-08-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-03-01' , '女');
insert into Student values('07' , '郑竹' , '1989-07-01' , '女');
insert into Student values('09' , '张三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2017-12-30' , '女');
insert into Student values('12' , '赵六' , '2017-01-01' , '女');
insert into Student values('13' , '孙七' , '2018-01-01' , '女');-- 科目表
DROP TABLE IF EXISTS Course;
create table IF NOT EXISTS Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');-- 教师表
DROP TABLE IF EXISTS Teacher
create table IF NOT EXISTS Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');-- 成绩表
DROP TABLE IF EXISTS SC
create table IF NOT EXISTS SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98)

题目说明:

-- 01. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 1.1 查询同时存在" 01 "课程和" 02 "课程的情况 1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null ) 1.3 查询不存在" 01 "课程但存在" 02 "课程的情况
-- 02. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
-- 03. 查询在 SC 表存在成绩的学生信息
-- 04. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null ) 4.1 查有成绩的学生信息
-- 05. 查询「李」姓老师的数量
-- 06. 查询学过「张三」老师授课的同学的信息
-- 07. 查询没有学全所有课程的同学的信息
-- 08. 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
-- 09. 查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息
-- 10. 查询没学过"张三"老师讲授的任一门课程的学生姓名
-- 11. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
-- 12. 检索" 01 "课程分数小于 60,按分数降序排列的学生信息
-- 13. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
-- 14. 查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
-- 15. 按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺 15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次
-- 16. 查询学生的总成绩,并进行排名,总分重复时保留名次空缺 16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
-- 17. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
-- 18. 查询各科成绩前三名的记录
-- 19. 查询每门课程被选修的学生数
-- 20. 查询出只选修两门课程的学生学号和姓名
-- 21. 查询男生、女生人数
-- 22. 查询名字中含有「风」字的学生信息
-- 23. 查询同名同性学生名单,并统计同名人数
-- 24. 查询 1990 年出生的学生名单
-- 25. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
-- 26. 查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
-- 27. 查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
-- 28. 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
-- 29. 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
-- 30. 查询不及格的课程
-- 31. 查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
-- 32. 求每门课程的学生人数
-- 33. 成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
-- 34. 成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
-- 35. 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
-- 36. 查询每门功成绩最好的前两名
-- 37. 统计每门课程的学生选修人数(超过 5 人的课程才统计)。
-- 38. 检索至少选修两门课程的学生学号
-- 39. 查询选修了全部课程的学生信息
-- 40. 查询各学生的年龄,只按年份来算
-- 41. 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
-- 42. 查询本周过生日的学生
-- 43. 查询下周过生日的学生
-- 44. 查询本月过生日的学生 

答案:

-- 01. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
SELECT * FROM
(SELECT sc.SId,sc.score FROM sc WHERE CId='01')as t1 INNER JOIN
(SELECT sc.SId,sc.score FROM sc WHERE CId='02')as t2 ON  t1.SId= t2.SId
WHEREt1.score > t2.score;--1.1 查询同时存在" 01 "课程和" 02 "课程的情况
SELECT * FROM
(SELECT sc.SId,sc.score FROM sc WHERE CId='01')as t1 INNER JOIN
(SELECT sc.SId,sc.score FROM sc WHERE CId='02')as t2 ON  t1.SId= t2.SId;--1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
SELECT * FROM
(SELECT sc.SId,sc.score FROM sc WHERE CId='01')as t1 left JOIN
(SELECT sc.SId,sc.score FROM sc WHERE CId='02')as t2 ON  t1.SId= t2.SId;-- 1.3 查询不存在" 01 "课程但存在" 02 "课程的情况
SELECT * FROM sc
WHEREsc.SId not in (SELECT sc.SId FROM sc WHERE sc.CId='01')
ANDsc.CId='02';-- 02. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
SELECT t1.SId        '学生编号',t1.Sname      '学生姓名',AVG(t2.score) '平均成绩'
FROM student t1,sc      t2
WHERE t1.SId= t2.SId
GROUP BYt1.SId
HAVINGAVG(t2.score)>=60;-- 03. 查询在 SC 表存在成绩的学生信息
select DISTINCT student.*   -- DISTINCT 去重
from student, sc
where student.sid = sc.sid -- 4. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为null)select student.sid, student.sname, t1.coursecount, t1.sumscore
from student inner join (
select sc.sid, count(sc.cid) as coursecount, sum(sc.score) as sumscore from sc group by sc.sid) as t1
on student.sid = t1.sid-- 4.1 查有成绩的学生信息    注意??EXISTS??关键字select student.*
from student
where student.sid in (
select DISTINCT sc.sid from sc)select *
from student
where EXISTS(select * from sc where student.SId=sc.SId)-- 5. 查询「李」姓老师的数量select count(*)
from teacher
where teacher.Tname like '李%'

Mysql基础之约束相关推荐

  1. MySQL基础——DDL语言学习\数据库的建立\MySQL数据类型\MySQL常见约束\表的增删改

    接上篇文章 MySQL基础--数据库和SQL概述\MySQL基本使用\DQL语言学习 DDL语言学习 Data Definition Language 数据定义语言 主要用于数据库和数据表的管理和操作 ...

  2. MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物

    MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物 前言 1.MySQL概述 1.1数据库相关概念 1.2MySQL数据库 1.2.1版本 1.2.2下载 1.2.3安装 ...

  3. MySQL基础-(概念、安装、SQL语句、约束)

    MySQL基础 一.数据库的基本概念 1.为什么要学数据库? 之前我们如果想将一些数据实现永久化存储,可以怎么做呢?没错.使用IO流的技术将数据保存到本地文件中 但是接下来我有这样一个需求:将下面的u ...

  4. MySQL基础教程系列-约束(一)主键约束

    主键是数据库中十分重要的概念,必须要掌握.合理的主键设置十分重要,直接决定着我们整个模型设计的合理性,如果前期设计不合理,在项目后期更改主键,将会带来灾难性的影响. 什么是主键,如何选取主键,主键的特 ...

  5. MySQL基础篇:子查询

    文章目录 概述 where型子查询 from型子查询 EXISTS型子查询 复制表子查询 概述 在某些情况下,当进行一个查询时,需要的条件或数据要用另一个select语句的结果,这个时候,就要用到** ...

  6. mysql 存储引擎 面试_搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

    MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

  7. mysql基础(全,必看)

    MySQL基础 一.MySQL概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access ...

  8. mysql核心数据库_从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程...

    从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程 课程目录 (1) 01MySQL基础_课程引入.avi (2) 02MySQL基础_为什么学习 ...

  9. MySQL 基础 ———— 连接查询

    引言 本篇文章承接<数据库与SQL语句>专栏,进入DQL的重要环节,可以说,这一部分的内容应该占据SQL语言的大部分使用场景. 本篇的连接查询知识,和后面的一些重要的查询知识总结,共同构成 ...

最新文章

  1. R语言Logistic回归模型亚组分析森林图(forest plot)绘制
  2. 【JVM】JVM系列之JVM体系(一)
  3. 我的大学到研究生自学 Java 之路,过程艰辛,不放弃,保持热情,最终发现我是这样拿到大厂 offer 的!...
  4. eclipse中简便的aptana安装方法
  5. NetCore 统一处理 webapi 返回null 转为“”
  6. charcoal editor installation
  7. 大快搜索获评“2018中国大数据基础软件领域领军企业”
  8. JDK源码解析--ArrayList
  9. 统计正数和负数的个数然后计算这些数的平均值_计算机中的二进制原来是这样:原码、反码和补码
  10. PS把一张白纸里的黑色图形抠出来
  11. StoreOnce的未来:惠普是否能真正实现一体化去重
  12. html5华文行楷字体代码,html5 支持的字体样式
  13. 2019.11.28工作记录——InstallShield制作windriver驱动安装包
  14. spark处理大数据实例
  15. 太一星晨:负载均衡啃不动的骨头交给应用交付
  16. 前端与后台(学习自某B站Up主)
  17. 启动监听时的XDB、XPT和PLSExtProc服务的介绍
  18. 无盘工作站给服务器ip地址协议,如何给无盘工作站安装TCP IP协议
  19. STM32:USART串口外设(内含:1.USART简介+2.USART基本结构+3.数据帧+4.起始位侦测+5.数据采样+6.波特率发生器)
  20. Lesson09_类和对象

热门文章

  1. 第三方应用接入企业微信
  2. 【SPIE独立出版 | Ei检索 】第二届物联网与机器学习国际学术会议征稿中!
  3. VC6升级到VC9,线程中自定义消息的升级方法
  4. 使用手柄控制Unity及效果展示(1)
  5. springBoot报 :Address already in use: bind错误
  6. 口令攻击实验V2.0
  7. 戴尔微型计算机进bois,dell进入bios的方法 搞定BIOS设置
  8. You Don’t Know JS 中文电子书 你不懂JS.pdf
  9. CAD图纸导入到PS的步骤
  10. 解析解(闭式解)、数值解