So sánh không bằng trong sql

Các thao tác truy xuất dữ liệu được thực hiện thông qua việc sử dụng các từ khóa và ký tự đặc biệt, chúng được sử dụng để thực hiện các phép toán số học, phép toán logic, phép toán so sánh, ghép chuỗi và nhiều phép toán khác. Trong viết này, hãy cùng DATAPOT tìm hiểu về SET Operators trong SQL bạn nhé!

Mục lục

Set Operators (Toán tử tập hợp) được sử dụng để kết hợp hoặc loại trừ kết quả của hai hay nhiều câu lệnh SELECT. Cách hoạt động của SET Operators là chúng kết hợp các hàng từ hai hoặc nhiều bảng (mở rộng theo chiều dọc, từ trên xuống), khác biệt hoàn toàn so với phép nối (JOIN) sử dụng các cột (mở rộng theo chiều ngang, từ trái sang phải).

Sử dụng SET Operators trong SQL

Ngày nay, hầu hết các hệ quản trị cơ sở dữ liệu khi sử dụng T-SQL để truy vấn dữ liệu đều hỗ trợ Set Operators. Cần đặc biệt lưu ý rằng: Set Operators sẽ kết hợp hai hay nhiều bảng theo hàng, còn phép nối (JOIN) sẽ kết hợp theo cột từ các bảng khác nhau.

Một số quy tắc cần tuân thủ khi sử dụng Set Operators

  • Số cột trong câu lệnh SELECT muốn áp dụng Set Operators phải giống nhau.
  • Thứ tự các cột phải giống nhau.
  • Các cột được chọn phải có cùng kiểu dữ liệu.
  • Nếu muốn sắp xếp kết quả, mệnh đề ORDER BY phải ở cuối truy vấn cuối cùng.

Các loại Set Operators trong SQL

Có 4 loại Set Operators trong SQL:

  • Toán tử Union
  • Toán tử Union ALL
  • Toán tử Intersect
  • Toán tử Minus/Except
    So sánh không bằng trong sql

Toán tử Union (Hợp nhất)

Có thể hợp nhất kết quả từ hai hay nhiều câu lệnh truy vấn khác nhau thành một tập kết quả duy nhất bằng cách sử dụng toán tử UNION. Tên của các cột trong các câu lệnh truy vấn này có thể khác tên, tuy nhiên cần phải có cùng số lượng và kiểu dữ liệu.

Cú pháp cho toán tử Union:

SELECT column_name(s) FROM table1 
UNION 
SELECT column_name(s) FROM table2;

Ví dụ: Có thông tin hai bảng Founders và Employees như sau:

So sánh không bằng trong sql

Yêu cầu: Viết câu lệnh truy vấn kết hợp hai bảng Founders, Employees, sử dụng cột FirstName và LastName

SELECT FirstName, LastName  FROM Founders  UNION  SELECT FirstName, LastName  FROM Employees;

Kết quả:

So sánh không bằng trong sql

Có thể thấy được, câu lệnh trên sẽ lấy ra toàn bộ dữ liệu hai cột FirstName và LastName của cả 2 bảng và loại bỏ giá trị trùng lặp. Nếu sử dụng UNION ALL, tất cả các hàng sẽ được chọn, bao gồm giá trị trùng lặp. Cụ thể:

SELECT FirstName, LastName  FROM Founders  UNION ALL  SELECT FirstName, LastName  FROM Employees;

Kết quả:

So sánh không bằng trong sql

Tóm lại, khi sử dụng UNION, các giá trị trùng lặp sẽ bị loại bỏ trong tập kết quả trả về, trong trường hợp sử dụng UNION ALL, tập kết quả trả về sẽ bao gồm các giá trị trùng lặp.

Toán tử Intersect (Giao)

Toán tử Intersect có chức năng tìm kiếm những dòng dữ liệu chung trong hai hoặc nhiều câu truy vấn. Để thực hiện thành công câu lệnh sử dụng toán tử Intersect, số cột và kiểu dữ liệu phải giống nhau trong các bảng. Kết quả trả về khi sử dụng toán tử này là các dòng chung trong các câu lệnh.

Cú pháp cho toán tử Intersect:

SELECT column1 , column2,... 
FROM table_names 
WHERE condition 
INTERSECT 
SELECT column1 , column2,... 
FROM table_names 
WHERE condition

Ví dụ: Sử dụng Intersect để tìm các dòng dữ liệu có trong cả hai bảng Founders, Employees

SELECT FirstName, LastName  FROM Founders  INTERSECT  SELECT FirstName, LastName  FROM Employees;

Kết quả:

So sánh không bằng trong sql

Toán tử Minus/Except

Toán tử Minus/Except cho phép lọc ra các kết quả có trong truy vấn đầu tiên nhưng không có trong truy vấn thứ hai. Để thực hiện sử dụng được toán tử Minus/Except, số cột và kiểu dữ liệu trong cả hai bảng phải giống nhau. Sau khi thực hiện thao tác Minus/Except, dữ liệu/bản ghi không có trong câu lệnh Select hoặc truy vấn thứ hai sẽ được hiển thị.

Lưu ý: Toán tử Minus chỉ được áp dụng khi sử dụng Oracle Database, đối với các hệ quản trị cơ sở dữ liệu khác như SQL Server, PostgreSQL, có thể sử dụng toán tử Except với chức năng tương tự.

Cú pháp của toán tử Minus/Except:

SELECT column1 , column2,... 
FROM table_names 
WHERE condition 
MINUS/EXCEPT 
SELECT column1 , column2,... 
FROM table_names 
WHERE condition

Ví dụ: Sử dụng toán tử Except để tìm các dòng dữ liệu có trong bảng Founders mà không có trong bảng Employees

SELECT FirstName, LastName  FROM Founders  EXCEPT  SELECT FirstName, LastName  FROM Employees

Kết quả:

So sánh không bằng trong sql

Một số lưu ý khác để sử dụng SET Operators trong SQL hiệu quả

Sự khác nhau giữa Set Operators EXCEPT và NOT IN trong SQL

Xét các bảng Car1 và Car2 với thông tin như sau:

So sánh không bằng trong sql

  • Câu lệnh truy vấn sử dụng NOT IN sẽ trả về các bản ghi trùng lặp trong khi EXCEPT chỉ trả về các dòng dữ liệu duy nhất.

Cụ thể, xét ví dụ sau:

Đầu tiên, 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.

SELECT id, name, company, power FROM Cars1  EXCEPT  SELECT id, name, company, power FROM Cars2

Kết quả:

So sánh không bằng trong sql

Từ tập kết quả trả về có thể thấy được: mặc dùng trong bảng Car1, dòng dữ liệu thứ 1 và thứ 11 đều không có trong bảng Car2, nhưng kết quả trả về chỉ là một hàng duy nhất.

Tiếp theo, sử dụng toán tử NOT IN thực hiện yêu cầu tương tự:

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

Kết quả:

So sánh không bằng trong sql

NOT IN trả về tập kết quả có dữ liệu bị trùng lặp.

  • 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.

Cụ thể, xét ví dụ sau:

SELECT id, name, company, power FROM Cars1  EXCEPT  SELECT id, name, power FROM Cars2

Kết quả:

So sánh không bằng trong sql

Trong câu lệnh trên, mệnh đề SELECT bảng Car1 đang nhiều hơn mệnh đề SELECT bảng Car2 một cột, khi thực thi câu lệnh sử dụng EXCEPT sẽ nhận được thông báo lỗi như trên.

Đối với NOT IN:

SELECT FirstName, LastName  FROM Founders  UNION  SELECT FirstName, LastName  FROM Employees;

0

Kết quả:

So sánh không bằng trong sql

Trong câu lệnh trên, mệnh đề SELECT trong sub-query đang có hai cột, khi thực thi câu lệnh sử dụng NOT IN sẽ nhận được thông báo lỗi như trên.

Sự khác nhau giữa UNION và JOIN trong SQL

JOIN UNION Mục đích Kết hợp các bảng liên quan Kết hợp những câu truy vấn độc lập Mối quan hệ Yêu cầu một trường chung Không yêu cầu trường chung cụ thể Kết quả Mở rộng kết quả truy vấn theo chiều ngang với các dữ liệu thỏa điều kiện Mở rộng kết quả truy vấn theo chiều dọc

UNION kết hợp kết quả của hai hoặc nhiều truy vấn vào một tập kết quả duy nhất bao gồm tất cả các hàng thuộc về tất cả các truy vấn.

Với JOIN, có thể truy xuất dữ liệu từ hai hoặc nhiều bảng dựa trên mối quan hệ logic giữa các bảng. Các phép nối cho biết cách SQL nên sử dụng dữ liệu từ một bảng để chọn các hàng trong bảng khác.

Cụ thể, xét các ví dụ sau:

Ví dụ 1: Bảng “Orders” chứa thông tin về các đơn đặt hàng và bảng “Customers” chứa thông tin về khách hàng. Bạn muốn kết hợp thông tin về đơn đặt hàng và khách hàng, với điều kiện là ID khách hàng.

Câu truy vấn có dạng:

SELECT FirstName, LastName  FROM Founders  UNION  SELECT FirstName, LastName  FROM Employees;

1

Ví dụ 2: Giả sử bạn có hai bảng “MaleEmployees” và “FemaleEmployees”. Bạn muốn lấy danh sách tất cả nhân viên (nam và nữ).

Câu truy vấn có dạng:

SELECT FirstName, LastName  FROM Founders  UNION  SELECT FirstName, LastName  FROM Employees;

2

Đọc thêm về: Hai kiểu gộp bảng bằng JOIN và UNION trong SQL Server

Trên đây là tổng hợp cách sử dụng cũng như sự khác biệt giữa SET Operators và các toán tử khác trong SQL. Hi vọng bài viết có thể cung cấp thêm thông tin để có thể ứng dụng trong các bài toán thực tế.