Phân biệt một số khái niệm trong SQL

(Ngày: 01/10/2019)
SQL là một ngôn ngữ để truy cập và thao tác cơ sở dữ liệu được chuẩn hóa bởi ANSI. Và việc phân biệt một số khái niệm trong SQL sẽ giúp người dùng dễ dàng thao tác khi sử dụng SQL.

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

JOIN: cho phép kết nối dữ liệu liên quan trọng các bảng khác nhau. 

UNION: hợp dữ liệu của 2 bảng mà có các cột loại data giống nhau.

JOIN cho phép chúng ta "tra cứu" các bản ghi trong các table khác nhau dựa trên các điều kiện kết nối giữa hai bảng. Chẳng hạn ta có ID department của từng Employee thì có thể sử dụng ID department của bảng Employee này để kết hợp với ID department của bảng department để tìm kiếm tên department.

UNION cho phép thêm các bộ dữ liệu tương tự nhau để tạo ra bộ dữ liệu kết quả có chứa tất cả dữ liệu từ các bộ dữ liệu nguồn. Union không yêu cầu bất kỳ điều kiện join nào. Chẳng hạn nếu có 2 bảng employee có cùng cấu trúc thì bạn có thể UNION chúng để tạo một bộ kết quả sẽ chứa tất cả nhân viên từ cả hai bảng employee.

SELECT * FROM EMP1

UNION

SELECT * FROM EMP2;

Sự khác nhau giữa UNION và UNION ALL

UNION và UNION ALL đều dùng để hợp hai tập bản ghi cùng cấu trúc, nhưng giữa hai mệnh đề có sự khác biệt: UNION loại bỏ các bản ghi trùng lặp trước khi trả lại kết quả còn UNION ALL giữ lại tất cả các bản ghi từ hai tập ban đầu. Cùng xem ví dụ sau đây:

SELECT * FROM EMPLOYEE WHERE ID = 5
UNION ALL
SELECT * FROM EMPLOYEE WHERE ID = 5

https://viblo.asia/uploads/2ecdb5e9-4ad2-4108-8316-af10dcf2a921.png

SELECT * FROM EMPLOYEE WHERE ID = 5
UNION 
SELECT * FROM EMPLOYEE WHERE ID = 5

https://viblo.asia/uploads/c5ed2d19-5062-42d0-8545-a00e1c2dacff.png

Sự khác nhau giữa WHERE và HAVING

WHERE và HAVING đều là câu lệnh dùng để lọc kết ra các bản ghi dựa trên một hoặc nhiều điều kiện. WHERE là câu lệnh dùng để đặt điều kiện lọc trên từng bộ. HAVING cũng là câu lệnh đặt điều kiện nhưng là ở trên 1 nhóm xác định, thường đi kèm với câu lệnh GROUP BY. Cùng xem cú pháp tổng quát như sau:

SELECT <danh sách các cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
GROUP BY <danh sách các cột gom nhóm>
HAVING <điều kiện trên nhóm>

Xe ví dụ sau: Giả sử chúng ta chỉ muốn tìm các department có ID > 3. Chúng ta sẽ sử dụng mệnh đề WHERE:

SELECT * FROM DEPT WHERE ID > 3

https://viblo.asia/uploads/2e4090f1-dc35-4642-930a-d17cba7f69a3.png

Tiếp theo, giả sử chúng ta chỉ muốn xem những Departments mà Mức lương trung bình (Average salary) lớn hơn 80. Điều kiện này liên quan đến một thông tin tổng hợp non-static là "Mức lương trung bình (Average salary)". Chúng ta sẽ cần phải sử dụng HAVING:

SELECT dept.name DEPARTMENT, avg(emp.sal) AVG_SAL
FROM DEPT dept, EMPLOYEE emp
WHERE dept.id = emp.dept_id (+)
GROUP BY dept.name
HAVING AVG(emp.sal) > 80

https://viblo.asia/uploads/1a4dd803-bf61-4ae1-ada9-e38a129d5ee2.png

 

Sự khác nhau giữa UNION, MINUS và INTERSECT

UNION kết hợp kết quả từ 2 table và loại bỏ đi những bản ghi trùng lặp từ tập kết quả. MINUS được sử dụng giữa 2 table, trả về kết quả là các bản ghi ở table thứ 1, loại trừ đi những bản ghi ở table 2. INTERSECT trả về những bản ghi khớp hoặc những bản ghi chung giữa 2 tập kết quả. Ví dụ: UNION

SELECT * FROM EMPLOYEE WHERE ID = 5
UNION 
SELECT * FROM EMPLOYEE WHERE ID = 6

https://viblo.asia/uploads/08fb6bdc-e2b4-48f4-9ea2-f83965bc9305.png MINUS

SELECT * FROM EMPLOYEE
MINUS
SELECT * FROM EMPLOYEE WHERE ID > 2

https://viblo.asia/uploads/795967ee-3dc6-412c-a074-0154f4135b68.png INTERSECT

SELECT * FROM EMPLOYEE WHERE ID IN (2, 3, 5)
INTERSECT
SELECT * FROM EMPLOYEE WHERE ID IN (1, 2, 4, 5)

https://viblo.asia/uploads/11d909c9-be8e-4ea8-9bca-354ce1ccee48.png

viblo.asia