子查询
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]
文章介绍了SQL中的子查询用法,包括where子句、from子句和select后的子查询,以及如何使用子查询找到比平均工资高的员工和每个岗位的平均薪资等级。同时,讲解了union操作的效率和使用场景,以及limit在分页查询中的应用。
808

被折叠的 条评论
为什么被折叠?



