1.1 查詢表中所有的行與列如下,那麼在查詢之前還是一樣要看一下表的結構
desc emp ;
若領導要看所有員工的信息,其實操作上很簡單隻需要在select * 後面加上表名即可,這個時候得到的結果是所有行與列的集合;
1.2從表中檢索部分行
查看公司有多少銷售人員,那麼只需要在查詢數據時增加一個過濾條件就可以,比喻列是JOB,銷售人員條件是where job='SALESMAN';
SELECT * FROM EMP E WHERE E.JOB='SALESMAN'
1.3查找空值,什麼是空值(NULL)
如果要查詢某一列為空的數據,比喻,返回提成(COMM)為空的數據
select * from emp e where e.comm is null;
查找空值的要點:查找空值時不能用“=”運算符,要用 IS NULL判斷,如果用了=運算符效果如下:
同時NULL不支持加、減、乘、除、大小比較、相等比較、否則只能為空。
SELECT * FROM DUAL D WHERE 1>=NULL;
SELECT * FROM dual d WHERE 1<=NULL;
SELECT * FROM dual d WHERE 1+NULL <=10;
SELECT * FROM dual d WHERE 1+NULL >=10;
沒有得到任何結果,對於其它的函數在使用時最好測試一下有NULL時會返回什麼結果。
我想把'ABCDE'中的E替換成空值,怎麼操作呢?
SELECT REPLACE('ABCDE','E',NULL) FROM DUAL;
怎麼把1替換成空值,其實用上面的語句也可以做到,兩種方法如下:
SELECT REPLACE(1,1,NULL) FROM DUAL D;
或者:SELECT GREATEST(1,NULL) FROM DUAL D;
結束:(END 2017-06-12 0:04)
開始:(START 2017-06-13 21:53)
由於昨天晚上工作上出了一些狀況,以及酒店的網絡時好時壞沒有心情來寫博客,在寫博客之前還是要吐槽一下這兩天的心情,可以説是心力交瘁,來自兩個方面家庭和工作,家庭方面是因為奶奶的身體不好父親也一直操心她的身體希望奶奶身體儘快恢復,雖然父親不説但是我也能感覺到他心裏的焦慮,工作上是因為客户投訴了我們在處理售後機制上總是延遲,而這個項目的負責人又是我,所以晚上我又同客户寫了一封道歉信,但無論怎麼樣工作和生活還是要繼續向前走,對自己説加油。
繼續今晚的學習:
1.4將空值轉換為實際值
SELECT COALESCE(e.comm,0) FROM emp e;
這個時候有的人會問,為什麼不使用NVL函數,我覺得這裏如果用NVL函數也可以達到我們想要的結果,但是會嵌套很多層,不好理解,記住COALESCE 這個函數。如下:
CREATE OR REPLACE VIEW x AS
SELECT NULL AS c1,NULL AS c2,1 AS c3,NULL AS c4,2 AS c5,NULL AS c6 FROM dual d
UNION ALL
SELECT NULL AS c1,NULL AS c2,NULL AS c3,3 AS c4,NULL AS c5,2 AS c6 FROM dual d;
SELECT * FROM x;
SELECT COALESCE(C1,C2,C3,C4,C5,C6) AS C FROM V(這樣就很方便地返回第一個不為空的值)
1.5 查找滿足多個條件的行
由於這兩天都在長沙出差一直都沒有更新博客,今天是週日從老家返回到武漢,這兩天回家主要是看看父母和小孩,有一個月沒有回家了,挺想他們的,想想也是我們做項目的有幾個能一直陪在家人的身邊的,話不多説接着學習。
開始:(START 2017-06-18 19:33)
對於簡單的查詢來説操作起來也是比較容易的,那麼複雜一點該從何分析呢,請看一下例子如下:
要查詢部門10中的的所有員工,所有得到提成的員,以及部門20中工資不超過2000dollar的員工。
首先需要把這三個條件整成邏輯表達式的形式:(部門10中所有的員工 OR 所有得到提成的員工OR 工資<=2000 AND 部門號=20);
SELECT * FROM emp e
WHERE
/*部門10中所有的員工 OR 所有得到提成的員工*/
(e.deptno=10 OR e.comm IS NOT NULL)
OR
/*部門20中工資不超過20000*/
(e.sal<=2000 AND e.deptno=20);
這裏要注意的是括號的使用(因為在多個條件組合中使用了括號後可以不必要考慮優先級的問題而且很容易找到各個條件的起始位置)。
1.6 從表中檢索部分列
前面都是從表中獲取所有列,但是常常只需要返回部分列的數據即可,例如:員工編碼、員工的名稱、僱傭日期、工資所以一般要明確查詢哪些列而不用使用"*"號來代替。
select e.empno,e.ename,e.hiredate,e.sal from emp e ;
1.7 為列取有意義的別名
通常我們在項目當中不是每個人都能看懂字母的含義,所以該給列取個別名,可以在字段的AS後面加上別名也可以直接跟上別名即可,請看如下事例:
SELECT e.empno AS 員工編號,e.ename 員工名稱,e.sal 工資,e.comm 提成 FROM emp e
1.8 在WHERE子句中引用取別名的列
SELECT * FROM (SELECT E.empno,E.ename,E.sal 工資 FROM emp e) where 工資<3000;
1.9 拼接列
有的人不喜歡看錶格的數據,希望返回的數據都像‘CLARK’的工作是‘MANAGER',我們可以通字符串連接符“||”來把各列拼在一起,如下:
1.10 在SELECT 語句中使用條件邏輯
如:當職員工資小於或等於2000美元時,就返回消息“過低”,大於或等於4000美元時就返回消息“過高”,如果在這兩個條件之間就返回"ok" 類似這種需求我們也會經常遇到,處理這樣的需求可以用CASE WEHN 來判斷轉化。
SELECT E.ename,E.sal,CASE WHEN E.sal<2000 THEN '過低'
WHEN E.SAL>4000 THEN '過高'
ELSE 'OK' END AS STATUS FROM emp e;
但往往這中方式還經常體現在報表中,比如要按工資分檔次統計人數
SELECT 檔次,count(*) 名次 FROM (SELECT (CASE WHEN E.sal<=1000 THEN '0000-1000'
WHEN E.sal<=2000 THEN '1000-2000'
WHEN E.sal<=3000 THEN '2000-3000'
WHEN E.sal<=4000 THEN '3000-4000'
WHEN E.sal<=5000 THEN '4000-5000'
WHEN E.sal<=6000 THEN '5000-6000'
END )AS 檔次 FROM emp e) group by 檔次 order by 名次;
1.11 限制返回的行數
通常在查詢數據時其實是不需要返回所有數據,比喻要求抽查時只返回2條數據,這個時候就會用到ROWNUM來過濾,ROWNUM依次對每一條數據做一個標示;
SELECT * FROM emp e where ROWNUM<=2;
如果用ROWNUM=2 來查詢會出現什麼的情況呢?如下圖
可以看到的結果什麼數據都沒有查出來,這是為什麼呢?因為本質上需要把ROWNUM=2的這條記錄找出來,就像在班級名次排序一下,知道了第一名才能知道第二名。
SELECT * FROM (SELECT ROWNUM rn,e.* FROM emp e) WHERE rn<=2;
1.12 從表隨機返回n條記錄(DBMS_RANDOM)
SELECT * FROM (SELECT E.empno,E.ename FROM emp e ORDER BY dbms_random."VALUE"()) WHERE ROWNUM<=3 ;
1.13模糊查詢
先建立一個VIEW:
DROP VIEW V;
CREATE OR REPLACE VIEW V AS
SELECT 'ABCEDF' AS VNAME FROM dual
UNION ALL
SELECT '_BCEFG' AS VNAME FROM dual
UNION ALL
SELECT '_BCEDF' AS VNAME FROM dual
UNION ALL
SELECT '_\BCEDF' AS VNAME FROM dual
UNION ALL
SELECT 'XYCEG' AS VNAME FROM dual;
範例1:查出VNAME中包含字符串“CED”的 正常情況下,我們會這樣寫:
SELECT * FROM V v WHERE V.VNAME LIKE '%CED%' 模糊查詢如下:
範例2:查詢出VNAME中包含字符串'_BCE'的
正常情況下我會這樣:
SELECT * FROM V V WHERE V.VNAME LIKE '_BCE%'那來看看效果:
這個時候看的結果發多了個"ABCEDF".因為LIKE字句中有兩個通配符"%" 、"_"(替代一個或多個字符),在這裏"_"被當作通配符了,如果遇到這種情況就要用到"轉義字符"(ESCAPE)如下:
SELECT * FROM V v WHERE V.VNAME LIKE '\_BCE%' ESCAPE '\';
截止目前為單表查詢説完了,希望在以後的工作中能對自己起到作用。
今天還做了一個POWERBI圖表,上圖了
end(2017-06-25)