mysql-DQL-子查询select-合并union-分页limit
一、子查询:select 语句中嵌套select语句,被嵌套的叫做子查询;出现位置:select-- (select)、from-- (select)、where-- (select)
- 1、select后面(select)子查询
- 案例:找出比最低工资高的员工姓名和工资(where子句中不能直接使用分组函数)
- 思路:
- 1、找出最低工资:select min(sal)from emp;
- 2、找出大于最低工资的:select ename,sal from emp where sal > 800;
- 3、合并: select ename,sal from emp where sal > (select min(sal) from emp);
- 2、 子查询:from后面(select):技巧:from后面的子查询,可以将子查询的查询结果当作一张临时表
- 案例:找出每个岗位的平均工资的薪资等级
- 思路:
- 1、找出每个岗位平均工资,按照岗位分组求平均值:select job,avg(sal) from emp group by job;
- 2、把以上查询结果当作一张单独存在的真实表格:t
- 3、把查询的薪资等级表当作一张真实存在的表:s ---- select *from salgrade;
- 4、t表和s表进行表连接,条件:t表avg(sal) between s.losal and s.hisal; 将t表,sql语句整体带入
- select t.*,s.grade
- from ( select job,avg(sal) as avgsal from emp group by job) t
- join salgrade s
- on t.avgsal between s.losal and s.hisal;
二、union 合并查询结果集
- 1、合并查询结果集:把乘法变为加法减少匹配次数,性能要快
- 2、union 在进行结果集 ,合并时要求两个结果集的列数相同
- 3、oracle数据库要求结果集合并时列和列的数据类型必须相同
- 案例:查询工作岗位是MANAGER和SELESMAN的员工:
- select ename,job from emp where job = 'MANAGER' or job = 'SELESMA';(效率低做乘法:笛卡尔积)
- union语句:(效率高做加法)
- select ename,job from emp where job = 'MANAGER'
- union
- select ename,job from emp where job = 'SELESMAN';
三、limit分页:
- 分页操作: limit (pageNo - 1) * pageSize , pageSize
- 重要:每页显示几条起始下标(pageNo - 1)*pageSize,pageNo页码;pageSize记录:
- 每页显示三条记录
- 第一页:limit 0,3 [0 1 2] 第一页起始下标:(1-1)*3
- 第二页:limit 3,3 [3 4 5] 第二页起始下标:(2-1)*3
- 第三页:limit 6,3 [6 7 8] 第三页起始下标:(3-1)*3
- 1、将查询结果集的一部分取出来通常使用在分页查询中;用来提高用户体验,一次性全查询出来,用户体验差。
- 2、语法:limit(startIndex,length):(从零开始的计算的起始下标 , 长度就是包含几条数据)
- 3、注意:mysql中limit在order by之后执行!
- 案例:按照薪资降序,去除排名前五的员工:
- select ename,sal
- from emp
- order by sal desc
- limit 0,5
- 取出来3-5名员工的姓名,工资?
- select ename,sal
- from emp
- order by sal desc
- limit 2,3; (2表示起始位置的下标从零开始,排名第三下标是2, 3表示长度,3、4、5三条数据;)
四、DQL关键字书写顺序:
- 书写顺序:select--from--where--group by--having--order by--limit
- 执行顺序:
- 1/from
- 2/where
- 3/group by
- 4/having
- 5/select
- 6/order by
- 7/limit