Trong SQL, IN
toán tử cho phép bạn lọc kết quả truy vấn của mình dựa trên danh sách các giá trị.
Bạn cũng có thể sử dụng nó để so khớp với bất kỳ giá trị nào được trả về bởi một truy vấn con (truy vấn con là một truy vấn được lồng bên trong một truy vấn khác).
Bảng nguồn
Các bảng sau được sử dụng cho các ví dụ trên trang này.
SELECT * FROM PetTypes;
SELECT * FROM Pets;
Kết quả:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected) +---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Ví dụ
Dưới đây là một ví dụ để chứng minh IN
nhà điều hành.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName IN ('Fluffy', 'Bark', 'Wag');
Kết quả:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 4 | Wag | 2020-03-15 | | 6 | Fluffy | 2020-09-17 | | 7 | Bark | NULL | +---------+-----------+------------+
Chúng tôi có thể đạt được kết quả tương tự bằng cách sử dụng hai OR
toán tử:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName = 'Fluffy'
OR PetName = 'Bark'
OR PetName = 'Wag';
Tuy nhiên, IN
toán tử là một cách ngắn gọn hơn để làm điều đó. IN
toán tử đặc biệt có lợi khi bạn có một danh sách dài các giá trị để so sánh với.
IN
toán tử hầu như luôn thực thi nhanh hơn nhiều OR
, đặc biệt là trên các tập dữ liệu lớn hơn.
Giá trị số
Các giá trị không chỉ giới hạn ở các chuỗi. Ví dụ:bạn có thể sử dụng IN
trên danh sách các giá trị số.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 5);
Kết quả:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+
Ngày
Dưới đây là một ví dụ sử dụng danh sách ngày tháng.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE DOB IN (
'2020-11-20',
'2018-10-01',
'2015-10-01'
);
Kết quả:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | +---------+-----------+------------+
Sử dụng IN
với Truy vấn con
Một lợi ích khác của IN
là toán tử có thể chứa một SELECT
khác danh sách. Đây được gọi là truy vấn con . Truy vấn con là một truy vấn được lồng bên trong một truy vấn khác (hoặc thậm chí là một truy vấn con khác).
Đây là một ví dụ.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Kết quả:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Ví dụ này cho chúng tôi thấy có bao nhiêu loại vật nuôi trong khách sạn vật nuôi của chúng tôi.
Sử dụng NOT IN
Chúng tôi có thể thêm NOT
để lật điều này và xem có bao nhiêu loại vật nuôi không trong khách sạn thú cưng của chúng tôi.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId NOT IN ( SELECT PetTypeId FROM Pets );
Kết quả:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 4 | Rabbit | +-------------+-----------+
Trong trường hợp này, cơ sở dữ liệu của chúng tôi chứa một loại vật nuôi là Rabbit
, nhưng chúng tôi hiện không có bất kỳ con thỏ nào làm thú cưng.
Biểu thức
Các giá trị được cung cấp là một danh sách các biểu thức. Do đó, bạn có thể làm những việc như sau:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 2 + 3);
Kết quả:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+