Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tổng quan về các kiểu Nối SQL với các ví dụ

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

SQL tự tham gia

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.

Kết hợp chéo trong SQL

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:

  • Bảng [Nhân viên] có ba hàng cho Emp ID 1,2 và 3.
  • Bảng [Địa chỉ] có các bản ghi cho Emp ID 1,2,7 và 8.

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.

Tham gia bên ngoài SQL

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 đủ.

Kết nối bên ngoài bên trái

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:

  • Các hàng phù hợp:ID trống 1 và 2 tồn tại trong cả bảng bên trái và bên phải.
  • Hàng chưa khớp:ID trống 3 không tồn tại trên bảng bên phải. Do đó, chúng tôi có giá trị NULL trong kết quả truy vấn.

Tham gia bên ngoài bên phải

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:

  • Các hàng phù hợp:ID trống 1 và 2 tồn tại trong cả hai bảng; do đó, các hàng này là các hàng phù hợp.
  • Các hàng chưa khớp:Trong bảng bên phải, chúng tôi có các hàng bổ sung cho Emp ID 7 và 8, nhưng những hàng này không có sẵn trong bảng bên trái. Do đó, chúng tôi nhận được giá trị NULL trong phép nối bên ngoài bên phải cho các hàng này.

Tham gia đầy đủ bên ngoài

Một phép nối bên ngoài đầy đủ trả về các hàng sau trong đầu ra:

  • Khớp các hàng giữa hai bảng.
  • Các hàng chưa khớp tương tự như phép nối ngoài cùng bên trái:Giá trị NULL cho các hàng chưa khớp từ bảng bên phải.
  • Các hàng chưa khớp tương tự như phép nối ngoài cùng bên phải:Giá trị rỗng cho các hàng chưa khớp từ bảng bên trái.

SQL kết hợp với nhiều bảng

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.

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

Hãy phân tích truy vấn theo các bước sau:

  • Kết quả trung gian 1: Tham gia bên trong đầu tiên nằm giữa bảng [HumanResources]. [Nhân viên] và [Người]. [Người].
  • Kết quả trung gian 2: Kết hợp bên trong giữa bảng [Kết quả trung gian 1] và [Nguồn nhân lực]. [Nhân viênDepartmentHistory].
  • Kết quả trung gian 3: Kết nối bên trong giữa bảng [Kết quả trung gian 2] và [Nguồn nhân lực]. [Bộ phận].

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á trị NULL và tham gia SQL

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.

Các phương pháp hay nhất về nối SQL

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.

  • Các phép nối bên trong xuất ra các hàng phù hợp từ điều kiện kết hợp trong cả hai bảng.
  • Phép nối chéo trả về tích Descartes của cả hai bảng.
  • Kết hợp bên ngoài trả về các hàng đã so khớp và chưa được so khớp tùy thuộc vào các từ khóa trái, phải và đầy đủ.
  • Tự nối SQL sẽ tự nối một bảng với chính nó.
  • Bạn nên luôn sử dụng bí danh bảng trong khi sử dụng các phép nối trong truy vấn.
  • Luôn sử dụng tên gồm hai phần [bí danh bảng]. Định dạng tên [cột] cho các cột trong truy vấn.
  • Trong trường hợp có nhiều SQL kết hợp trong một truy vấn, bạn nên sử dụng thứ tự logic của các bảng theo cách để đáp ứng yêu cầu dữ liệu của bạn và giảm thiểu luồng dữ liệu giữa các toán tử khác nhau của kế hoạch thực thi.
  • Bạn có thể kết hợp nhiều phép nối chẳng hạn như phép nối bên trong, phép nối bên ngoài và tự nối lại với nhau. Tuy nhiên, bạn nên sử dụng các liên kết và đơn đặt hàng của chúng để nhận dữ liệu cần thiết.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lấy tất cả các tên bảng của một cơ sở dữ liệu cụ thể bằng truy vấn SQL?

  2. Tại sao sử dụng Chọn 100 Phần trăm Hàng đầu?

  3. Tại sao lại sử dụng mệnh đề INCLUDE khi tạo chỉ mục?

  4. Sự khác biệt giữa sys.parameters, sys.system_parameters và sys.all_parameters trong SQL Server

  5. Tham chiếu bí danh ở nơi khác trong danh sách CHỌN