數據庫-通用函數和多表查詢

1、通用函數

一、NVL2(列名,結果1,結果2l)

NVL2(comm,sal+comm,sal):html

判斷comm是否是空值,若是是空值則返回sal,不是空值則返回sal+comm函數

 

二、sign(n)比較大小

取數字n的符號,大於0返回1,小於0返回-1,等於0則返回0htm

 

三、DECODE流程控制函數

DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )    blog

至關於if......else......語句,但DECODE()單獨使用的話,通常用於等值判斷排序

練習1:SELECT ename,job,DECODE(job,'MANAGER','經理','SALESMAN','銷售人員','PRESIDENT','總裁') FROM emp;     //判斷job這一列的值,若是是'MANAGER'則返回'經理',若是是'SALESMAN'則返回'銷售人員',若是是'PRESIDENT',則返回'總裁'。get

練習2:SELECT ename,job,sal,DECODE(job,'MANAGER',sal*0.8,'SALESMAN',sal+100,sal) 調後薪資 FROM emp;   //工資調整:manager的工資下調20%,salesman工資增長100,其他人員不變博客


 

練習3:進行範圍判斷,根據不一樣的工資範圍,計算出不一樣等級的稅款io

方法1:與SIGN()函數結合使用class

SELECT ename,job,sal,select

DECODE(SIGN(sal-3000),1,sal*0.2,0,sal*0.2,

-1,DECODE(SIGN(sal-2000),1,sal*0.15,0,sal*0.15,

-1,DECODE(SIGN(sal-1000),1,sal*0.1,0,sal*0.1,-1,0)

)) 稅款 FROM emp;

方法2:與TRUNC()函數結合使用

SELECT ename,job,sal,

DECODE(TRUNC(sal/1000),0,0,

1,sal*0.1,2,sal*0.15,sal*0.2) 稅款 FROM emp;


 

練習4:SELECT ename,job,DECODE(INSTR(ename,'A'),0,'名字中不包含A','名字中包含A') 包含A不 FROM emp;   //與INSTR函數結合使用,判斷名字中是否包含A


 

練習5:查詢僱員姓名、崗位,並以崗位排序,順序爲'CLERK','MANAGER','SALESMAN','ANALYST','PRESIDENT'

方法1:DECODE

SELECT ename,job FROM emp ORDER BY DECODE(job,'CLERK',1,'MANAGER',2,'SALESMAN',3,'ANALYST',4,'PRESIDENT',5);

方法2:CASE WHEN1 ? THEN1 ?WHEN2 ? THEN ?....... END

SELECT ename,job FROM emp ORDER BY CASE job WHEN 'CLERK' THEN 1 WHEN 'MANAGER' THEN 2 WHEN 'SALESMAN' THEN 3 WHEN 'ANALYST' THEN 4 WHEN 'PRESIDENT' THEN 5 END;


 

 2、多表查詢

一、笛卡爾積現象,即交叉相乘

多表進行聯合查詢,不使用關聯條件的話,就會產生笛卡爾積現象,產生不少重複無用的數據。select * from emp,dept;

二、多表鏈接

語法:SELECT [DISTINCT] 列名1,列名2... FROM 表1,表2 WHERE 鏈接條件 AND 過濾條件;

外鏈接:

找尋兩個表中相同的列:SELECT ename,job,d.deptno,dname FROM emp e,dept d WHERE e.deptno = d.deptno AND job='CLERK';

SELECT ename,sal,grade FROM emp,salgrade s WHERE sal BETWEEN s.losal AND s.hisal;多表鏈接也可使用除=外的其餘符號進行鏈接

內鏈接:

SELECT e.ename,e.job,e.mgr,m.ename 上司 FROM emp e,emp m WHERE e.mgr = m.empno;     把同一個表看成幾個表來使用,經過賦予別名


 

例題:查詢員工姓名、工資、工資等級、部門名稱,以及他的上司姓名和工資等級,工資等級均以漢字顯示。

SELECT e.ename,e.sal,

DECODE(s1.grade,1,'第一等級',2,'第二等級',3,'第三等級',4,'第四等級',5,'第五等級') 等級,

dname,m.ename 上司,m.sal 上司sal,

DECODE(s2.grade,1,'第一等級',2,'第二等級',3,'第三等級',4,'第四等級',5,'第五等級') 等級

FROM emp e,emp m,dept d,salgrade s1,salgrade s2 

WHERE e.mgr = m.empno AND d.deptno=e.deptno

AND (e.sal BETWEEN s1.losal AND s1.hisal) AND (m.sal BETWEEN s2.losal AND s2.hisal);

三、DISTINCT

關鍵字 distinct 用於返回惟一不一樣的值,只能在SELECT 語句中使用,不能在 INSERT, DELETE, UPDATE 語句中使用

distinct是將全部查詢的字段進行對比去重,全部字段都徹底相同纔會去重

distinct 必須放在查詢字段開頭進行查詢,distinct對NULL是不進行過濾的,即返回的結果中是包含NULL值的。

 

今日練習:

一、查詢部門名爲’SALES’的員工信息。

SELECT * FROM emp e,dept d 

WHERE (e.deptno=d.deptno) AND (d.dname='SALES');

二、查詢在部門所在地爲NEW YORK的員工的員工姓名,部門名稱和崗位名稱。

SELECT e.ename,d.dname,e.job 

FROM emp e,dept d 

WHERE (e.deptno=d.deptno) AND (d.loc='NEW YORK');

 

 

做者:kerwin-chyl

文章連接:https:////www.cnblogs.com/kerwin-chyl

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索