sql資料庫查詢語句例子「mysql子查詢語句」

前面說了很多MySQL中的查詢,比如條件查詢、分組聚合查詢、連接查詢,今天來說一下另外兩個非常的重要的查詢,MySQL中的子查詢和聯合查詢。

數據分析系列 16/32 | MySQL中子查詢與聯合查詢

PART

01

子查詢

子查詢也稱嵌套查詢,是將一個查詢語句嵌套在另一個查詢語句的WHERE子句或者HAVING短語中,前者被稱為內層查詢或子查詢,後者被稱為外層查詢或父查詢。在整個SELECT語句中,先計運算元查詢,然後將子查詢的結果作為父查詢的過濾條件,嵌套查詢可以用多個簡單的查詢構成一個複雜的查詢,用來增強SQL的查詢能力。

1、帶IN關鍵字的查詢

帶IN關鍵字的子查詢是最常用的一類子查詢,用於判定一個給定值是否存在與子查詢的結果集中,使用IN關鍵字進行子查詢是,內層查詢語句僅僅返回一個數據列,其值將提供給外層查詢進行比較操作。

#在學生表tb_student中,將學號出現在成績表tb_score中(表明該學生選修了課程)的學生姓名查詢出來SELECT studentNameFROM tb_studentWHERE tb_student.studentNo IN(SELECT DISTINCT tb_score, studentNo  FROM tb_score);或SELECT DISTINCT studentNameFROM tb_student, tb_scoreWHERE tb_student.studentNo = tb_score.studentNo;

說明:在處理這類子查詢時MySQL實際上執行了兩個操作,即先執行內層查詢,再執行外層查詢,內層查詢的結果作為外層查詢的比較條件。也可以使用NOT IN來判定一個給定值不屬於子查詢的結果。但是,這類表示否定的查詢不能用連接查詢來改寫。

2、帶比較運算符的子查詢

帶比較運算符的子查詢是指父查詢與子查詢之間用用比較運算符進行連接,當用戶能確定知道內層查詢返回的是單值時,可以用=、>、<、>=、<=、!=(<>)等比較運算符構造子查詢。

#查詢班級「計算機17-1班」所有學生的學號、姓名SELECT studentNo, studentName FROMtb_studentWHERE classNo =(SELECT classNo FROM tb_classWHERE className = 『計算機17-1班』)#查詢與「李明」在同一個班學習的學生學號、姓名、班號SELECT studentNo, studentName, classNo FROMtb_student s1WHERE classNo =(SELECT classNo FROM tb_ students s2WHERE studentName=』李明』) AND studentName != 』李明』;#上面的最後一個條件,是為了從結果集中去掉李明本人。

比較運算符還可以與ALL、SOME、ANY關鍵字一起構造子查詢。ALL、SOME、ANY用於指定對比較運算符的限制,ALL用於指定表達式需要與子查詢結果集中的每個值都進行比較當表達式與每個值都滿足比較關係時,會返回TRUE,否則返回FALSE,SOME和ANY是同義詞,表示表達式與子查詢結果集中的某個值滿足比較關係時,就返回TRUE,否則返回FALSE。

#查詢男生中比某個女生出生年份晚的學生姓名和出生年份SELECT studentName, YEAR(birthday) FROM tb_studentWHERE sex=』男』 AND YEAR(birthday)>ANY(SELECT YEAR(birthday) FROM tb_student WHEREsex=』女』);

3、帶EXISTS關鍵字的子查詢

使用關鍵字EXISTS構建子查詢時,系統對子查詢進行運算以判斷它是否返回結果集,如果子查詢的結果集不為空,則EXISTS返回的結果為TRUE,此時外層查詢語句將進行查詢,如果子查詢的結果集為空,則EXISTS返回的結果為FALSE,此時外層查詢不進行查詢。

由於帶EXISTS的子查詢只返回TRUE或FALSE,內層查詢的SELECT 子句給出欄位名稱的實際意義,所以其目標列表達式通常用星號「*」。與EXISTS相對應的是NOT EXISTS,使用方法相同。

#查詢選修了課程號為「31002」的學生姓名SELECT studentName FROM tb_student aWHERE EXISTS(SELECT * FROM tb_score bWHERE a.studentNo= b.studentNo AND courseNo=』31002』);或SELECT studentName FROM tb_studentWHERE studentNo IN(SELECT studentNo FROM tb_score WHERE courseNo=』31002』);

說明:與關鍵字IN不同的是,外層的WHERE子句中關鍵字EXISTS前面沒有指定內層查詢結果集與外層查詢的比較條件,故使用關鍵字EXISTS構造子查詢時內層的WHERE子句中需要指定連接條件,即a.studentNo=b.studentNo。

數據分析系列 16/32 | MySQL中子查詢與聯合查詢

PART

02

聯合查詢

使用UNION關鍵字可以把來自多個SELECT語句的結果組合到一個結果集中,這種查詢稱為並(UNION)運算或聯合查詢。合併時,多個SELECT子句中對應的欄位數和數據類型必須相同。下面不使用ALL關鍵字,執行的時候去掉重複的記錄,所有返回的行都是唯一的,使用關鍵字ALL的作用是不去掉重複的記錄,也不對結果進行自動排序。

語法格式是:

SELECT -FROM -WHEREUNION [ALL]SELECT -FROM -WHERE[...UNION [ALL]SELECT -FROM -WHERE]

例子:

#使用UNION查詢選修了「管理學」或「計算機基礎」的學生學號SELECT studentNo FROM tb_score, tb_courseWHERE tb_score .courseNo= tb_course. courseNoAND courseName=』管理學』UNIONSELECT studentNo FROM tb_score, tb_courseWHERE tb_score .courseNo= tb_course. courseNoAND courseName=』 計算機基礎』;

使用UNION語句需要注意以下幾點:

  • UNION語句必須由兩條或兩條以上的SELECT語句組成,且彼此間用關鍵字UNION分隔。
  • UNION語句中的每個SELECT子句必須包含相同的列、表達式或聚合函數。
  • 每個SELECT子句對應的目標列的數據類型必須兼容,目標列的數據類型不必完全相同,但必須是MySQL可以隱含轉換的類型,例如,不同的數值類型或不同的日期類型。
  • 第一個SELECT子句對應的目標列名會被作 為UNION語句結果集的列名稱。
  • 聯合查詢中只能使用一條ORDER BY自己或LIMIMT自己,且它們置於最後一條SELECT語句之後。

今天分享下MySQL中的子查詢和聯合查詢,這對多層查詢很有幫助,在工作中,我們常用的是子查詢,因為很多數據都不是存儲在一個表中,需要進行多層查詢。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/268194.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-16 13:08
下一篇 2024-12-16 13:08

相關推薦

發表回復

登錄後才能評論