ĐĂNG KÝ ĐỂ NHẬN THÔNG TIN MỚI NHẤT

JOIN – Tự học SQL cơ bản (phần 6) – Tổ hợp dữ liệu từ nhiều bảng trong SQL

JOIN – Tự học SQL cơ bản (phần 6) – Tổ hợp dữ liệu từ nhiều bảng trong SQL

Trong bài viết thứ 6 của Chương trình tự học SQL cơ bản, anh em sẽ được tìm hiểu với các nội dung sau:

  • Cách truy vấn dữ liệu từ nhiều bảng trong SQL.

1. Tổ hợp dữ liệu từ nhiều bảng trong SQL

Khi thực hiện truy vấn trong CSDL, SQL cho phép người dùng có thể lấy dữ liệu từ nhiều bảng khác nhau bằng cách ghép dữ liệu các bảng dựa trên cột giá trị chung của chúng sử dụng từ khóa JOIN.

Ví dụ lấy dữ liệu từ 2 bảng là EMPLOYEESDEPARTMENTS dựa trên cột chung là DEPARTMENT_ID.

SELECT employee_id, email, department_name 
FROM employees e JOIN departments d
   ON e.department_id = d.department_id;

Điều kiện ghép của JOIN sẽ được đặt sau từ khóa ON. Lưu ý ta sẽ đặt Alias cho các bảng để phân biệt các cột chung trên mỗi bảng khi ghép dữ liệu với nhau. Ta cũng có thể đặt điều kiện trên nhiều hơn một cột trong câu lệnh SQL như sau. 

Ví dụ lấy thông tin nhân viên và thông tin phòng ban của nhân viên đó với điều kiện cùng mã quản lý của nhân viên giống mã quản lý phòng.

SELECT employee_id, email, department_name, d.manager_id 
FROM employees e JOIN departments d 
   ON e.department_id = d.department_id
   AND e.manager_id = d.manager_id;

Các điều kiện đứng sau ON cũng đặt giống như WHERE, ngăn cách bằng AND hoặc OR. Thực chất câu lệnh có sử dụng JOIN như đầu tiên cũng tương tự với câu lệnh truy vấn thông thường từ nhiều bảng như sau.

SELECT employee_id, email, department_name 
FROM employees e JOIN departments d 
   ON e.department_id = d.department_id;

SELECT employee_id, email, department_name
employees e, departments d
WHERE e.department_id = d.department_id;

Không có sự khác nhau giữa 2 câu lệnh này. Nhưng trong trường hợp câu lệnh cần lấy dữ liệu từ nhiều hơn 2 bảng, ta nên sử dụng JOIN thay vì WHERE. Vì khi có quá nhiều điều kiện trong WHERE sẽ khiến câu lệnh bị rối và khó đọc hơn. Sử dụng linh hoạt cả hai để giúp câu lệnh trở nên tường minh và dễ đọc cũng như dễ quản lý hơn trên CSDL.

2. Các phép Join khác trong SQL

Phép JOIN trước đó ta thực hiện có cú pháp đầy đủ là INNER JOIN. Trên các Hệ CSDL, ta có thể thêm từ khóa INNER nếu muốn vì CSDL không bắt buộc điều đó, câu lệnh vẫn trả về kết quả tương tự.

SELECT employee_id, email, department_name
FROM employees e INNER JOIN departments d 
   ON e.department_id = d.department_id;

Bên cạnh INNER ta còn có phép LEFT JOIN, ta vẫn sẽ ghép 2 bảng dựa trên giá trị chung nhưng câu lệnh sẽ trả về thêm bản ghi của bảng bên trái.

SELECT
   e.manager_id,
   d.manager_id
FROM employees e LEFT JOIN departments d
   ON e.manager_id = d.manager_id;

Bảng bên phải hay đứng sau JOIN sẽ hiển thị là NULL cho các giá trị không tồn tại trong bảng. Nếu muốn lấy giá trị chỉ thuộc bảng bên trái mà không có ở bảng bên phải kể cả giá trị chung ta có thể thực hiện như sau.

SELECT
   e.manager_id,
   d.manager_id
FROM employees e LEFT JOIN departments d
   ON e.manager_id = d.manager_id
WHERE d.manager_id IS NULL;

Ngược lại với LEFTRIGHT JOIN, tức là câu lệnh sẽ lấy giá trị chung và giá trị chỉ có ở bảng bên phải.

SELECT
   e.manager_id,
   d.manager_id
FROM employees e RIGHT JOIN departments d
   ON e.manager_id = d.manager_id;

Và ta cũng có thể chỉ lấy giá trị ở bảng bên phải mà không có ở bảng bên trái kể cả giá trị chung như sau. 

SELECT
   e.manager_id,
   d.manager_id
FROM employees e RIGHT JOIN departments d
   ON e.manager_id = d.manager_id
WHERE e.manager_id IS NULL;

Tiếp theo

Tự học SQL cơ bản (phần 7)

Liên Hệ với Wecommit

Nếu bạn muốn liên hệ với Wecommit, bạn có thể trao đổi trực tiếp qua Facebook cùng Trần Quốc Huy – người sáng lập của Wecommit.

Nếu bạn muốn chúng tôi đồng hành xây dựng sự nghiệp với bạn trong 01 năm (bạn sẽ có rất nhiều kiến thức, kinh nghiệm ĐỘC QUYỀN về tối ưu cơ sở dữ liệu) bạn có thể đăng ký trải nghiệm chương trình Từ điển tối ưu 100x hiệu năng của chúng tôi.

Views: 98





    Câu hỏi bảo mật

    Trả lời

    Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *