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

Toán tử SET T-SQL Phần 2:INTERSECT và EXCEPT

Trong bài viết trước của tôi, tôi đã giải thích những điều cơ bản về toán tử tập hợp, kiểu của chúng và điều kiện tiên quyết để sử dụng chúng. Tôi cũng đã nói về UNION và UNION ALL, cách sử dụng và sự khác biệt của chúng.

Trong bài viết này, chúng ta sẽ tìm hiểu những điều sau:

  1. Toán tử EXCEPT và INTERSECT.
  2. Sự khác biệt giữa INTERSECT và INNER JOIN.
  3. Giải thích chi tiết về INTERSECT và EXCEPT kèm theo một ví dụ.

Toán tử EXCEPT và INTERSECT đã được giới thiệu trong SQL Server 2005. Cả hai đều là toán tử set được sử dụng để kết hợp các tập kết quả được tạo bởi hai truy vấn và truy xuất đầu ra mong muốn.

Toán tử INTERSECT là gì

INTERSECT được sử dụng để lấy các bản ghi chung cho tất cả các tập dữ liệu được truy xuất từ ​​nhiều truy vấn hoặc bảng. Đây là hình ảnh trực quan về điều này:

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

 CHỌN COLUMN1, COLUMN2, COLUMN3, COLUMN4.. BẢNG CỘT1 INTERSECTSELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4.. BẢNG CỘT2 

Toán tử EXCEPT là gì

EXCEPT được sử dụng để truy xuất các bản ghi được tìm thấy trong một truy vấn nhưng không được tìm thấy trong một truy vấn khác. Nói cách khác, nó trả về các bản ghi là duy nhất cho một tập kết quả. Đây là những gì nó trông giống như được hình dung:

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

 CHỌN COLUMN1, COLUMN2, COLUMN3, COLUMN4.. BẢNG CỘT1 EXCEPTSELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4..FROM TABLE2 

Hãy tạo một thiết lập demo để chứng minh cách sử dụng các toán tử này.

Thiết lập Demo

Để chứng minh INTERSECT và EXCEPT, tôi đã tạo hai bảng có tên Nhân viên Thực tập sinh .

Thực thi truy vấn sau để tạo các bảng này:

 TẠO BẢNG [DBO]. [EMPLOYEE] ([NAME] [NVARCHAR] (250) NOT NULL, [BUSINESSENTITYID] [INT] NOT NULL, [NATIONALIDNUMBER] [NVARCHAR] (15) NOT NULL, [LOGINID] [ NVARCHAR] (256) NOT NULL, [BIRTHDATE] [DATE] NOT NULL, [MARITALSTATUS] [NCHAR] (1) NOT NULL, [G GIỚI] [NCHAR] (1) NOT NULL) ON [PRIMARY] CREATE TABLE [DBO] . [TRAINEE] ([NAME] [NVARCHAR] (250) KHÔNG ĐẦY ĐỦ, [BUSINESSENTITYID] [INT] KHÔNG ĐẦY ĐỦ, [NATIONALIDNUMBER] [NVARCHAR] (15) KHÔNG ĐẦY ĐỦ, [NGÀY SINH] [NGÀY] KHÔNG ĐẦY ĐỦ, [GIỚI TÍNH] [NCHAR] (1) KHÔNG ĐẦY ĐỦ) BẬT [CHÍNH] 

Bây giờ, hãy chèn một số dữ liệu giả vào Nhân viên bảng bằng cách thực hiện truy vấn sau:

 INSERT [DBO]. [EMPLOYEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS], [GENDER]) GIÁ TRỊ (N'KEN SÁNCHEZ ', 1, N'295847284 ', N'ADVENTURE-WORKS \ KEN0', CAST (N'1969-01-29 'AS DATE), N'S', N'M ') GOINSERT [DBO]. [EMPLOYEE] ([NAME], [ BUSINESSENTITYID], [NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS], [GENDER]) GIÁ TRỊ (N'TERRI DUFFY ', 2, N'245797967', N'ADVENTURE-WORKS \ TERRI0 ', CAST (N '1971-08-01' AS DATE), N'S ', N'F') GOINSERT [DBO]. [EMPLOYEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS ], [GENDER]) GIÁ TRỊ (N'ROBERTO TAMBURELLO ', 3, N'509647174', N'ADVENTURE-WORKS \ ROBERTO0 ', CAST (N'1974-11-12' AS DATE), N'M ', N 'M') GOINSERT [DBO]. [EMPLOYEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS], [GENDER]) GIÁ TRỊ (N'ROB WALTERS ', 4 , N'112457891 ', N'ADVENTURE-WORKS \ ROB0', CAST (N'1974-12-23 'AS DATE), N'S', N'M ') GOINSERT [DBO]. [EMPLOYEE] ([NAME], [BUSINESSENTITYID], [ GIÁ TRỊ CỦA NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS], [GENDER]) (N'GAIL ERICKSON ', 5, N'695256908', N'ADVENTURE-WORKS \ GAIL0 ', CAST (N'1952-09 -27 'AS DATE), N'M', N'F ') GOINSERT [DBO]. [EMPLOYEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS], [GIỚI THIỆU]) GIÁ TRỊ (N'JOSSEF GOLDBERG ', 6, N'998320692', N'ADVENTURE-WORKS \ JOSSEF0 ', CAST (N'1959-03-11' AS DATE), N'M ', N'M ') 

Tiếp theo, chúng tôi sẽ làm điều tương tự đối với Thực tập sinh bảng:

 INSERT [DBO]. [TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) GIÁ TRỊ (N'JOHN WOOD ', 18, N'222969461', CAST (N '1978-03-06' AS DATE), N'M ') GOINSERT [DBO]. [TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) GIÁ TRỊ (NỮA DEMPSEY ', 19, N'52541318', CAST (N'1978-01-29 'AS DATE), N'F') GOINSERT [DBO]. [TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [NGÀY SINH], [GIỚI TÍNH]) GIÁ TRỊ (N'WANIDA BENSHOOF ', 20, N'323403273', CAST (N'1975-03-17 'AS DATE), N'F') GOINSERT [DBO]. [TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [G GIỚI]) GIÁ TRỊ (N'KEN SÁNCHEZ ', 1, N'295847284', CAST (N'1969-01-29 'AS DATE), N'M ') GOINSERT [DBO]. [TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) GIÁ TRỊ (N'TERRI DUFFY', 2, N'245797967 ', CAST (N'1971-08-01 'AS DATE), N'F') GOINSERT [DBO]. [TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) GIÁ TRỊ (N 'ROBERTO TAMBURELLO', 3, N'509647174 ', CAST (N'1974-11-12' AS DATE), N'M ') ĐI 

Bây giờ, hãy sử dụng INTERSECT để truy xuất danh sách nhân viên chung cho cả hai bảng. Để làm điều đó, hãy chạy truy vấn sau:

 CHỌN TÊN, BUSINESSENTITYID, NATIONALIDNUMBER, BIRTHDATE, GIỚI TÍNH TỪ NHÂN VIÊN INTERSECT CHỌN TÊN, BUSINESSENTITYID, NATIONALIDNUMBER, BIRTHDATE, G GIỚI TỪ TRAINEE 

Đầu ra của truy vấn này sẽ như sau:

Như bạn có thể thấy trong ảnh chụp màn hình ở trên, truy vấn chỉ trả về các bản ghi chung cho cả hai bảng.

INNER JOIN so với INTERSECT

Trong hầu hết các trường hợp, INTERSECT và INNER JOIN trả về cùng một đầu ra, nhưng có một số ngoại lệ. Một ví dụ đơn giản sẽ giúp chúng ta hiểu điều này.

Hãy thêm một số bản ghi trùng lặp vào bảng Thực tập sinh. Thực hiện truy vấn sau:

 INSERT [DBO]. [TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) GIÁ TRỊ (N'TERRI DUFFY ', 2, N'245797967', CAST (N '1971-08-01' AS DATE), N'F ') GOINSERT [DBO]. [TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) GIÁ TRỊ (N'ROBERTO TAMBURELLO ', 3, N'509647174', CAST (N'1974-11-12 'AS DATE), N'M') ĐI 

Bây giờ, chúng tôi sẽ cố gắng tạo ra đầu ra mong muốn bằng INTERSECT.

 CHỌN TÊN, BUSINESSENTITYID, NATIONALIDNUMBER, BIRTHDATE, GIỚI TÍNH TỪ NGƯỜI LAO ĐỘNG SẮP XẾP TÊN, BUSINESSENTITYID, NATIONALIDNUMBER, BIRTHDATE, G GIỚI TỪ TRAINEE 

Đây là kết quả mà chúng tôi nhận được:

Bây giờ, hãy thử sử dụng INNER JOIN.

 CHỌN A.NAME, A.BUSINESSENTITYID, A.NATIONALIDNUMBER, A.BIRTHDATE, A.GENDER TỪ NHÂN VIÊN A BÊN TRONG THAM GIA TRAINEE B TRÊN A.NAME =B.NAME 

Đầu ra chúng ta nhận được trong trường hợp này như sau:

Bây giờ, như bạn có thể thấy trên ảnh chụp màn hình ở trên, INNER JOIN lấy các bản ghi chung cho cả hai bảng. Nó điền tất cả các bản ghi từ bảng bên phải. Do đó, bạn có thể thấy các bản ghi trùng lặp.

Bây giờ, hãy thêm từ khóa DISTINCT vào truy vấn INNER JOIN và xem điều này có tác dụng gì:

 CHỌN DISTINCT A.NAME, A.BUSINESSENTITYID, A.NATIONALIDNUMBER, A.BIRTHDATE, A.GENDER TỪ NHÂN VIÊN BÊN TRONG THAM GIA TRAINEE B TRÊN A.NAME =B.NAME 

Đầu ra sẽ giống như sau:

Như bạn có thể thấy trên ảnh chụp màn hình ở trên, các bản ghi trùng lặp đã được loại bỏ.

INTERSECT và INNER JOIN xử lý các giá trị NULL khác nhau. Đối với INNER JOIN, hai giá trị NULL khác nhau, vì vậy có khả năng nó sẽ bỏ qua chúng khi tham gia hai bảng.

Mặt khác, INTERSECT coi hai giá trị NULL giống nhau, vì vậy các bản ghi có giá trị NULL sẽ không bị loại bỏ. Để hiểu rõ hơn, hãy xem một ví dụ.

Trước tiên, hãy thêm một số giá trị NULL vào Người tập sự Nhân viên bảng bằng cách thực hiện truy vấn sau:

 INSERT [DBO]. [TRAINEE] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [BIRTHDATE], [GENDER]) GIÁ TRỊ (NULL, 3, N'509647174 ', CAST (N'1974-11) -12 'AS DATE), N'M') GOINSERT [DBO]. [Nhân viên] ([NAME], [BUSINESSENTITYID], [NATIONALIDNUMBER], [LOGINID], [BIRTHDATE], [MARITALSTATUS], [GENDER]) GIÁ TRỊ (NULL, 3, N'509647174 ',' ADVENTURE-WORKS \ TERRI0 ', CAST (N'1974-11-12' AS DATE), N'M ', N'M') ĐI 

Bây giờ chúng ta hãy thử truy xuất các bản ghi chung cho hai bảng bằng INTERSECT và INNER JOIN. Bạn sẽ cần thực hiện truy vấn sau:

> BUSINESSENTITYID, A.NATIONALIDNUMBER, A.BIRTHDATE, A.GENDER TỪ NHÂN VIÊN BÊN TRONG THAM GIA TRAINEE B TRÊN A.NAME =B.NAME

Đây là kết quả mà chúng ta sẽ nhận được do kết quả:

Như bạn có thể thấy ở trên, tập kết quả được tạo bởi INTERSECT chứa các giá trị NULL, trong khi INNER JOIN bỏ qua các bản ghi có giá trị NULL.

Toán tử NGOẠI LỆ

Để chứng minh toán tử EXCEPT hoạt động, chúng ta hãy xem xét một trường hợp sử dụng. Ví dụ:tôi muốn điền thông tin chi tiết về nhân viên nữ từ bảng Nhân viên. Truy vấn sau sẽ giúp chúng tôi thực hiện điều đó:

 CHỌN TÊN, DOANH NHÂN, QUỐC TỊCH, NGÀY SINH, GIỚI TÍNH TỪ NGƯỜI LAO ĐỘNG WHERE GENDER ='F' NGOẠI TRỪ CHỌN TÊN, BUSINESSENTITYID, NATIONALIDNUMBER, BIRTHDATE, GIỚI TÍNH TỪ NGƯỜI LAO ĐỘNG WHERE GENDER ='M' 

Đây là kết quả mà chúng tôi nhận được:

Như bạn có thể thấy ở trên, truy vấn chỉ điền thông tin chi tiết về nhân viên nữ.

Bạn cũng có thể điền tập kết quả bằng truy vấn phụ:

 CHỌN TÊN, DOANH NHÂN, QUỐC TỊCH, NGÀY SINH, GIỚI TÍNH TỪ NHÂN VIÊN NHƯ M WHERE GENDER ='F' VÀ KHÔNG CÓ GIỚI TÍNH (CHỌN GIỚI TÍNH TỪ NGƯỜI LAO ĐỘNG LÀ F WHERE GENDER ='M') 

Hạn chế của INTERSECT và EXCEPT

  1. Chúng tôi không thể sử dụng EXCEPT và INTERSECT trong các định nghĩa chế độ xem được phân vùng phân tán với các mệnh đề COMPUTE và COMPUTE BY.
  2. EXCEPT và INTERSECT có thể được sử dụng trong Chỉ tua nhanh và con trỏ tĩnh.
  3. EXCEPT và INTERSECT có thể được sử dụng trong các truy vấn phân tán, nhưng chỉ có thể được thực thi trên máy chủ cục bộ. Bạn không thể chạy chúng trên máy chủ từ xa.

Tóm tắt

Trong bài viết này, tôi đã đề cập đến:

  1. Các toán tử EXCEPT và INTERSECT.
  2. Sự khác biệt giữa INTERSECT và INNER JOIN.
  3. Giải thích chi tiết về toán tử INTERSECT và EXCEPT kèm theo một ví dụ.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Biểu thức bảng thông thường:Khi nào và làm thế nào để sử dụng chúng

  2. Kết nối các ứng dụng ODBC trên Windows với Zoho CRM

  3. Cách viết câu lệnh CASE trong SQL

  4. Sai lầm sơ đồ ER thường gặp

  5. Hiểu về triển khai Amazon Auroras Multi-AZ