Oracle查詢優化--單表查詢


--查詢所有

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是用來定義轉義字符的,只有定義了才有效果,也可以定義成其他,如*、/等

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM