12/08/2018, 15:06

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

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. Bài viết này sẽ giới thiệu về SQL dưới dạng một số câu hỏi thường được hỏi trong các buổi phỏng vấn. Sự khác nhau giữa INNER JOIN và OUTER JOIN là gì? Inner Join Inner Join được sử dụng để kết hợp các rows từ hai ...

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. Bài viết này sẽ giới thiệu về SQL dưới dạng một số câu hỏi thường được hỏi trong các buổi phỏng vấn. Sự khác nhau giữa INNER JOIN và OUTER JOIN là gì? Inner Join Inner Join được sử dụng để kết hợp các rows từ hai table và tạo ra một tập kết quả chỉ chứa các bảnghi có trong cả hai bảng dựa trên điều kiện join, các bản ghi chỉ xuất hiện ở một trong hai bảng sẽ bị loại. Nếu không có kết quả khớp nhau giữa hai bảng thì INNER JOIN sẽ trả về một tập NULL. Dưới đây là ví dụ về INNER JOIN và tập kết quả:

SELECT dept.name DEPARTMENT, emp.name EMPLOYEE 
FROM DEPT dept, EMPLOYEE emp
WHERE emp.dept_id = dept.id

Outer Join Outer Join nới lỏng hơn, lấy về các bản ghi có mặt trong cả hai bảng và cả các bản ghi chỉ xuất hiện ở một trong hai bảng. Ví dụ: Không có Employee trong Department 5 (Logistics). Nếu chúng ta thực hiện inner join thì Department 5 không xuất hiện trong tập kết quả. Tuy nhiên trong truy vấn dưới đây, khi thực hiện outer join (dept left outer join emp) thì Department 5 sẽ được xuất hiện.

SELECT dept.name DEPARTMENT, emp.name EMPLOYEE 
FROM DEPT dept, EMPLOYEE emp
WHERE dept.id = emp.dept_id (+)

Ký hiệu (+) trong câu query trên chỉ ra rằng emp là outer table. Có thể viết theo cách khác như sau:

SELECT dept.name DEPARTMENT, emp.name EMPLOYEE 
FROM DEPT dept LEFT OUTER JOIN EMPLOYEE emp
ON dept.id = emp.dept_id 

Sự khác nhau giữa JOIN và UNION là gì? JOIN: cho phép kết nối dữ liệu liên quan trong 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. Ví dụ: nếu 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 chúng ta 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. Ví dụ: nếu bạn có 2 bảng employee có cùng cấu trúc, 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 là gì? 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. Ví dụ:

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

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

Sự khác nhau giữa WHERE và HAVING là gì? 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ú 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>

Xem xét 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

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

Sự khác nhau giữa UNION, MINUS và INTERSECT là gì? 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

MINUS

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

INTERSECT

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

Bài viết sau sẽ trình bày về một số khái niệm khác: Self Join, ROWNUM, RANK,... Refer: https://dwbi.org/database/sql/72-top-20-sql-interview-questions-with-answers

0