• Oracle,第四周


    查询

      SQL的执行顺序 : 从右向左。

      GROUP BY HAVING

        GROUP BY 根据某个字段分组显示。HAVING 指从分组结果进行过滤。

        当使用GROUP BY 时,查询显示的字段只能在GROUP BY里,或使用分组函数。如 : SELECT ename,deptno FROM emp GROUP BY ename,deptno;

      分组函数 : MAX(column),MIN(column),SUM(column),AVG(column),COUNT(column)

        COUNT(*) 和 COUNT(column) 的区别 : COUNT(*)会将NULL 放入统计结果, COUNT(column) 不会将NULL 放入统计结果

        如果有10条数据,name这一列都为null,那么 COUNT(*) 返回 10, COUNT(name) 返回 0。

      ORDER BY

        ASC(ascend), 升序(默认)

        DESC(descend),降序

      注意 ORDER BY 不能用于子查询,因为子查询出来的结果并不显示,所以ORDER BY 是没意义的。

        如  SELECT * FROM emp WHERE deptno IN(SELECT deptno FROM dept WHERE dname IS NOT NULL ORDER BY deptno)

      LIKE

        用于模糊查询, % 指所有, _ 指任意单个字符。

      ALL() 和 ANY()

        查询10号部门大于20部门的所有人工资的信息,SELECT * FROM emp WHERE deptno=10 sal > ALL(SELECT sal FROM emp WHERE deptno=20);

        查询10号部门大于20部门的任意人工资的信息,SELECT * FROM emp WHERE deptno=10 sal > ANY(SELECT sal FROM emp WHERE deptno=20);

      合并查询 : 将两张表的查询结果进行合并

        UNION :  去除重复,并排序

        UNION ALL : 不去除重复,不排序

        INSERECT : 取交集

        MINUS : 取差集

    连接查询

      内连接(默认): INNER JOIN  ON  (两张表进行条件判断时,满足ON条件的显示)

      左外连接 : LEFT JOIN ON  (两张表进行条件判断时,以左表为准, 满足ON条件的显示,不满足ON条件的左表记录也会显示)

      右外连接 : RIGHT JOIN ON(两张表进行条件判断时,以右表为准, 满足ON条件的显示,不满足ON条件的右表记录也会显示)

      全外连接 : OUT JOIN ON(不满足ON条件,两张表记录都会显示)

      (+)  写在 = 右边的为左连接, 写在 = 左边的为右连接  如 :

      SELECT * FROM emp e,dept d WHERE e.deptno = d.deptno(+); 等于 SELECT * FROM emp e LEFT JOIN ON dept d ON e.deptno = d.deptno;

      SELECT * FROM emp e,dept d WHERE e.deptno(+) = d.deptno; 等于 SELECT * FROM emp e RIGHT JOIN ON dept d ON e.deptno = d.deptno;

    分页

      分页一定要抓住几个要点 :  总记录数, 每页显示多少记录数,当前页数。 数据库的查询只需知道当前查询的页,和每页显示记录数。

      MYSQL的分页 : LIMIT 关键字

        pageIndex 指的是查询的页,pageSize指的是每一页多少条记录数。

        SELECT * FROM emp WHERE [conditions] LIMIT (pageIndex - 1) * pageSize,pageSize;

        pageIndex = 1,pageSize= 10 时  LIMIT 0,10;  显示 0 - 9 的记录

        pageIndex = 2,pageSize= 10 时  LIMIT 10,10; 显示 10 - 19 的记录

        pageIndex = 3,pageSize= 10 时  LIMIT 20,10;  显示 20 - 29的记录

        LIMIT a,b  (a 代表 从哪一条开始 , b 代表 取多少条 并不是到哪一条结束)

      SQLSERVER 的分页 : TOP 关键字

        SELECT TOP pageSize FROM emp WHERE id NOT IN (SELECT TOP(pageIndex - 1)*pageSize  id FROM emp) ORDER BY id;

        pageSize = 10;

        当pageIndex = 1 时 : SELECT TOP 10 FROM emp WHERE id NOT IN (SELECT TOP 0 id FROM emp) 

        当pageIndex = 2 时 : SELECT TOP 10 FROM emp WHERE id NOT IN(SELECT TOP 10 FROM emp)

        NOT IN(SELECT TOP 10 FROM emp), 这里很关键, NOT IN(TOP 10) 也就是把TOP 10 的数据先排除出去,然后再取 TOP 10, 也就是取10 - 20 的数据。

       ORACLE 的分页 : ROWNUM 关键字

        ROWNUM,就像隐藏在表里的一个字段。每张表都会有这个字段。

        ORACLE 里面不能使用 如 ROWNUM >= 10 这样的条件,可能是处于速度的考虑。

        只能把 ROWNUM 查出来当做某临时表的字段使用 如 :  SELECT * FROM (SELECT emp.*,ROWNUM rum FROM emp) temp1 WHERE temp1.rum >= 10, 那么这里查出来的ROWNUM 可以当做普通的字段使用。

         有了以上思路,那么ORACLE 的分页就比较简单了。(其实ORALCE 分页的语句相对MYSQL 和 SQLSERVER 可能复杂一点,但是在使用上ORALCE 要快捷和简单的很多)

         (SELECT * FROM emp) temp1;

         (SELECT *,ROWNUM rum FROM (SELECT * FROM emp) temp1 WHERE ROWNUM < 20) temp2;

         SELECT * FROM (SELECT temp1.*,ROWNUM rum FROM (SELECT * FROM emp) temp1 WHERE ROWNUM <= pageSize) temp2 WHERE temp2.rum >= (1-pageIndex)*pageSize;

        上面这一段可以当做模板使用,  红色部分是可变部分,其他的都可不变。

        其实只要 SELECT * FROM (SELECT emp.*,ROWNUM rum FROM emp WHERE ROWNUM <=10) temp1 WHERE temp1.rum >=5;不过这种方式的扩展性不好。

      ORACLE 分页的关键在于把 ROWNUM 查出来当做某临时表的字段使用。

    创建表,自我复制

      CREATE TABLE tableName as SELECT [columnName] FROM otherTableName;

      INSERT INTO tableName [(column)] SELECT [(column)] FROM tableName;

  • 相关阅读:
    IOI 1996 网络协议
    lougu P2344奶牛抗议
    Poj3764 The XOR-longest Path
    A Simple Problem with Integers (线段树)
    NOIP2011 选择客栈
    20181029 T3 乐谱分段
    20181029 T2 寻宝游戏
    20181029 T1 教科书般的亵渎
    NOIP2011聪明的质监员
    浅谈AC自动机
  • 原文地址:https://www.cnblogs.com/shouwangzhe-/p/3632641.html
Copyright © 2020-2023  润新知