多表查询

执行sql脚本

1
2
3
source 脚本名.sql

source scott_data.sql

2 交叉连接—相当于笛卡尔积

1
select e.*, d.* from emp e cross join dept d;

3 自连接

1
2
3
4
5
6
7
8
9
10
11
12
查询emp表和dept表的所有信息: 
SQL99:
select e.*, d.* from emp e inner join dept d on e.deptno=d.deptno;
其中inner可以省略

oracle写法:
select e.*, d.* from emp e, dept d where e.deptno=d.deptno;
总结:
[,]---->[inner join]
[where]----->[on]

注意: 不能显示40号部门的信息, 此时需要使用外连接

4 外连接

1
2
3
4
5
6
7
8
9
 左外连接:
select e.*, d.* from emp e right outer join dept d on e.deptno=d.deptno;

右外连接:
select e.*, d.* from dept d left outer join emp e on e.deptno=d.deptno;

【注意】SQL99中,外链接取值与关系表达式=号左右位置无关。取值跟from后表的书写顺序有关。
"xxx left outer join yyy" 则为取出xxx的内容。
"xxx right outer join yyy" 则为取出yyy的内容

对比练习:

1 查询员工信息,员工号,姓名,月薪,部门名称

1
2
3
4
5
6

select e.empno, e.ename, e.sal, d.dname from emp e inner join dept d on e.deptno=d.deptno;
select e.empno, e.ename, e.sal, d.dname from emp e, dept d where e.deptno=d.deptno;

[,] ---->inner join
[where] ----->on

2 统计各个部门员工总人数-要求显示部门名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
select d.deptno, d.dname, count(e.empno) from emp e inner join dept d on e.deptno=d.deptno group by d.deptno, d.dname;

select d.deptno, d.dname, count(e.empno) from emp e, dept d where e.deptno=d.deptno group by d.deptno, d.dname;

显示40号部门的信息----需要使用外连接
oracle的写法: ----不支持
select d.deptno, d.dname, count(e.empno) from emp e, dept d where e.deptno(+)=d.deptno group by d.deptno; ---不支持此种写法

外连接:
右外连接:
select d.deptno, d.dname, count(e.empno) from emp e right outer join dept d on e.deptno=d.deptno group by d.deptno, d.dname;

左外连接:
SELECT d.deptno, d.dname, COUNT(e.empno) FROM dept d LEFT OUTER JOIN emp e ON e.deptno=d.deptno GROUP BY d.deptno, d.dname;



与oracle比较:
mysql不支持oracle那样的外连接的写法, 需要使用right | left [outer] join 的写法
,---->right|left [outer] join
where---->on