【MySQL系列笔记】- 第四章 - 子查询和limit, union

子查询

select 语句中嵌套 select 语句,被嵌套的 select 语句称为子查询

select
	..(select).
from
	..(select).
where
	..(select).
  1. where 子句中的子查询

    注意:后面不能直接加分组函数

    # 找出比平均工资高的员工姓名和薪资
    select 
    	ename, sal
    from 
    	emp
    where 
    	sal > (select avg(sal) from emp);
    

    回到之前的内容:where之后不能加多行处理函数,这种SQL语句是不允许的:

    select ename, sal from emp where sal > avg(sal);
    
  2. 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 |
    +-------+-----------+-------------+
    
  3. 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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值