Hướng dẫn how do i join two tables if there is no common column in mysql? - làm cách nào để tham gia hai bảng nếu không có cột chung trong mysql?

Vâng, bạn có thể! Câu trả lời dài hơn là có, có một vài cách để kết hợp hai bảng mà không có cột chung, bao gồm tham gia chéo (sản phẩm Cartesian) và Union. Cái sau về mặt kỹ thuật không phải là một sự tham gia nhưng có thể tiện dụng để hợp nhất các bảng trong SQL. Trong bài viết này, tôi sẽ hướng dẫn bạn thông qua các giải pháp khác nhau với các ví dụ.

Khi nào bạn cần tham gia các bảng mà không có cột chung?

Người mới bắt đầu mới bắt đầu với SQL thường được giới thiệu để tham gia Equi Standard, trong đó hai bảng được kết hợp bởi một cột chung. Tuy nhiên, các nhiệm vụ trong thế giới thực của một nhà phân tích dữ liệu thường đa dạng và phức tạp hơn.

Ví dụ, có nhiều trường hợp sử dụng cho tham gia không cân bằng, khi hai bảng được kết hợp bằng cách sử dụng các toán tử có điều kiện khác với dấu hiệu bằng nhau. Nếu bạn không quen thuộc với loại tham gia này, hãy xem khóa học tham gia SQL tương tác của chúng tôi. Nó cung cấp hơn 90 bài tập thực hành trên các loại tham gia khác nhau, bao gồm tham gia nhiều hơn hai bảng, tham gia không cân bằng, tự tham gia, LEFT JOIN, FULL JOIN, và nhiều hơn nữa.

Trong các trường hợp khác, bạn có thể muốn có mọi kết hợp của các hàng từ hai bảng. Ví dụ, nếu bạn điều hành một nhà hàng, bạn có thể muốn xem tất cả các kết hợp rượu vang có thể có từ thẻ rượu vang và các khóa học chính từ thực đơn của bạn.

Hoặc, hãy tưởng tượng rằng thông tin về các nhà cung cấp của bạn được lưu trữ trong các bảng khác nhau. Họ thậm chí có thể có tên cột khác nhau theo loại sản phẩm (tức là, rượu vang, nước ép, trái cây, v.v.). Bạn có thể muốn kết hợp tất cả các thông tin để tạo một bảng duy nhất với tất cả các nhà cung cấp.

Trong những trường hợp này, bạn sẽ muốn kết hợp hai hoặc nhiều bảng mà không yêu cầu một cột chung. Có vẻ như nó phải là một bài tập SQL khá đơn giản. Vâng, tất nhiên nó được! Tôi sẽ đề xuất một vài giải pháp trong hướng dẫn này.you would want to combine two or more tables without requiring a common column. It sounds like it should be a pretty straightforward SQL assignment. Well, of course, it is! I’ll suggest a couple of solutions in this guide.

Nhưng trước tiên, hãy để khám phá dữ liệu mà chúng tôi sẽ sử dụng cho các ví dụ của chúng tôi.

Làm quen với dữ liệu

Chúng tôi điều hành một nhà hàng và có dữ liệu liên quan được lưu trữ trong nhiều bảng, trong đó là winemain_course.

Bảng wine chứa ID rượu, tên rượu, ID nhà cung cấp và giá:

TôiTênsupplier_idgiá bán
1 Merlot500 7.95
2 Căn nhà400 2.45
3 Sangiovese600 5.20

Bảng main_course chứa ID khóa học chính, tên, ID nhà cung cấp của nhà cung cấp chính cho món ăn này và giá, cho mỗi món ăn:

main_course

TôiTênmajor_supplier_idgiá bán
1 Merlot200 19.99
2 Căn nhà100 8.99
3 Sangiovese300 11.99
4 Bảng main_course chứa ID khóa học chính, tên, ID nhà cung cấp của nhà cung cấp chính cho món ăn này và giá, cho mỗi món ăn:400 15.99

Salmon Maple thảo quả

Macaroni & pho mát cổ điển

Gà Teriyaki nướngall possible combinations of wines and main courses from our menu. There are at least two approaches to combining the wine and the main_course tables to get the result we need.

Thịt bò thịt phô mai xanh

Hãy để xem cách chúng ta có thể kết hợp các bảng này để có được kết quả chúng ta muốn.

Cách kết hợp hai bảng mà không có cột chung

SELECT w.name AS wine, m.name AS main_course
FROM wine w, main_course m;

Trong ví dụ đầu tiên của chúng tôi, chúng tôi muốn thấy tất cả các kết hợp có thể có của rượu vang và các khóa học chính từ thực đơn của chúng tôi. Có ít nhất hai cách tiếp cận để kết hợp bảng winemain_course để có được kết quả chúng ta cần.Cartesian product (a cross join), whose result set has the total number of rows equal to the number of rows in the first table multiplied by the number of rows in the second table.

Sử dụng từ từ Bảng1, Taber2.main_course
MerlotMerlot
Căn nhàMerlot
SangioveseMerlot
MerlotCăn nhà
Căn nhàCăn nhà
SangioveseCăn nhà
MerlotSangiovese
Căn nhàSangiovese
SangioveseSangiovese
MerlotBảng main_course chứa ID khóa học chính, tên, ID nhà cung cấp của nhà cung cấp chính cho món ăn này và giá, cho mỗi món ăn:
Căn nhàBảng main_course chứa ID khóa học chính, tên, ID nhà cung cấp của nhà cung cấp chính cho món ăn này và giá, cho mỗi món ăn:
SangioveseBảng main_course chứa ID khóa học chính, tên, ID nhà cung cấp của nhà cung cấp chính cho món ăn này và giá, cho mỗi món ăn:

Salmon Maple thảo quả

Macaroni & pho mát cổ điển

Gà Teriyaki nướng

Thịt bò thịt phô mai xanh

Như bạn có thể đã đoán, cách tiếp cận thứ hai để có được tất cả các kết hợp có thể của các hàng từ hai bảng là bằng cách sử dụng toán tử

SELECT w.name AS wine, m.name AS main_course
FROM wine w
CROSS JOIN main_course m;
5:

SELECT w.name AS wine, m.name AS main_course
FROM wine w
CROSS JOIN main_course m;

Truy vấn này đưa ra kết quả chính xác giống như được hiển thị trước đó. Tuy nhiên, cú pháp này thích hợp hơn vì nó nêu rõ ý định thực hiện

SELECT w.name AS wine, m.name AS main_course
FROM wine w
CROSS JOIN main_course m;
5 và dễ đọc hơn đối với người dùng khác của mã SQL của bạn.this syntax is preferable as it clearly states the intent to perform a
SELECT w.name AS wine, m.name AS main_course
FROM wine w
CROSS JOIN main_course m;
5 and is more readable for other users of your SQL code.

Tìm hiểu thêm về Cross Joins trong hướng dẫn minh họa của chúng tôi về SQL Cross tham gia.

Sử dụng Liên minh hoặc Liên minh tất cả

Có các trường hợp sử dụng khác để kết hợp hai bảng mà không có cột chung. Như trong ví dụ đã đề cập trước đó, bạn có thể muốn hợp nhất tất cả các thông tin nhà cung cấp được lưu trữ trong nhiều bảng. Bạn không muốn có một sản phẩm Cartesian trong trường hợp này. Vì vậy, làm thế nào để bạn kết hợp các bảng?

Trong trường hợp này, bạn sử dụng

SELECT w.name AS wine, m.name AS main_course
FROM wine w
CROSS JOIN main_course m;
9 để hợp nhất thông tin từ nhiều bảng. Đây không phải là một sự tham gia; Tuy nhiên, nó có thể rất tiện dụng để kết hợp các hàng từ một số bảng, như trong ví dụ của chúng tôi dưới đây.

Nói một cách đơn giản,

SELECT w.supplier_id
FROM wine w
UNION
SELECT m.major_supplier_id
FROM main_course m
ORDER BY supplier_id;
0 Kết hợp dữ liệu bằng cách nối thêm các cột từ một bảng cùng với các cột từ một bảng khác. Ngược lại,
SELECT w.supplier_id
FROM wine w
UNION
SELECT m.major_supplier_id
FROM main_course m
ORDER BY supplier_id;
1 kết hợp dữ liệu bằng cách nối các hàng dọc theo các hàng từ một bảng khác.

Vì vậy, nếu chúng tôi muốn tạo danh sách kết hợp ID nhà cung cấp từ các bảng winemain_course, chúng tôi có thể sử dụng truy vấn SQL sau:

SELECT w.supplier_id
FROM wine w
UNION
SELECT m.major_supplier_id
FROM main_course m
ORDER BY supplier_id;

Ở đây, trước tiên chúng tôi chọn ID nhà cung cấp từ bảng wine (cột

SELECT w.supplier_id
FROM wine w
UNION
SELECT m.major_supplier_id
FROM main_course m
ORDER BY supplier_id;
5) và từ bảng main_course (cột
SELECT w.supplier_id
FROM wine w
UNION
SELECT m.major_supplier_id
FROM main_course m
ORDER BY supplier_id;
7) riêng biệt. Sau đó, chúng tôi kết hợp các hàng này bằng từ khóa
SELECT w.name AS wine, m.name AS main_course
FROM wine w
CROSS JOIN main_course m;
9. Cuối cùng, chúng tôi sắp xếp kết quả để thuận tiện:

supplier_id
100
200
300
400
500
600

Lưu ý những điều sau khi sử dụng

SELECT w.name AS wine, m.name AS main_course
FROM wine w
CROSS JOIN main_course m;
9 trong SQL:

  • Tất cả các câu lệnh
    SELECT w.supplier_id
    FROM wine w
    UNION ALL
    SELECT m.major_supplier_id
    FROM main_course m
    ORDER BY 1;
    
    0 nên liệt kê cùng một số cột.the same number of columns.
  • Các cột tương ứng phải có cùng loại dữ liệu.the same data type.
  • Các cột tương ứng có thể có các tên khác nhau, như chúng làm trong ví dụ của chúng tôi. Theo mặc định, tên của cột tương ứng trong đầu ra sẽ được lấy từ câu lệnh
    SELECT w.supplier_id
    FROM wine w
    UNION ALL
    SELECT m.major_supplier_id
    FROM main_course m
    ORDER BY 1;
    
    0 đầu tiên. Nếu cần thiết, bạn có thể đặt tên cho các cột kết quả bằng cách sử dụng từ khóa AS. Lưu ý rằng các cột từ các bảng khác nhau phải được đặt tên theo cùng một thứ tự để chúng tương ứng chính xác.can have different names, as they do in our example. By default, the name of the corresponding column in the output will be taken from the first
    SELECT w.supplier_id
    FROM wine w
    UNION ALL
    SELECT m.major_supplier_id
    FROM main_course m
    ORDER BY 1;
    
    0 statement. If necessary, you can set the names for the resulting columns using the AS keyword. Note that the columns from different tables have to be named in the same order for them to correspond correctly.
  • Toán tử

    SELECT w.name AS wine, m.name AS main_course
    FROM wine w
    CROSS JOIN main_course m;
    
    9 loại bỏ các bản sao khỏi tập kết quả. Như bạn có thể nhận thấy,
    SELECT w.supplier_id
    FROM wine w
    UNION
    SELECT m.major_supplier_id
    FROM main_course m
    ORDER BY supplier_id;
    
    5 400 nằm trong cả hai bảng, nhưng nó chỉ xuất hiện một lần trong tập kết quả. Nếu bạn không muốn loại bỏ các bản sao, hãy sử dụng toán tử
    SELECT w.supplier_id
    FROM wine w
    UNION ALL
    SELECT m.major_supplier_id
    FROM main_course m
    ORDER BY 1;
    
    4 thay thế:

    SELECT w.supplier_id
    FROM wine w
    UNION ALL
    SELECT m.major_supplier_id
    FROM main_course m
    ORDER BY 1;
    

Kết quả của truy vấn này sẽ bao gồm

SELECT w.supplier_id
FROM wine w
UNION
SELECT m.major_supplier_id
FROM main_course m
ORDER BY supplier_id;
5 400 hai lần:

supplier_id
100
200
300
400
400
500
600

Nếu cả

SELECT w.name AS wine, m.name AS main_course
FROM wine w
CROSS JOIN main_course m;
5 và
SELECT w.name AS wine, m.name AS main_course
FROM wine w
CROSS JOIN main_course m;
9 đều áp dụng cho trường hợp sử dụng của bạn là kết hợp hai bảng mà không có cột chung, hãy xem bài viết này với các ví dụ về các kết nối không cân bằng. Bạn có thể tìm thấy một số ví dụ có liên quan ở đó.

Thời gian để thực hành tham gia chéo và công đoàn!

Bây giờ bạn biết rất nhiều về việc kết hợp các bảng mà không có cột chung. Bạn sẽ được chuẩn bị cho câu hỏi về cách kết hợp hai bảng mà không cần một cột chung. Đây là một câu hỏi rất phổ biến trong các cuộc phỏng vấn xin việc SQL!

Nếu bạn muốn tìm hiểu thêm về

SELECT w.supplier_id
FROM wine w
UNION
SELECT m.major_supplier_id
FROM main_course m
ORDER BY supplier_id;
0, hãy xem video cơ bản của SQL tham gia từ loạt phim We We Learn SQL của chúng tôi trên YouTube. Ngoài ra, hãy thử Hướng dẫn tìm hiểu về các cách tốt nhất để học các tham gia SQL.

Tuy nhiên, có lẽ bạn đã biết rằng con đường ngắn nhất để trở thành một chuyên gia SQL là thông qua rất nhiều thực hành viết các truy vấn SQL. LearnSQL.com cung cấp một khóa học toàn diện về SQL tham gia với 93 bài tập tương tác. Trong khóa học này, bạn sẽ có cơ hội thực hành tất cả các loại ____20 cơ bản, bao gồm LEFT JOIN0, tự tham gia, không cân bằng và tham gia nhiều bảng.93 interactive exercises. In this course, you’ll have the opportunity to practice all kinds of basic

SELECT w.supplier_id
FROM wine w
UNION
SELECT m.major_supplier_id
FROM main_course m
ORDER BY supplier_id;
0, including LEFT JOIN0, self-joins, non-equi joins, and joins of multiple tables.

Học hỏi!

Chúng ta có thể tham gia 2 bảng không có cột chung không?

Có một vài cách để kết hợp hai bảng mà không có cột chung bao gồm tham gia chéo (sản phẩm Cartesian) và công đoàn. Đây không phải là một sự tham gia nhưng có thể hữu ích cho việc hợp nhất các bảng trong SQL.Cross Join (Cartesian Product) and UNION. This is not a join but can be useful for merging tables in SQL.

Bạn có thể tham gia một bảng không có hồ sơ phù hợp không?

Sự tham gia nối hoặc bên trong hoàn toàn không trả lại bất kỳ hàng không phù hợp nào.Nó chỉ trả về các hàng phù hợp trong cả hai bảng bạn tham gia.Nếu bạn muốn có bất kỳ hàng nào chưa từng có, bạn không nên sử dụng nó.Tham gia bên trái và tham gia bên phải giúp bạn cả hai hàng phù hợp và chưa từng có.. It returns only the rows that match in both of the tables you join. If you want to get any unmatched rows, you shouldn't use it. The LEFT JOIN and the RIGHT JOIN get you both matched and unmatched rows.

Làm thế nào tôi có thể tham gia hai bảng trong MySQL mà không cần tham gia?

Làm thế nào để tham gia các bảng trong SQL mà không cần sử dụng các kết nối..
Sử dụng dấu phẩy giữa các tên bảng trong mệnh đề từ và chỉ định điều kiện tham gia ở đâu ..
Sử dụng tất cả liên minh / liên minh ..

Loại tham gia khi tham gia bảng mà không có mệnh đề ở đâu?

Bất kỳ tham gia mà không có mệnh đề trên là một tham gia chéo.Tham gia bên trái là một tham gia bên ngoài, tạo ra một tập kết quả với tất cả các hàng từ bảng trên "trái" (t1);Các giá trị cho các cột trong bảng khác (T2) phụ thuộc vào việc có tìm thấy một trận đấu hay không.CROSS JOIN. The LEFT JOIN is an outer join, which produces a result set with all rows from the table on the "left" (t1); the values for the columns in the other table (t2) depend on whether or not a match was found.