1:多表查询:
员工表(employee):(deptid:部门号)
id | name | deptid |
1 | 张三 | 4 |
2 | 李四 | 5 |
3 | 王五 | 4 |
4 | 陈六 | 5 |
id | name |
4 | 软件开发部 |
5 | 软件维护部 |
6 | 秘书部 |
需求:员工及其部门
select e.name, d.name from employee e,dept d //这样查出的是错误的,这样会产生笛卡尔乘积每一个e.name 将对应d.name 中的3个,共有12条;
多表查询的步骤:
1)确定我们要查询相关的那些表
2)确定要查询那些字段
3)确定查询的链接条件
需求:员工及其部门
1:内链接查询:
select e.name,d.name from employee e, deptid d
where e.deptid=d.id;
2:它的另一种语法:内链接查询:(inner join on )
select e.name,d.name
from employee e
inner join dept d
on e.deptid=d.id;
内链接的效果:当只有满足链接条件的数据它才会显示出来;
3:外链接:
需求:查询部门及其部门的员工:(部门全部都要显示)
预期效果:
软件开发部 | 张三 |
软件开发部 | 王五 |
软件维护部 | 李四 |
软件维护部 | 陈六 |
秘书部 | null |
1:下面是按照内链接的做法来查:
select d.name, e.name
from dept d, employee e
where d.id=e.deptid;(sql语句的效果图如下:)
软件开发部 | 张三 |
软件开发部 | 王五 |
软件维护部 | 李四 |
软件维护部 | 陈六 |
但我们要左表的数据都要显示(左外链接效果)
select d.name,e.name
from dept d
left outer join employee e
on d.id=e.deptid; // 这才是正确的sql
2)右外链接:
select e.name, d.name
from employee e
right outer join dept d
on e.deptid=d.id;
3)还有一种自连接,它的思想是我们去虚构一张表:
员工表(employee):
id | name | bossid |
1 | 张三 | null |
2 | 李四 | 1 |
需求:查出没个员工及他们的上司
select e.name,b.name
from employee e
inner join employee b
on e.bossid=b.id(效果图)
李四 | 张三 |
select e.name, b.name
from employee e
left outer join employee b
on e.bossid =b.id