如何在没有ON条件的情况下使用MySQL JOIN?
在MySQL中, JOIN语句用于合并两个或多个表中的行,但通常需要使用ON条件来指定JOIN的条件。然而,有时候我们需要在没有ON条件的情况下进行JOIN操作。那么,该如何使用MySQL JOIN呢?
阅读更多:MySQL 教程
MySQL JOIN简介
在开始介绍如何在没有ON条件的情况下使用MySQL JOIN之前,我们先简单了解一下MySQL JOIN操作的常用语法。
INNER JOIN
INNER JOIN(内连接)用于只返回两个表中都有匹配行的结果。常用的INNER JOIN写法是:
SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column;
LEFT (OUTER) JOIN
LEFT (OUTER) JOIN (左外侧连接)用于返回左表中的所有行以及与右表中的匹配行。 如果没有匹配行,则返回 NULL 值。常用的LEFT JOIN写法是:
SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column;
RIGHT (OUTER) JOIN
RIGHT (OUTER) JOIN (右外侧连接)用于返回右表中的所有行以及与左表中的匹配行。 如果没有匹配行,则返回 NULL 值。常用的RIGHT JOIN写法是:
SELECT * FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
FULL (OUTER) JOIN
FULL (OUTER) JOIN (全外侧连接)用于返回两个表中的所有行。 如果没有匹配行,则返回 NULL 值。常用的FULL JOIN写法是:
SELECT * FROM table1 FULL JOIN table2 ON table1.column = table2.column;
无ON条件下的MySQL JOIN
通常情况下,我们使用MySQL JOIN语句时,都会添加一个ON条件来指定匹配两个表之间的关系。这个指定可以是简单的匹配,也可以是复杂的逻辑关系。但是,在一些特定的情况下,我们需要没有ON条件的JOIN语句来查询数据,比如:
- 在表中没有可匹配的列时;
- 我们需要在匹配列之外的其他列上比较数据。
这时候就需要使用不同的语法来进行JOIN操作。
CROSS JOIN
CROSS JOIN(交叉连接)操作是获取两个或多个表的所有行的笛卡尔积,这意味着返回行的数目等于所有表的行数的乘积。下面是常用的CROSS JOIN写法:
SELECT * FROM table1 CROSS JOIN table2;
NATURAL JOIN
NATURAL JOIN(自然连接)操作会使用两个表之间的列进行简单的匹配,如果两个表中有相同名称的列,则匹配这些列。常用的NATURAL JOIN写法是:
SELECT * FROM table1 NATURAL JOIN table2;
USING关键字
USING关键字是一种在没有ON条件的情况下进行JOIN操作的方法。我们可以使用USING指定需要匹配的列。常用的USING写法如下:
SELECT * FROM table1 JOIN table2 USING(column_name);
示例代码
下面是一些使用无ON条件下MySQL JOIN的示例代码:
CROSS JOIN
-- 创建表格1
CREATE TABLE t1 (
id INT PRIMARY KEY,
name VARCHAR(20)
);
-- 插入数据
INSERT INTO t1 VALUES (1, "John"), (2, "Bob"), (3, "Mike");
-- 创建表格2
CREATE TABLE t2 (
id INT PRIMARY KEY,
age INT
);
-- 插入数据
INSERT INTO t2 VALUES (1, 20), (2, 30), (3, 40);
-- 执行CROSS JOIN操作
SELECT * FROM t1 CROSS JOIN t2;
运行结果:
id | name | id | age |
---|---|---|---|
1 | John | 1 | 20 |
2 | Bob | 1 | 20 |
3 | Mike | 1 | 20 |
1 | John | 2 | 30 |
2 | Bob | 2 | 30 |
3 | Mike | 2 | 30 |
1 | John | 3 | 40 |
2 | Bob | 3 | 40 |
3 | Mike | 3 | 40 |
NATURAL JOIN
-- 创建表格1
CREATE TABLE t1 (
id INT PRIMARY KEY,
name VARCHAR(20),
age INT
);
-- 插入数据
INSERT INTO t1 VALUES (1, "John", 20), (2, "Bob", 30), (3, "Mike", 40);
-- 创建表格2
CREATE TABLE t2 (
id INT PRIMARY KEY,
name VARCHAR(20),
age INT
);
-- 插入数据
INSERT INTO t2 VALUES (1, "John", 20), (2, "Bob", 30), (3, "Mike", 40);
-- 执行NATURAL JOIN操作
SELECT * FROM t1 NATURAL JOIN t2;
运行结果:
id | name | age |
---|---|---|
1 | John | 20 |
2 | Bob | 30 |
3 | Mike | 40 |
USING关键字
-- 创建表格1
CREATE TABLE t1 (
id INT PRIMARY KEY,
name VARCHAR(20),
age INT
);
-- 插入数据
INSERT INTO t1 VALUES (1, "John", 20), (2, "Bob", 30), (3, "Mike", 40);
-- 创建表格2
CREATE TABLE t2 (
id INT PRIMARY KEY,
name VARCHAR(20),
birthday DATE
);
-- 插入数据
INSERT INTO t2 VALUES (1, "John", "2000-01-01"), (2, "Bob", "1990-05-10"), (3, "Mike", "1980-06-20");
-- 执行USING操作
SELECT * FROM t1 JOIN t2 USING(name);
运行结果:
id | name | age | birthday |
---|---|---|---|
1 | John | 20 | 2000-01-01 |
2 | Bob | 30 | 1990-05-10 |
3 | Mike | 40 | 1980-06-20 |
结论
本文介绍了如何在没有ON条件的情况下使用MySQL JOIN。笔者推荐使用USING关键字进行操作,因为它比NATURAL JOIN更加安全,而且交叉联接会返回太多无用的数据。在合适的场景下,我们可以使用这些方法来进行数据查询和处理。