該練習都是oracle自帶的表數據,emp,dept等。oracle
1、優化原則ide
1.查詢語句儘可能指定列名,避免使用*;函數
2. WHERE 條件從右到左優化
3.儘可能使用WHERE,少使用HAVINGspa
4.多表查詢優於子查詢。code
5.儘可能不要使用集合運算字符串
2、IN可使用NULL,NOT IN 不可使用NULLit
在ORACLE中,IN是或邏輯(=1 OR =2 OR =NULL),NOT IN 是與邏輯(=1 AND =2 AND =NULL)。並且ORACLE中任何值AND NULL的值都是爲NULL 或者FALSE。因此,IN能夠簡寫成(=1 OR =2),而NOT IN 返回的都是FALSE 或者NULL。io
3、查詢字符串帶有'_'值的模糊查詢date
例如查詢表emp 中ename含有'_'的值。若是寫:select * from emp where ename like '%_%'; 這樣查詢到的結果與想象的不一樣,這個查詢出來的是任意名字,由於'%'表明一個或多個字符串,'_'表明了一個字符串;那麼如何作呢?
應該先轉義'_',這樣寫就能夠了:select * from emp where ename like '%\_%';
4、ORDER BY 後的條件可使用SELECT-LIST的列名,序號,別名,並且必須是SELECT-LIST中的。
select empno,ename,sal,sal*12 年薪 from emp order by sal*12 desc;
select empno,ename,sal,sal*12 年薪 from emp order by 4 desc;
select empno,ename,sal,sal*12 年薪 from emp order by 年薪 desc;
注意:若是ORDER BY 後面不止一列,那麼desc只做用於最接近的一列:
select * from emp order by deptno ,sal desc
若是須要都起做用須要都添加desc:
select * from emp order by deptno desc,sal desc
在ORACLE 中,NULL值最大。
5、to_char 將字符串轉換爲你想要的格式
to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') sysdate獲取的是當前時間。
SQL> --2014-12-26 15:19:12 今天是星期五
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual;
SQL> --查詢員工薪水:兩位小數,千位符,貨幣代碼
SQL> select to_char(sal,'L9,999.99') from emp;
6、條件表達式
1.三元運算符nvl2(a,b,c)
若是a=null時,返回c;a!=null 時,返回b.
若是某個數+null時,其值會爲null這不是咱們想要的結果,能夠參考以下例子。
SQL> --nvl2(a,b,c) 當a=null時候,返回c;不然返回b
SQL> select sal*12+nvl2(comm,comm,0) from emp;
2.nullif 返回null或者前一個字符串
SQL> --nullif(a,b) 當a=b時候,返回null,不然返回a
SQL> select nullif('abc','abc') 值 from dual;
3.coalesce
SQL> --coalesce 從左到右 找到第一個不爲null的值
SQL> select comm,sal,coalesce(comm,sal) "第一個不爲null的值" from emp;
4.case語句與decode語句
case語句控制不一樣條件的顯示
select ename,job,sal 漲前,
case job when 'PRESIDENT' then sal+1000
when 'MANAGER' then sal+800
else sal+400
end 漲後
from emp;
使用decode函數表示爲
select ename,job,sal 漲前,decode(
job,'president',sal+1000,
'manage',sal+800,
sal+400
) 漲後 from emp
使用decode函數的一個例子:根據80號部門員工的工資,顯示稅率
7、分組函數
定義:分組函數是做用於一組數據的函數,並對一組數據返回一個值。常見的有SUM,COUNT,AVG,MAX,MIN
注意:where 以後不能跟組函數的條件。
1.nvl函數:nvl(a,b) 若是a不爲null返回a,不然返回b;
用法:select count(*),count(nvl(comm,0)) from emp; 這樣就能夠統計包括comm爲null的數量了。
2.rollup函數 一般用作於報表查詢,返回的數據格式比較好看。以下圖:
8、多表查詢
笛卡爾積:笛卡爾積是表的行數相乘的積:如下條件會產生笛卡爾積:
無條件,條件無效,全部行相互鏈接。
在oracle中多表查詢方式有等值鏈接,不等值鏈接,外鏈接,自鏈接。
1.等值鏈接
--查詢員工信息 : 員工號 姓名 月薪 部門名稱
select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno;
2.不等值鏈接
--查詢員工信息 : 員工號 姓名 月薪 工資級別
select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;
3.外鏈接
--按部門統計員工人數: 部門號 部門名稱 人數
select d.deptno 部門號,d.dname 部門名稱,count(e.empno) 人數 from emp e,dept d where e.deptno=d.deptno group by d.deptno,d.dname; 這條語句是不對的,由於有一行部門的值並無查詢出來。
外連接:對於某些不成立的記錄,任然但願包含在最後的結果中
左外鏈接:當where e.deptno=d.deptno不成立的時候,等號左邊的表任然被包含
寫法:當但願是包含d表不成立的記錄時:where e.deptno(+)=d.deptno
寫法:當但願是包含e表不成立的記錄時:where e.deptno=d.deptno(+)
4. 自鏈接:經過表的別名,將同一張表視爲多張表
--在一張表中根據關係自連查詢。(與層次相比直觀)
select a.ename,b.ename from emp a,emp b where a.mgr=b.empno;
注:自鏈接不適合查詢大表。。由於大表的乘積特別大。
層次查詢:在emp表中,員工的mgr是他頂級上司的員工號 (不會產生笛卡爾積)
select level(這是一個僞列,若是不指定則不出現),empno,ename,mgr
connect by prior empno =mgr start with mgr is null order by 1;
START WITH:指定層級的跟節點行。
CONNECT BY:指定層級的父行於子行的關係。