子查询
select
语句中嵌套 select
语句,被嵌套的 select
语句称为子查询
select
..(select).
from
..(select).
where
..(select).
-
where
子句中的子查询注意:后面不能直接加分组函数
# 找出比平均工资高的员工姓名和薪资 select ename, sal from emp where sal > (select avg(sal) from emp);
回到之前的内容:
where
之后不能加多行处理函数,这种SQL语句是不允许的:select ename, sal from emp where sal > avg(sal);
-
from
子句中的子查询from
后面的子查询,可以将子查询的查询结果当做一张临时表# 找出每个岗位的平均工资的薪资等级 # 找出每个岗位的平均工资 -> 将其作为新表和salgrade连接 select s.grade, t.* from salgrade s join (select job,avg(sal) as average from emp group by job) t on t.average between s.losal and s.hisal; +-------+-----------+-------------+ | grade | job | average | +-------+-----------+-------------+ | 1 | CLERK | 1037.500000 | | 2 | SALESMAN | 1400.000000 | | 4 | MANAGER | 2758.333333 | | 4 | ANALYST | 3000.000000 | | 5 | PRESIDENT | 5000.000000 | +-------+-----------+-------------+
-
select
后的子查询,只能返回一条结果,多于一条就报错# 找出每个员工的部门名称,要求显示员工名,部门名? select e.ename,e.deptno,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;
union
union
的效率更高,可以减少匹配次数
进行该操作时,要求两个结果集的列数相同、列和列的数据类型也相同)
示例:查询工作岗位是manager或salesman的员工姓名和岗位
# 方法1,使用or
select ename, job from emp where job = 'manager' or job = 'salesman';
# 方法2,使用in
select ename, job from emp where job in('manager', 'salesman');
# 方法3,使用
select ename, job from emp where job='manager'
union
select ename, job from emp where job='salesman';
limit
limit
是将结果的一部分取出,通常使用在分页查询中
使用方法:limit startIndex, length
or limit toIndex
这里的index是从0开始计数的
示例:按照薪资降序,取出排名在前5的员工
select
ename,sal
from
emp
order by
sal desc
limit 5; // or limit 0, 5
注意:limit
在order by之后执行
使用 limit
分页:
每页显示pageSize条记录
第pageNo页:limit (pageNo - 1) * pageSize, pageSize
eg. 第1页:limit 0, 3 [0, 1, 2]