Hướng dẫn what are the supported types of joins in mysql? - các loại tham gia được hỗ trợ trong mysql là gì?


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":

OrderIDID khách hàngNgày đặ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":

ID khách hàngNgày đặt hàng1996-09-181996-09-19
1 1996-09-20Sau đó, 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ạcQuốc giaAlfreds Futterkiste
3 Maria Andersnước ĐứcAlfreds 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

OrderIDNgày đặt hàngNgày đặt hàng
10308 Tên Liên lạcQuốc gia
10365 Maria Andersnước Đức
10383 Ana Trujillo Emparedados Y HeladosAna Trujillo
10355 Ana Trujillo Emparedados Y HeladosAna Trujillo
10278 MexicoAntonio 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
    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), chọn các bản ghi có giá trị phù hợp trong cả hai bảng:
  • 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;

Hướng dẫn what are the supported types of joins in mysql? - các loại tham gia được hỗ trợ trong mysql là gì?
Hãy tự mình thử »
Hướng dẫn what are the supported types of joins in mysql? - các loại tham gia được hỗ trợ trong mysql là gì?
 
Hướng dẫn what are the supported types of joins in mysql? - các loại tham gia được hỗ trợ trong mysql là gì?
 
Hướng dẫn what are the supported types of joins in mysql? - các loại tham gia được hỗ trợ trong mysql là gì?




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

    SELECT * FROM (SELECT 1, 2, 3) AS t1;
    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 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 đề

    SELECT left_tbl.*
      FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
      WHERE right_tbl.id IS NULL;
    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 * 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 và
    SELECT left_tbl.*
      FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
      WHERE right_tbl.id IS NULL;
    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) .

    Tuy nhiên, mức độ ưu tiên của toán tử dấu phẩy ít hơn so với

    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,
    SELECT left_tbl.*
      FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
      WHERE right_tbl.id IS NULL;
    6,
    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, 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ẫu
    SELECT left_tbl.*
      FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
      WHERE right_tbl.id IS NULL;
    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ới
    SELECT * FROM (SELECT 1, 2, 3) AS t1;
    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 đề
    a LEFT JOIN b USING (c1, c2, c3)
    1. Nói chung, mệnh đề
    SELECT * FROM (SELECT 1, 2, 3) AS t1;
    4 phục vụ cho các điều kiện chỉ định cách tham gia các bảng và mệnh đề
    a LEFT JOIN b USING (c1, c2, c3)
    1 hạn chế các hàng nào sẽ đưa vào tập hợp kết quả.

  • Nếu không có hàng phù hợp cho bảng phù hợp trong phần

    SELECT * FROM (SELECT 1, 2, 3) AS t1;
    4 hoặc
    a LEFT JOIN b USING (c1, c2, c3)
    5 trong
    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, một hàng với tất cả các cột được đặt thành
    a LEFT JOIN b USING (c1, c2, c3)
    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:

    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

    a LEFT JOIN b USING (c1, c2, c3)
    8 với giá trị
    a LEFT JOIN b USING (c1, c2, c3)
    9 không có trong
    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;
    0 (nghĩa là tất cả các hàng trong
    a LEFT JOIN b USING (c1, c2, c3)
    8 không có hàng tương ứng trong
    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;
    0). Xem Phần & NBSP; 8.2.1.9, Tối ưu hóa tham gia bên ngoài.

  • Điều khoản

    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;
    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ả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;
    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ột
    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;
    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:

    a LEFT JOIN b USING (c1, c2, c3)
  • 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;
    9 của hai bảng được xác định là tương đương về mặt ngữ nghĩa với
    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;
    0 hoặc
    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 với mệnh đề
    a LEFT JOIN b USING (c1, c2, c3)
    5 đặt tên cho tất cả các cột tồn tại 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)
    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ụng
    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;
    5 thay 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)
    9.

  • 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;
    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 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

    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;
    8, chẳng hạn 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)
    7 hoặ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);
    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ư
    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, 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.

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

    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);
    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);

    Trong 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 đầu tiên, cột
    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);
    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ột
    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);
    6 được đặt tên trong mệnh đề
    a LEFT JOIN b USING (c1, c2, c3)
    5 và chỉ xuất hiện một lần trong đầu ra, không phải hai lần.

    Do đó, các câu lệnh tạo ra đầu ra 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)
    0

    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

    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);
    9 và
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    00 Cột nối đơn kết quả
    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;
    4 được định nghĩa là
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    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)
    1

    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à

    a LEFT JOIN b USING (c1, c2, c3)
    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ủa
    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. Giả sử rằng các bảng
    SELECT * FROM t1 LEFT JOIN (t2, t3, 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)
    2

    Sau đó, đối với tham gia này, cột

    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;
    4 chứa các giá trị của
    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);
    9:

    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    3

    Ngược lại, đối với tham gia này, cột

    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;
    4 chứa các giá trị của
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    00.

    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    4

    So sánh các kết quả đó với các truy vấn tương đương khác với

    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    13:

    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    5
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    6
  • Một mệnh đề

    a LEFT JOIN b USING (c1, c2, c3)
    5 có thể được viết lại dưới dạng mệnh đề
    SELECT * FROM (SELECT 1, 2, 3) AS t1;
    4 so sánh các cột tương ứng. Tuy nhiên, mặc dù
    a LEFT JOIN b USING (c1, c2, c3)
    5 và
    SELECT * FROM (SELECT 1, 2, 3) AS t1;
    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 t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    7

    Đố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

    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    18, hai lần tham gia không giống nhau về mặt ngữ nghĩa. Tham gia
    a LEFT JOIN b USING (c1, c2, c3)
    5 chọn giá trị kết hợp của các cột tương ứng, trong khi
    SELECT * FROM (SELECT 1, 2, 3) AS t1;
    4 tham gia chọn tất cả các cột từ tất cả các bảng. Đối với tham gia
    a LEFT JOIN b USING (c1, c2, c3)
    5,
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    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)
    8

    Đối với tham gia

    SELECT * FROM (SELECT 1, 2, 3) AS t1;
    4,
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    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)
    9

    Với tham gia bên trong,

    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    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ặc
    SELECT * 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 CROSS JOIN t3 CROSS JOIN 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à
    a LEFT JOIN b USING (c1, c2, c3)
    7. Cột đó bị bỏ qua từ kết quả.

  • Một mệnh đề

    SELECT * FROM (SELECT 1, 2, 3) AS t1;
    4 chỉ có thể đề cập đến các toán hạng của nó.

    Thí dụ:

    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)
    0

    Câu lệnh không thành công với lỗi

    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    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 trong
    SELECT * 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 (SELECT 1, 2, 3) AS t1;
    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 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)
    1
  • 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ó ưu tiên cao hơn nhà điều hành dấu phẩy (
    SELECT left_tbl.*
      FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
      WHERE right_tbl.id IS NULL;
    4), do đó biểu thức tham gia
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    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 (SELECT 1, 2, 3) AS t1;
    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ì.

    Thí dụ:

    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)
    2

    Câu lệnh không thành công với lỗi

    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    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 trong
    SELECT * 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 (SELECT 1, 2, 3) AS t1;
    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 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 left_tbl.*
      FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
      WHERE right_tbl.id IS NULL;
    4), do đó biểu thức tham gia
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    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 (SELECT 1, 2, 3) AS t1;
    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 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 hơn nhà điều hành dấu phẩy, do đó, các toán hạng cho mệnh đề
      SELECT * FROM (SELECT 1, 2, 3) AS t1;
      4 là
      SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                       ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
      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ỗi
      SELECT * 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 CROSS JOIN t3 CROSS JOIN t4)
                       ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
      3
    • Để 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:

      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

    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 đề

    SELECT * FROM (SELECT 1, 2, 3) AS t1;
    4 là
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    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:

  • Tránh sử dụng toán tử dấu phẩy và sử dụ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)
    5 thay thế:


4 loại tham gia trong SQL là gì?

Bốn loại nối: trái, phải, bên trong và bên ngoài.left, right, inner, and outer.

Có bao nhiêu loại tham gia được hỗ trợ trong cơ sở dữ liệu?

Có bốn loại tham gia chính trong sql: tham gia bên trong, tham gia bên ngoài, tham gia chéo và tự tham gia.four main types of JOINs in SQL: INNER JOIN, OUTER JOIN, CROSS JOIN, and SELF JOIN.

5 loại bảng khác nhau tham gia là gì?

Như đã biết, có năm loại hoạt động tham gia: bên trong, trái, phải, đầy đủ và tham gia chéo.Inner, Left, Right, Full and Cross joins.

Các loại tham gia là gì?

Các loại tham gia..
Tham gia chéo.Một tham gia chéo trả về tất cả các kết hợp có thể của các hàng của hai bảng (còn được gọi là sản phẩm Cartesian) ..
Tham gia/Tham gia bên trong.Một tham gia bên trong, còn được gọi là một tham gia đơn giản, trả về các hàng từ các bảng được nối có các hàng phù hợp.....
Bên trái tham gia/tham gia bên trái ..
Tham gia bên ngoài bên phải/tham gia bên phải ..
Tham gia đầy đủ bên ngoài ..