MySQL tham gia bảng
Một mệnh đề
SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4]
ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
5 được sử dụng để kết hợp các hàng từ hai hoặc nhiều bảng, dựa trên một cột liên quan giữa chúng.Hãy xem xét một lựa chọn từ bảng "Đơn đặt hàng":
10308 | 2 | 1996-09-18 |
10309 | 37 | 1996-09-19 |
10310 | 77 | 1996-09-20 |
Sau đó, nhìn vào một lựa chọn từ bảng "Khách hàng":
1 | 1996-09-20 | Sau đó, nhìn vào một lựa chọn từ bảng "Khách hàng": | Tên khách hàng |
2 | Tên Liên lạc | Quốc gia | Alfreds Futterkiste |
3 | Maria Anders | nước Đức | Alfreds Futterkiste |
Maria Anders
nước Đức
Ana Trujillo Emparedados Y Helados
Ana Trujillo
FROM Orders
INNER JOIN Customers ON
Orders.CustomerID=Customers.CustomerID;
Mexico
Antonio Moreno Taquería
10308 | Tên Liên lạc | Quốc gia |
10365 | Maria Anders | nước Đức |
10383 | Ana Trujillo Emparedados Y Helados | Ana Trujillo |
10355 | Ana Trujillo Emparedados Y Helados | Ana Trujillo |
10278 | Mexico | Antonio Moreno Taquería |
Antonio Moreno
- Lưu ý rằng cột "customerID" trong bảng "Đơn hàng" đề cập đến "Ứng dụng khách hàng" trong bảng "Khách hàng". Mối quan hệ giữa hai bảng trên là cột "customerID".
- Sau đó, chúng ta có thể tạo câu lệnh SQL sau [có chứa
6], chọn các bản ghi có giá trị phù hợp trong cả hai bảng:SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
- Thí dụ
- Chọn Order.OrderID, Khách hàng.CustomerName, Order.OrderDateFrom OrderInner Tham gia khách hàng theo đơn đặt hàng.CustomerId = customer.CustomerID;
Tham gia bên ngoài bên phải/tham gia bên phải ..
Tham gia đầy đủ bên ngoài ..
table_references:
escaped_table_reference [, escaped_table_reference] ...
escaped_table_reference: {
table_reference
| { OJ table_reference }
}
table_reference: {
table_factor
| joined_table
}
table_factor: {
tbl_name [PARTITION [partition_names]]
[[AS] alias] [index_hint_list]
| [LATERAL] table_subquery [AS] alias [[col_list]]
| [ table_references ]
}
joined_table: {
table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
| table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
| table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
}
join_specification: {
ON search_condition
| USING [join_column_list]
}
join_column_list:
column_name [, column_name] ...
index_hint_list:
index_hint [, index_hint] ...
index_hint: {
USE {INDEX|KEY}
[FOR {JOIN|ORDER BY|GROUP BY}] [[index_list]]
| {IGNORE|FORCE} {INDEX|KEY}
[FOR {JOIN|ORDER BY|GROUP BY}] [index_list]
}
index_list:
index_name [, index_name] ...
13.2.11.2 & nbsp; tham gia mệnh đề
MySQL hỗ trợ cú pháp
SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4]
ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
5 sau đây cho phần SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
SELECT t1.name, t2.salary
FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
2 của các câu lệnh SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
SELECT t1.name, t2.salary
FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
3 và các câu lệnh SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
SELECT t1.name, t2.salary
FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
4 và SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
SELECT t1.name, t2.salary
FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
5:Một tham chiếu bảng còn được gọi là một biểu thức tham gia.
Một tham chiếu bảng [khi nó đề cập đến một bảng được phân vùng] có thể chứa một mệnh đề
SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
SELECT t1.name, t2.salary
FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
6, bao gồm danh sách các phân vùng được phân tách bằng dấu phẩy, các phần phụ hoặc cả hai. Tùy chọn này theo tên của bảng và đi trước mọi khai báo bí danh. Hiệu quả của tùy chọn này là các hàng chỉ được chọn từ các phân vùng được liệt kê hoặc các phần phụ. Bất kỳ phân vùng hoặc phân vùng nào không được đặt tên trong danh sách đều bị bỏ qua. Để biết thêm thông tin và ví dụ, xem Phần & NBSP; 24.5, Lựa chọn phân vùng.SELECT * FROM t1 LEFT JOIN [t2, t3, t4]
ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Cú pháp của
SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
SELECT t1.name, t2.salary
FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
7 được mở rộng trong MySQL so với SQL tiêu chuẩn. Tiêu chuẩn chỉ chấp nhận SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
SELECT t1.name, t2.salary
FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
8, không phải là danh sách chúng bên trong một cặp dấu ngoặc đơn.SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4]
ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Đây là một phần mở rộng bảo thủ nếu mỗi dấu phẩy trong danh sách các mục
SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
SELECT t1.name, t2.salary
FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
8 được coi là tương đương với một lần nối bên trong. Ví dụ:tương đương với:
Trong MySQL,
SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4]
ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
5, SELECT * FROM [SELECT 1, 2, 3] AS t1;
1 và SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4]
ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
7 là tương đương cú pháp [chúng có thể thay thế lẫn nhau]. Trong SQL tiêu chuẩn, chúng không tương đương. SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4]
ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
7 được sử dụng với mệnh đề SELECT * FROM [SELECT 1, 2, 3] AS t1;
4, SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
SELECT t1.name, t2.salary
FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
0 được sử dụng khác.Nói chung, dấu ngoặc đơn có thể bị bỏ qua trong các biểu thức tham gia chỉ chứa các hoạt động tham gia bên trong. MySQL cũng hỗ trợ tham gia lồng nhau. Xem Phần & NBSP; 8.2.1.8, Tối ưu hóa tham gia.
Gợi ý chỉ mục có thể được chỉ định để ảnh hưởng đến cách trình tối ưu hóa MySQL sử dụng các chỉ mục. Để biết thêm thông tin, xem Phần & NBSP; 8.9.4, Gợi ý Chỉ số. Gợi ý của trình tối ưu hóa và biến hệ thống
6 là những cách khác để ảnh hưởng đến việc sử dụng các chỉ mục tối ưu hóa. Xem Phần & NBSP; 8.9.3, Gợi ý của Trình tối ưu hóa, và Phần & NBSP; 8.9.2, Tối ưu hóa chuyển đổi có thể chuyển đổi.SELECT * FROM [SELECT 1, 2, 3] AS t1;
SELECT t1.name, t2.salary FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name; SELECT t1.name, t2.salary FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
Danh sách sau đây mô tả các yếu tố chung cần tính đến khi viết tham gia:must include an alias to give the subquery result a table name, and may optionally include a list of table column names in parentheses. A trivial example follows:
SELECT * FROM [SELECT 1, 2, 3] AS t1;
Số lượng bảng tối đa có thể được tham chiếu trong một lần tham gia là 61. Điều này bao gồm một lần tham gia được xử lý bằng cách hợp nhất các bảng và chế độ xem trong mệnh đề
1 vào khối truy vấn bên ngoài [xem Phần & NBSP; 8.2.2.2 Tài liệu tham khảo và biểu thức bảng phổ biến với sự hợp nhất hoặc vật chất hóa].SELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
7 vàSELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
4 [dấu phẩy] tương đương về mặt ngữ nghĩa trong trường hợp không có điều kiện tham gia: cả hai sản xuất một sản phẩm Cartesian giữa các bảng được chỉ định [nghĩa là mỗi và mỗi hàng trong bảng đầu tiên được nối với từng hàng trong bảng thứ hai] .SELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
Tuy nhiên, mức độ ưu tiên của toán tử dấu phẩy ít hơn so với
7,SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
6,SELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
8, v.v. Nếu bạn kết hợp dấu phẩy tham gia với các loại tham gia khác khi có điều kiện tham gia, có thể xảy ra lỗi của mẫuSELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
8 'trong mệnh đề' trên mệnh đề '. Thông tin về xử lý vấn đề này được đưa ra sau trong phần này.SELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
9 được sử dụng vớiSELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
4 là bất kỳ biểu thức có điều kiện nào của hình thức có thể được sử dụng trong mệnh đềSELECT * FROM [SELECT 1, 2, 3] AS t1;
1. Nói chung, mệnh đềa LEFT JOIN b USING [c1, c2, c3]
4 phục vụ cho các điều kiện chỉ định cách tham gia các bảng và mệnh đềSELECT * FROM [SELECT 1, 2, 3] AS t1;
1 hạn chế các hàng nào sẽ đưa vào tập hợp kết quả.a LEFT JOIN b USING [c1, c2, c3]
Nếu không có hàng phù hợp cho bảng phù hợp trong phần
4 hoặcSELECT * FROM [SELECT 1, 2, 3] AS t1;
5 tronga LEFT JOIN b USING [c1, c2, c3]
8, một hàng với tất cả các cột được đặt thànhSELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
7 được sử dụng cho bảng bên phải. Bạn có thể sử dụng thực tế này để tìm các hàng trong một bảng không có đối tác trong một bảng khác:a LEFT JOIN b USING [c1, c2, c3]
SELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
Ví dụ này tìm thấy tất cả các hàng trong
8 với giá trịa LEFT JOIN b USING [c1, c2, c3]
9 không có tronga LEFT JOIN b USING [c1, c2, c3]
0 [nghĩa là tất cả các hàng trongSELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
8 không có hàng tương ứng tronga LEFT JOIN b USING [c1, c2, c3]
0]. Xem Phần & NBSP; 8.2.1.9, Tối ưu hóa tham gia bên ngoài.SELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
Điều khoản
3] đặt tên cho một danh sách các cột phải tồn tại trong cả hai bảng. Nếu các bảngSELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
4 vàSELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
5, cả hai đều chứa các cộtSELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
6,SELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
7 vàSELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
8, các tham gia sau đây sẽ so sánh các cột tương ứng với hai bảng:SELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
a LEFT JOIN b USING [c1, c2, c3]
9 của hai bảng được xác định là tương đương về mặt ngữ nghĩa vớiSELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
0 hoặcSELECT * FROM table1, table2; SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id; SELECT * FROM table1 LEFT JOIN table2 USING [id]; SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id LEFT JOIN table3 ON table2.id = table3.id;
8 với mệnh đềSELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
5 đặt tên cho tất cả các cột tồn tại trong cả hai bảng.a LEFT JOIN b USING [c1, c2, c3]
9 hoạt động tương tự nhưSELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
8. Để giữ mã di động trên cơ sở dữ liệu, bạn nên sử dụngSELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
5 thay vìSELECT * FROM table1, table2; SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id; SELECT * FROM table1 LEFT JOIN table2 USING [id]; SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id LEFT JOIN table3 ON table2.id = table3.id;
9.SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Cú pháp
7 được hiển thị trong mô tả cú pháp tham gia chỉ tồn tại để tương thích với ODBC. Các niềng răng xoăn trong cú pháp nên được viết theo nghĩa đen; Chúng không phải là metasyntax như được sử dụng ở nơi khác trong các mô tả cú pháp.SELECT * FROM table1, table2; SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id; SELECT * FROM table1 LEFT JOIN table2 USING [id]; SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id LEFT JOIN table3 ON table2.id = table3.id;
SELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
Bạn có thể sử dụng các loại nối khác trong
8, chẳng hạn nhưSELECT * FROM table1, table2; SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id; SELECT * FROM table1 LEFT JOIN table2 USING [id]; SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id LEFT JOIN table3 ON table2.id = table3.id;
7 hoặcSELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
0. Điều này giúp tương thích với một số ứng dụng của bên thứ ba, nhưng không phải là cú pháp ODBC chính thức.CREATE TABLE t1 [i INT, j INT]; CREATE TABLE t2 [k INT, j INT]; INSERT INTO t1 VALUES[1, 1]; INSERT INTO t2 VALUES[1, 1]; SELECT * FROM t1 NATURAL JOIN t2; SELECT * FROM t1 JOIN t2 USING [j];
1 tương tự nhưCREATE TABLE t1 [i INT, j INT]; CREATE TABLE t2 [k INT, j INT]; INSERT INTO t1 VALUES[1, 1]; INSERT INTO t2 VALUES[1, 1]; SELECT * FROM t1 NATURAL JOIN t2; SELECT * FROM t1 JOIN t2 USING [j];
5, ngoại trừ bảng bên trái luôn được đọc trước bảng bên phải. Điều này có thể được sử dụng cho những trường hợp [một vài] trường hợp mà trình tối ưu hóa tham gia xử lý các bảng theo thứ tự dưới mức tối ưu.SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Một số ví dụ tham gia:
SELECT * FROM table1, table2;
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;
SELECT * FROM table1 LEFT JOIN table2 USING [id];
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
LEFT JOIN table3 ON table2.id = table3.id;
Các kết nối tự nhiên và tham gia với
a LEFT JOIN b USING [c1, c2, c3]
5, bao gồm các biến thể tham gia bên ngoài, được xử lý theo tiêu chuẩn SQL: 2003:Các cột dự phòng của một
4 Tham gia không xuất hiện. Hãy xem xét tập hợp các tuyên bố này:CREATE TABLE t1 [i INT, j INT]; CREATE TABLE t2 [k INT, j INT]; INSERT INTO t1 VALUES[1, 1]; INSERT INTO t2 VALUES[1, 1]; SELECT * FROM t1 NATURAL JOIN t2; SELECT * FROM t1 JOIN t2 USING [j];
CREATE TABLE t1 [i INT, j INT]; CREATE TABLE t2 [k INT, j INT]; INSERT INTO t1 VALUES[1, 1]; INSERT INTO t2 VALUES[1, 1]; SELECT * FROM t1 NATURAL JOIN t2; SELECT * FROM t1 JOIN t2 USING [j];
Trong câu lệnh
3 đầu tiên, cộtSELECT t1.name, t2.salary FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name; SELECT t1.name, t2.salary FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
6 xuất hiện trong cả hai bảng và do đó trở thành cột nối, do đó, theo SQL tiêu chuẩn, nó chỉ xuất hiện một lần trong đầu ra, không hai lần. Tương tự, trong câu lệnh SELECT thứ hai, cộtCREATE TABLE t1 [i INT, j INT]; CREATE TABLE t2 [k INT, j INT]; INSERT INTO t1 VALUES[1, 1]; INSERT INTO t2 VALUES[1, 1]; SELECT * FROM t1 NATURAL JOIN t2; SELECT * FROM t1 JOIN t2 USING [j];
6 được đặt tên trong mệnh đềCREATE TABLE t1 [i INT, j INT]; CREATE TABLE t2 [k INT, j INT]; INSERT INTO t1 VALUES[1, 1]; INSERT INTO t2 VALUES[1, 1]; SELECT * FROM t1 NATURAL JOIN t2; SELECT * FROM t1 JOIN t2 USING [j];
5 và chỉ xuất hiện một lần trong đầu ra, không phải hai lần.a LEFT JOIN b USING [c1, c2, c3]
Do đó, các câu lệnh tạo ra đầu ra này:
0SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Việc loại bỏ cột dự phòng và thứ tự cột xảy ra theo SQL tiêu chuẩn, tạo ra thứ tự hiển thị này:
Đầu tiên, kết hợp các cột chung của hai bảng được nối, theo thứ tự chúng xảy ra trong bảng đầu tiên
Thứ hai, các cột duy nhất cho bảng đầu tiên, theo thứ tự chúng xảy ra trong bảng đó
Thứ ba, các cột duy nhất cho bảng thứ hai, theo thứ tự chúng xảy ra trong bảng đó
Cột kết quả duy nhất thay thế hai cột phổ biến được xác định bằng cách sử dụng hoạt động hợp tác. Đó là, trong hai
9 vàCREATE TABLE t1 [i INT, j INT]; CREATE TABLE t2 [k INT, j INT]; INSERT INTO t1 VALUES[1, 1]; INSERT INTO t2 VALUES[1, 1]; SELECT * FROM t1 NATURAL JOIN t2; SELECT * FROM t1 JOIN t2 USING [j];
00 Cột nối đơn kết quảSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
4 được định nghĩa làSELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
02, trong đó:SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
1SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Nếu thao tác tham gia là bất kỳ tham gia nào khác, các cột kết quả của nối bao gồm sự kết hợp của tất cả các cột của các bảng được nối.
Hậu quả của định nghĩa của các cột kết hợp là, đối với các kết nối bên ngoài, cột kết hợp chứa giá trị của cột không phải -____ ____ 67 nếu một trong hai cột luôn luôn là
7. Nếu cả hai cột làa LEFT JOIN b USING [c1, c2, c3]
7, cả hai cột phổ biến đều có cùng giá trị, do đó, không quan trọng là giá trị nào là giá trị của cột kết hợp. Một cách đơn giản để giải thích điều này là xem xét rằng một cột kết hợp của một lần nối bên ngoài được biểu thị bằng cột chung của bảng bên trong củaa LEFT JOIN b USING [c1, c2, c3]
5. Giả sử rằng các bảngSELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
07 vàSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
08 có nội dung sau:SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
2SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Sau đó, đối với tham gia này, cột
4 chứa các giá trị củaSELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
9:CREATE TABLE t1 [i INT, j INT]; CREATE TABLE t2 [k INT, j INT]; INSERT INTO t1 VALUES[1, 1]; INSERT INTO t2 VALUES[1, 1]; SELECT * FROM t1 NATURAL JOIN t2; SELECT * FROM t1 JOIN t2 USING [j];
3SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Ngược lại, đối với tham gia này, cột
4 chứa các giá trị củaSELECT left_tbl.* FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id } WHERE right_tbl.id IS NULL;
00.SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
4SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
So sánh các kết quả đó với các truy vấn tương đương khác với
13:SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
5SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
6SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Một mệnh đề
5 có thể được viết lại dưới dạng mệnh đềa LEFT JOIN b USING [c1, c2, c3]
4 so sánh các cột tương ứng. Tuy nhiên, mặc dùSELECT * FROM [SELECT 1, 2, 3] AS t1;
5 vàa LEFT JOIN b USING [c1, c2, c3]
4 là tương tự nhau, nhưng chúng không hoàn toàn giống nhau. Hãy xem xét hai truy vấn sau:SELECT * FROM [SELECT 1, 2, 3] AS t1;
7SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Đối với việc xác định các hàng nào thỏa mãn điều kiện tham gia, cả hai tham gia đều giống hệt nhau về mặt ngữ nghĩa.
Liên quan đến việc xác định cột nào sẽ hiển thị để mở rộng
18, hai lần tham gia không giống nhau về mặt ngữ nghĩa. Tham giaSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
5 chọn giá trị kết hợp của các cột tương ứng, trong khia LEFT JOIN b USING [c1, c2, c3]
4 tham gia chọn tất cả các cột từ tất cả các bảng. Đối với tham giaSELECT * FROM [SELECT 1, 2, 3] AS t1;
5,a LEFT JOIN b USING [c1, c2, c3]
18 chọn các giá trị này:SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
8SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Đối với tham gia
4,SELECT * FROM [SELECT 1, 2, 3] AS t1;
24 chọn các giá trị này:SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
9SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Với tham gia bên trong,
25 giống nhưSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
26 hoặcSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
27 vì cả hai cột đều có cùng một giá trị. Với một tham gia bên ngoài [chẳng hạn nhưSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
8], một trong hai cột có thể làSELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
7. Cột đó bị bỏ qua từ kết quả.a LEFT JOIN b USING [c1, c2, c3]
Một mệnh đề
4 chỉ có thể đề cập đến các toán hạng của nó.SELECT * FROM [SELECT 1, 2, 3] AS t1;
Thí dụ:
0SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Câu lệnh không thành công với lỗi
31 vìSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
32 là một cột trongSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
33, đây không phải là toán hạng của mệnh đềSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
4. Để cho phép kết nối được xử lý, hãy viết lại câu lệnh như sau:SELECT * FROM [SELECT 1, 2, 3] AS t1;
1SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
5 có ưu tiên cao hơn nhà điều hành dấu phẩy [SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
4], do đó biểu thức tham giaSELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
37 được hiểu làSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
38, không phải làSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
39. Điều này ảnh hưởng đến các câu lệnh sử dụng mệnh đềSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
4 vì điều khoản đó chỉ có thể đề cập đến các cột trong các toán hạng của tham gia và mức độ ưu tiên ảnh hưởng đến việc giải thích các toán hạng đó là gì.SELECT * FROM [SELECT 1, 2, 3] AS t1;
Thí dụ:
2SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Câu lệnh không thành công với lỗi
31 vìSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
32 là một cột trongSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
33, đây không phải là toán hạng của mệnh đềSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
4. Để cho phép kết nối được xử lý, hãy viết lại câu lệnh như sau:SELECT * FROM [SELECT 1, 2, 3] AS t1;
5 có ưu tiên cao hơn nhà điều hành dấu phẩy [SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
4], do đó biểu thức tham giaSELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
37 được hiểu làSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
38, không phải làSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
39. Điều này ảnh hưởng đến các câu lệnh sử dụng mệnh đềSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
4 vì điều khoản đó chỉ có thể đề cập đến các cột trong các toán hạng của tham gia và mức độ ưu tiên ảnh hưởng đến việc giải thích các toán hạng đó là gì.SELECT * FROM [SELECT 1, 2, 3] AS t1;
5 được ưu tiên hơn nhà điều hành dấu phẩy, do đó, các toán hạng cho mệnh đềSELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
4 làSELECT * FROM [SELECT 1, 2, 3] AS t1;
43 vàSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
33. VìSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
45 không phải là một cột trong một trong hai toán hạng, kết quả là lỗiSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
46.SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
3SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Để cho phép kết nối được xử lý, hãy sử dụng một trong những chiến lược này:
4SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Nhóm hai bảng đầu tiên một cách rõ ràng với dấu ngoặc đơn để các toán hạng cho mệnh đề
4 làSELECT * FROM [SELECT 1, 2, 3] AS t1;
48 vàSELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
33:SELECT * FROM t1 LEFT JOIN [t2, t3, t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]
Tránh sử dụng toán tử dấu phẩy và sử dụng
5 thay thế:SELECT * FROM t1 LEFT JOIN [t2 CROSS JOIN t3 CROSS JOIN t4] ON [t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c]