--查詢所有
1 select * from emp; 2 select * from emp where comm is null;
--錯誤表達
1 --select * from emp where comm = null;
--其他有關null的返回結果
1 select replace('abcde','a',null) as str from dual; 2 select greatest(1,null) from dual;
/*結論:遇到null最好先測試一下,不能臆想猜測*/
--coalesce函數
1 SELECT coalesce(comm,0) FROM emp;
--上述例子中coalesce與nvl函數起同樣作用,但coalesce函數更好用,支持更多參數,能很方便地返回第一個不為空的值
1 CREATE OR REPLACE VIEW v AS 2 SELECT NULL AS c1,NULL AS c2,'1' AS c3,NULL AS c4,'2' AS c5,NULL AS c6 FROM dual UNION ALL 3 SELECT NULL AS c1,NULL AS c2,NULL AS c3,'3' AS c4,NULL AS c5,'2' AS c6 FROM dual; 4 SELECT * FROM v; 5 SELECT COALESCE(c1,c2,c3,c4,c5,c6) AS c FROM v;
--key:別名
--desc:可以為結果集的列指定別名,用AS或空格緊跟。
SELECT 姓名 FROM (SELECT ename 姓名,comm AS 提成 FROM emp) WHERE 提成 IS NULL;
--summary:使用別名當篩選條件需要在外面嵌套一層
--key:拼接
--desc:concat和||都可以拼接字段
1 SELECT ename || '的工作是' ||job AS msg FROM emp WHERE deptno=20; 2 SELECT concat('姓名:',ename) AS msg FROM emp WHERE deptno=20;
--summary:concat可以拼接兩個字段,使用||可以拼接多重字段
--key:生成sql
--desc:用sql生成sql
1 DROP TABLE test_concat PURGE; 2 CREATE TABLE test_concat AS 3 SELECT table_name, 4 'N_' || table_name AS new_tbl_name, 5 column_name, 6 'new_' || column_name AS new_col_name 7 FROM all_tab_cols 8 WHERE owner = 'SCOTT';
1 DECLARE v_sql CLOB; 2 BEGIN 3 FOR cur IN (SELECT 'CREATE OR REPLACE VIEW ' || new_tbl_name || ' as ' || chr(10) || 4 'select ' || chr(10) || 5 wmsys.wm_concat(column_name || ' as ' || new_col_name || chr(10)) || 6 'from scott.' || table_name AS create_view 7 FROM test_concat 8 GROUP BY table_name,new_tbl_name) 9 LOOP 10 v_sql := cur.create_view; 11 EXECUTE IMMEDIATE v_sql; 12 END LOOP; 13 END;
--key:條件邏輯
--desc:case when
1 SELECT (CASE 2 WHEN sal<1000 THEN '0000-1000' 3 WHEN sal<=2000 THEN '1000-2000' 4 ELSE '好高' END) AS 提成 5 FROM emp;
--key:rownum
--desc:限制返回行數
1 SELECT * FROM emp WHERE ROWNUM<=3 ORDER BY sal DESC;
--upgrade
1 SELECT * FROM (SELECT ROWNUM rn ,emp.* FROM emp WHERE ROWNUM<=3) WHERE rn=2;
--summary:並不能通過order by和rownum的配合得到排名
--key:隨機
--desc:隨機抽查3行數據
1 SELECT empno,ename FROM (SELECT dbms_random.value(),empno,ename FROM emp ORDER BY dbms_random.value()) WHERE ROWNUM <= 3;
/*summary:必須嵌套使用,否則直接使用並不能得到隨機效果:
1 SELECT dbms_random.value(),empno,ename FROM emp where rownum <=3 ORDER BY dbms_random.value()
因為查詢語句中執行的順序是:!.select 2.rownum 3.order by
所以,在order by執行之前,前三行已經定了,隨后對已選定的三行進行隨機顯示而已*/
--key:模糊查詢
--desc:模糊查詢及轉義字符的使用
--prep:
1 CREATE OR REPLACE VIEW v AS SELECT 'ABCEDF' AS vname FROM dual 2 UNION ALL 3 SELECT '_BCEFG' AS vname FROM dual 4 UNION ALL 5 SELECT '_BCEDF' AS vname FROM dual 6 UNION ALL 7 SELECT '_\BCEDF' AS vname FROM dual 8 UNION ALL 9 SELECT 'XYCEG' AS vname FROM dual 10 SELECT * FROM v;
--查詢包含CED的行
1 SELECT * FROM v WHERE vname LIKE '%CED%';
--查詢包含_BCE的行
1 SELECT * FROM v WHERE vname LIKE '%_BCE%';--ABCEDF和_\BCEDF並不是想要的結果,因為_被當做通配符了 2 SELECT * FROM v WHERE vname LIKE '%\_BCE%' ESCAPE '\';--escape是用來定義轉義字符的,只有定義了才有效果,也可以定義成其他,如*、/等
