Oracle04表连接
- 格式:doc
- 大小:47.50 KB
- 文档页数:4
表连接
内连接
1.交叉连接
两个没有任何关系的表,在连接时会产生笛卡尔积。
Select *
From [tabel1],[tabel2];
From [tabel1] cross join [tabel2] ;//标准的交叉连接写法,ANSI SQL99标准
2.等值连接
Select *
From [tabel1] join[tabel2]
On express1 = express2;
标准语法中,使用join关键字代表连接,on代表连接的条件,Join和on必须配对使用。
例:显示员工的姓名和所在的部门名。
Select e.first_name,
Frome s_emp e join s_dept d
On e.dept_id = d.id;
例:显示亚洲地区员工的姓名和所在的部门名。
Select e.first_name,
Frome s_emp e join s_dept d
On e.dept_id = d.id
Join s_region i
On r.id = d.regin_id
And = ‘Asia’;
练习:
显示First_name叫Carmen的人的姓名和部门名。
select e.first_name,
from s_emp e join s_dept d
on e.dept_id = d.id
and e.first_name = 'Carmen';
3.非等值连接
例如,查询公司里所有员工的工资级别。
select e.ename,e.sal,g.grade
from emp e join salgrade g
on e.sal between g.losal and g.hisal;//不是用‘=’作为条件,所以叫非等值。
4.自然连接
查询的字段全部来自于一张表,通过给表起别名,将同一张表的列之间的关系,转成不同表的列之间的关系。
例:显示每个员工的姓名以及其领导的姓名。
select a.first_name employee,a.manager_id ,
b.first_name leader
from s_emp a join s_emp b
on a.manager_id = b.id;
练习:哪些人是领导?(自连接)
select distinct b.first_name leader
from s_emp a join s_emp b
on b.id = a.manager_id;
练习:在Scott用户下查询所有部门的员工状况。
(姓名,工资,部门名称、部门号)
select d.deptno,d.dname,e.ename,e.sal
from emp e join dept d
on e.deptno = d.deptno
order by deptno;
小结:这种结果只有三个部门,不包含所有部门,这是因为结果有空值,直接过滤掉了,这也是内连接的一种缺陷:结果集里面有null的,就直接过滤掉了。
外连接
1.左外连接
select [select list]
from [table1] t1 left join [table2] t2
on t1.c = t2.c;
2.右外连接
select [select list]
from [table1] t1 right join [table2] t2
on t1.c = t2.c;
3.全连接
select [select list]
from [table1] t1 full join [table2] t2
on t1.c = t2.c;
left指定左边的t1表作为驱动表,t2作为匹配表,如果t1.c在t2中找不到匹配的话,那么就要在t2中生成一个空记录和t1.c匹配。
select e.ename,e.sal,d.deptno,
from emp e right join dept d
on e.deptno = d.deptno;
将dept表作为驱动表,如果在EMP表中找不到相应记录,则将一条空记录与dept 连接,而不是像内连接那样直接将该记录过滤掉。
小结:
外连接的核心作用是用来找回匹配不到的纪录的,避免把空记录过滤掉。
《一个都不能少》
补充:
查询公司每个部门的每个岗位的最高工资。
(deptno job maxsal)
select deptno,job,max(sal)
from emp
group by deptno,job;//用多个列去分组
而且验证了结论:所有包含于select列表中而未出现在组函数中的列,必须出现在group by 子句中。
作业:
1.Ben的领导是谁?
select st_name
from s_emp a join s_emp b
on a.id = b.manager_id
and b.first_name = 'Ben';
2.Ben领导谁?
select a.first_name leader,b.first_name employee
from s_emp a join s_emp b
on a.id = b.manager_id
and a.first_name = 'Ben';
3.哪些员工的工资高于他直接上司的工资,列出员工的名字和工资,上司的名字和工资。
select e.first_name employee,e.salary,l.first_name leader,l.salary
from s_emp e join s_emp l
on e.manager_id = l.id
and e.salary > l.salary;
4.那些员工和Biri(last_name)同部门
select st_name,a.dept_id,st_name,b.dept_id
from s_emp a join s_emp b
on a.dept_id = b.dept_id
and st_name = 'Biri';
5.那些员工跟Smith(last_name)坐一样的职位
select st_name,a.title,st_name,b.title
from s_emp a join s_emp b
on a.title = b.title
and st_name = 'Smith';
6.那些员工跟Biri不在同一个部门。
select st_name,a.dept_id,st_name,b.dept_id
from s_emp a join s_emp b
on a.dept_id <> b.dept_id
and st_name = 'Biri';
7.显示有提成的员工的信息:名字、提成、所在部门名称、所在地区名称。
select st_name,mission_pct, deptname, regionname
from s_emp a join s_dept b
on a.dept_id = b.id
join s_region c
on c.id = b.region_id;
8.显示Operations部门有哪些职位。
select distinct deptname,a.title from s_emp a join s_dept b
on a.dept_id = b.id
and = 'Operations';。