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

Mọi thứ bạn nên biết về SQL Server JOINS

Trọng tâm của bài viết này sẽ là sử dụng JOIN. Chúng ta sẽ bắt đầu bằng cách nói một chút về cách các THAM GIA sẽ diễn ra và lý do tại sao bạn cần phải THAM GIA dữ liệu. Sau đó, chúng tôi sẽ xem xét các loại JOIN mà chúng tôi có sẵn cho chúng tôi và cách sử dụng chúng.

THAM GIA CƠ BẢN

Các phép tham gia trong TSQL thường sẽ được thực hiện trên dòng FROM.

Trước khi chúng ta bắt đầu làm bất cứ điều gì khác, câu hỏi lớn thực sự trở thành - “Tại sao chúng ta phải thực hiện THAM GIA, và chúng ta thực sự sẽ thực hiện các THAM GIA của mình như thế nào?”

Hóa ra, mọi cơ sở dữ liệu mà chúng tôi từng làm việc sẽ có dữ liệu của nó được chia thành nhiều bảng. Có nhiều lý do khác nhau cho điều này:

  • Duy trì tính toàn vẹn của dữ liệu
  • Tiết kiệm dung lượng lưu trữ
  • Chỉnh sửa dữ liệu nhanh hơn
  • Làm cho các truy vấn linh hoạt hơn

Vì vậy, mọi cơ sở dữ liệu mà bạn sẽ làm việc sẽ cần dữ liệu đó được kết hợp với nhau để nó thực sự có ý nghĩa.

Ví dụ:bạn có các bảng riêng biệt cho đơn đặt hàng và cho khách hàng. Câu hỏi trở thành - "Làm cách nào để chúng ta thực sự kết nối tất cả dữ liệu với nhau?" Đó chính xác là những gì JOIN sẽ làm.

CÁCH THAM GIA HOẠT ĐỘNG

Hãy tưởng tượng trường hợp, khi chúng ta có hai bảng riêng biệt và các bảng đó sẽ được kết hợp với nhau bằng cách tạo một đường nối.

Điều gì sẽ xảy ra với đường nối, nếu chúng ta nhận được một cột từ mỗi bảng sẽ được sử dụng để đối sánh và điều đó sẽ xác định những hàng nào được hoặc không sẽ được trả lại? Ví dụ:chúng tôi có Khách hàng ở bên trái và Đơn đặt hàng dịch vụ ở bên phải. Nếu chúng ta muốn có được tất cả các khách hàng và đơn đặt hàng của họ, chúng ta cần phải THAM GIA hai bảng này với nhau. Đối với điều này, chúng tôi cần chọn một cột sẽ hoạt động như một đường nối và tất nhiên, cột chúng tôi sẽ sử dụng là CustomerID.

Nhân tiện, CustomerID được gọi là Khóa chính cho bảng bên trái, xác định duy nhất mọi hàng bên trong bảng Khách hàng.

Trong bảng ServiceOrders, chúng tôi cũng có cột CustomerID, được gọi là Khóa ngoại . Khóa ngoại chỉ đơn giản là một cột được thiết kế để trỏ đến một bảng khác. Trong trường hợp của chúng ta, nó đang trỏ trở lại bảng Khách hàng. Do đó, đó là cách chúng tôi sẽ tập hợp tất cả dữ liệu đó lại với nhau bằng cách cung cấp đường nối đó.

Trong các bảng này, chúng ta có các khớp sau:2 lệnh cho 15 và 1 lệnh cho 23, 25 và 26. 16 và 22 bị loại bỏ.

Một điều lớn cần lưu ý ở đây là chúng ta có thể THAM GIA nhiều bảng . Trên thực tế, việc THAM GIA nhiều bảng với nhau để lấy bất kỳ dạng thông tin nào là khá phổ biến. Nếu bạn xem cơ sở dữ liệu phổ biến nhất, bạn có thể phải THAM GIA cùng nhau bốn, năm, sáu và nhiều bảng chỉ để có được thông tin bạn đang tìm kiếm. Có một sơ đồ cơ sở dữ liệu sẽ rất hữu ích.

Để giúp bạn trong hầu hết các môi trường cơ sở dữ liệu, bạn sẽ nhận thấy rằng các cột được thiết kế để được THAM GIA có cùng tên.

THAM GIA TỔNG HỢP

Bản sửa đổi thứ ba của ngôn ngữ truy vấn cơ sở dữ liệu SQL (SQL-92) quy định cú pháp JOIN:

Có thể thực hiện lệnh JOIN trên dòng WHERE:

Một quan hệ thường có một diễn giải đồ họa đơn giản dưới dạng một bảng.

Các Quy ước và Thực tiễn Tốt nhất

  1. Tên bảng bí danh.
  2. Sử dụng cách đặt tên gồm hai phần cho các cột
  3. Đặt mỗi JOIN trên một dòng riêng biệt
  4. Đặt các bảng theo thứ tự hợp lý

THAM GIA CÁC LOẠI

SQL Server cung cấp các loại JOIN sau:

  • THAM GIA INNER
  • THAM GIA NGOÀI TRỜI
  • TỰ THAM GIA
  • THAM GIA CROSS

Để biết thêm thông tin về chủ đề này, vui lòng xem bài viết này về các kiểu kết hợp trong SQL Server và tìm hiểu cách viết các truy vấn như vậy dễ dàng như thế nào với sự trợ giúp của SQL Complete.

THAM GIA INNER

Loại JOIN đầu tiên mà chúng ta có thể muốn thực thi là INNER JOIN. Thông thường, các tác giả gọi loại SQL Server JOIN này như một JOIN thông thường hoặc đơn giản. Họ chỉ bỏ tiền tố INNER. Loại JOIN này kết hợp hai bảng với nhau và chỉ trả về các hàng từ cả hai bên khớp với nhau .

Chúng tôi không thấy Klara và Anthony ở đây vì CustomerID của họ không khớp trong cả hai bảng. Tôi cũng muốn nhấn mạnh thực tế rằng hoạt động JOIN trả lại một khách hàng mỗi khi nó khớp với đơn đặt hàng . Có hai đơn đặt hàng cho Michael và một đơn đặt hàng cho Dave, Victor và Tom mỗi người.

Tóm tắt:

  • INNER JOIN chỉ trả về các hàng khi có ít nhất một hàng trong cả hai bảng phù hợp với điều kiện JOIN.
  • INNER JOIN loại bỏ các hàng không khớp với một hàng trong bảng khác

THAM GIA NGOÀI TRỜI

Các Outer JOIN khác nhau vì chúng trả về các hàng từ bảng hoặc dạng xem ngay cả khi chúng không khớp. Loại THAM GIA này rất hữu ích nếu bạn cần truy xuất tất cả những khách hàng chưa từng đặt hàng. Hoặc, ví dụ, nếu bạn đang tìm kiếm một sản phẩm chưa bao giờ được đặt hàng.

Cách chúng tôi thực hiện THAM GIA NGOÀI TRỜI là chỉ ra TRÁI hoặc PHẢI, hoặc ĐẦY ĐỦ.

Không có sự khác biệt giữa các mệnh đề sau:

  • LEFT OUTER JOIN =THAM GIA TRÁI
  • RIGHT OUTER JOIN =THAM GIA PHẢI
  • FULL OUTER JOIN =THAM GIA ĐẦY ĐỦ

Tuy nhiên, tôi khuyên bạn nên viết mệnh đề hoàn chỉnh vì nó làm cho mã dễ đọc hơn.

Sử dụng LEFT OUTER JOIN

Không có sự khác biệt giữa LEFT hoặc RIGHT ngoại trừ thực tế là chúng ta chỉ trỏ vào bảng mà chúng ta muốn lấy thêm các hàng từ đó. Trong ví dụ sau, chúng tôi liệt kê các khách hàng và đơn đặt hàng của họ. Chúng tôi sử dụng LEFT để có được tất cả những khách hàng chưa từng đặt hàng. Chúng tôi yêu cầu SQL Server cung cấp cho chúng tôi các hàng bổ sung từ bảng bên trái.

Lưu ý rằng Karla và Anthony chưa đặt bất kỳ đơn hàng nào và kết quả là chúng tôi nhận được giá trị NULL cho ServiceName và ServiceID. SQL Server không biết phải đặt cái gì ở đó và nó đặt NULL.

Sử dụng RIGHT OUTER JOIN

Để nhận được dịch vụ ít phổ biến hơn từ bảng ServiceOrders, chúng ta cần sử dụng hướng RIGHT.

Chúng tôi thấy rằng trong trường hợp này, SQL Server trả về các hàng bổ sung từ bảng bên phải và dịch vụ Giặt thảm chưa bao giờ được đặt hàng.

Sử dụng FULL OUTER JOIN

Loại JOIN này cho phép bạn lấy thông tin không khớp bằng cách bao gồm các hàng không khớp từ cả hai bảng.

Điều này cũng có thể hữu ích nếu bạn cần dọn dẹp dữ liệu.

Tóm tắt:

THAM GIA NGOÀI TRỜI ĐẦY ĐỦ

  • Trả về các hàng từ cả hai bảng ngay cả khi chúng không khớp với câu lệnh JOIN

TRÁI hoặc PHẢI

  • Không có sự khác biệt ngoại trừ thứ tự của các bảng trong mệnh đề FROM
  • Chỉ hướng tại một bảng để truy xuất các hàng không khớp từ

TỰ THAM GIA

Loại JOIN tiếp theo mà chúng ta có là SELF JOIN. Đây có lẽ là kiểu JOIN ít phổ biến thứ hai mà bạn sẽ thực thi. TỰ THAM GIA là khi bạn đang tham gia một bảng vào chính nó. Nói chung, đây là một dấu hiệu của thiết kế kém. Để sử dụng cùng một bảng hai lần trong một truy vấn, bảng phải được đặt bí danh. Bí danh giúp bộ xử lý truy vấn xác định xem các cột nên hiển thị dữ liệu từ bên phải hay bên trái. Ngoài ra, bạn cần loại bỏ các hàng đang diễu hành. Điều này thường được thực hiện với một phép nối không trang bị.

Tóm tắt:

  • THAM GIA một bảng với chính nó
  • Nói chung là một dấu hiệu của thiết kế và chuẩn hóa kém
  • Các bảng phải được đặt bí danh
  • Cần lọc các hàng phù hợp với chính chúng

THAM GIA CHÉO

Loại THAM GIA này không có nút BẬT tuyên bố. Mỗi hàng từ mỗi bảng sẽ khớp với nhau. Đây còn được gọi là Sản phẩm Đề-các (trong trường hợp CROSS JOIN không có mệnh đề WHERE). Bạn sẽ hầu như không sử dụng loại JOIN này trong các tình huống thực tế, tuy nhiên, đó là một cách tốt để tạo dữ liệu thử nghiệm.

Kết quả là một tập dữ liệu, trong đó số hàng trong bảng bên trái nhân với số hàng trong bảng bên phải. Cuối cùng, chúng tôi thấy rằng mọi khách hàng đều phù hợp với mọi dịch vụ.

Chúng tôi nhận được kết quả tương tự khi sử dụng mệnh đề CROSS JOIN một cách rõ ràng.

Tóm tắt:

  • Tất cả các hàng đều khớp với mỗi bảng
  • Không có tuyên bố BẬT
  • Có thể được sử dụng để tạo dữ liệu thử nghiệm

THAM GIA THUẬT TOÁN

Trong phần đầu tiên của bài viết, chúng ta đã thảo luận về logic Các toán tử JOIN SQL Server sử dụng trong khi phân tích cú pháp và liên kết truy vấn. Đó là:

  • THAM GIA INNER
  • THAM GIA NGOÀI TRỜI
  • THAM GIA CROSS

Các toán tử logic là khái niệm và chúng khác với vật lý THAM GIA. Nói cách khác, các THAM GIA hợp lý không thực sự tham gia cột bảng cụ thể. Một JOIN logic duy nhất có thể tương ứng với nhiều JOIN vật lý. SQL Server thay thế các THAM GIA logic thành các THAM GIA vật lý trong quá trình tối ưu hóa. SQL Server có các toán tử JOIN vật lý sau:

  • NESTED LOOP
  • MERGE
  • HASH

Người dùng không viết hoặc sử dụng các loại JOINS này. Chúng là một phần của công cụ SQL Server và SQL Server sử dụng chúng bên trong để triển khai các THAM GIA logic. Khi bạn khám phá kế hoạch thực thi, bạn có thể lưu ý rằng SQL Server thay thế các toán tử JOIN logic bằng một trong ba toán tử vật lý.

Tham gia vòng lặp lồng nhau

Hãy bắt đầu từ toán tử đơn giản nhất, đó là Vòng lặp lồng nhau. Thuật toán so sánh mọi hàng đơn lẻ của một bảng (bảng bên ngoài) với mỗi hàng của bảng khác (bảng bên trong) để tìm kiếm các hàng đáp ứng vị từ JOIN.

Mã giả sau đây mô tả thuật toán vòng lặp tham gia lồng nhau bên trong:

Mã giả sau đây mô tả thuật toán vòng lặp tham gia lồng nhau bên ngoài:

Kích thước của đầu vào ảnh hưởng trực tiếp đến chi phí thuật toán. Đầu vào tăng thì chi phí cũng tăng theo. Loại thuật toán JOIN này hiệu quả trong trường hợp đầu vào nhỏ. SQL Server ước tính một vị từ JOIN cho mọi hàng trong cả hai đầu vào.

Hãy xem xét truy vấn sau đây làm ví dụ, truy vấn này thu hút khách hàng và đơn đặt hàng của họ.

Toán tử Quét chỉ mục theo cụm là đầu vào bên ngoài và Tìm kiếm chỉ mục theo cụm là đầu vào bên trong . Toán tử Vòng lặp lồng nhau thực sự tìm thấy sự phù hợp. Toán tử tìm kiếm từng bản ghi trong đầu vào bên ngoài và tìm các hàng phù hợp trong đầu vào bên trong. SQL Server thực hiện thao tác Quét chỉ mục theo cụm (đầu vào bên ngoài) chỉ một lần để lấy tất cả các bản ghi có liên quan. Clustered Index Seek được thực hiện cho mỗi bản ghi từ đầu vào bên ngoài. Để xác nhận điều này, hãy điều hướng con trỏ đến biểu tượng toán tử và kiểm tra chú giải công cụ.

Hãy nói về sự phức tạp. Giả sử N là số hàng cho đầu ra bên ngoài. M là tổng số hàng trong Người đặt hàng bàn. Do đó, độ phức tạp của truy vấn là O (NLogM) ở đâu LogM là độ phức tạp của mỗi lần tìm kiếm trong đầu vào bên trong. Trình tối ưu hóa sẽ chọn toán tử này mỗi khi đầu vào bên ngoài nhỏ và đầu vào bên trong chứa chỉ số trong cột đóng vai trò là đường nối. Do đó, chỉ mục và thống kê là cần thiết cho loại JOIN này, nếu không, SQL Server có thể vô tình nghĩ rằng không có quá nhiều hàng trong một trong các đầu vào. Tốt hơn là thực hiện quét một bảng hơn là thực hiện Tìm kiếm chỉ mục 100K lần. Đặc biệt là khi kích thước đầu vào bên trong lớn hơn 100K.

Tóm tắt:

Các vòng lặp lồng nhau

  • Độ phức tạp:O (NlogM)
  • Thường được áp dụng khi một bảng nhỏ
  • Bảng lớn hơn chứa một chỉ mục cho phép tìm kiếm nó bằng cách sử dụng khóa tham gia

Hợp nhất Tham gia

Một số nhà phát triển không hoàn toàn hiểu Hash và Merge JOIN và thường liên kết chúng với các truy vấn hoạt động kém.

Trái ngược với Vòng lặp lồng nhau chấp nhận bất kỳ vị từ JOIN nào, Kết nối hợp nhất yêu cầu ít nhất một phép nối trang bị. Ngoài ra, cả hai đầu vào phải được sắp xếp trên các khóa JOIN.

Mã giả cho thuật toán MERGE JOIN:

Thuật toán so sánh hai đầu vào được sắp xếp. Một hàng tại một thời điểm. Trong trường hợp có sự bằng nhau giữa hai hàng, thuật toán đưa ra kết quả nối các hàng và tiếp tục. Nếu không, thuật toán loại bỏ giá trị nhỏ hơn của hai đầu vào và tiếp tục. Không giống như Vòng lặp lồng nhau, chi phí ở đây tỷ lệ với tổng số hàng đầu vào. Về độ phức tạp - O (N + M). Do đó, loại JOIN này thường tốt hơn cho các đầu vào lớn.

Hoạt ảnh sau minh họa cách thuật toán MERGE JOIN thực sự nối các hàng trong bảng.

Tóm tắt

  • Độ phức tạp:O (N + M)
  • Cả hai đầu vào phải được sắp xếp trên khóa tham gia
  • Một toán tử bình đẳng được sử dụng
  • Tuyệt vời cho các bảng lớn

Tham gia băm

Hash Join rất thích hợp cho các bảng lớn mà không có chỉ mục có thể sử dụng được. Ở bước đầu tiên - giai đoạn xây dựng thuật toán tạo chỉ mục băm trong bộ nhớ ở đầu vào bên trái. Bước thứ hai được gọi là giai đoạn thăm dò . Thuật toán đi qua đầu vào bên phải và tìm các kết quả phù hợp bằng cách sử dụng chỉ mục được tạo trong giai đoạn xây dựng. Nếu nói đúng sự thật, đó không phải là một dấu hiệu tốt khi trình tối ưu hóa chọn loại thuật toán THAM GIA này.

Có hai khái niệm quan trọng làm cơ sở cho loại JOIN này:Hàm băm và Bảng băm.

Một hàm băm là bất kỳ hàm nào có thể được sử dụng để ánh xạ dữ liệu có kích thước thay đổi thành dữ liệu có kích thước cố định.

Một bảng băm là một cấu trúc dữ liệu được sử dụng để triển khai một mảng kết hợp, một cấu trúc có thể ánh xạ các khóa thành các giá trị. Bảng băm sử dụng hàm băm để tính chỉ mục thành một mảng nhóm hoặc vị trí, từ đó có thể tìm thấy giá trị mong muốn.

Dựa trên số liệu thống kê có sẵn, SQL Server chọn đầu vào nhỏ nhất làm đầu vào xây dựng và sử dụng nó để xây dựng bảng băm trong bộ nhớ. Nếu không có đủ bộ nhớ, SQL Server sử dụng không gian đĩa vật lý trong TempDB. Khi bảng băm được tạo, SQL Server lấy dữ liệu từ đầu vào thăm dò (bảng lớn hơn) và so sánh nó với bảng băm bằng cách sử dụng hàm đối sánh băm. Kết quả là nó trả về các hàng phù hợp.

Nếu chúng ta xem xét kế hoạch thực thi, phần tử trên cùng bên phải là đầu vào bản dựng và phần tử dưới cùng bên phải là đầu vào của đầu dò . Trong trường hợp cả hai đầu vào đều cực kỳ lớn, thì chi phí sẽ quá cao.

Để ước tính độ phức tạp, hãy giả sử như sau:

h c - độ phức tạp của việc tạo bảng băm

h m - độ phức tạp của hàm đối sánh băm

N - bảng nhỏ hơn

M - bảng lớn hơn

J - bổ sung độ phức tạp để tính toán động và tạo hàm băm

Độ phức tạp sẽ là: O (N * h c + M * h m + J)

Trình tối ưu hóa sử dụng thống kê để xác định bản số giá trị. Sau đó, nó tự động tạo ra một hàm băm chia dữ liệu thành nhiều nhóm với kích thước bằng nhau. Thường rất khó để ước tính độ phức tạp của quá trình tạo bảng băm, cũng như độ phức tạp của mỗi trận đấu băm do tính chất động. Kế hoạch thực thi thậm chí có thể hiển thị các ước tính không chính xác vì trình tối ưu hóa thực hiện tất cả các hoạt động động này trong thời gian thực thi. Trong một số trường hợp, kế hoạch thực thi có thể cho thấy rằng Nested Loop đắt hơn Hash Join, nhưng trên thực tế, Hash Join thực thi chậm hơn do ước tính chi phí không chính xác.

Tóm tắt

  • Độ phức tạp:O (N * h c + M * h m + J)
  • Loại tham gia cuối cùng
  • Sử dụng bảng băm và hàm đối sánh băm động để khớp các hàng

Sản phẩm hữu ích:

SQL Complete - viết, làm đẹp, cấu trúc lại mã của bạn một cách dễ dàng và tăng năng suất của bạn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi ‘smalldatetime’ thành ‘datetime’ trong SQL Server (Ví dụ T-SQL)

  2. Thay đổi các loại cột trong một bảng lớn

  3. Cách xem lịch sử truy vấn trong SQL Server Management Studio

  4. Làm cách nào để bạn chuyển hoặc xuất dữ liệu SQL Server 2005 sang Excel

  5. Xóa cấu hình thư cơ sở dữ liệu (SSMS)