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;

posted @ 2014-03-29 17:29  廖东海  阅读(174)  评论(0编辑  收藏  举报