在SQL語句中,SELECT IN是常用的一種查詢方式。通過使用IN關鍵字,可以查詢某一列中包含特定值的所有行。下面,我們將從多個方面對SQL SELECT IN進行詳細的闡述。
一、IN的基本用法
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);
IN語法簡介:SELECT語句中,IN關鍵字用於指定一個集合,該集合包含所要求的列的值。這個集合可以由一個或多個用逗號分隔的值、子查詢、表達式或參數指定。
下面是一個簡單的示例:
SELECT * FROM customers
WHERE country IN ('USA', 'UK');
以上語句的含義是:在”customers”表中,選擇”country”列等於”USA”或者”UK”的全部數據。
注意:
1、IN子句中不能多於1000個值。如果需要查詢超過1000個值,可以將值放置到一個臨時表中並使用JOIN語句來進行查詢。
2、在實際應用中,IN語句需要慎用,因為它會影響查詢效率,尤其是當IN語句中的集合非常大時。
二、IN與NOT IN的區別
除了IN,另外一種常用的條件是NOT IN。NOT IN與IN的區別在於,我們假設IN查詢的列中有多個值可以匹配,那麼IN將選擇所有匹配的行,而NOT IN將選擇所有不匹配的行。
下面是一個示例:
SELECT * FROM customers
WHERE country NOT IN ('USA', 'UK');
以上語句的含義是:在”customers”表中,選擇”country”列不等於”USA”或者”UK”的全部數據。
注意:
1、在執行NOT IN查詢時,需要注意列中是否有NULL值。如果列中有NULL值,NOT IN語句不會選擇這些具有NULL值的行。
三、IN與子查詢的結合使用
IN語句還可以和子查詢一起使用,來進行更加複雜的查詢。
下面是一個示例:
SELECT * FROM customers
WHERE customer_id IN (
SELECT customer_id
FROM orders
WHERE order_date BETWEEN '2020-01-01' AND '2020-12-31'
);
以上語句的含義是:在”customers”表中,選擇那些客戶,在訂單表”orders”中下了2020年的訂單。
注意:
1、IN與子查詢結合使用時,需要用小括號將子查詢括起來。
2、在實際應用中,子查詢的效率通常比較低,所以需要慎用。
四、IN與存在性子查詢
除了IN與子查詢的結合使用,IN還經常用於存在性子查詢。
下面是一個示例:
SELECT * FROM customers
WHERE EXISTS (
SELECT * FROM orders
WHERE orders.customer_id = customers.customer_id
);
以上語句的含義是:在”customers”表中,選擇那些已經在訂單表”orders”中有訂單的客戶。
注意:
1、在這個查詢中,我們檢查是否有一個子查詢返回結果。如果存在,則返回”customers”表中的相關行。
2、IN語句在存在性子查詢中的使用,比其他的查詢方法(例如LEFT JOIN)更加清晰,也更容易理解和優化。
五、IN與多個列的關係
IN語句還可以與多個列的關係一起使用。
下面是一個示例:
SELECT * FROM customers
WHERE (country, city) IN (
('USA', 'New York'),
('France', 'Paris'),
('Germany', 'Berlin')
);
以上語句的含義是:在”customers”表中,選擇那些客戶,其”country”列等於”USA”並且”city”列等於”New York”,或者”country”列等於”France”並且”city”列等於”Paris”,以及”country”列等於”Germany”並且”city”列等於”Berlin”。
注意:
1、在這個查詢中,IN語句與括號里的兩個列一起使用,相當於對兩個列完成一個聯接,然後再進行IN語句的查詢。
2、在實際應用中,除非數據表中的唯一性約束很明顯,否則應該避免使用這種多列的IN查詢,因為它們通常會影響性能。
六、IN與參數化查詢
在實際應用中,為了更好的代碼安全性以及重複使用SQL查詢,我們常常採用參數化查詢。下面是一個示例:
DECLARE @Country varchar(255)
SET @Country = 'USA'
SELECT *
FROM customers
WHERE country = @Country;
以上語句的含義是:在”customers”表中,選擇”country”列等於”@Country”變量的全部數據。
注意:
1、參數化查詢通常用於存儲過程或應用程序的代碼。
2、它的優點是,由於沒有在SQL查詢中包含任何變量的值,因此它更加安全。黑客無法通過SQL注入攻擊來獲得訪問數據庫的權限。
七、IN的擴展用法
IN語句還可以擴展到其他方面的查詢中。
下面是一個示例:
SELECT *
FROM customers
WHERE employee_id IN (
SELECT employee_id FROM employees
WHERE title = 'Sales Representative'
);
以上語句的含義是:在”customers”表中,選擇那些下了銷售員的訂單的顧客。
注意:
1、在這個查詢中,我們首先選取了職位為”Sales Representative”的員工列表,然後將這個列表用作IN語句中的查詢條件。
2、這個查詢的好處在於,如果需要改變查詢條件,我們只需要修改子查詢的SQL語句即可。
總結
SQL SELECT IN是一種常用的查詢方式,可以針對多個列進行IN查詢、NOT IN查詢以及子查詢等。但需要注意,需要避免過度使用IN,否則會影響查詢效率。
原創文章,作者:DKPV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/138639.html