1 . 多表关系
多表关系: 由于业务需求,所以各个表结构之间也存在各种联系 ,基本上分为三种 ,
一对多(多对一)、多对多、一对一。
2 . 多表查询
多表查询 : 是指从多张表中查询数据
笛卡尔积: 指在数学中 ,两个集合 A 集合和 B 集合的所有组成情况 。
在多表查询时,需要消除无效的笛卡尔积。
2 . 1 多表查询的分类:
2 . 2 连接查询 - 内连接
内连接查询的是两种表交集的部分。
例 : 查询每一个员工的姓名 ,及关联的部门的名称(隐式内连接实现)
// 表结构 : 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 ;
例 : 查询每一个员工的姓名 ,及关联的部门的名称(显式内连接实现)
select * from emp e inner join dept d on e.dept_id = d.id ; // inner 可以省略
2 . 2 连接查询 - 外连接
外连接分为左外连接和右外连接
左外连接查询的是表 1 (左表)的所有数据 ,包括表 1 和表 2 的交集部分的所有数据。
右外连接查询的是表 2 (右表)的所有数据 ,包括表 1 和表 2 的交集部分的所有数据。
例:查询emp表的所有数据,和对应的部门信息(左外连接)
select e.* , d.name from emp e left outer join dept d on e.dept_id = d.id ;
例:查询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 连接查询 - 自连接
自连接查询: 可以是内连接查询 ,也可以是外连接查询。自己连接自己。
注意:此时让一张表看成两张表!!!
例: 查询员工及其所属领导的名字
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 ;