Theo truyền thống, bạn lấy dữ liệu từ hai hoặc nhiều bảng bằng WHERE
mệnh đề trong một truy vấn. Nhưng trong hệ thống cơ sở dữ liệu quan hệ (RDBMS), điều này có thể đạt được bằng cách sử dụng một SELECT
duy nhất truy vấn. Đây là sức mạnh thực sự của hệ thống cơ sở dữ liệu quan hệ. Trong hướng dẫn này, bạn tìm hiểu về SQL Joins, một cách hiệu quả để so sánh và chọn các hàng và bảng.
SQL Join là gì?
Trong SQL, một join
mệnh đề mở rộng khả năng so sánh và chọn hàng từ bảng. Nó sử dụng một quy trình đại số để kết hợp các hàng từ hai hoặc nhiều bảng dựa trên một cột có liên quan trong các bảng đó. Theo định nghĩa SQL tiêu chuẩn ANSI, có năm loại kết hợp - Kết hợp chéo , Tham gia bên trong , Kết hợp bên trái (Bên ngoài) , Tham gia bên phải (Bên ngoài) và Tham gia đầy đủ (Bên ngoài) . Các tham gia này được triển khai trên tất cả các hệ thống cơ sở dữ liệu quan hệ và được đề cập trong các phần bên dưới.
Lưu ý Các phép nối có thể được thực hiện trên bất kỳ số lượng bảng nào trong một truy vấn nhất định. Để ngắn gọn và rõ ràng, hướng dẫn này thảo luận về Các phép nối được áp dụng cho hai bảng.
Hướng dẫn này sử dụng hai bảng, Employees
và Address
, tương ứng, để chứng minh SQL Joins. Mỗi bảng này chứa các định nghĩa và dữ liệu cột sau:
-
Bảng nhân viên
EmployeeId EmployeeName 1 John 2 Mary 3 Robert -
Bảng địa chỉ
Id State 1 New York 2 New Jersey 3 Idaho 4 Hawaii
Lưu ý Trừ khi được đề cập khác, tất cả các lệnh trong hướng dẫn này hoạt động tốt trên cả MySQL và PostgreSQL cơ sở dữ liệu.
SQL Cross Joins
Còn được gọi là Kết hợp Descartes , Kết hợp chéo xảy ra khi bạn chỉ định nhiều bảng làm nguồn cho SELECT
của mình danh sách cột. Trong trường hợp này, bạn bỏ đi WHERE
mệnh đề nối biểu thức để khớp với các hàng trên. Tập hợp kết quả chứa một hàng cho mọi kết hợp các hàng giữa các bảng. Trong kịch bản hai bảng, mọi hàng trong một bảng được ghép nối với mọi hàng của bảng khác. Sản phẩm thu được được gọi là Sản phẩm Descartes của hai bảng. Cú pháp cho Tham gia chéo như sau:
(# Rows in Table A) TIMES (# of Rows in Table B)
Lưu ýTrong lý thuyết tập hợp, Tích Descartes là một phép nhân tạo ra tất cả các cặp có thứ tự của các tập hợp đã cho. Ví dụ:hãy xem xét đặt
A
với các phần tử{a,b}
và đặtB
với các phần tử{1,2,3}
. Sản phẩm Descartes củaA
vàB
được ký hiệu làAxB
và kết quả như sau:AxB ={(a,1), (a,2), (a,3), (b,1), (b,2), (b,3)}
Cú pháp SQL cho một phép nối chéo như sau:
SELECT ColumnName_1,
ColumnName_2,
ColumnName_N
FROM [Table_1]
CROSS JOIN [Table_2]
Từ cú pháp trên, Column_1
, Column_2
, Column_N
đại diện cho các cột trong bảng và CROSS JOIN
mệnh đề dùng để kết hợp hai bảng, Table_1
và Table_2
. Từ các bảng ví dụ ở trên, nếu bạn cần thực hiện Tham gia chéo trên Employees
và Address
bảng, sử dụng mã SQL sau:
SELECT EmployeeName, State
FROM Employees
CROSS JOIN Address
Đầu ra của mã SQL trên giống như sau:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| John | New Jersey |
| John | Idaho |
| John | Hawaii |
| John | New York |
| Mary | New York |
| Mary | New Jersey |
| Mary | Idaho |
| Mary | Hawaii |
| Robert | New York |
| Robert | New Jersey |
| Robert | Idaho |
| Robert | Hawaii |
+------------+----------------+
Tham gia bên trong SQL
Một phép nối bên trong trả về các hàng có giá trị phù hợp trong cả hai bảng. Nếu không có bản ghi nào phù hợp, thì không có hàng nào được trả về trong kết quả.
Cú pháp SQL cho phép nối bên trong như sau:
SELECT ColumnName_1,
ColumnName_2,
ColumnName_N
FROM Table_1
INNER JOIN Table_2
ON Table_1.key = Table_2.key;
Trong ví dụ trên, key
là khóa tương ứng của các bảng. Nếu bạn cần thực hiện tham gia nội bộ trên Employees
và Address
bảng, sử dụng mã SQL sau:
SELECT EmployeeName, State
FROM Employees
INNER JOIN Address
ON Employees.EmployeeId = Address.Id
Đầu ra của mã SQL trên giống như sau:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
+------------+----------------+
SQL Left (Outer) Tham gia
Phép nối bên trái trả về một tập hợp các hàng hoàn chỉnh từ bảng bên trái cùng với các hàng phù hợp từ bảng bên phải. Nếu không có bản ghi nào phù hợp, thì NULL
các giá trị được trả về từ bảng bên phải.
Lưu ý Một số triển khai cơ sở dữ liệu quan hệ sử dụng các từ khóa “Left Outer Join”, trái ngược với “Left Join”, nhưng chúng tương đương về mặt chức năng.
Cú pháp SQL cho phép nối trái như sau:
SELECT * FROM Table_1
LEFT JOIN Table_2
ON Table_1.key = Table_2.key
Trong ví dụ trên, key
là khóa tương ứng của các bảng. Nếu bạn cần thực hiện kết hợp trái trên Employees
và Address
bảng, sử dụng mã SQL sau:
SELECT EmployeeName, State
FROM Employees
LEFT JOIN Address
ON Employees.EmployeeId = Address.Id
Đầu ra của mã SQL trên như sau:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| Robert | NULL |
+------------+----------------+
SQL Right (Outer) Tham gia
Phép nối bên phải trả về một tập hợp các hàng hoàn chỉnh từ bảng bên phải và các hàng phù hợp từ bảng bên trái. Đây còn được gọi là Tham gia Bên ngoài Bên phải. Nếu không có bản ghi nào phù hợp, thì NULL
các giá trị được trả về từ bảng bên phải cho các hàng bị ảnh hưởng trong bảng bên trái.
Lưu ý Một số triển khai cơ sở dữ liệu quan hệ sử dụng từ khóa “Tham gia bên ngoài bên phải”, trái ngược với “Tham gia bên phải”, nhưng chúng tương đương về mặt chức năng.
Cú pháp SQL cho phép nối phải như sau:
SELECT * FROM Table_1
RIGHT JOIN Table_2
ON Table_1.key = Table_2.key
Từ mã trên, key
là khóa tương ứng của các bảng. Nếu bạn cần thực hiện tham gia đúng vào Employees
và Address
bảng, sử dụng mã SQL sau:
SELECT EmployeeName, State
FROM Employees
RIGHT JOIN Address
ON Employees.EmployeeId = Address.Id
Đầu ra của mã SQL trên như sau:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| NULL | Idaho |
| NULL | Hawaii |
+------------+----------------+
SQL Full (Outer) Tham gia
Một kết hợp đầy đủ trả về tất cả các hàng từ bảng bên trái, tất cả các hàng từ bảng bên phải. Điều này còn được gọi là Tham gia Bên ngoài Toàn bộ. Một tham gia đầy đủ cũng trả về tất cả các bản ghi phù hợp từ cả hai bảng nếu có sẵn. Nếu không có bản ghi nào phù hợp, thì NULL
các giá trị được trả về từ bảng bên trái. Nó cũng trả về NULL
giá trị từ bảng bên phải.
Lưu ý Một số triển khai cơ sở dữ liệu quan hệ sử dụng các từ khóa “Tham gia đầy đủ bên ngoài”, trái ngược với “Tham gia đầy đủ”, nhưng chúng tương đương về mặt chức năng.
Cú pháp SQL cho Full Join như sau:
SELECT * FROM Table1
FULL JOIN Table2
ON Table1.key = Table2.key
Trong đoạn mã trên, key
là khóa tương ứng của các bảng. Nếu bạn cần thực hiện tham gia đầy đủ trên Employees
và Address
bảng, sử dụng mã SQL sau:
SELECT EmployeeName, State
FROM Employees
FULL JOIN Address
ON Employees.EmployeeId = Address.Id
Đầu ra của mã SQL trên như sau:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| Robert | NULL |
| NULL | Idaho |
| NULL | Hawaii |
+------------+----------------+
Lưu ý Trong khi tính toán Kết hợp, nếu bạn so sánh dữ liệu bảng vớiNULL
giá trị, chúng không khớp với nhau. Do đó,NULL
các giá trị chỉ được trả về như một phần của kết quả Tham gia và bị bỏ qua trong quá trình tính toán Tham gia.
So sánh hiệu suất của SQL Joins
Xem xét các bảng ví dụ trên, phép nối bên trong thường là mệnh đề nhanh nhất trong số năm mệnh đề phép nối về mặt hiệu suất cơ sở dữ liệu. Tham gia bên trái và tham gia bên phải là nhanh nhất tiếp theo tùy thuộc vào kích thước của hai bảng. Tham gia đầy đủ thường chậm hơn tham gia trái hoặc tham gia phải. Cross Join, dựa trên tích Descartes của hai bảng, thường là chậm nhất về hiệu suất cơ sở dữ liệu. Hệ thống phân cấp hiệu suất được chỉ định có thể khác nhau tùy thuộc vào độ dài cột bảng, kiểu dữ liệu cột và định nghĩa khóa.
Kết luận
Việc sử dụng SQL Joins mở rộng chức năng có thể so sánh các hàng trong bảng, qua WHERE
truyền thống truy vấn mệnh đề. Nối là một cơ chế có giá trị để áp dụng logic đại số cho hai hoặc nhiều bảng.