mysql的復雜查詢_mysql復雜查詢

所謂復雜查詢,指涉及多個表、具有嵌套等復雜結構的查詢。這里簡要介紹典型的幾種復雜查詢格式。

一、連接查詢

連接是區別關系與非關系系統的最重要的標志。通過連接運算符可以實現多個表查詢。連接查詢主要包括內連接、外連接等。

假設有Student和Grade兩個表如下:

+-----+--------+-------+ +-----+------------+--------+

| sID | sName | sDept | | gID | gCourse | gScore |

+-----+--------+-------+ +-----+------------+--------+

| 1 | Paul | CS | | 1 | Math | 87 |

| 2 | Oliver | MS | | 2 | English | 95 |

| 3 | Jack | SE | | 3 | Physics | 76 |

| 4 | Robin | CS | | 7 | Philosophy | 76 |

+-----+--------+-------+ +-----+------------+--------+

1.1 內連接

內連接(INNER JOIN)使用比較運算符進行表間列數據的比較操作,并列出這些表中與連接條件相匹配的數據行,組合成新的記錄。

當比較操作符是=時,稱為等值連接:

SELECT * FROM Student INNER JOIN Grade ON Student.sID = Grade.gID;

等價于

SELECT * FROM Student,Grade WHERE Student.sID = Grade.gID;

結果如下:

+-----+--------+-------+-----+---------+--------+

| sID | sName | sDept | gID | gCourse | gScore |

+-----+--------+-------+-----+---------+--------+

| 1 | Paul | CS | 1 | Math | 87 |

| 2 | Oliver | MS | 2 | English | 95 |

| 3 | Jack | SE | 3 | Physics | 76 |

+-----+--------+-------+-----+---------+--------+

可以看出,在內連接查詢中,只有滿足條件的記錄才能出現在結果關系中。

1.2 外連接

與內連接不同的是,外連接返回的查詢結果集中不僅包含符合連接條件的行,而且還包括左表(左連接)、右表(右連接)或兩個表(全外連接)中的所有數據行。

1.2.1 左連接

LEFT JOIN(左連接),即LEFT OUTER JOIN,返回左表的全部記錄,即使右表中沒有對應匹配記錄。

SELECT * FROM Student LEFT JOIN Grade ON Student.sID = Grade.gID;

結果如下:

+-----+--------+-------+------+---------+--------+

| sID | sName | sDept | gID | gCourse | gScore |

+-----+--------+-------+------+---------+--------+

| 1 | Paul | CS | 1 | Math | 87 |

| 2 | Oliver | MS | 2 | English | 95 |

| 3 | Jack | SE | 3 | Physics | 76 |

| 4 | Robin | CS | NULL | NULL | NULL |

+-----+--------+-------+------+---------+--------+

1.2.2 右連接

RIGHT JOIN(右連接),即RIGHT OUTER JOIN,返回右表的全部記錄,即使左表中沒有對應匹配記錄。

SELECT * FROM Student RIGHT JOIN Grade ON Student.sID = Grade.gID;

結果如下:

+------+--------+-------+-----+------------+--------+

| sID | sName | sDept | gID | gCourse | gScore |

+------+--------+-------+-----+------------+--------+

| 1 | Paul | CS | 1 | Math | 87 |

| 2 | Oliver | MS | 2 | English | 95 |

| 3 | Jack | SE | 3 | Physics | 76 |

| NULL | NULL | NULL | 7 | Philosophy | 76 |

+------+--------+-------+-----+------------+--------+

1.2.3 全連接

FULL JOIN(全連接),即FULL OUTER JOIN,返回左表、右表的全部記錄,即使沒有對應的匹配記錄。

**注意:**MySQL不支持FULL JOIN,不過可以通過UNION關鍵字來合并 LEFT JOIN 與 RIGHT JOIN來模擬。

SELECT * FROM Student LEFT JOIN Grade ON Student.sID = Grade.gID

UNION

SELECT * FROM Student RIGHT JOIN Grade ON Student.sID = Grade.gID

結果如下:

+------+--------+-------+------+------------+--------+

| sID | sName | sDept | gID | gCourse | gScore |

+------+--------+-------+------+------------+--------+

| 1 | Paul | CS | 1 | Math | 87 |

| 2 | Oliver | MS | 2 | English | 95 |

| 3 | Jack | SE | 3 | Physics | 76 |

| 4 | Robin | CS | NULL | NULL | NULL |

| NULL | NULL | NULL | 7 | Philosophy | 76 |

+------+--------+-------+------+------------+--------+

另外,如果在一個連接查詢中涉及到的兩個表是同一個表,這種查詢稱為自連接查詢。為了防止產生二義性,自連接查詢中通常對表使用別名。

二、子查詢

子查詢是指一個查詢語句嵌套在另一個查詢語句內部的查詢。在 SELECT 子句中先計算子查詢,子查詢結果作為外層另一個查詢的過濾條件。

子查詢中常用的操作符有ANY、SOME、ALL、EXISTS、IN,也可以使用比較運算符。子查詢可以添加到 SELECT、UPDATE 和 DELETE 語句中,而且可以進行多層嵌套。

2.1 在條件表達式中產生標量的子查詢

SELECT *

FROM score

WHERE id = (SELECT event_id

FROM event

WHERE date='2015-07-01'

AND type='Q');

所謂標量,就是單個屬性的一個原子值。當子查詢出現在 WHERE 子句中的比較運算符(= ,>, >= ,< , <= ,<>)的右邊,其輸出結果應該只有一個才對。很容易理解,如果返回多條結果,就無法進行比較,系統就會報錯。

又如:

SELECT * FROM teacher WHERE birth = MIN(birth); /*錯誤*/

這個查詢是錯的!因為MySQL不允許在子句里面使用統計函數,所以改用子查詢:

SELECT *

FROM teacher

WHERE birth = (SELECT MIN(birth)

FROM teacher);

2.2 在條件表達式中產生集合的子查詢

如果子查詢的輸出是一個結果集合,可以通過 ANY、ALL、IN 進行比較。

2.2.1 ANY與SOME

ANY和SOME關鍵字是同義詞,表示滿足其中任一條件。它們允許創建一個表達式對子查詢的返回結果集進行比較:

SELECT num1

FROM t1

WHERE num1 > ANY(SELECT num2

FROM t2);

上面的子查詢返回 t2 的 num2 列,然后將 t1 中的 num1 值與之進行比較,只要大于 num2 的任何一個值,即為符合查詢條件的結果。

等價于:

SELECT num1

FROM t1

WHERE num1 > SOME(SELECT num2

FROM t2);

2.2.2 ALL

與ANY/SOME不同,使用ALL時需要同時滿足所有內層查詢的條件。

SELECT num1

FROM t1

WHERE num1 > ALL(SELECT num2

FROM t2);

上面的子查詢還是返回 t2 的 num2 列,然后將 t1 中的 num1 值與之進行比較。但是只有大于所有 num2 值的 num1 才是符合查詢條件的結果。

2.2.3 IN

IN關鍵字后接一個子查詢,若在子查詢結果集中,返回true,否則返回false。與之相對的是NOT IN。

SELECT num1

FROM t1

WHERE num1 IN (SELECT num2

FROM t2);

2.3 在條件表達式中測試空/非空的子查詢

EXISTS關鍵字后接一個任意的子查詢,系統對子查詢進行運算以判斷它是否返回行。

若至少返回一行,那么 EXISTS 的結果為 true,此時外層查詢語句將進行查詢;

若沒有返回任何行,那么 EXISTS 的結果為 false,此時外層語句將不進行查詢。

SELECT sName

FROM Student

WHERE EXISTS (SELECT *

FROM Grade

WHERE gScore < 60);

EXISTS和NOT EXISTS的結果只取決于是否會返回行,而不取決于這些行的內容。

2.4 關聯子查詢

一般的子查詢只計算一次,其結果用于外層查詢。但關聯子查詢需要計算多次。

子查詢中使用了主查詢中的某些字段,主查詢每掃描一行都要執行一次子查詢,這種子查詢稱為關聯子查詢(Correlated Subquery)。

SELECT sName

FROM Student

WHERE '450' NOT IN (SELECT courseID

FROM Course

WHERE sID = Student.sID);

上面的子查詢中使用了 Student 表的 sID 字段。對于 Student 表中每一個 sID 都會執行一次子查詢。

2.5 FROM子句中的子查詢

子查詢可以用括號括起來作為一個關系,從而出現在 FROM 列表中。由于子查詢的結果關系沒有正式的名字,故必須給它取一個別名。

SELECT *

FROM Grade,

(SELECT * FROM Student WHERE sDept='CS')x

WHERE x.sID=Grade.gID;

x 就是子查詢的結果關系的別名。

三、合并查詢結果

利用UNION或UNION ALL關鍵字,可以將多個 SELECT 語句的結果組合成單個結果集。合并時,兩個表對應的列數和數據類型必須相同。

UNION:合并查詢結果時,刪除重復的記錄,返回的行都是唯一的。

UNION ALL:合并查詢結果時,不刪除重復行。

3.1 UNION ALL

SELECT * FROM Student

UNION ALL

SELECT * FROM Student;

結果如下:

+-----+--------+-------+

| sID | sName | sDept |

+-----+--------+-------+

| 1 | Paul | CS |

| 2 | Oliver | MS |

| 3 | Jack | SE |

| 4 | Robin | CS |

| 1 | Paul | CS |

| 2 | Oliver | MS |

| 3 | Jack | SE |

| 4 | Robin | CS |

+-----+--------+-------+

3.2 UNION

SELECT * FROM Student

UNION

SELECT * FROM Student;

結果如下:

+-----+--------+-------+

| sID | sName | sDept |

+-----+--------+-------+

| 1 | Paul | CS |

| 2 | Oliver | MS |

| 3 | Jack | SE |

| 4 | Robin | CS |

+-----+--------+-------+

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287687.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫調優要點紀要

數據庫瓶頸一般在IO和CPU 1、少用group by, order by 2、通過索引來排序&#xff08;不要所有字段都用索引&#xff0c;因為insert、update要重構索引很耗時&#xff09; 3、避免select * 4、少用join 5、join和子查詢&#xff0c;還是用join來代替子查詢吧 6、少用or 7、用uni…

Unity3D 之UGUI 滑動條(Slider)

這里來講解下UGUI 滑動條(Slider)的用法 控件下面有三個游戲對象 Background -->背景 Fill Area --> 前景區域 Handle Slide Area --> 滑動條 Slider的屬性 其他幾個設置和其他控件都差不多&#xff0c;這里來講解幾個特有的屬性。 Direction -->方向 Whole Number…

Android Studio導入別人的module提示錯誤Plugin with id ‘com.jfrog.bintray‘ not found.

1 問題 Android Studio導入別人的module提示錯誤如下 Plugin with id com.jfrog.bintray not found. Plugin with id com.github.dcendents.android-maven not found 2 解決辦法 在我們的項目的build.gradle添加如下配置 buildscript {repositories {google()jcenter()}dep…

C語言真的很難嗎?那是你沒看這張圖,化整為零輕松學習C語言。

真不難 C語言難不難&#xff1f;這個問題是相對的&#xff0c;對于找到合適方法學習C語言的同學想必是覺得很簡單&#xff1b;但對于一部分同學來說&#xff0c;沒有眾觀全局就會誤以為剛入門就需要學習龐大的知識&#xff0c;學著學著開始看不懂&#xff0c;由于心理作怪&…

【中間件】.net Core中使用HttpReports進行接口統計,分析, 可視化, 監控,追蹤等...

HttpReports 基于.Net Core 開發的APM監控系統&#xff0c;使用MIT開源協議&#xff0c;主要功能包括&#xff0c;統計, 分析, 可視化&#xff0c; 監控&#xff0c;追蹤等&#xff0c;適合在微服務環境中使用。官方地址&#xff1a;https://www.yuque.com/httpreports/docs/u…

【遙感數字圖像處理】實驗:遙感影像輻射糾正(大氣糾正)完整操作圖文教程(Erdas版)

一、實驗平臺:Erdas 9.1 二、實驗數據:dmtm.img 三、實驗內容:利用回歸分析法校正影像 四、實驗原理:大氣散射只影響短波波段,長短波進行對比,找出影響短波的程輻射值,將其減去 五、實驗目的:掌握回歸分析法校正影像的方法及步驟,能熟練地對影像進行校正 六、實…

Android之開源視頻壓縮框架RxFFmpeg的commands設置

1 Android視頻壓縮框架 地址:https://github.com/microshow/RxFFmpeg 2 問題 用ffmpeg進行壓縮的時候,我們需要采用ffmpeg命令壓縮官網給的命令如下 String text = "ffmpeg -y -i /storage/emulated/0/1/input.mp4 -vf boxblur=25:5 -preset superfast /storage/emul…

Acitivty生命周期

為什么80%的碼農都做不了架構師&#xff1f;>>> Acitivty 有七個生命周期&#xff1a; onCreate&#xff1a;當第一次調用一個Activity就會執行onCreate方法 onStart&#xff1a;當Activity處于可見狀態的時候就會調用onStart方法 onResume&#xff1a;當Activity可…

listview嵌套gridview

1.首先要自定義一個繼承gridview的類 public class MyGridView extends GridView {public boolean hasScrollBar true;public MyGridView(Context context) {super(context);}public MyGridView(Context context, AttributeSet attrs) {super(context, attrs);}Overrideprotec…

還不懂你現在學習的編程語言能做什么?還不懂如何進階?過來看圖

前言說七說八 本篇文章的配圖標注、內容并不代表僅有&#xff1b;本篇僅以個人經驗及當前大學&#xff08;大專、本科&#xff09;相關課程作對比&#xff0c;列出比較常規的語言發展走向及相關技術&#xff1b;再次重申&#xff0c;本圖及本文所涉及的技術發展走向并不代表著…

IT新起之秀

辭職以后自己比較迷茫&#xff0c;不知道自己能干什么&#xff0c;09年畢業到現在雖然工作經驗有7、8年&#xff0c;但是感覺自己什么都不會&#xff0c;除了自己能下車間別的好像也做不成&#xff0c;沒有一技之長。我更像是一個經驗用了7、8年而不是有7、8年的經驗 在齊魯人才…

【遙感數字圖像處理】實驗:遙感影像幾何糾正完整操作流程(Erdas版)

☆☆☆ 幾何糾正預備知識 ☆☆☆ 1、幾何變形誤差的影響因素 遙感器本身引起的畸變外部因素引起的畸變處理過程中引起的畸變2、需要做精糾正的情況 景與景之間作比較GIS建模之前監督分類時提取樣本創建高精度比例尺的影像地圖與矢量數據疊加源于不同比例尺的地圖之間比較提取精…

openid 釘釘_釘釘開發入門,微應用識別用戶身份,獲取用戶免登授權碼code,獲取用戶userid,獲取用戶詳細信息...

最近有個需求,在釘釘內,點擊微應用,獲取用戶身份,根據獲取到的用戶身份去企業內部的用戶中心做校驗,校驗通過,相關子系統直接登陸;就是在獲取這個用戶身份的時候,網上的資料七零八落的,找的人煩躁的很,所以自己記錄一下;實現這個要求,有好幾種方式,使用ISV方式相對來說比較簡單…

趣味二維碼生成

1背景介紹 最近在 Github 看到了一個有趣的項目 amazing-qr&#xff0c;它支持生成普通二維碼&#xff0c;帶圖片的藝術二維碼&#xff0c;動態二維碼。項目是用 python 編寫的&#xff0c;以命令行的方式運行生成&#xff0c;不太方便調用&#xff0c;因此&#xff0c;我…

學習進度博客十二

本周學習軟件工程所花時間為&#xff1a;4小時 代碼&#xff1a;200行 博客發表篇數&#xff1a;3 了解到的知識點&#xff1a;這周我們開始了第二次沖刺階段 轉載于:https://www.cnblogs.com/wulun/p/5610433.html

Android Studio提示No virtual method asBitmap()Lcom/bumptech/glide/RequestBuilder

1 問題 android studio導入別人項目的module,運行點擊app,程序奔潰&#xff0c;錯誤日志如下 Process: com.example.chenyu, PID: 6302java.lang.NoSuchMethodError: No virtual method asBitmap()Lcom/bumptech/glide/RequestBuilder; in class Lcom/bumptech/glide/RequestM…

電腦開機后,就會自動運行chkdsk,我想取消chkdsk,怎么取消

&#xfeff;&#xfeff;每次開機都自動檢查磁盤&#xff0c;檢測通過后下次還是一樣,NTFS/FAT32分區都有可能有這樣的情況&#xff0c;即使重裝系統&#xff0c;仍可能出現同樣情況&#xff0c;但是硬盤可以通過Dell 隨機帶的檢測程序解決方法&#xff1a;在命令行窗口中輸入…

《零基礎看得懂的C++入門教程 》——(1)第一個C++程序就讓你知其所以然

一、學習目標 了解第一個C程序了解第一個C程序結構了解什么是注釋了解什么是命名空間了解C語言的輸出&#xff08;如何在程序運行時顯示內容&#xff09;了解語句結束后需要使用什么符號表示結束 了解程序入口 目錄 預備第一篇&#xff0c;使用軟件介紹在這一篇&#xff0c;…

1、Locust壓力測試環境搭建

環境準備&#xff1a;阿里云服務器一臺、python2.7、pip Locust 介紹Locust 是一個開源負載測試工具。使用 Python 代碼定義用戶行為&#xff0c;也可以仿真百萬個用戶。 Locust 簡單易用&#xff0c;分布式&#xff0c;用戶負載測試工具。Locust 主要為網站或者其他系統進行負…

MicroStation V8i簡體中文版完全補丁安裝教程(附安裝包下載)

MicroStation是一款非常不錯的二維和三維設計軟件,由奔特力(Bentley)工程軟件系統有限公司開發的一款軟件。在CAD設計上該軟件是和AutoCAD是齊名的軟件,其專用的文件格式是DGN,當然該軟件還兼容AutoCAD的DWG/DXF等格式,該軟件的應用已經非常廣泛,在建筑、土木工程、交通…