MySQL数据篇之多表操作-----保姆级教程
Posted 大忽悠爱忽悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据篇之多表操作-----保姆级教程相关的知识,希望对你有一定的参考价值。
外键约束
作用:保证多表之间的数据完整性
测试环境准备:
create table dept(
did int primary key auto_increment,
dname varchar(20)
);
insert into dept values(null,'市场部');
insert into dept values(null,'人事部');
insert into dept values(null,'教研部');
create table employee(
eid int primary key auto_increment,
ename varchar(20),
salary double,
birthday date,
sex varchar(10),
dno int
);
insert into employee values(null,'张三',8000,'1980-09-01','男',3);
insert into employee values(null,'李四',9000,'1980-09-01','男',1);
insert into employee values(null,'王五',6000,'1980-09-01','男',2);
insert into employee values(null,'赵六',10000,'1980-09-01','男',3);
insert into employee values(null,'孙七',10000,'1980-09-01','男',1);
向员工表中插入一条记录,没有部门:
insert into employee values(null,'王五',6000,'1980-09-01','男',null);
删除一个人事部门:
delete from dept where did=2;
向刚才做的这两个操作(插入一个没有部门的员工和删除一个带有员工的部门),这种情况都是不应该发生的。
这个时候就需要在多表之间添加外键约束
添加外键
语法
在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)
在已有表中添加外键约束:alter table 从表表名 add constraints 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)
删除外键语法: alter table 从表表名 drop foreign key 外键名称;
在员工表上添加外键
alter table employee add foreign key(dno) references dept(did);
//让员工表中员工的部门类型不为空,即设置外键为非空
alter table employee modify dno int not null;
注意
添加外键约束后,如果想要删除主键即某个部门,需要先将该部门下关联的员工记录删除,否则报错。
但是我们可以直接删除掉某个部门下的员工,即外键的删除不影响主键。
而主键的删除会影响外键。
表与表之间的关系
一对多的关系
一个部门下可以有多个员工,但是一个员工只能属于一个部门
一对多的建表原则
在多的一方创建外键指向一的一方的主键
多对多的关系
一个学生可以选择多门课程,一个课程可以被多个学生选择、
多对多的建表原则
需要创建中间表,中间表中至少有两个字段,分别作为外键指向多对多双方的主键
一对一的例子
一个公司只能有一个注册地址,一个注册地址也只能对应一个公司
一对一的建表原则
多表案例分析
建表:
多表查询
多表查询分类
1.连接查询
交叉连接: cross join
- 交叉连接:查询到的是两个表的笛卡尔积
- 语法:
select* from 表1 cross join 表2;
或者
select * from 表1,表2;
内连接:inner join(inner)可以省略
- 显示的内连接:在sql中显示调用inner join关键字
- 语法:
select *from 表1 inner join 表2 on 关联条件;
- 隐式内连接 : 在sql中没有调用inner join 关键字
- 语法:
select *from 表1,表2 where 关联条件;
外连接—outer join(outer可以省略)
-
左外连接:
-
语法:
select * from 表1 left outer join 表2 on 关联条件;
- 右外连接
- 语法:
select * from 表1 right outer join 表2 on 关联条件;
2.子查询
一个查询语句需要依赖另一个查询语句的结果
多表查询之数据准备
-
班级表数据准备
-
学生表数据准备
-
课程表数据准备
-
学生选课表数据准备
多表查询之交叉连接
使用 cross join 关键字
SELECT * FROM classes CROSS JOIN stu;
不使用cross join关键字
SELECT* FROM classes,stu;
效果一样:
多表查询之内连接–返回两张表都满足条件的部分记录
1.显示内连接
SELECT * FROM classes c INNER JOIN stu s ON c.cid=s.cno;
可以省略INNER
SELECT * FROM classes c JOIN stu s ON c.cid=s.cno;
2.隐式内连接
SELECT *FROM classes c,stu s WHERE c.cid=s.cno;
多表查询之外连接
左外连接
返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。
SELECT *FROM classes c LEFT OUTER JOIN classesstu s ON c.cid=s.cno;
可以省略OUTER
SELECT *FROM classes c LEFT JOIN classesstu s ON c.cid=s.cno;
右外连接
恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。
SELECT *FROM classes c RIGHT OUTER JOIN stu s ON c.cid=s.cno;
可以省略OUTER
SELECT *FROM classes c RIGHT JOIN stu s ON c.cid=s.cno;
内连接与外连接的区别
多表查询之子查询
带in的子查询
- 查询学生生日在91年之后的班级信息
SELECT *FROM classes WHERE cid IN (SELECT cno FROM stu WHERE birthday > '1991-01-01');
带exists的子查询
带any的子查询
带all的子查询
以上是关于MySQL数据篇之多表操作-----保姆级教程的主要内容,如果未能解决你的问题,请参考以下文章
MySQL数据库篇---对数据库,数据库中表,数据库中表的记录进行添修删查操作---保姆级教程