day08—SQL高级查询
2016-03-03 23:39
453 查看
目标
1、子查询
2、分页查询
3、DECODE函数
4、排序函数
子查询:嵌入在其它SQL语句中的SELECT语句,大部分时候出现在WHERE子句中。
ps:本章学习内容所用数据表格请见:
/article/3701936.html
一、子查询在WHERE子句中:
--查找和SCOTT同职位的员工
--查找薪水比整个机构平均薪水高的员工
--查询出部门中有SALESMAN但职位不是SALESMAN的员工的信息
--列出来那些有员工的部门信息
子查询在H***ING部分:
--查询列出最低薪水高于部门30的最低薪水的部门信息
--查询出薪水比本部门平均薪水高的员工信息
子查询在SELECT部分:
把子查询放在SELECT子句部分,可以认为是外连接的另一种表现形式,使用更灵活:
二、分页查询
ROWNUM:
ROWNUM被称作伪列,用于返回标识行数据顺序的数字。例如:
如图:
ROWNUM只能从1计数,不能从结果集中直接截取。下面的查询语句将没有结果:
如果利用ROWNUM截取结果集中的部分数据,需要用到行内视图:
也就是将ROWNUM先作为行内视图的一个列,在主查询中就可以使用这个列值作为条件。
三、DECODE函数
DECODE:基本语法
DECODE (expr, search1, result1[, search2, result2…][, default])
查询职员表,根据职员的职位计算奖励金额,当职位分别是’MANAGER’、’ANALYST’、’SALESMAN’时,奖励金额分别是薪水的1.2倍、1.1倍、1.05倍,如果不是这三个职位,则奖励金额取薪水值
和DECODE函数功能相似的有CASE语句,实现类似于if-else的操作。
DECODE函数可以按字段内容分组。
例如:计算职位的人数,analyst/manager职位属于vip,其余是普通员工operation
四、排序函数
ROW_NUMBER:语法如下
ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2排序。此函数计算的值就表示每组内部排序后的顺序编号,组内连续且唯一。
ROWNUM是伪列, ROW_NUMBER功能更强,可以直接从结果集中取出子集。
按照部门编码分组显示,每组内按职员编码排序,并赋予组内编码
RANK:语法如下
RANK() OVER(PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2给予等级标识,即排名,相同的数据返回相同排名。特点是跳跃排序,如果有相同数据,则排名相同,比如并列第一,则两行数据都标记为1,但下一位将是第三名。
DENSE_RANK:语法如下
DENSE_RANK() OVER(PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2给予等级标识,即排名,相同的数据返回相同排名。特点是连续排序,如果有并列第二,下一个排序将是三,这一点是和RANK的不同,RANK是跳跃排序。
关联emp和dept表,按照部门编码分组,每组内按照员工薪水排序,列出员工的部门名字、姓名和薪水
本章学习到此结束,欢迎广大博友讨论指点。
1、子查询
2、分页查询
3、DECODE函数
4、排序函数
子查询:嵌入在其它SQL语句中的SELECT语句,大部分时候出现在WHERE子句中。
ps:本章学习内容所用数据表格请见:
/article/3701936.html
一、子查询在WHERE子句中:
--查找和SCOTT同职位的员工
<span style="white-space:pre"> </span>select job from emp where ename='scott'; --查找scott的职位 <span style="white-space:pre"> </span>select * from emp where job = (select job from emp where ename='scott');
--查找薪水比整个机构平均薪水高的员工
<span style="white-space:pre"> </span>select avg(nvl(sal,0)) from emp; --查找整个机构所有员工的平均薪水 <span style="white-space:pre"> </span>select * from emp where sal>(select avg(nvl(sal,0)) from emp);
--查询出部门中有SALESMAN但职位不是SALESMAN的员工的信息
<span style="white-space:pre"> </span>select deptno from emp where job='salesman'--查找部门中有SALESMAN的部门 <span style="white-space:pre"> </span>select * from emp where deptno in (select deptno from emp where job='salesman')and job != 'salesman';
--列出来那些有员工的部门信息
<span style="white-space:pre"> </span>select * from dept d where exists(select * from emp e where e.deptno=d.deptno)
子查询在H***ING部分:
--查询列出最低薪水高于部门30的最低薪水的部门信息
<span style="white-space:pre"> </span>select min(sal) from emp where deptno=30;--查询部门30的最低薪水 <span style="white-space:pre"> </span>select deptno ,min(sal) from emp group by deptno;--查找每个部门的最低薪水 <span style="white-space:pre"> </span>select deptno ,min(sal) from emp group by deptno having min(sal) >(select min(sal) from emp where deptno=30);
--查询出薪水比本部门平均薪水高的员工信息
<span style="white-space:pre"> </span>select deptno,avg(sal) from emp group by deptno;--查询每个部门的平均薪水 <span style="white-space:pre"> </span>select * from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) t1 <span style="white-space:pre"> </span>where e.deptno=t1.deptno and e.sal>t1.avgsal;
子查询在SELECT部分:
把子查询放在SELECT子句部分,可以认为是外连接的另一种表现形式,使用更灵活:
<span style="white-space:pre"> </span>select e.ename, e.sal, e.deptno, (select d.deptno from dept d where d.deptno = e.deptno) deptno FROM emp e;
二、分页查询
ROWNUM:
ROWNUM被称作伪列,用于返回标识行数据顺序的数字。例如:
<span style="white-space:pre"> </span>select rownum , empno, ename, sal from emp;
如图:
ROWNUM只能从1计数,不能从结果集中直接截取。下面的查询语句将没有结果:
<span style="white-space:pre"> </span>select rownum , empno, ename, sal from emp where rownum > 3;
如果利用ROWNUM截取结果集中的部分数据,需要用到行内视图:
<span style="white-space:pre"> </span>select * from (select rownum rn , e.* from emp e ) where rn between 8 and 10;
也就是将ROWNUM先作为行内视图的一个列,在主查询中就可以使用这个列值作为条件。
三、DECODE函数
DECODE:基本语法
DECODE (expr, search1, result1[, search2, result2…][, default])
查询职员表,根据职员的职位计算奖励金额,当职位分别是’MANAGER’、’ANALYST’、’SALESMAN’时,奖励金额分别是薪水的1.2倍、1.1倍、1.05倍,如果不是这三个职位,则奖励金额取薪水值
<span style="white-space:pre"> </span>select ename,job,sal,decode(job,'MANAGER',sal*1.2,'ANALYST',sal*1.1,'SALESMAN',sal*1.05,sal) sal2
<span style="white-space:pre"> </span>from emp order by job;
和DECODE函数功能相似的有CASE语句,实现类似于if-else的操作。
<span style="white-space:pre"> </span>select ename,job,sal, <span style="white-space:pre"> </span>case job <span style="white-space:pre"> </span>when 'MANAGER' then sal*1.2 <span style="white-space:pre"> </span>when 'ANALYST' then sal*1.1 <span style="white-space:pre"> </span>when 'SALESMAN' then sal*1.05 <span style="white-space:pre"> </span>else sal <span style="white-space:pre"> </span>end sal2 from emp order by job;得到的结果和上图一样。
DECODE函数可以按字段内容分组。
例如:计算职位的人数,analyst/manager职位属于vip,其余是普通员工operation
四、排序函数
ROW_NUMBER:语法如下
ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2排序。此函数计算的值就表示每组内部排序后的顺序编号,组内连续且唯一。
ROWNUM是伪列, ROW_NUMBER功能更强,可以直接从结果集中取出子集。
按照部门编码分组显示,每组内按职员编码排序,并赋予组内编码
<span style="white-space:pre"> </span>select deptno ,ename ,empno ,ROW_NUMBER() over(partition by deptno order by empno ) emp_id from emp;
RANK:语法如下
RANK() OVER(PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2给予等级标识,即排名,相同的数据返回相同排名。特点是跳跃排序,如果有相同数据,则排名相同,比如并列第一,则两行数据都标记为1,但下一位将是第三名。
<span style="white-space:pre"> </span>select deptno, ename ,sal,rank() over(partition by deptno order by sal desc) rank_id from emp;
DENSE_RANK:语法如下
DENSE_RANK() OVER(PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2给予等级标识,即排名,相同的数据返回相同排名。特点是连续排序,如果有并列第二,下一个排序将是三,这一点是和RANK的不同,RANK是跳跃排序。
关联emp和dept表,按照部门编码分组,每组内按照员工薪水排序,列出员工的部门名字、姓名和薪水
<span style="white-space:pre"> </span>select d.dname,e.ename,e.sal,dense_rank() over( partition by e.deptno order by sal desc ) from emp e,dept d
<span style="white-space:pre"> </span>where e.dptno = d.deptno;
本章学习到此结束,欢迎广大博友讨论指点。
相关文章推荐
- redis和memcached的区别
- Celery+rabbitmq+mysql+flower
- 如何在 Ubuntu 15.04 上安装带 JSON 支持的 SQLite 3.9
- 30分钟带你快速入门MySQL教程
- Redis杂记
- 实现两个MySQL数据库之间的主从同步
- Oracle以及SDE维护常用命令-查看表空间等
- MySQL 5.7新特性之Generated Column(函数索引)
- MongoDB学习—(2)shell的基本操作
- Java中使用Jedis操作Redis
- MySQL 'localhost' (10061)解决方法
- C# 和SQL Server 类型转换
- sql server 触发器
- MySQL数据库的常用命令
- sql server 触发器
- ORACLE 12c 固定表2
- ORACLE 12c 固定表1
- ORACLE 12c 所有latch name
- Sql去重及查询重复
- ORACLE 12c 支持的hint 命令