Oracle与Mysql的高级查询与难点sql(三)

2014-11-24 16:51:50 · 作者: · 浏览: 1
七、合并查询
集合操作符有UNION,UNION ALL, INTERSECT和MINUS。当使用集合操作符时,必须确保不同查询的列个数和数据类型都要匹配。
有以下一些限制:
1.对于LOB,VARRAY和嵌套表列来说,集合操作符是无效的。
2.对于LONG列来说,UNION,INTERSECT,MINUS操作符是无效的。
3.如果选择列表包含了表达式,则必须为为其指定列别名。
(一)UNION
UNION操作符用于获取两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。并且会以第一列的结果进行排序。
Sql代码
1. SELECT ename,sal,job FROM emp WHERE sal>2500 UNION SELECT ename,sal,job FROM emp WHERE job='MANAGER';
(二)UNION ALL
UNION ALL操作符获取两个结果集的并集,但不会取消重复值,而且也不会以任何列进行排序。
Sql代码
1. SELECT ename,sal,job FROM emp WHERE sal>2500 UNION ALL SELECT ename,sal,job FROM emp WHERE job='MANAGER';
(三)INTERSECT
INTERSECT操作符用于获取两个结果集的交集。当使用该操作符时,只会显示同时存在于两个结果集中的数据,并且会以第一列进行排序。
Sql代码
1. SELECT ename,sal,job FROM emp WHERE sal>2500 INTERSECT SELECT ename,sal,job FROM emp WHERE job='MANAGER';
(四)MINUS
MINUS用于获取两个结果集的差集。以第一列进行排序。
Sql代码
1. SELECT ename,sal,job FROM emp WHERE sal>2500 MINUS SELECT ename,sal,job FROM emp WHERE job='MANAGER';
八、CASE表达式和倒叙查询
通过CASE表达式,可以避免调用过程来完成条件分支操作。
Sql代码
1. SELECT ename,sal,CASE WHEN sal>3000 THEN 3 WHEN sal>2000 THEN 2 ELSE 1 END grade FROM emp WHERE deptno=10;
默认情况下,当执行查询操作时,只能看到最近提交的数据。从Oracle9i开始,通过使用倒叙查询(Flashback Query)特征,可以查看到过去某个时间点所提交的数据。注意,如果使用倒叙查询,那么要示
数据库
必须彩UNDO管理方式,并且初始化参数undo_retention限制了UNDO数据的保留时间。
Sql代码
1. SELECT ename,sal FROM emp AS OF TIMESTAMP to_timestamp('2009-01-01 12:12:00','YYYY-MM-DD HH24:MI:SS') WHERE ename='CLARK';
九、使用WITH子句重用子查询
从Oracle9i开始,通过WITH子句可以给子查询指定一个名称,并且使得在一条语句中可以完成所有任务,从而避免使用临时表。
如显示部门工资总和高于雇员工资总和三分之一的部门名称及工资总和。
Sql代码
1. WITH summary AS (SELECT dname,SUM(sal) AS dept_total FROM emp,dept WHERE emp.deptno=dept.deptno GROUP BY dname)
2. SELECT dname, dept_total FROM summary WHERE dept_total>(
3. SELECT SUM(dept_total) * 1/3 FROM summary);
十、oracle对记录进行去重sql
Sql代码
1. DELETE FROM [TABLE_NAME]
2. WHERE ROWID NOT IN (
3. SELECT MIN(ROWID) FROM [TABLE_NAME]
4. GROUP BY [COL1,COL2,COL3...]
5. );
统计酒店名不重复的总数
Sql代码
1. SELECT COUNT(DISTINCT(hotel_id)) FROM t_app_travel_hotel_comment;
十一、SQL排序后的NULL位置
可以把那些NULL值假想为所有内容中值是最大的,因此,升序排序后NULL值在最后,倒序排序后NULL值在最前!
当指定"NULLS FIRST"时,无论是升序排序还是倒序排序,NULL值都会排列在最前面;当指定“NULLS LAST”时,无论是升序排序还是倒序排序,NULL值都会排列在最后面。
Sql代码
1. SELECT * FROM t ORDER BY x DESC NULLS LAST;