查询
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;