oracle子查询,分页查询 的运用

子查询

子查询是一条查询语句,它是嵌套在其他SQL
语句当中的,作用是为外层的SQL提供数据的。
子查询常用在查询语句中,当然也可以用在
DML,DDL中。

查看与FORD同部门的员工?
SELECT ename,sal,deptno
FROM emp
WHERE deptno=(SELECT deptno
FROM emp
WHERE ename=’FORD’)

SELECT ename,sal,deptno
FROM emp
WHERE job=(SELECT job
FROM emp
WHERE ename=’SMITH’)

查看比公司平均工资高的员工信息?
SELECT ename,sal,deptno
FROM emp
WHERE sal>(SELECT AVG(sal) FROM emp)

在DDL(create,alter,drop)中使用子查询
可以基于一个子查询的结果集当做表快速
的创建出来。

创建表employee
字段:empno,ename,mgr,sal,job,deptno,
dname,loc
数据是基于表中emp,dept现有数据。
CREATE TABLE employee
AS
SELECT
e.empno,e.ename,e.mgr,e.sal,
e.job,d.deptno,d.dname,d.loc
FROM
emp e LEFT OUTER JOIN dept d
ON
e.deptno=d.deptno

DESC employee
SELECT * FROM employee

子查询在DML(select,delete, update, insert)中的应用
将SMITH所在部门的所有员工工资上浮10%
UPDATE emp
SET sal=sal*1.1
WHERE deptno=(SELECT deptno
FROM emp
WHERE ename=’SMITH’)

子查询根据查询结果不同分为:

单行单列,多行单列:常用在WHERE作为过滤条件
多行多列:常当做表看待

当判断的是一个多行单列子查询结果时,通常
要配合IN,ANY,ALL使用。

查看与职位是SALESMAN同部门的其他职位员工?
SELECT ename,job,deptno
FROM emp
WHERE deptno IN (SELECT deptno
FROM emp
WHERE job=’SALESMAN’)
AND job <> ‘SALESMAN’

查看比SALESMAN和CLERK职位工资都高的员工?
SELECT ename,sal
FROM emp
WHERE
sal>ALL(SELECT sal FROM emp
WHERE
job IN(‘SALESMAN’,’CLERK’)
)

EXISTS关键字
EXISTS在WHERE中使用,后面跟一个子查询,
子查询的结果不关注具体值,只关注是否能
查询出数据,只要可以则条件成立。

查看有员工的部门信息?
SELECT deptno, dname FROM dept d
WHERE
EXISTS (SELECT * FROM emp e
WHERE d.deptno = e.deptno)

查询部门的最低薪水,前提是要高于30号部门
的最低薪水?
SELECT MIN(sal),deptno
FROM emp
GROUP BY deptno
HAVING
MIN(sal)>(SELECT MIN(sal)
FROM emp
WHERE deptno=30)

FROM子句中使用子查询
该子查询是当做一张表使用的。

查看比自己所在部门平均工资高的员工?
SELECT e.ename,e.sal,e.deptno
FROM emp e,
(SELECT AVG(sal) avg_sal,
deptno
FROM emp
GROUP BY deptno) t
WHERE e.deptno=t.deptno
AND e.sal>t.avg_sal

SELECT
e.ename, e.sal,
(SELECT d.dname FROM dept d
WHERE d.deptno = e.deptno) dname
FROM emp e

分页查询

分页查询其实就是将数据分段查询出来,当数据
量大的时候经常会使用分页查询技术,这样可以
减少资源开销,提高系统响应速度。
标准SQL中没有定义分页语法,所以不同的数据
库的分页语法不一样。

ORACL中使用伪列ROWNUM实现
ROWNUM是一个伪列,并不存在与任何表中,但
是所有的表都可以查询该字段,而该字段的值
就是查询出来的结果集中每条记录的行号,从1
开始自动递增。ROWNUM字段的值生成是伴随查
询进行的过程中的。每当可以从表中查询出一
条记录,那么ROWNUM的值就是该条查询出来记
录的行号。

由于ROWNUM的值时查询过程中动态生成,并从
1开始所以在使用ROWNUM对结果集编行号时不
要使用ROWNUM在WHERE中做>1以上数字的判断,
否则查不到任何数据
SELECT ROWNUM,ename,sal,deptno
FROM emp
WHERE ROWNUM > 1

SELECT *
FROM (SELECT ROWNUM rn,ename,
sal,deptno
FROM emp)
WHERE rn BETWEEN 6 AND 10

SELECT ename,sal,deptno
FROM emp
ORDER BY sal DESC

SELECT *
FROM(SELECT ROWNUM rn,t.*
FROM(SELECT ename,sal,deptno
FROM emp
ORDER BY sal DESC) t)
WHERE rn BETWEEN 6 AND 10

SELECT *
FROM(SELECT ROWNUM rn,t.*
FROM(SELECT ename,sal,deptno
FROM emp
ORDER BY sal DESC) t
WHERE ROWNUM<=10)
WHERE rn>=6

pageSize(每页显示的条目数):5
page(页数):2

start:(page-1)*pageSize+1
end:pageSize*page

DECODE函数,可以实现简单的分支结构
SELECT
ename, job, sal,
DECODE(job,
‘MANAGER’, sal * 1.2,
‘ANALYST’, sal * 1.1,
‘SALESMAN’, sal * 1.05,
sal
) bonus
FROM emp

SELECT COUNT(1),job
FROM emp
GROUP BY job

SELECT
COUNT(1),DECODE(job,
‘MANAGER’,’VIP’,
‘ANALYST’,’VIP’,
‘OTHER’)
FROM emp
GROUP BY DECODE(job,
‘MANAGER’,’VIP’,
‘ANALYST’,’VIP’,
‘OTHER’)

你可能感兴趣的:(数据库)