数据库 10 -- 多表查询(1)

266 阅读2分钟

1 . 多表关系

多表关系: 由于业务需求,所以各个表结构之间也存在各种联系 ,基本上分为三种 ,一对多(多对一)多对多一对一

0606.png

0607.png

0608.png

2 . 多表查询

多表查询 : 是指从多张表中查询数据

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

2 . 1 多表查询的分类:

0609.png

2 . 2 连接查询 - 内连接

内连接查询的是两种表交集的部分。

0610.png

例 : 查询每一个员工的姓名 ,及关联的部门的名称(隐式内连接实现)

// 表结构 : 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 , dept d where emp.dept_id = dept.id ;

0612.png 例 : 查询每一个员工的姓名 ,及关联的部门的名称(显式内连接实现)

select * from emp e inner join dept d on e.dept_id = d.id ;  // inner 可以省略

2 . 2 连接查询 - 外连接

外连接分为左外连接和右外连接

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

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

0613.png

例:查询emp表的所有数据,和对应的部门信息(左外连接)

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

0614.png

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

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

// 可以改成左外
select e.* , d.* from dept d left outer join emp e on e.dept_id = d.id ;

2 . 2 连接查询 - 自连接

自连接查询: 可以是内连接查询 ,也可以是外连接查询。自己连接自己。

0616.png

0615.png

注意:此时让一张表看成两张表!!!

例: 查询员工及其所属领导的名字

select a.name , b.name from emp a , emp b where a.managerid = b.id ;

例: 查询所有员工 emp 及其所属领导的名字 ,如果员工没有领导 ,也要查询出来 !!

// 此时要用外连接 (左外)

select a.name as '员工', b.name as '领导' from emp a left outer join emp b on a.managerid = b.id ;