1. 程式人生 > 其它 >MySQL資料庫 - 子查詢

MySQL資料庫 - 子查詢

技術標籤:Educoder實訓之MySQL

第1關:帶比較運算子的子查詢
任務描述
本關任務:查詢大於所有平均年齡的員工姓名與年齡。
相關知識
為了完成本關任務,你需要掌握:
1.什麼叫子查詢,
2.比較運算子結合標量子查詢的使用。
子查詢
子查詢是指出現在其他SQL語句內的SELECT子句。
例如:
SELECT * FROM t1 WHERE col1=(SELECT col2 FROM t2);
子查詢指巢狀在查詢內部,且必須始終出現在圓括號內,子查詢可以分為四類:
標量子查詢:返回單一值的標量,最簡單的形式;
列子查詢:返回的結果集是 N 行一列;
行子查詢:返回的結果集是一行 N 列;

表子查詢:返回的結果集是 N 行 N 列。
帶比較運算子的子查詢
在這裡插入圖片描述
帶有比較運算子的子查詢是指父查詢和子查詢使用比較運算子連線的巢狀查詢;
使用場景:當用戶能夠確切的知道內層查詢返回的是單個值時,可以使用比較運算子。
舉個例子,現在有一張employee表資料:
在這裡插入圖片描述
我們查詢與Tom在同一個部門的同事id和姓名以及部門id。
1.首先,可以查詢Tom所在部門id
在這裡插入圖片描述
2.然後查詢dept_id=102的同事id和姓名
在這裡插入圖片描述
將上面兩條簡單的的SQL語句合併成一個巢狀查詢:
在這裡插入圖片描述
程式設計要求
在右側編輯器補充程式碼,查詢大於所有平均年齡的員工姓名與年齡。
我們為你提供了tb_emp表,資料如下:
在這裡插入圖片描述
測試說明
平臺會對你編寫的程式碼進行測試:
預期輸出:
name age
Tom 33
Nancy 28
開始你的任務吧,祝你成功!
參考程式碼:

USE Company;
#請在此處新增實現程式碼
########## Begin ##########
#1.查詢大於所有平均年齡的員工姓名與年齡
select name,age from tb_emp where age>(select avg(age) from tb_emp);
########## End ##########

第2關:關鍵字子查詢
任務描述
本關任務:根據要求使用關鍵字進行查詢。
相關知識
由於列子查詢返回的結果集是 N 行一列,因此不能直接使用 = 、>、<、>=、<=、<>這些比較標量結果的操作符。在列子查詢中可以使用 ALL、ANY、SOME 和 IN關鍵字操作符。

為了完成本關任務,你需要掌握:如何在子查詢中使用關鍵字進行查詢。
ALL關鍵字
ALL必須接在一個比較運算子的後面,表示與子查詢返回的所有值比較都為 TRUE則返回TRUE。
在這裡插入圖片描述
舉個例子:
SELECT col1 FROM table1 WHERE col1 > ALL (SELECT col2 FROM table2)
該查詢語句不會返回任何結果,因為col1中沒有比col2所有值都大的值。
在這裡插入圖片描述
ANY和SOME關鍵字
ANY與比較操作符聯合使用,表示與子查詢返回的任何值比較為TRUE ,則返回TRUE。
SOME是ANY的別名,一般用的比較少。
仍使用上面二張表的資料:
在這裡插入圖片描述
在子查詢中,返回的是table2的所有col2列的結果(5,12,20),然後將table1中col1的值與之進行比較,只要大於col2的任何值則為TRUE,因此查詢結果為10。
IN關鍵字
IN的意思就是指定的一個值是否在這個集合中,如果在就返回TRUE;否則就返回FALSE了,同IN(項1,項2,…);
IN 是 = ANY 的別名,二者相同,但 NOT IN 的別名卻不是 <> ANY 而是 <> SOME。
程式設計要求
我們為你提供瞭如下資料表:
tb_salary表資料:
在這裡插入圖片描述
根據提供的資料,在右側編輯器中補充程式碼:
查詢薪資表中比Java最高工資高的所有員工職位名稱和薪資;
查詢薪資表中比Java最低工資高的所有員工職位名稱和薪資;
查詢薪資表中職位為Java的所有員工職位名稱和薪資。
測試說明
平臺會對你編寫的程式碼進行測試:
預期輸出:
position salary
Python 10000
position salary
Java 8400
Java 9000
Python 10000
position salary
Java 8000
Java 8400
Java 9000
開始你的任務吧,祝你成功!
參考程式碼:

USE Company;
#請在此處新增實現程式碼
########## Begin ##########
SELECT position,salary FROM tb_salary WHERE salary > ANY(SELECT max(salary) FROM tb_salary where position='java');
#2.使用 ANY 關鍵字進行查詢
SELECT position,salary FROM tb_salary WHERE salary > ANY(SELECT min(salary) FROM tb_salary where position='java');
#3.使用 IN 關鍵字進行查詢
select position,salary from tb_salary where position in('java');
########## End ##########