目录

复合查询与表的外连接

多表查询

自连接

子查询:

单行子查询

多行子查询

在from子句中使用子查询

表的连接分为内连和外连

内连接

外连接(重点)

左外链接:

右外连接:

复合查询与表的外连接

多表查询

  • emp表中的deptno=dept表中的deptno字段记录
select emp.ename,eap.sal,dept.dname from emp,dept 
   where emp.deptno = dept.deptno;
  • 显示部门号为10的部门名,员工名和工资
select ename, sal,dname from emp, dept where 
    emp.deptno=dept.deptno and dept.deptno = 10;
  • 显示各个员工的姓名,工资,及工资级别
select ename,sal, grade from emp, salgrade where 
    emp.sal between losal and hisal;

自连接

自连接是指在同一张表连接查询

显示员工from 上级领导的编号和姓名

  • 使用字查询:
select empno,ename from emp where 
    empno =(select mgr from emp where ename = 'from');
  • 使用多表查询:

--使用到表的名称

select leader.empno,leader.ename from emp leader,emp worker where 
leader.empno = worker.mgr and worker.ename = 'ford';

子查询:

是嵌入在其他SQL语句中的select语句,也叫嵌套查询

单行子查询

返回一行记录的子查询

  • 显示SMITH同一部门的员工
select * from emp where deptno = 
    (select deptno from emp where ename = 'smith');

多行子查询

返回多行记录的子查询

  • in关键字;

查询和10号部门的工作相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的

select ename,job,sal,empno from emp where 
  job in(select distinct job from emp where deptno = 10) 
     and deptno <>10;
  • all关键字
select ename, sal, deptno from emp where 
    sal > all(select sal from emp where deptno=30);
  • any关键字
select ename, sal, deptno from emp where 
   sal > any(select sal from emp where deptno=30);

在from子句中使用子查询

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用

  • 显示高于自己部门平均工资的员工的姓名、部门、工资、平均工资

   ---获取各个部门的平均工资,将其看作临时表

select ename, deptno, sal, format(asal,2) from emp, 
(select avg(sal) asal, deptno dt from emp group by deptno) tmp 
   where EMP.sal > tmp.asal and emp.deptno=tmp.dt;
  • 查找每个部门工资最高的人的姓名、工资、部门、最高工资
select emp.ename, emp.sal, emp.deptno, ms from emp, 
(select max(sal) ms, deptno from emp group by deptno) tmp 
   where emp.deptno=tmp.deptno and EMP.sal=tmp.ms;
  • 显示每个部门的信息(部门名,编号,地址)和人员数量

方法1:使用多表

select dept.dname,dept.deptno,dept.loc,count(*)'部门人数' from emp, dept 
 where emp.deptno = dept.deptno group by dept.deptno,dept.dname,dept.loc;

方法2:使用子查询

   1. 对EMP表进行人员统计

select count(*), deptno from emp group by deptno;

   2. 将上面的表看作临时表

select dept.deptno, dname, mycnt, loc from dept, 
 (select count(*) mycnt, deptno from emp group by deptno) 
   tmp where dept.deptno=tmp.deptno;

表的连接分为内连和外连

内连接

实际上就是利用where子句对两种表形成的笛卡儿进行筛选

语法:

select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件

例子:

显示SMITH的名称和部门名称

  •   标准写法
select ename,dname from emp inner join dept on 
    emp.deptno = dept.deptno and ename = 'SMITH';

外连接(重点)

外连接分为左外连接和右外连接

左外链接:

左侧的表完全显示

select 字段名 from 表1 left join 表2 on 连接条件;

右外连接:

右侧的表完全显示

select * from 表名1 right join 表名2 on 连接条件;