一、關聯子查詢是什么
關聯子查詢是指和外部查詢有關聯的子查詢,具體來說就是在這個子查詢里使用了外部查詢包含的列。在關聯子查詢中,對于外部查詢返回的每一行數據,內部查詢都要執行一次。另外,在關聯子查詢中是信息流是雙向的。外部查詢的每行數據傳遞一個值給子查詢,然后子查詢為每一行數據執行一次并返回它的記錄。然后,外部查詢根據返回的記錄做出決策。
關聯子查詢與嵌套子查詢不同的是,信息傳播是雙向而不是單向的。在嵌套子查詢中,僅處理內部查詢一次,并向外部查詢傳遞信息——本質上提供相同值或者列出錄入的清單。但是,內部查詢利用關聯子查詢涉及外部查詢提供的信息,反之亦然。這種說法似乎有點令人混淆,但它可以分為三步進行處理:
外部查詢得到一條記錄并傳遞到內部查詢中;內部查詢基于輸入值執行;內部查詢把返回值輸出到外部查詢中,并用這些值結束內部查詢。二、關聯子查詢語法的好處
1、簡化SQL語句:關聯子查詢語法可以將多個SQL查詢合并成一個查詢,從而簡化SQL語句的編寫。這樣可以減少代碼量,提高開發效率。
2、提高查詢效率:關聯子查詢語法可以避免多次執行相同的查詢,從而提高查詢效率。使用關聯子查詢可以將兩個或多個表的數據一次性讀入內存中,在內部完成數據比較,減少對數據庫的IO操作,提高查詢速度。
3、方便進行數據分析:關聯子查詢可以將多個表的數據合并在一起,方便進行數據的分析和處理。使用關聯子查詢可以更容易地獲取和處理表與表之間的數據,增強了SQL查詢的靈活性和功能擴展性。
4、支持復雜查詢:關聯子查詢可以支持復雜的查詢需求,如嵌套子查詢、多個SELECT語句的組合等,從而滿足不同業務場景下的需求。
三、關聯查詢優化
1、外連接小表驅動大表:LEFT JOIN 時,選擇小表作為驅動表, 大表作為被驅動表 。減少外層循環的次數。
2、內連接驅動表由優化器決定:INNER JOIN 時,MySQL會自動將 小結果集的表選為驅動表 。選擇相信MySQL優化策略。
3、被驅動表優先創建索引:被驅動表的JOIN字段要創建索引。
4、兩表連接字段類型必須一致:兩個表JOIN字段數據類型保持絕對一致。防止自動類型轉換導致索引失效。
5、關聯替代子查詢:能夠直接多表關聯的盡量直接關聯,不用子查詢。(減少查詢的趟數)。子查詢是一個SELECT查詢的結果作為另一個SELECT語句的條件。
6、多次查詢代替子查詢:不建議使用子查詢,建議將子查詢SQL拆開結合程序多次查詢,或使用 JOIN 來代替子查詢。
四、子查詢
子查詢是一種常用計算機語言SELECT-SQL語言中嵌套查詢下層的程序模塊。當一個查詢是另一個查詢的條件時,稱之為子查詢。
在SQL語言中,一個SELECT-FROM-WHERE語句稱為一個查詢塊。當獲得一個查詢的答案需要多個步驟的操作,首先必須創建一個查詢來確定用戶不知道但包含在數據庫中的值,將一個查詢塊嵌套在另一個查詢塊的WHERE字句或HAVING短語的條件中查詢塊稱為子查詢或內層查詢。上層的查詢塊曾為父查詢或外層查詢。子查詢的結果作為輸入傳遞回“父查詢”或“外部查詢”。父查詢將這個值結合到計算中,以便確定最后的輸出。
SQL語言允許多層嵌套查詢,即一個子查詢中還可以嵌套其他子查詢。以層層嵌套的方式來構造程序正是SQL中”結構化”的含義所在。子查詢是本質上就是一個完整 的SELECT 語句,它可以使一個 SELECT、SELECT…INTO 語句、INSERT…INTO 語句、DELETE 語句、或 UPDATE 語句或嵌套在另一子查詢中。子查詢的輸出可以包括一個單獨的值(單行子查詢)、幾行值(多行子查詢)、或者多列數據(多列子查詢)。
延伸閱讀1:WHERE子句中的關聯子查詢
在這個特定的查詢中,外部查詢只在WHERE子句中引用內部查詢——它也可以在SELECT清單中包括從內部查詢中獲得的數據。通常根據自己的意愿決定是否希望使用別名,但對關聯子查詢,則必須使用別名。這種查詢在很大程度上顯示了為什么內部查詢和外部查詢都建立在同一張表上。兩個查詢都從彼此之間獲得信息,因此,如果沒有別名,它們就不會知道用戶對哪張表的數據感興趣。