EXISTS子查询、ROWNUM伪列的使用、分页查询

文章目录

  • EXISTS子查询
  • ROWNUM伪列的使用
  • 分页查询

EXISTS子查询

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伪列的使用

概念:

ROWNUM是在查询过程中动态生成的一个列,该列其实也很像一个字段,但是这个列不是数据表的数据,而是在查询中动态生成的而且该列必须从1开始。

DEMO:使用ROWNUM查询emp表的第一条数据

SELECT ROWNUM AS rn ,empno,ename,job,sal,mgr,hiredate,comm,deptno
	FROM emp
	 WHERE ROWNUM=1;

EXISTS子查询、ROWNUM伪列的使用、分页查询_第1张图片
作用:查询第一条数据最大的作用是观察数据表的结构

DEMO:使用ROWNUM查询emp表的第二条数据

SELECT ROWNUM AS rn ,empno,ename,job,sal,mgr,hiredate,comm,deptno
	FROM emp
	 WHERE ROWNUM=2;

EXISTS子查询、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;

EXISTS子查询、ROWNUM伪列的使用、分页查询_第3张图片

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;

EXISTS子查询、ROWNUM伪列的使用、分页查询_第4张图片

分页查询

要实现分页需要知道两个参数:

  • currentPage:表示当前页(cp)
  • linesize:表示每页显示的数据量(ls)

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=currentPage
lineSize

DEMO:每页显示4条数据查询出第3页的数据
m=(3-1)4+1=9
n=3
4=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。

实现的基本语法:
EXISTS子查询、ROWNUM伪列的使用、分页查询_第5张图片

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

你可能感兴趣的:(原创)