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

    xiaoxiao2022-07-06  220

    文章目录

    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;

    作用:查询第一条数据最大的作用是观察数据表的结构

    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;

    分页查询

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

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

    最新回复(0)