七、 复合查询(重点)
7.1 多表查询(案例:公司管理系统,有三张表EMP,DEPT,SALGRADE)
eg1:显示雇员名、雇员工资以及所在部门的名字。(上面的数据来自EMP和DEPT表,因此要联合查询)
select EMP.ename, EMP.sal, DEPT.dname from EMP, DEPT where EMP.deptno = DEPT.deptno;
eg2:显示部门号为10的部门名,员工名和工资。
select ename, sal,dname from EMP, DEPT where EMP.deptno=DEPT.deptno and DEPT.deptno= 10;
eg3:显示各个员工的姓名,工资,及工资级别。
select ename, sal, grade from EMP, SALGRADE where EMP.sal between losal and hisal;
7.2 自连接
自连接是指在同一张表连接查询
eg1:显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)
使用的子查询:
select empno,ename from emp where emp.empno=(select mgr from emp where ename='FORD');
使用多表查询(自查询):
-- 使用到表的别名
select leader.empno,leader.ename from emp leader, emp worker where leader.empno =worker.mgr and worker.ename='FORD';
7.3 子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询.
7.3.1 单行子查询(单行子查询是指子查询只返回单列,单行数据)
eg:显示SMITH同一部门的员工
select * from EMP WHERE deptno = (select deptno from EMP where ename='smith');
7.3.2 多行子查询(多行子查询是指返回单列多行数据)
(1)in关键字;
eg:查询和10号部门的工作相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
select ename,job,sal,empno from emp where job in (select distinct job from emp where deptno=10) and deptno<>10;
(2)all关键字;
eg:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
select ename, sal, deptno from EMP where sal > all(select sal from EMP where deptno=30);
(3)any关键字;
eg:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号
select ename, sal, deptno from EMP where sal > any(select sal from EMP where deptno=30);
7.3.3 多列子查询(多列子查询则是指查询返回多个列数据的子查询语句)
eg:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
select ename from EMP where (deptno, job)=(select deptno, job from EMP where ename='SMITH') and ename <> 'SMITH';
7.3.4 在from子句中使用子查询(把一个子查询当做一个临时表使用)
eg:显示高于自己部门平均工资的员工的姓名、部门、工资、平均工资
select ename, deptno, sal, format(asal,2) from EMP, (select avg(sal) asal, deptno dt from EMP group by deptno) tmp bwhere EMP.sal > tmp.asal and EMP.deptno=tmp.dt;
7.3.5 合并查询
(1)union (该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行)
eg:将工资大于2500或职位是MANAGER的人找出来
select ename, sal, job from EMP where sal>2500 union (select ename, sal, job from EMP where job='MANAGER');
(2)union all (该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行)
eg:将工资大于25000或职位是MANAGER的人找出来
select ename, sal, job from EMP where sal>2500 union all (select ename, sal, job from EMP where job='MANAGER');