JAVA-Unit03: SQL(基礎查詢) 、 SQL(關聯查詢)


    Unit03: SQL(基礎查詢) 、 SQL(關聯查詢)    

列別名
當SELECT子句中查詢的列是一個函數
或者表達式時,那么查詢出來的結果集
中對應的該字段的名字就是這個函數或者
表達式的名字。為此可以為這一列添加
別名,這樣結果集中該字段就使用別名
作為該列的名字。
若希望別名區分大小寫或者含有空格,那么
該別名可以使用雙引號括起來。
SELECT ename,sal*12 "s al"
FROM emp

ANDOR AND優先級高於OR,可以通過括號 提高優先級。 SELECT ename,job,sal
FROM emp
WHERE sal>1000
AND job='SALESMAN'
OR job='CLERK' LIKE可以模糊匹配字符串 支持兩個通配符: %:任意個字符(0-多個) _:單一的一個字符

查看名字第二個字母是A的員工:
SELECT ename,sal,deptno
FROM emp
WHERE ename LIKE '_A%'


IN(list)與NOT IN(list) 判斷在列表中或者不在列表中。 常用在判斷子查詢的結果。 BETWEEN...AND... 判斷在一個區間范圍內

查看工資在1500到3000之間的員工信息
SELECT ename,sal,deptno
FROM emp
WHERE sal BETWEEN 1500 AND 3000

ANY,ALL
配合>,>=,<,<=判斷使用,
判斷一個列表中的內容是否滿足要求
>ANY(list):大於列表之一即可(大於最小)
>ALL(list):大於列表所有(大於最大)
ANY,ALL通常用在子查詢結果的判斷上。

DISTINCT關鍵字
對結果集指定字段值重復的記錄行
去除。

SELECT DISTINCT job FROM emp

對多列去重是指:這這些列的值的組合沒有重復
SELECT DISTINCT job,deptno FROM emp


ORDER BY子句,用於結果集排序 ORDER BY只能寫在DQL的最后一個子句中 ORDER BY可以對結果集按照給定字段的值 進行升序(ASC)或降序(DESC)進行排序

查看公司的工資排名?
SELECT ename,sal
FROM emp
ORDER BY sal DESC


多字段排序是有優先級的,首先按照
第一個字段的排序規則對結果集排序,
當第一個字段有重復值時再按照第二個
字段的值排序,以此類推。
SELECT ename,deptno,sal
FROM emp
ORDER BY deptno,sal DESC

排序的字段若含有NULL值,NULL被
認作最大值。
SELECT ename,comm
FROM emp
ORDER BY comm 



聚合函數
聚合函數也稱為:多行函數分組函數
聚合函數是用來統計結果集中的數據的
四個對值進行統計的函數:MAX,MIN,AVG,SUM 一個對記錄數統計的函數:COUNT

統計公司工資的最大值與最小值
SELECT MAX(sal),MIN(sal)
FROM emp

公司的工資總和和平均值?
SELECT SUM(sal),AVG(sal)
FROM emp

查看公司總共多少人?
SELECT COUNT(ename)
FROM emp

聚合函數忽略NULL值。
SELECT SUM(comm),AVG(NVL(comm,0))
FROM emp

SELECT NVL(comm,0) FROM emp

統計一張表記錄總數常用:
SELECT COUNT(*)
FROM emp


SELECT AVG(sal) FROM emp
WHERE deptno=20 分組 GROUP BY子句 GROUP BY子句可以將結果集按照指定 字段進行分組,分組原則為該字段值一 樣的記錄看作一組,配合聚合函數可以 進行細致的統計。

查看每個部門的平均工資?
SELECT AVG(sal),deptno
FROM emp
GROUP BY deptno


查看每個職位的平均工資與工資總和?
SELECT AVG(sal),SUM(sal),job
FROM emp
GROUP BY job

GROUP BY可以按照多字段分組,分組 原則為這幾個字段值的組合相同的記錄 看作一組

查看同部門同職位的員工各多少人?
SELECT COUNT(*),deptno,job
FROM emp
GROUP BY deptno,job


查看部門的平均工資,前提是該部門
平均工資要高於2000
SELECT AVG(sal),deptno
FROM emp
WHERE AVG(sal)>2000
GROUP BY deptno

WHERE中不能使用聚合函數作為過濾 條件,原因在於過濾時機不對。WHERE
是在第一次查詢表中數據進行過濾的,
逐行過濾,將滿足條件的記錄查詢出來。
聚合函數是建立在結果集基礎上進行統計
的。這已經是在WHERE之后進行了。

HAVING子句 HAVING子句必須跟在GROUP BY子句之后, 用來對GROUP BY分組后對每一個分組進行 過濾。
HAVING可以使用聚合函數並根據結果來取舍
分組。

查看部門的平均工資,前提是該部門
平均工資要高於2000
SELECT AVG(sal),deptno
FROM emp
GROUP BY deptno
HAVING AVG(sal)>2000

查看平均工資高於2000的部門的
最高工資與最低工資分別是多少?
SELECT MAX(sal),MIN(sal),deptno
FROM emp
GROUP BY deptno
HAVING AVG(sal)>2000

查看平均工資高於2000的職位各多少人?
SELECT COUNT(*),job
FROM emp
GROUP BY job
HAVING AVG(sal)>2000 關聯查詢 關聯查詢的結果集中字段來自多張表 聯合查詢的結果。 關聯查詢的關鍵在於連接條件,即: 表之間數據的對應關系。

查看每個員工以及其所在部門的名稱?
SELECT e.ename,e.deptno,d.dname
FROM emp e,dept d
WHERE e.deptno=d.deptno

關聯查詢中連接條件要與過濾條件同時
成立!
查看在NEW YORK工作的員工?
SELECT e.ename,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno
AND d.loc='NEW YORK' 關聯查詢中不添加鏈接條件或鏈接條件 無效則會出現笛卡兒積,這通常是一個 無意義的結果集。 笛卡兒積的記錄數是由參與查詢的表的記 錄數乘積得到。 SELECT d.deptno,d.dname
FROM dept d


不滿足連接條件的記錄是不會被查詢
出來的。
SELECT e.ename,d.dname
FROM emp e,dept d
WHERE e.deptno=d.deptno

查看KING在哪個城市工作?
SELECT e.ename,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno
AND e.ename='KING'

關聯查詢中N張表關聯查詢,至少要有
N-1個連接條件。

內連接
內連接也是用來完成關聯查詢的。
SELECT e.ename,d.loc
FROM emp e JOIN dept d
ON e.deptno=d.deptno
WHERE e.ename='KING' 外連接
外連接在進行關聯查詢時除了可以將
滿足連接條件的記錄查詢出來之外,也
可以將不滿足連接條件的記錄列出來。
外連接分為:左外連接,右外連接,全外連接
左外連接:以JOIN左側表作為驅動表(所有記錄
        都會列出來),那么當驅動表中不滿足
        連接條件的記錄來自右側表中的字段值
        為NULL。

SELECT e.ename,d.dname
FROM emp e 
 LEFT|RIGHT|FULL OUTER JOIN 
dept d
ON e.deptno=d.deptno


SELECT e.ename,d.dname
FROM emp e,dept d
WHERE e.deptno=d.deptno(+)

自連接
當前表的一條記錄可以對應當前表自己的
多條記錄這樣的設定就是自連接。
自連接保存屬性相同的數據但是之間有存在
上下級關系的樹狀結構數據使用。

SELECT empno,ename,mgr
FROM emp


查看每個員工的名字以及其上司的名字?
SELECT e.ename,m.ename
FROM emp e,emp m
WHERE e.mgr=m.empno

查看SMITH的上司在哪個城市工作?

 


免責聲明!

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



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