天天看點

SQL第23課~相關子查詢+運算符+SELECT子句FROM子句

所有内容收錄在合集~SQL入門到熟練。歡迎點贊關注我哦~

Correlated Subqueries

SELECT子句中的子查詢

FROM子句中的子查詢

第一步找出支付訂單中高于平均值的訂單。執行查詢的時候,順序是先找出平均值,然後進行對比,如果高于平均值,就會傳回到結果裡。

然後是第二條記錄,也會計算平均值,就是相關子查詢。子查詢和外查詢存在相關性。引用了外查詢裡面出現的别名,就是那個p,進行了一個關聯。

SQL第23課~相關子查詢+運算符+SELECT子句FROM子句

對應的,之前沒有這個步驟的查詢,就是非關聯子查詢。沒有外查詢的引用和外查詢有相關性,是以執行一次查詢。

而添加了這部分内容的查詢,傳回了一系列的客戶id,則可以指派到外查詢,或者主查詢相關的where子句中。

where customer_id=p.customer_id

使用相關子查詢的時候,會在主查詢的每一層面執行,是以相關子查詢執行的會慢一些,會清楚的看到這些資料是跳出來的。資料越多,執行越慢,記憶體占的越多。但是,他好用的時候也很多。

EXISTS 運算符

在上面這個寫法的基礎上,内連接配接和外連接配接關聯了。

SQL第23課~相關子查詢+運算符+SELECT子句FROM子句

在子查詢中引用了表格,在第一個where後面引用了列,并且得出了結果。

如果不想引用列的話,可以用EXISTS替代,代表運作的資料中是否有存在符号條件的行。執行的時候,系統會檢查是否存在一條符合這個條件的記錄。

SQL第23課~相關子查詢+運算符+SELECT子句FROM子句

差別:

用in時,mysol會執行這段子查詢,并把結果傳回到where子句,但是由于是逐個傳回的,如果in後面的數字很多,比如1233567890,會執行很久,妨礙最佳性能。那麼這個時候,使用EXISTS運算符會提高效率。

用EXISRS時,子查詢沒有給外查詢傳回一個結果,會傳回一個指令,說明這個查詢中是否有一個符合這個搜尋條件的行。

是否有符合條件的資料,隻要找到表中有一個符合條件的記錄,就會傳回true給EXISTS運算符,然後運算符就會添加記錄。

小結:如果在IN運算符後的子查詢生成了很大的結果集,使用EXISTS更有效率。使用EXISTS的時候,子查詢并沒有真的把結果集傳回給外查詢。

假設還是在拼多多買東西,然後找出沒有下單的

SQL第23課~相關子查詢+運算符+SELECT子句FROM子句

對比一下,然後由于這裡有NOT運算符,是以true會傳回false,記錄不會放入結果集中。

SQL第23課~相關子查詢+運算符+SELECT子句FROM子句

SELECT子句中的子查詢

前面的子查詢都是where子句,可以試試看看有沒有其他的子句了。

比如還是這個表格,查找顧客資訊,訂單資訊,金額和平均值。。

然後為了書寫更清晰,我把括号裡面的子查詢設定為一個名字,比如A

然後我想計算單價和平均的內插補點,

SQL第23課~相關子查詢+運算符+SELECT子句FROM子句

那麼我進行添加,由于表達式中不可以使用别名,是以我進行複制。

得出一個結果,雖然這樣寫是一長串,也是不錯的方法。

SQL第23課~相關子查詢+運算符+SELECT子句FROM子句

還有一種方法,把它轉化為子查詢。那麼我剛才給了一個别名A,現在可以直接這麼寫。

(select A),直接放進括号裡面,執行是一樣的結果。

SQL第23課~相關子查詢+運算符+SELECT子句FROM子句

FROM子句中的子查詢

目前一直用的是虛拟表格,但是和真實的表格一樣,可以從儲存中擷取表格,通過客戶id列等,和其他表格進行連接配接,篩選資料,資料分組等。

現在用剛才寫好的查詢,開始寫FROM子查詢。

可以直接把剛才寫的内容轉化為子查詢,加括号,加from。

SQL第23課~相關子查詢+運算符+SELECT子句FROM子句

然後報錯了,理由是 Every derived table must have its own alias

子查詢需要有一個别名,這是必選項,不管你是否用到,就是要有名字。

是以我随機極簡取了名字,A,B,C。

SQL第23課~相關子查詢+運算符+SELECT子句FROM子句

然後得到一個表,主要特點就是名字不一樣。

這個時候,可以再寫一段查詢,用where子句,隻傳回某個設定條件。

比如傳回2.99。

SQL第23課~相關子查詢+運算符+SELECT子句FROM子句

當然,也可以連接配接其他表。

選擇from寫子查詢,表格會瞬間膨脹好幾倍,也就是說變得複雜了。

是以,可以試試視圖的形式,可以用這段查詢,作為視圖存放到資料庫中。

然後也取一個名字,就可以簡化很多。

總結:from由于比較麻煩,隻用于簡單的查詢。