在SQL中常用的存在的 關聯查詢 exist join in ,最佳化查詢
一、 “查詢A表中在(或者不在)B表中的記錄”
1、 join /in /exists 都可以用來實現,,這種查詢,在查詢的兩個表大小相當的情況下,3種查詢方式的執行時間通常是: exists <= in <= join
當表中欄位允許NULL時,not in 的方式最慢;
not exists <= left join <= not in
比較:
-
JOIN 和 IN
select * from A where id in(select id from B)
select * from A left join B on A.id = B.id
使用join也可以實現這種功能(“查詢A表中在(或者不在)B表中的記錄”),但是往往吃力不討好,因為還需要處理NULL,JOIN的使用場景是連線兩個表,而不是判斷一個表的記錄是否在另一個表中 -
in 和 exists
select * from A where id in(select id from B)
但是,通常情況下,兩個表中資料是一個較大,一個較小,這種情況下,
in適合子查詢表B 資料小的情況
exists適合子查詢表B 資料大的情況
原因:in在查詢的時候,先查子查詢的表B,然後將內表和外表做一個笛卡爾積,然後按照條件篩選,所以子查詢表比較小的時候,in的速度較快; 而exists 是對外表A做loop迴圈,每次loop迴圈再對內表B進行查詢,即我們先查詢的不是子查詢B的內容,而是查我們的主查詢的表A,所以子查詢表資料比較大的時候,exists的速度較快
select 3 in (1,2,3); -- true
select 3 in (1,2,4); -- false
select 3 in (1,2,null); -- null
select 3 not in (1,2,null); -- null
SELECT EXISTS (SELECT 1 FROM (SELECT 3 AS num) AS temp WHERE temp.num IN (1,2,4,3)) AS result; -- true
SELECT EXISTS (SELECT 1 FROM (SELECT 3 AS num) AS temp WHERE temp.num IN (1,2,4)) AS result; -- false
SELECT EXISTS (SELECT 1 FROM (SELECT 3 AS num) AS temp WHERE temp.num IN (1,2,4,null)) AS result; -- false
當 ansi_nulls 開啟時,3 <> NULL 被解釋為 UNKNOWN,因為在 ANSI SQL 中,任何與 NULL 進行比較的結果都是未知的。
當 ansi_nulls 關閉時,3 <> NULL 被解釋為 TRUE,因為 SQL Server 認為 3 不等於 NULL。
ansi_nulls 表示是否嚴格遵循 ANSI SQL 標準,ansi_nulls
- not in 和 not exists
select * from A where id not in(select id from B)
無論哪個表大,not exists 總是比 not in 執行效率高
2、sql效能最佳化 效能最佳化
3、 索引
-
單列索引(Single-Column Index):
單列索引是針對單個列建立的索引。在給定的表中,每個索引項只包含一個列的值。
例如,CREATE INDEX idx_table_name ON table_name(name); 建立的是一個針對 name 列的單列索引。
單列索引適用於對單個列進行查詢、排序、過濾和連線操作。它可以加速對單個列的等值查詢(=)、範圍查詢(BETWEEN)、排序查詢(ORDER BY)等操作。 -
組合索引(Composite Index):
組合索引是針對多個列組合而成的索引。在給定的表中,每個索引項包含多個列的值。
例如,CREATE INDEX idx_table_name ON table_name(name, comment_info); 建立的是一個針對 name 列和 comment_info 列的組合索引。
組合索引適用於對多個列進行聯合查詢、排序、過濾和連線操作。它可以加速聯合查詢中的多個列的等值查詢、範圍查詢、排序查詢等操作。另外,組合索引也可以減少索引的數量,節省儲存空間。 -
唯一索引(Unique Index):
唯一索引是保證索引列的值唯一的索引。在給定的表中,每個索引項包含的列的值都是唯一的。
例如,CREATE UNIQUE INDEX unique_idx ON table_name(table_id); 建立的是一個唯一索引,確保 table_id 列中的值都是唯一的。
唯一索引適用於確保表中某個列或列組的值唯一性,通常用於主鍵約束或唯一性約束。