查詢表數(shù)據(jù)
查詢特定的列數(shù)據(jù)
如:
SELECT ename, empno, job, hiredate
FROM scott.emp;
查詢所有列數(shù)據(jù)
如:
SELECT * FROM emp;
使用DISTINCT查詢唯一列數(shù)據(jù)
可以使用DISTINCT關(guān)鍵字獲取列中的唯一值,,即去除重復(fù)數(shù)據(jù),,如:
SELECT DISTINCT job FROM emp;
要注意,,DISTINCT會導(dǎo)致索引失效,,在大型數(shù)據(jù)集查詢中應(yīng)該盡量避免DISTINCT查詢,。
在查詢中使用表達(dá)式
如:
SELECT empno, ename, sal * (1 + 0.12) FROM emp;
在進(jìn)行算術(shù)運(yùn)算時,如果列包含NULL值,,那么結(jié)果也為NULL,。
使用列別名
如:
SELECT empno 員工名稱, ename "員工姓名_NAME", sal * (1 + 0.12) raised_sal, sal AS 薪水 FROM emp;
AS關(guān)鍵字可選。
如果列別名中包含空格,、特殊字符或者大小寫敏感字符,,則要用雙引號把別名引起來。
字符串連接
使用|| 符號,,如:
SELECT ename || '的薪資為:' || sal 員工薪水 FROM emp;
指定查詢條件
簡單WHERE子句
如:
SELECT * FROM emp WHERE deptno = 20;
SELECT empno, ename, job FROM emp WHERE sal >= 1500 AND sal <= 2500;
使用范圍操作符
可以使用BETWEEN AND,,IN,LIKE,。
BETWEEN AND
如:
SELECT empno, ename, job FROM emp WHERE sal BETWEEN 1500 AND 2500;
實(shí)際上在使用BETWEEN AND操作符時,,Oracle會將該語句轉(zhuǎn)換為一對AND條件,因此,上面的語句會被Oracle翻譯成:
SELECT empno, ename, job FROM emp WHERE sal >= 1500 AND sal <= 2500;
因此使用BETWEEN AND并沒有提高性能,,只是邏輯上給了用戶一種更接近自然語言的表達(dá)方式,。
IN
如:
SELECT empno, ename, job, mgr, hiredate, sal
FROM emp
WHERE job IN ('SALESMAN', 'CLERK', 'ANALYST');
對于IN查詢條件,Oracle會將其轉(zhuǎn)換為一組OR條件,,因此對于上面的語句,,Oracle會將其轉(zhuǎn)換為如下語句:
SELECT empno, ename, job, mgr, hiredate, sal
FROM emp
WHERE job = SALESMAN OR job = CLERK OR job = ANALYST;
LIKE
LIKE查詢也成為模糊查詢,% 通配符表示零個或多個字符,,_ 通配符表示一個字符,,如“”
SELECT empno, ename, job, mgr, hiredate, sal
FROM emp
WHERE ename LIKE 'J%';
SELECT empno, ename, job, mgr, hiredate, sal
FROM emp
WHERE hiredate LIKE '%81';
SELECT empno, ename, job, mgr, hiredate, sal
FROM emp
WHERE ename LIKE '__A%';
判斷NULL值
如:
SELECT empno, ename, job, mgr, hiredate
FROM emp
WHERE mgr IS NULL;
SELECT empno, ename, job, mgr, hiredate
FROM emp
WHERE mgr IS NOT NULL;
使用邏輯組合
如:
SELECT empno, ename, job, mgr, hiredate, sal, deptno
FROM emp
WHERE deptno = 20 AND hiredate LIKE '%82';
SELECT empno, ename, job, mgr, hiredate, sal, deptno
FROM emp
WHERE deptno = 20 OR hiredate LIKE '%82';
SELECT empno, ename, job, mgr, hiredate, sal, deptno
FROM emp
WHERE job NOT IN ('CLERK', 'MANAGER', 'SALESMAN');
SELECT empno, ename, job, mgr, hiredate, sal, deptno
FROM emp
WHERE sal NOT BETWEEN 1000 AND 2500;
SELECT empno, ename, job, mgr, hiredate, sal, deptno
FROM emp
WHERE ename NOT LIKE '%A%';
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
排序
ORDER BY指定要對結(jié)果集進(jìn)行排序,可選擇ASC表示升序,,DESC表示降序,。默認(rèn)為ASC。
ORDER BY子句必須是SELECT語句的最后一個子句,。
如:
SELECT empno, ename, job, mgr, hiredate, sal, deptno
FROM emp
WHERE deptno = 20
ORDER BY empno;
SELECT empno, ename, job, mgr, hiredate, sal, deptno
FROM emp
WHERE deptno = 20
ORDER BY empno, ename DESC;
除了直接指定列名之外,,還可以根據(jù)SELECT語句的字段列表的索引順序指定排序,如根據(jù)SELECT語句中的第4個字段mgr進(jìn)行排序:
SELECT empno, ename, job, mgr, hiredate, sal, deptno
FROM emp
WHERE deptno = 20
ORDER BY 4 DESC;
如果指定一個不存在的SELECT語句中的索引號,,Oracle會提示異常,,如:
SELECT empno, ename, job, mgr, hiredate, sal, deptno
FROM emp
WHERE deptno = 20
ORDER BY 8 DESC;
異常為:
ORA-01785:ORDER BY項必須是SELECT-list表達(dá)式的數(shù)目
統(tǒng)計函數(shù)
記錄統(tǒng)計
如:
SELECT COUNT(*) 記錄條數(shù) FROM emp WHERE deptno=20;
COUNT(*)返回SELECT語句標(biāo)準(zhǔn)的行數(shù),包括重復(fù)行和有空值列的行,。
如果要統(tǒng)計某個字段的非空值得個數(shù),,可以這么寫:
SELECT COUNT(comm) 提成員工數(shù) FROM emp;
COUNT默認(rèn)使用ALL參數(shù),表示提取所有包括重復(fù)的記錄,,因此上面的語句等同于:
SELECT COUNT(ALL comm) 提成員工數(shù) FROM emp;
如果要獲得唯一記錄數(shù),,則可以:
SELECT COUNT(DISTINCT job) 職位個數(shù) FROM emp;
匯總和平均值計算
SUM函數(shù)可以用來匯總,如:
SELECT SUM(sal) 薪水總計, SUM(comm) 提成總計 FROM emp;
AVG函數(shù)可以用來計算平均值,,如:
SELECT AVG(sal) 平均薪資,AVG(comm) 平均提成 FROM emp;
最小值和最大值
如:
SELECT MIN(sal) 最低薪資,MAX(sal) 最高薪資 FROM emp;
SELECT MIN(hiredate) 最早雇傭日期,MAX(hiredate) 最晚雇傭日期 FROM emp;
統(tǒng)計函數(shù)的NULL值處理
可以使用NVL函數(shù)將NULL替換成別的值,,如:
SELECT MIN(NVL(comm,0)) 最低提成,MAX(NVL(comm,0)) 最高提成 FROM emp;
分組統(tǒng)計
使用GROUP BY來分組,如:
SELECT deptno, SUM (sal) 部門薪資小計
FROM emp
GROUP BY deptno
ORDER BY SUM (sal);
分組對于初學(xué)者來說比較難于掌握,,這里就簡單地說一下,。
在使用GROUP BY子句時,除了作為分組函數(shù)(如:SUM,,AVG,,COUNT等)參數(shù)的列不用包含在GROUP BY子句中之外,任何在SELECT列表中的其他列都必須出現(xiàn)在GROUP BY子句中,。不過在GROUP BY子句中的列不必一定出現(xiàn)在SELECT列表中,。
分組結(jié)果通過分組列隱式排序,也可以用ORDER BY指定不同的排序順序,,但也只能用分組函數(shù)或分組列進(jìn)行排序,。
HAVING子句
例如如果只是想對部門編號為20和30的員工進(jìn)行分組統(tǒng)計,,使用WHERE子句即可,如:
SELECT deptno, job, SUM (sal) 薪資小計
FROM emp
WHERE deptno IN (20, 30)
GROUP BY deptno, job
如果要對分組的結(jié)果進(jìn)行進(jìn)一步的過濾,,比如要顯示分組后薪資小計大于2000的分組結(jié)果,,那么可以:
SELECT deptno, job, SUM (sal) 薪資小計
FROM emp
WHERE deptno IN (20, 30)
GROUP BY deptno, job
HAVING SUM (sal) > 2000;
HAVING子句只能用在GROUP BY子句的后面,不能使用WHERE子句來取代HAVING子句,,否則將會產(chǎn)生異常,。
使用DUAL表
DUAL表是Oracle系統(tǒng)中對所有用戶可用的一個實(shí)際存在的表,是一個1行1列的表,,這個表不能實(shí)際存儲信息,,也不具有任何其他的 意義,在實(shí)際應(yīng)用中僅用來執(zhí)行SELECT語句,,如:
-- 查詢當(dāng)前系統(tǒng)日期
SELECT TO_CHAR (SYSDATE, 'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
-- 查詢當(dāng)前系統(tǒng)用戶
SELECT USER FROM DUAL;
-- 輸出靜態(tài)文本
SELECT 'hello' FROM DUAL;
-- 計算表達(dá)式
SELECT 500 * 60 FROM DUAL;
|