所有内容收錄在合集~SQL入門到熟練。歡迎點贊關注我哦~
Correlated Subqueries
SELECT子句中的子查詢
FROM子句中的子查詢
第一步找出支付訂單中高于平均值的訂單。執行查詢的時候,順序是先找出平均值,然後進行對比,如果高于平均值,就會傳回到結果裡。
然後是第二條記錄,也會計算平均值,就是相關子查詢。子查詢和外查詢存在相關性。引用了外查詢裡面出現的别名,就是那個p,進行了一個關聯。
對應的,之前沒有這個步驟的查詢,就是非關聯子查詢。沒有外查詢的引用和外查詢有相關性,是以執行一次查詢。
而添加了這部分内容的查詢,傳回了一系列的客戶id,則可以指派到外查詢,或者主查詢相關的where子句中。
where customer_id=p.customer_id
使用相關子查詢的時候,會在主查詢的每一層面執行,是以相關子查詢執行的會慢一些,會清楚的看到這些資料是跳出來的。資料越多,執行越慢,記憶體占的越多。但是,他好用的時候也很多。
EXISTS 運算符
在上面這個寫法的基礎上,内連接配接和外連接配接關聯了。
在子查詢中引用了表格,在第一個where後面引用了列,并且得出了結果。
如果不想引用列的話,可以用EXISTS替代,代表運作的資料中是否有存在符号條件的行。執行的時候,系統會檢查是否存在一條符合這個條件的記錄。
差別:
用in時,mysol會執行這段子查詢,并把結果傳回到where子句,但是由于是逐個傳回的,如果in後面的數字很多,比如1233567890,會執行很久,妨礙最佳性能。那麼這個時候,使用EXISTS運算符會提高效率。
用EXISRS時,子查詢沒有給外查詢傳回一個結果,會傳回一個指令,說明這個查詢中是否有一個符合這個搜尋條件的行。
是否有符合條件的資料,隻要找到表中有一個符合條件的記錄,就會傳回true給EXISTS運算符,然後運算符就會添加記錄。
小結:如果在IN運算符後的子查詢生成了很大的結果集,使用EXISTS更有效率。使用EXISTS的時候,子查詢并沒有真的把結果集傳回給外查詢。
假設還是在拼多多買東西,然後找出沒有下單的
對比一下,然後由于這裡有NOT運算符,是以true會傳回false,記錄不會放入結果集中。
SELECT子句中的子查詢
前面的子查詢都是where子句,可以試試看看有沒有其他的子句了。
比如還是這個表格,查找顧客資訊,訂單資訊,金額和平均值。。
然後為了書寫更清晰,我把括号裡面的子查詢設定為一個名字,比如A
然後我想計算單價和平均的內插補點,
那麼我進行添加,由于表達式中不可以使用别名,是以我進行複制。
得出一個結果,雖然這樣寫是一長串,也是不錯的方法。
還有一種方法,把它轉化為子查詢。那麼我剛才給了一個别名A,現在可以直接這麼寫。
(select A),直接放進括号裡面,執行是一樣的結果。
FROM子句中的子查詢
目前一直用的是虛拟表格,但是和真實的表格一樣,可以從儲存中擷取表格,通過客戶id列等,和其他表格進行連接配接,篩選資料,資料分組等。
現在用剛才寫好的查詢,開始寫FROM子查詢。
可以直接把剛才寫的内容轉化為子查詢,加括号,加from。
然後報錯了,理由是 Every derived table must have its own alias
子查詢需要有一個别名,這是必選項,不管你是否用到,就是要有名字。
是以我随機極簡取了名字,A,B,C。
然後得到一個表,主要特點就是名字不一樣。
這個時候,可以再寫一段查詢,用where子句,隻傳回某個設定條件。
比如傳回2.99。
當然,也可以連接配接其他表。
選擇from寫子查詢,表格會瞬間膨脹好幾倍,也就是說變得複雜了。
是以,可以試試視圖的形式,可以用這段查詢,作為視圖存放到資料庫中。
然後也取一個名字,就可以簡化很多。
總結:from由于比較麻煩,隻用于簡單的查詢。