MySQL-Câu lệnh Join

Mệnh đề INNER JOIN trong SQL được sử dụng để ghép (kết hợp) các hàng từ hai hoặc nhiều bảng dựa trên một điều kiện liên kết cụ thể. Khi sử dụng INNER JOIN, chỉ những hàng thỏa mãn điều kiện liên kết từ cả hai bảng mới được đưa vào kết quả truy vấn.

Cú pháp cơ bản

SELECT cot1, cot2, ...
FROM bang1
INNER JOIN bang2
ON bang1.cot_khoa_ngoai = bang2.cot_khoa_chinh;
  • bang1, bang2: Tên của các bảng muốn kết hợp.
  • cot_khoa_ngoai: Cột trong bang1 mà chứa giá trị liên kết.
  • cot_khoa_chinh: Cột trong bang2 mà chứa giá trị liên kết.

Ví dụ Cơ Bản

Giả sử bạn có hai bảng:

  1. Bảng NhanVien:
  • MaNhanVien
  • TenNhanVien
  • MaPhongBan (khóa ngoại liên kết với bảng PhongBan)
  1. Bảng PhongBan:
  • MaPhongBan (khóa chính)
  • TenPhongBan

Để lấy danh sách nhân viên cùng với tên phòng ban của họ, bạn có thể sử dụng INNER JOIN như sau:

SELECT NhanVien.TenNhanVien, PhongBan.TenPhongBan
FROM NhanVien
INNER JOIN PhongBan
ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;

Câu lệnh này sẽ kết hợp các hàng từ bảng NhanVien và bảng PhongBan dựa trên sự liên kết giữa MaPhongBan của NhanVienMaPhongBan của PhongBan, và trả về tên nhân viên cùng với tên phòng ban của họ.

Kết Hợp Với Nhiều Bảng

Bạn cũng có thể sử dụng INNER JOIN để kết hợp nhiều hơn hai bảng. Ví dụ, nếu bạn có một bảng DonHang và bạn muốn kết hợp tất cả các bảng để lấy thông tin đơn hàng cùng với thông tin nhân viên và phòng ban:

  1. Bảng DonHang:
  • MaDonHang
  • MaNhanVien (khóa ngoại liên kết với bảng NhanVien)
  • NgayDat
SELECT NhanVien.TenNhanVien, PhongBan.TenPhongBan, DonHang.MaDonHang, DonHang.NgayDat
FROM DonHang
INNER JOIN NhanVien ON DonHang.MaNhanVien = NhanVien.MaNhanVien
INNER JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;

Câu lệnh này sẽ kết hợp bảng DonHang với NhanVien và sau đó kết hợp với PhongBan, và trả về thông tin đầy đủ về đơn hàng, nhân viên và phòng ban.

Lưu Ý

  • Chỉ những hàng khớp: INNER JOIN chỉ trả về những hàng mà có sự khớp nhau trong điều kiện liên kết. Nếu không có sự khớp, hàng đó sẽ không xuất hiện trong kết quả.
  • Hiệu suất: Các phép nối (JOIN) có thể ảnh hưởng đến hiệu suất của truy vấn, đặc biệt khi làm việc với các bảng lớn. Đảm bảo rằng các cột được liên kết có chỉ mục để cải thiện hiệu suất.
  • Tên bảng và cột: Khi kết hợp nhiều bảng, nếu các bảng có cùng tên cột, bạn cần chỉ định rõ tên bảng (hoặc bí danh) để tránh nhầm lẫn. Ví dụ: NhanVien.TenNhanVienPhongBan.TenPhongBan.

Tóm tắt

  • Mệnh đề INNER JOIN được sử dụng để kết hợp các hàng từ hai hoặc nhiều bảng dựa trên một điều kiện liên kết.
  • Chỉ những hàng thỏa mãn điều kiện liên kết từ cả hai bảng mới được đưa vào kết quả.
  • Có thể kết hợp nhiều bảng cùng lúc để lấy dữ liệu liên quan từ nhiều nguồn.
  • Kết hợp với các điều kiện và chỉ mục để cải thiện hiệu suất và độ chính xác của truy vấn.

Mệnh đề LEFT JOIN (hoặc LEFT OUTER JOIN) trong SQL được sử dụng để kết hợp các hàng từ hai bảng dựa trên một điều kiện liên kết, tương tự như INNER JOIN. Tuy nhiên, khác với INNER JOIN, LEFT JOIN trả về tất cả các hàng từ bảng bên trái (bảng đầu tiên) và các hàng khớp từ bảng bên phải (bảng thứ hai). Nếu không có hàng khớp trong bảng bên phải, thì các giá trị trong các cột của bảng bên phải sẽ được điền là NULL.

Cú pháp cơ bản

SELECT cot1, cot2, ...
FROM bang1
LEFT JOIN bang2
ON bang1.cot_khoa_ngoai = bang2.cot_khoa_chinh;
  • bang1, bang2: Tên của các bảng muốn kết hợp.
  • cot_khoa_ngoai: Cột trong bang1 mà chứa giá trị liên kết.
  • cot_khoa_chinh: Cột trong bang2 mà chứa giá trị liên kết.

Ví dụ Cơ Bản

Giả sử bạn có hai bảng:

  1. Bảng NhanVien:
  • MaNhanVien
  • TenNhanVien
  • MaPhongBan (khóa ngoại liên kết với bảng PhongBan)
  1. Bảng PhongBan:
  • MaPhongBan (khóa chính)
  • TenPhongBan

Để lấy danh sách tất cả nhân viên cùng với tên phòng ban của họ, kể cả những nhân viên không thuộc bất kỳ phòng ban nào, bạn có thể sử dụng LEFT JOIN như sau:

SELECT NhanVien.TenNhanVien, PhongBan.TenPhongBan
FROM NhanVien
LEFT JOIN PhongBan
ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;

Câu lệnh này sẽ trả về tất cả nhân viên và tên phòng ban của họ. Nếu một nhân viên không thuộc bất kỳ phòng ban nào, trường TenPhongBan sẽ có giá trị NULL.

Kết Hợp Với Nhiều Bảng

Bạn cũng có thể kết hợp nhiều bảng với LEFT JOIN. Ví dụ, nếu bạn có một bảng DonHang và bạn muốn lấy thông tin đơn hàng cùng với thông tin nhân viên và phòng ban, nhưng vẫn muốn thấy tất cả các đơn hàng, kể cả những đơn hàng không có thông tin nhân viên hoặc phòng ban:

  1. Bảng DonHang:
  • MaDonHang
  • MaNhanVien (khóa ngoại liên kết với bảng NhanVien)
  • NgayDat
SELECT DonHang.MaDonHang, DonHang.NgayDat, NhanVien.TenNhanVien, PhongBan.TenPhongBan
FROM DonHang
LEFT JOIN NhanVien ON DonHang.MaNhanVien = NhanVien.MaNhanVien
LEFT JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;

Câu lệnh này sẽ trả về tất cả các đơn hàng. Nếu một đơn hàng không có thông tin về nhân viên hoặc phòng ban, các cột tương ứng sẽ có giá trị NULL.

Lưu Ý

  • Kết quả không khớp: LEFT JOIN đảm bảo rằng tất cả các hàng từ bảng bên trái được trả về, ngay cả khi không có sự khớp ở bảng bên phải. Nếu không có khớp, các giá trị của các cột từ bảng bên phải sẽ là NULL.
  • Hiệu suất: LEFT JOIN có thể ảnh hưởng đến hiệu suất của truy vấn, đặc biệt khi làm việc với các bảng lớn. Đảm bảo rằng các cột được liên kết có chỉ mục để cải thiện hiệu suất.
  • Sử dụng với các điều kiện khác: LEFT JOIN có thể kết hợp với các điều kiện lọc khác như WHERE, ORDER BY, và GROUP BY để điều chỉnh kết quả.

Tóm tắt

  • Mệnh đề LEFT JOIN kết hợp tất cả các hàng từ bảng bên trái với các hàng khớp từ bảng bên phải, và trả về các hàng từ bảng bên trái ngay cả khi không có khớp ở bảng bên phải.
  • Nếu không có khớp, các giá trị của các cột từ bảng bên phải sẽ là NULL.
  • Kết hợp LEFT JOIN với các điều kiện và mệnh đề khác để lấy dữ liệu đầy đủ và chính xác theo yêu cầu.

Mệnh đề RIGHT JOIN (hoặc RIGHT OUTER JOIN) trong SQL được sử dụng để kết hợp các hàng từ hai bảng dựa trên một điều kiện liên kết, tương tự như LEFT JOIN. Tuy nhiên, khác với LEFT JOIN, RIGHT JOIN trả về tất cả các hàng từ bảng bên phải (bảng thứ hai) và các hàng khớp từ bảng bên trái (bảng đầu tiên). Nếu không có hàng khớp trong bảng bên trái, thì các giá trị trong các cột của bảng bên trái sẽ được điền là NULL.

Cú pháp cơ bản

SELECT cot1, cot2, ...
FROM bang1
RIGHT JOIN bang2
ON bang1.cot_khoa_ngoai = bang2.cot_khoa_chinh;
  • bang1, bang2: Tên của các bảng muốn kết hợp.
  • cot_khoa_ngoai: Cột trong bang1 mà chứa giá trị liên kết.
  • cot_khoa_chinh: Cột trong bang2 mà chứa giá trị liên kết.

Ví dụ Cơ Bản

Giả sử bạn có hai bảng:

  1. Bảng NhanVien:
  • MaNhanVien
  • TenNhanVien
  • MaPhongBan (khóa ngoại liên kết với bảng PhongBan)
  1. Bảng PhongBan:
  • MaPhongBan (khóa chính)
  • TenPhongBan

Để lấy danh sách tất cả phòng ban cùng với tên nhân viên thuộc các phòng ban đó, kể cả những phòng ban không có nhân viên, bạn có thể sử dụng RIGHT JOIN như sau:

SELECT NhanVien.TenNhanVien, PhongBan.TenPhongBan
FROM NhanVien
RIGHT JOIN PhongBan
ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;

Câu lệnh này sẽ trả về tất cả các phòng ban và tên nhân viên của họ. Nếu một phòng ban không có nhân viên, trường TenNhanVien sẽ có giá trị NULL.

Kết Hợp Với Nhiều Bảng

Bạn cũng có thể kết hợp nhiều bảng với RIGHT JOIN. Ví dụ, nếu bạn có bảng DonHang và muốn lấy tất cả các phòng ban và thông tin đơn hàng, kể cả những phòng ban không có đơn hàng:

  1. Bảng DonHang:
  • MaDonHang
  • MaNhanVien (khóa ngoại liên kết với bảng NhanVien)
  • NgayDat
SELECT PhongBan.TenPhongBan, DonHang.MaDonHang, DonHang.NgayDat
FROM PhongBan
RIGHT JOIN NhanVien ON PhongBan.MaPhongBan = NhanVien.MaPhongBan
RIGHT JOIN DonHang ON NhanVien.MaNhanVien = DonHang.MaNhanVien;

Câu lệnh này sẽ trả về tất cả các đơn hàng và thông tin phòng ban liên quan, kể cả những phòng ban không có đơn hàng.

Lưu Ý

  • Kết quả không khớp: RIGHT JOIN đảm bảo rằng tất cả các hàng từ bảng bên phải được trả về, ngay cả khi không có sự khớp ở bảng bên trái. Nếu không có khớp, các giá trị của các cột từ bảng bên trái sẽ là NULL.
  • Hiệu suất: RIGHT JOIN có thể ảnh hưởng đến hiệu suất của truy vấn, đặc biệt khi làm việc với các bảng lớn. Đảm bảo rằng các cột được liên kết có chỉ mục để cải thiện hiệu suất.
  • Sử dụng với các điều kiện khác: RIGHT JOIN có thể kết hợp với các điều kiện lọc khác như WHERE, ORDER BY, và GROUP BY để điều chỉnh kết quả.

Tóm tắt

  • Mệnh đề RIGHT JOIN kết hợp tất cả các hàng từ bảng bên phải với các hàng khớp từ bảng bên trái, và trả về các hàng từ bảng bên phải ngay cả khi không có khớp ở bảng bên trái.
  • Nếu không có khớp, các giá trị của các cột từ bảng bên trái sẽ là NULL.
  • Kết hợp RIGHT JOIN với các điều kiện và mệnh đề khác để lấy dữ liệu đầy đủ và chính xác theo yêu cầu.

Trong MySQL, không có mệnh đề FULL JOIN (hoặc FULL OUTER JOIN) như trong một số hệ quản trị cơ sở dữ liệu khác như SQL Server hay PostgreSQL. Tuy nhiên, bạn có thể đạt được hiệu ứng tương tự bằng cách kết hợp kết quả của LEFT JOINRIGHT JOIN thông qua một phép hợp (UNION).

Khái Niệm về FULL JOIN

FULL JOIN (hoặc FULL OUTER JOIN) kết hợp tất cả các hàng từ cả hai bảng, bao gồm các hàng không có sự khớp ở cả hai bảng. Nếu một bảng không có hàng khớp, các cột của bảng đó sẽ được điền là NULL.

Tạo Kết Quả Tương Tự FULL JOIN Trong MySQL

Để mô phỏng FULL JOIN trong MySQL, bạn có thể sử dụng phép hợp (UNION) của LEFT JOINRIGHT JOIN. Đây là cách kết hợp kết quả từ LEFT JOINRIGHT JOIN để đảm bảo rằng tất cả các hàng từ cả hai bảng đều được bao gồm.

Cú Pháp Mô Phỏng FULL JOIN

SELECT bang1.*, bang2.*
FROM bang1
LEFT JOIN bang2
ON bang1.cot_khoa_ngoai = bang2.cot_khoa_chinh

UNION

SELECT bang1.*, bang2.*
FROM bang1
RIGHT JOIN bang2
ON bang1.cot_khoa_ngoai = bang2.cot_khoa_chinh;

Ví Dụ

Giả sử bạn có hai bảng:

  1. Bảng NhanVien:
  • MaNhanVien
  • TenNhanVien
  • MaPhongBan (khóa ngoại liên kết với bảng PhongBan)
  1. Bảng PhongBan:
  • MaPhongBan (khóa chính)
  • TenPhongBan

Để lấy danh sách tất cả nhân viên và phòng ban, bao gồm cả những nhân viên không thuộc bất kỳ phòng ban nào và các phòng ban không có nhân viên, bạn có thể sử dụng cú pháp mô phỏng FULL JOIN:

-- Kết quả của LEFT JOIN
SELECT NhanVien.MaNhanVien, NhanVien.TenNhanVien, PhongBan.TenPhongBan
FROM NhanVien
LEFT JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan

UNION

-- Kết quả của RIGHT JOIN
SELECT NhanVien.MaNhanVien, NhanVien.TenNhanVien, PhongBan.TenPhongBan
FROM NhanVien
RIGHT JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;

Giải Thích

  • LEFT JOIN: Trả về tất cả các hàng từ bảng bên trái (NhanVien) và các hàng khớp từ bảng bên phải (PhongBan). Nếu không có khớp, các cột từ bảng bên phải sẽ là NULL.
  • RIGHT JOIN: Trả về tất cả các hàng từ bảng bên phải (PhongBan) và các hàng khớp từ bảng bên trái (NhanVien). Nếu không có khớp, các cột từ bảng bên trái sẽ là NULL.
  • UNION: Kết hợp kết quả từ hai truy vấn và loại bỏ các hàng trùng lặp.

Lưu Ý

  • Hiệu suất: Kết hợp LEFT JOINRIGHT JOIN có thể ảnh hưởng đến hiệu suất của truy vấn, đặc biệt khi làm việc với các bảng lớn. Đảm bảo rằng các cột liên kết có chỉ mục để cải thiện hiệu suất.
  • Dữ liệu trùng lặp: Khi sử dụng UNION, các hàng trùng lặp sẽ bị loại bỏ. Nếu bạn muốn giữ các hàng trùng lặp, hãy sử dụng UNION ALL thay vì UNION.

Tóm tắt

  • MySQL không hỗ trợ trực tiếp FULL JOIN. Để đạt được hiệu ứng tương tự, bạn cần kết hợp kết quả của LEFT JOINRIGHT JOIN bằng cách sử dụng UNION.
  • Sử dụng cú pháp mô phỏng FULL JOIN để bao gồm tất cả các hàng từ cả hai bảng, bao gồm cả các hàng không có khớp.
  • Lưu ý hiệu suất và các điều kiện khi sử dụng phương pháp này, đặc biệt với các bảng lớn.