SQL子查询(二)

4.from/join子查询

from/join子查询通常为表子查询,在实际业务中,有时单个原始数据表中存储的现成字段无法涵盖分析所需的全部字段,这些需要处理的字段可能会分布在多个表中,需要依次进行计算之后再连接。from/join子查询也可以用来进行计算字段和原始数据表中数据列的比较,因为有些查询字句或函数并没有考虑数据重复的情况,直接使用它们进行查询容易导致结果丢失,因此在不确定数据的重复情况时,可以使用子查询来规避此类错误。

如:我们想要查询最高工资的员工,代码如下

select empno,ename,sal,emp.deptno from emp left join (select deptno,max(sal) as 最高工资 from emp group by deptno) as t

on emp.deptno=t.deptno where sal = 最高工资;

或者也可以使用开窗函数实现:

select emptno,ename,sal,deptno from (select *,dense_rank() over(partition by deptno order by sal desc) 工资排名 from emp) t where 工资排名=1;

5. where/having子查询

where/having子查询通常用于根据较为复杂的业务逻辑需求来对数据进行条件筛选,支持所有种类的字查询,并可以直接使用运算符来对子查询返回的结果集进行比较和筛选。如果子查询为标量子查询或者行子查询,即在只返回一条记录的前提下,可以直接使用>、>=、<、<=、=、<>/!=等比较操作字符来进行比较。如果子查询为列子查询或者表子查询,即返回多条记录,需要使用[not]in、any/some、all、[not]exists等关键词进行条件筛选,通常比较操作字符会直接添加在子查询外部括号的左边。

基础语法格式:

select <字段名列表> from  <表名> where expr operator(select <字段名列表> from <表名>);

1)比较操作字符

当返回的结果集为单行时,可以直接使用比较操作字符直接进行比较。如果记过集包含多个字段,需要使用括号将多个字段括起来,两侧字段的数据类型、个数顺序必须一一对应。

你可能感兴趣的:(SQL子查询(二))