SQL JOIN là một mệnh đề được sử dụng để kết hợp nhiều bảng và truy xuất dữ liệu dựa trên một trường phổ biến trong cơ sở dữ liệu quan hệ. Các chuyên gia cơ sở dữ liệu sử dụng các chuẩn hóa để đảm bảo và cải thiện tính toàn vẹn của dữ liệu. Trong các dạng chuẩn hóa khác nhau, dữ liệu được phân phối thành nhiều bảng logic. Các bảng này sử dụng các ràng buộc tham chiếu - khóa chính và khóa ngoài - để thực thi tính toàn vẹn của dữ liệu trong bảng SQL Server. Trong hình ảnh dưới đây, chúng ta có một cái nhìn thoáng qua về quá trình chuẩn hóa cơ sở dữ liệu.
Hiểu các loại SQL JOIN khác nhau
SQL JOIN tạo dữ liệu có ý nghĩa bằng cách kết hợp nhiều bảng quan hệ. Các bảng này có liên quan với nhau bằng cách sử dụng một khóa và có mối quan hệ một-một hoặc một-nhiều. Để truy xuất dữ liệu chính xác, bạn phải biết các yêu cầu dữ liệu và cơ chế nối chính xác. SQL Server hỗ trợ nhiều phép nối và mỗi phương pháp có một cách cụ thể để lấy dữ liệu từ nhiều bảng. Hình ảnh dưới đây chỉ định các phép nối Máy chủ SQL được hỗ trợ.
Tham gia bên trong SQL
Phép nối bên trong SQL bao gồm các hàng từ các bảng mà các điều kiện nối được thỏa mãn. Ví dụ:trong biểu đồ Venn bên dưới, phép nối bên trong trả về các hàng phù hợp từ Bảng A và Bảng B.
Trong ví dụ dưới đây, hãy lưu ý những điều sau:
- Chúng tôi có hai bảng - [Nhân viên] và [Địa chỉ].
- Truy vấn SQL được kết hợp trên cột [Nhân viên]. [EmpID] và [Địa chỉ]. [ID].
Kết quả truy vấn trả về bản ghi nhân viên cho EmpID tồn tại trong cả hai bảng.
Phép nối bên trong trả về các hàng phù hợp từ cả hai bảng; do đó, nó còn được gọi là tham gia Trang bị. Nếu chúng tôi không chỉ định từ khóa bên trong, thì SQL Server sẽ thực hiện thao tác nối bên trong.
Trong một kiểu nối bên trong khác, phép nối theta, chúng ta không sử dụng toán tử đẳng thức (=) trong mệnh đề ON. Thay vào đó, chúng tôi sử dụng các toán tử không bình đẳng như
CHỌN * TỪ Table1 T1, Table2 T2 WHERE T1.Price
Trong tự tham gia, SQL Server tham gia bảng với chính nó. Điều này có nghĩa là tên bảng xuất hiện hai lần trong mệnh đề from.
Dưới đây, chúng tôi có một bảng [Emp] có nhân viên cũng như dữ liệu của người quản lý của họ. Việc tự nối rất hữu ích để truy vấn dữ liệu phân cấp. Ví dụ:trong bảng nhân viên, chúng tôi có thể sử dụng tự tham gia để tìm hiểu từng nhân viên và tên người quản lý báo cáo của họ.
Truy vấn trên đặt một tự tham gia vào bảng [Emp]. Nó kết hợp cột EmpMgrID với cột EmpID và trả về các hàng phù hợp.
Trong phép nối chéo, SQL Server trả về sản phẩm Descartes từ cả hai bảng. Ví dụ:trong hình ảnh dưới đây, chúng tôi đã thực hiện kết hợp chéo cho bảng A và B.
Phép nối chéo nối từng hàng từ bảng A đến mọi hàng có sẵn trong bảng B. Do đó, kết quả đầu ra còn được gọi là tích Descartes của cả hai bảng. Trong hình ảnh dưới đây, hãy lưu ý những điều sau:
Trong đầu ra kết hợp chéo, hàng 1 của bảng [Nhân viên] kết hợp với tất cả các hàng của bảng [Địa chỉ] và tuân theo cùng một mẫu cho các hàng còn lại.
Nếu bảng đầu tiên có x số hàng và bảng thứ hai có n số hàng, phép nối chéo sẽ cho x * n số hàng trong đầu ra. Bạn nên tránh kết hợp chéo trên các bảng lớn hơn vì nó có thể trả về một số lượng lớn các bản ghi và Máy chủ SQL yêu cầu nhiều sức mạnh tính toán (CPU, bộ nhớ và IO) để xử lý dữ liệu lớn như vậy.
Như chúng tôi đã giải thích trước đó, phép nối bên trong trả về các hàng phù hợp từ cả hai bảng. Khi sử dụng phép nối bên ngoài SQL, nó không chỉ liệt kê các hàng phù hợp mà còn trả về các hàng chưa khớp từ các bảng khác. Hàng chưa đối sánh phụ thuộc vào các từ khóa trái, phải hoặc đầy đủ.
Hình ảnh dưới đây mô tả ở cấp độ cao kết nối bên ngoài trái, phải và đầy đủ.
Phép nối bên trái bên trái của SQL trả về các hàng phù hợp của cả hai bảng cùng với các hàng chưa khớp từ bảng bên trái. Nếu bản ghi từ bảng bên trái không có bất kỳ hàng nào phù hợp trong bảng bên phải, bản ghi đó sẽ hiển thị bản ghi có giá trị NULL.
Trong ví dụ dưới đây, phép nối ngoài cùng bên trái trả về các hàng sau:
Phép nối bên ngoài bên phải SQL trả về các hàng phù hợp của cả hai bảng cùng với các hàng chưa khớp từ bảng bên phải. Nếu bản ghi từ bảng bên phải không có bất kỳ hàng nào phù hợp trong bảng bên trái, bản ghi đó sẽ hiển thị bản ghi có giá trị NULL.
Trong ví dụ dưới đây, chúng ta có các hàng đầu ra sau:
Một phép nối bên ngoài đầy đủ trả về các hàng sau trong đầu ra:
Trong các ví dụ trước, chúng tôi sử dụng hai bảng trong một truy vấn SQL để thực hiện các thao tác nối. Hầu hết, chúng tôi kết hợp nhiều bảng với nhau và nó trả về dữ liệu có liên quan.
Truy vấn dưới đây sử dụng nhiều phép nối bên trong.
Hãy phân tích truy vấn theo các bước sau:
Khi bạn thực hiện truy vấn với nhiều phép nối, trình tối ưu hóa truy vấn sẽ chuẩn bị kế hoạch thực thi. Nó chuẩn bị một kế hoạch thực thi được tối ưu hóa chi phí đáp ứng các điều kiện kết hợp với việc sử dụng tài nguyên — ví dụ:trong kế hoạch thực thi thực tế bên dưới, chúng ta có thể xem xét nhiều vòng lặp lồng nhau (kết nối bên trong) và kết hợp băm (kết hợp bên trong) kết hợp dữ liệu từ nhiều bảng tham gia .
Giả sử chúng ta có giá trị NULL trong các cột của bảng và chúng ta nối các bảng trên các cột đó. SQL Server có khớp với giá trị NULL không?
Các giá trị NULL không khớp với nhau. Do đó, SQL Server không thể trả về hàng phù hợp. Trong ví dụ dưới đây, chúng ta có NULL trong cột EmpID của bảng [Nhân viên]. Do đó, trong đầu ra, nó trả về hàng phù hợp chỉ cho [EmpID] 2.
Chúng ta có thể lấy hàng NULL này trong đầu ra trong trường hợp có phép nối bên ngoài SQL vì nó cũng trả về các hàng chưa khớp.
Trong bài viết này, chúng ta đã khám phá các kiểu nối SQL khác nhau. Dưới đây là một số phương pháp hay nhất quan trọng cần ghi nhớ và áp dụng khi sử dụng các phép nối SQL. SQL tự tham gia
Kết hợp chéo trong SQL
Tham gia bên ngoài SQL
Kết nối bên ngoài bên trái
Tham gia bên ngoài bên phải
Tham gia đầy đủ bên ngoài
SQL kết hợp với nhiều bảng
USE [AdventureWorks2019]
GO
SELECT
e.[BusinessEntityID]
,p.[FirstName]
,p.[MiddleName]
,p.[LastName]
,e.[JobTitle]
,d.[Name] AS [Department]
,d.[GroupName]
,edh.[StartDate]
FROM [HumanResources].[Employee] e
INNER JOIN [Person].[Person] p
ON p.[BusinessEntityID] = e.[BusinessEntityID]
INNER JOIN [HumanResources].[EmployeeDepartmentHistory] edh
ON e.[BusinessEntityID] = edh.[BusinessEntityID]
INNER JOIN [HumanResources].[Department] d
ON edh.[DepartmentID] = d.[DepartmentID]
WHERE edh.EndDate IS NULL
GO
Giá trị NULL và tham gia SQL
Các phương pháp hay nhất về nối SQL