Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Hiểu sự khác biệt giữa toán tử EXCEPT và NOT IN

Cả hai toán tử EXCEPT và NOT IN đều được sử dụng để lọc các bản ghi từ một bảng dựa trên một tiêu chí cụ thể. Trong bài viết này, chúng tôi sẽ xem xét chi tiết các toán tử này và sẽ điều tra sự khác biệt giữa chúng.

Trước khi chúng ta đi xa hơn, hãy tạo một số dữ liệu giả mà chúng ta sẽ sử dụng trong ví dụ này:

Chuẩn bị dữ liệu giả

Thực thi tập lệnh sau để tạo cơ sở dữ liệu giả và các bảng mà chúng ta sẽ sử dụng trong bài viết này.

CREATE Database ShowRoom;
GO
USE ShowRoom;

CREATE TABLE Cars1
(
    id INT,
    name VARCHAR(50) NOT NULL,
    company VARCHAR(50) NOT NULL,
    power INT NOT NULL
 )


CREATE TABLE Cars2
(
    id INT,
    name VARCHAR(50) NOT NULL,
    company VARCHAR(50) NOT NULL,
    power INT NOT NULL
 )

Trong đoạn mã ở trên, chúng tôi tạo cơ sở dữ liệu ShowRoom với hai bảng, Cars1 và Cars2.

Hãy thêm một số bản ghi giả vào bảng Cars1 và Cars2.

Thực thi tập lệnh sau:

USE ShowRoom

INSERT INTO Cars1

VALUES
(1, 'Corrolla', 'Toyota', 1800),
(2, 'City', 'Honda', 1500),
(3, 'C200', 'Mercedez', 2000),
(4, 'Vitz', 'Toyota', 1300),
(5, 'Baleno', 'Suzuki', 1500),
(6, 'C500', 'Mercedez', 5000),
(7, '800', 'BMW', 8000),
(8, 'Mustang', 'Ford', 5000),
(9, '208', 'Peugeot', 5400),
(10, 'Prius', 'Toyota', 3200)


INSERT INTO Cars2

VALUES
(6, 'C500', 'Mercedez', 5000),
(7, '800', 'BMW', 8000),
(8, 'Mustang', 'Ford', 5000),
(9, '208', 'Peugeot', 5400),
(10, 'Prius', 'Toyota', 3200),
(11, 'Atlas', 'Volkswagen', 5000),
(12, '110', 'Bugatti', 8000),
(13, 'Landcruiser', 'Toyota', 3000),
(14, 'Civic', 'Honda', 1800),
(15, 'Accord', 'Honda', 2800)

Bây giờ chúng tôi có một tập dữ liệu hữu ích.

Hãy xem toán tử EXCEPT và NOT IN khác nhau như thế nào khi sử dụng dữ liệu này.

NGOẠI LỆ Toán tử

Toán tử EXCEPT lọc tất cả các bản ghi từ kết quả truy vấn bên trái, cũng có trong kết quả của truy vấn bên phải và trả về các kết quả còn lại từ truy vấn bên trái.

Cú pháp của toán tử EXCEPT như sau:

Right_Query EXCEPT Left_Query

Có hai điều kiện cần được đáp ứng trước khi thực thi toán tử EXCEPT. Đó là:

  • Thứ tự và số lượng các cột mà cả hai truy vấn trả về phải giống nhau.
  • Loại dữ liệu của các cột phải khớp hoặc tương thích.

Điều này nghe có vẻ phức tạp. Tuy nhiên, ví dụ sau sẽ làm rõ hơn.

Trong bảng Cars1 và Cars2, các bản ghi có id 6 đến id 10 là phổ biến. Nếu chúng ta sử dụng toán tử EXCEPT với các bản ghi từ bảng Cars1 ở bên trái và bảng Cars2 ở bên phải, những bản ghi đó từ bảng Cars1 sẽ được trả về mà không có trong Cars2.
Hãy xem toán tử EXCEPT hoạt động như thế nào.
P>

USE ShowRoom
SELECT id, name, company, power FROM Cars1
Except
SELECT id, name, company, power FROM Cars2

Kết quả của truy vấn trên sẽ giống như sau:

Truy vấn ở phía bên trái truy xuất tất cả các bản ghi từ bảng Cars1 trong khi ở phía bên phải truy xuất tất cả các bản ghi từ bảng Cars2. Trong bảng Cars1, các bản ghi có id từ 6 đến 10 cũng có trong bảng Cars2, do đó, toán tử EXCEPT chỉ trả về năm hàng đầu tiên từ bảng Cars1.

Tương tự, nếu bạn muốn trả lại tất cả các bản ghi từ bảng Cars2 không có trong bảng Cars1, bạn chỉ cần di chuyển bảng Cars2 sang bên trái của toán tử EXCEPT như được hiển thị trong truy vấn sau:

USE ShowRoom
SELECT id, name, company, power FROM  Cars2
Except
SELECT id, name, company, power FROM  Cars1

Sử dụng toán tử EXCEPT trên một bảng duy nhất

Trong các ví dụ trước, chúng tôi đã áp dụng toán tử EXCEPT trên hai bảng. Tuy nhiên, toán tử EXCEPT cũng có thể được sử dụng để lọc các bản ghi từ một bảng. Ví dụ:nếu bạn muốn lọc tất cả các bản ghi từ bảng Cars1 trong đó giá trị công suất lớn hơn 3.000, bạn có thể sử dụng toán tử EXCEPT như sau:

USE ShowRoom
SELECT id, name, company, power FROM Cars1 
Except
SELECT id, name, company, power from Cars1 WHERE power < 3000

Trong tập lệnh trên, truy vấn ở phía bên trái của toán tử EXCEPT lấy tất cả các bản ghi từ bảng Cars1. Truy vấn ở phía bên phải của toán tử EXCEPT chỉ lấy các bản ghi đó từ bảng Cars1 nơi giá trị công suất nhỏ hơn 3.000. Toán tử EXCEPT lọc các bản ghi từ truy vấn ở bên trái tồn tại trong kết quả từ truy vấn ở bên phải. Do đó, tất cả các bản ghi trong bảng Cars1 có công suất nhỏ hơn 3.000 sẽ được lọc ra và phần còn lại của các bản ghi sẽ được trả lại như được hiển thị trong kết quả bên dưới:

KHÔNG CÓ trong nhà điều hành

Toán tử NOT IN cũng được sử dụng để lọc các hàng. Hãy tìm tất cả các bản ghi từ bảng Cars1 cũng có trong bảng Cars2 và trả về phần còn lại của các bản ghi bằng toán tử NOT IN.

USE ShowRoom
SELECT id, name, company, power FROM Cars1 
WHERE id NOT IN (SELECT id from Cars2)

Kết quả của truy vấn trên trông giống như sau:

Điều này tương tự với kết quả nhận được khi sử dụng toán tử EXCEPT.

Sự khác biệt giữa toán tử EXCEPT và NOT IN

Chúng ta có thể thấy rằng các kết quả thu được khi sử dụng toán tử EXCEPT và NOT IN là tương tự nhau. Tuy nhiên, có hai điểm khác biệt chính giữa EXCEPT và NOT IN Operator:

1- NOT IN trả về các bản ghi trùng lặp trong khi EXCEPT chỉ trả về các bản ghi riêng biệt

Toán tử EXCEPT loại bỏ các hàng trùng lặp khỏi kết quả và chỉ trả về các bản ghi DISTINCT. Mặt khác, toán tử NOT IN sẽ trả về các bản ghi trùng lặp.
Chúng ta hãy xem xét điều này với sự trợ giúp của một ví dụ. Thực thi truy vấn sau để chèn một bản ghi trùng lặp trong bảng Cars1.

INSERT INTO Cars1

VALUES
(1, 'Corrolla', 'Toyota', 1800)

Bây giờ bảng Cars1 có hai bản ghi trùng lặp. Bạn có thể xác minh điều này bằng cách thực hiện truy vấn sau:

SELECT * FROM Cars1

Bảng Cars1 sẽ trông như thế:

Bạn có thể thấy rằng hàng 1 và hàng 11 là bản sao của nhau.

Trước tiên, chúng ta hãy sử dụng toán tử EXCEPT để lọc tất cả các bản ghi từ bảng Cars1 có trong bảng Cars2.

USE ShowRoom
SELECT id, name, company, power FROM Cars1
Except
SELECT id, name, company, power FROM Cars2

Kết quả như sau:

Bạn có thể thấy rằng mặc dù hàng 1 và 11 là bản sao trong bảng Cars1 và chúng không có trong bảng Cars2, toán tử EXCEPT không trả về cả hai hàng này. Nó chỉ trả về các hàng riêng biệt.

Bây giờ, hãy sử dụng toán tử NOT IN cho cùng một tác vụ:

USE ShowRoom
SELECT id, name, company, power FROM Cars1 
WHERE id NOT IN (SELECT id from Cars2)

Đầu ra của truy vấn trên trông giống như sau:

Bạn có thể thấy rằng NOT IN trả về các hàng trùng lặp, tức là hàng 1 và hàng 6.

2- EXCEPT so sánh các cột trong khi NOT IN so sánh một giá trị duy nhất

Toán tử EXCEPT so sánh các giá trị trong một hoặc nhiều cột. Điều này có nghĩa là số lượng cột phải giống nhau. Mặt khác, toán tử NOT IN so sánh các giá trị trong một cột.

Ví dụ:bạn không thể có số lượng cột không bằng nhau cho các truy vấn ở bên trái và bên phải của toán tử EXCEPT như được hiển thị trong ví dụ sau:

USE ShowRoom
SELECT id, name, company, power FROM Cars1
Except
SELECT id, name,power FROM Cars2

Truy vấn trên trả về lỗi sau:

Đối với toán tử NOT IN, bạn không thể có nhiều hơn một cột trong truy vấn phụ. Điều này có nghĩa là truy vấn sau sẽ trả về lỗi:

USE ShowRoom
SELECT id, name, company, power FROM Cars1 
WHERE id NOT IN (SELECT id, name from Cars2)

Trong tập lệnh trên, truy vấn phụ có hai cột, tức là id và tên. Do đó, một lỗi sẽ được đưa ra:

Đọc thêm:

  • Trường học W3:Ví dụ VÀO VÀ KHÔNG CÓ TRONG
  • TechontheNet:Toán tử NGOẠI LỆ
  • YouTube:Nhà điều hành NGOẠI LỆ

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giới thiệu về TimescaleDB

  2. Hướng dẫn giao dịch SQL

  3. 3 mẹo hàng đầu bạn cần biết để viết chế độ xem SQL nhanh hơn

  4. NULL phức tạp - Phần 4, Thiếu ràng buộc duy nhất tiêu chuẩn

  5. Bảo trì Chế độ xem được Lập chỉ mục trong Kế hoạch Thực thi