数据库之复合查询

文章目录

  • 1. 基本查询回顾
  • 2. 多表查询
  • 3. 自连接
  • 4. 子查询
    • 4.1 单行子查询
    • 4.2 多行子查询
    • 4.3 多列子查询
    • 4.4 在from子句中使用子查询
    • 4.5 合并查询
      • 4.5.1 union
      • 4.5.3 union all

1. 基本查询回顾

  • 显示工资最高的员工姓名和其工作岗位
    select ename,job from EMP where sal=(select max(sal) from EMP);
  • 显示工资高于平均工资的员工信息
    select ename,sal from EMP where sal>(select avg(sal) from EMP);
  • 显示平均工资低于2000的部门号和它的平均工资
    select deptno, avg(sal) as avg_sal from EMP group by deptno having avg_sal<2000;
  • 显示每种岗位的雇员总数,平均工资
    select job,count(*), format(avg(sal), 2) from EMP group by job;

WHERE 分组前做筛选
HAVING 分组后做筛选

2. 多表查询

       数据来自不同的表,所以需要多表查询。

  • 显示雇员名、雇员工资以及所在部门的名字。因为上面的数据来自EMP和DEPT表,因此要联合查询
    select EMP.ename, EMP.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;

3. 自连接

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

  • 显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno)
    select empno,ename from emp where emp.empno=(select mgr fom emp where ename='FORO');----子查询 select t leader.empno,leader.ename from emp leader, emp worker where leader.empno = worker.mgr and worker.ename='FORD';----多表查询(自查询)

4. 子查询

       子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。

4.1 单行子查询

       返回一行记录的子查询,单行子查询是指子查询只返回单列,单行数据。

  • 显示SMITH同一部门的员工

select * from EMP WHERE deptno = (select deptno from EMP where ename='smith');

4.2 多行子查询

       返回多行记录的子查询,多行子查询是指返回单列多行数据

  • 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关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
    select ename, sal, deptno from EMP where sal > all(select sal from EMP where deptno=30);
  • any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号
    select ename, sal, deptno from EMP where sal > any(select sal from EMP where deptno=30);

4.3 多列子查询

       多列子查询则是指查询返回多个列数据的子查询语句

  • 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
    seelct ename from EMP where (deptno, job)=(select deptno, job from EMP where ename='SMITH') and ename<>'SMITH';

4.4 在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.deptno=tmp.deptno and EMP.sal=tmp.ms;
  • 查找每个部门工资最高的人的姓名、工资、部门、最高工资
    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;

4.5 合并查询

       为了合并多个select的执行结果,可以使用集合操作符 union,union all

4.5.1 union

       该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

  • 将工资大于2500或职位是MANAGER的人找出来
    select ename, sal, job from EMP where sal>2500 union select ename, sal, job from EMP where job='MANAGER';--去掉了重复记录

4.5.3 union all

       该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
select ename, sal, job from EMP where sal>2500 union all select ename, sal, job from EMP where job='MANAGER';

你可能感兴趣的:(数据库)