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

Giới thiệu về SQL Joins

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) 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, EmployeesAddress , 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 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à đặt B với các phần tử {1,2,3} . Sản phẩm Descartes của AB đượ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_1Table_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 EmployeesAddress 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 EmployeesAddress 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 EmployeesAddress 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 EmployeesAddress 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 EmployeesAddress 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ới NULL 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.


  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ỗi 1064 trong TẠO BẢNG ... TYPE =MYISAM

  2. Neo4j - Tạo chỉ mục bằng Cypher

  3. Ví dụ về MAKETIME () - MySQL

  4. Hướng dẫn SQL về khóa chính - Cách xác định khóa chính trong cơ sở dữ liệu

  5. Nhập từ và xuất sang tệp bằng dòng lệnh MySQL