MySQL-多表查询-内连接/外连接/自连接

发布时间:2022-08-18 18:48

多表关系
一对多(多对一)
案例:部门与员工的关系
关系:一个部门对应多个员工,一个员工对应一个部门
实现:在多的一方建立外键,指向一的一方的主键

多对多
案例: 学生与课程的关系
关系:一个学生可以选修多门课程,一门课程可供多个学生选择
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

一对一
案例:用户与用户详情的关系
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,提升操作效率.
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

多表查询:指从多张表中查询数据
笛卡尔积: 在数学中,两个集合,A和B的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)

多表查询分类
连接查询:
内连接:相当于查询A和B交集部分的数据
外连接:
左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
自连接:当前表与自身的连接查询,自连接必须使用表别名
子查询

内连接
查询的是两张表交集的部分
查询语法:
隐式内连接:

select 字段列表 from1,2 where 条件...;

显式内连接:

select 字段列表 from1 [Inner] join2 on 连接条件...;

内连接演示需求:

查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)
表结构: emp, dept
连接条件: emp.dept_id=dept.id

隐式内连接:

select emp.name, dept.name from emp, dept where emp.dept_id=dept.id;

显式内连接:

select e.name, d.name from emp e inner join dept d on e.dept_id=d.id;
##inner可省略

外连接
左外连接: 查询表1(左表)的所有数据,包含表1和表2交集部分

select 字段列表 from1 left [outer] join2 on 条件...;

右外连接: 查询表2(右表)的所有数据,包含表1和表2交集部分

select 字段列表 from1 right [outer] join2 on 条件...;

需求:

查询员工信息表的所有数据,和对应的部门信息(左外连接)
表结构:emp, dept
连接条件: emp.dept_id = dept.id

select emp.*, d.name from emp left join dept on emp.dept_id = dept.id;

查询员工信息表的所有数据,和对应的员工信息(右外连接)

select dept.*,emp.* from emp right join dept on emp.dept_id = dept.id;

自连接
查询语法:

select 字段列表 from 表A 别名A join 表a 别名b on 条件...;

自连接查询可以是内连接查询,也可以是外连接查询.

需求:

  1. 查询员工及其所属领导的名字
  2. 查询所有员工及其领导的名字,如果员工没有领导,也要查询出来
select a.name,b.name from emp a, emp b where a.managerid=b.id;
select a.name '员工', b.name '领导' from emp a left join emp b on a.managerid=b.id;

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号