EXISTS子查询的特征:
将主查询中的数据带到子查询中进行验证,如果验证成功则子查询返回true,
当主查询接收true的时候被验证的数据就显示,如果在子查询中验证失败返回false,当主查询接收到false的时候被验证的数据就不显示。
查询出有部门的雇员的雇员的信息
INSERT INTO emp(empno,ename,job,sal,mgr,hiredate,comm) VALUES (1001,'张三','CLERK',12000.00,SYADATE,1000.00);
COMMTT;(提交数据)
SELECT *
FROM emp
WHERE deptno IS NOT NULL;
SELECT *
FROM emp
WHERE deptno IN (SELECT deptno FROM dept);
SELECT *
FROM emp e
WHERE EXISTS(SELECT * FROM dept d WHERE e.deptno=d.deptno);
查询出还没有的雇员的雇员的信息
SELECT *
FROM emp e
WHERE NOT EXISTS (SELECT * FROM dept d WHERE e.deptno=d.deptno);
使用NOT EXISTS的时候也是将主查询中的数据带入子查询进行验证,如果验证成功返回false,
主查询接收到false则不显示数据,反之则显示数据。
概念:
ROWNUM是在查询过程中动态生成的一个列,该列其实也很像一个字段,但是这个列不是数据表的数据,而是在查询中动态生成的而且该列必须从1开始。
DEMO:使用ROWNUM查询emp表的第一条数据
SELECT ROWNUM AS rn ,empno,ename,job,sal,mgr,hiredate,comm,deptno
FROM emp
WHERE ROWNUM=1;
DEMO:使用ROWNUM查询emp表的第二条数据
SELECT ROWNUM AS rn ,empno,ename,job,sal,mgr,hiredate,comm,deptno
FROM emp
WHERE ROWNUM=2;
此时直接使用ROWNUM查询第二条数据的时候没有任何显示,原因ROWNUM是动态生成的,而且必须从1开始,这里直接使用ROWNUM=2就无法查询到数据
使用ROWNUM取得emp表中的前5条数据
SELECT ROWNUM AS rn ,empno,ename,job,sal,mgr,hiredate,comm,deptno
FROM emp
WHERE ROWNUM<=5;
DEMO:取得6到10行数据
SELECT *
FROM(
SELECT ROWNUM AS rn ,empno,ename,job,sal,mgr,hiredate,comm,deptno
FROM emp
WHERE ROWNUM <=10) temp
WHERE temp.rn>=6;
要实现分页需要知道两个参数:
DEMO:查询第一页数据,每页显示三条数据(emp表)
currentPage=1,lineSize=3:从数据表中取得1~3条数据
SELECT *
FROM (
SELECT ROWNUM AS rn,empno,ename,job,mgr,hiredate,sal,comm,deptno
FROM emp WHERE ROWNUM<=3)temp
WHERE temp.rn>=1;
DEMO:查询第二页数据,每页显示三条数据
currentPage=2,lineSize=3:从4~6条数据
SELECT *
FROM (
SELECT ROWNUM AS rn,empno,ename,job,mgr,hiredate,sal,comm,deptno
FROM emp WHERE ROWNUM<=6)temp
WHERE temp.rn>=4;
DEMO:查询第三页数据,每页显示三条数据
currentPage=3,lineSize=3:从7~9条数据
SELECT *
FROM (
SELECT ROWNUM AS rn,empno,ename,job,mgr,hiredate,sal,comm,deptno
FROM emp WHERE ROWNUM<=9)temp
WHERE temp.rn>=7;
通过以上例子可以总结出:当前页(cp)和每页显示的数据量(ls),
就可以计算出要从数据库中第m条查询到第n条数据
m=(currentPage-1)lineSize+1
n=currentPagelineSize
DEMO:每页显示4条数据查询出第3页的数据
m=(3-1)4+1=9
n=34=12
SELECT *
FROM (
SELECT ROWNUM AS rn,empno,ename,job,mgr,hiredate,sal,comm,deptno
FROM emp WHERE ROWNUM<=12) temp
WHERE temp.rn>=9;
以上分页查询是Oracle的实现方式(行号ROWNUM+FROM子查询),在mysql中直接使用一个关键字LIMIT m,n去实现,而SqlServer使用top关键字去实现。
DEMO:mysql中的分页查询
要在mysql中实现分页查询需要使用到一个关键字LIMIT,关键字之后需要两个参数m,n。
m的含义表示从数据库的第m条开始查询(mysql中的第一条数据m=0)
n的含义是从第m条数据开始往后查询n条数据。
查询第1页数据,每页显示3条数据
mysql>SELECT *
FROM emp
LIMIT 0,3;
查询第1页数据,每页显示4条数据
mysql>SELECT *
FROM emp
LIMIT 0,4;
查询第2页数据,每页显示5条数据
mysql>SELECT *
FROM emp
LIMIT 5,5;
通过以上例子可以总结出公示如下:
m=(cp-1)*ls
n=ls