1. MySQL INNER JOIN
在MySQL中,JOIN 子句是将两个或多个表连接在一起的语句。INNER JOIN 是最常用的 JOIN 类型之一。在INNER JOIN中,作为基础连接的表被称为主表,而在同一查询中要连接的表被称为从表,主表中列的值与从表中列的值匹配的行将被保留。
1.1 语法
以下是 INNER JOIN 语法:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
其中:
column_name(s):要返回的列的名称
table1、table2:要连接的表的名称
ON:指定表之间的连接条件。在INNER JOIN 中,连接条件要求在主表和副表中都存在匹配行。
1.2 示例
以下是一个基本的 INNER JOIN 示例:
SELECT customers.CustomerName, orders.OrderID
FROM customers
INNER JOIN orders
ON customers.CustomerID = orders.CustomerID;
在这个例子中,我们从 customers 表中选择 CustomerName 列以及从 orders 表中选择 OrderID 列。我们将这些表连接在一起,使得当 customers.CustomerID 和 orders.CustomerID 的值相同时,将返回匹配的行。
2. MySQL CROSS JOIN
CROSS JOIN 是另一种常见的 JOIN 类型。在CROSS JOIN中,每个表中的每一行都与另一个表中的每一行匹配。
2.1 语法
以下是 CROSS JOIN 语法:
SELECT column_name(s)
FROM table1
CROSS JOIN table2;
其中:
column_name(s):要返回的列的名称
table1、table2:要连接的表的名称
2.2 示例
以下是一个基本的 CROSS JOIN 示例:
SELECT customers.CustomerName, orders.OrderID
FROM customers
CROSS JOIN orders;
在这个例子中,我们从 customers 表中选择 CustomerName 列以及从 orders 表中选择 OrderID 列。我们将这些表交叉连接在一起,使得每一行都由 customers 和 orders 表中的所有行组成。
3. 如何区分 INNER JOIN 和 CROSS JOIN
INNER JOIN 和 CROSS JOIN 可以看起来很相似,但它们的区别在于它们匹配行的方式。
INNER JOIN 只匹配在主表和副表中都存在匹配行的行。CROSS JOIN 匹配主表中的每一行与从表中的每一行。这意味着如果两个表的大小分别为 m 和 n,则 INNER JOIN 最多将返回 m * n 行,而 CROSS JOIN 将返回 ex m * n 行。
3.1 INNER JOIN 示例:
假设我们有两个表 employees 和 departments:
employees
+----+--------+-------------+
| id | name | department |
+----+--------+-------------+
| 1 | Alice | Marketing |
| 2 | Bob | Sales |
| 3 | Carol | Marketing |
+----+--------+-------------+
departments
+----+-------------+
| id | name |
+----+-------------+
| 1 | Marketing |
| 2 | Sales |
+----+-------------+
我们可以使用 INNER JOIN 将它们连接在一起,使得我们可以一起查看每个雇员所属的部门:
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments
ON employees.department = departments.name;
这将返回以下结果:
+------+-------------+
| name | name |
+------+-------------+
| Alice| Marketing |
| Bob | Sales |
| Carol| Marketing |
+------+-------------+
在这个例子中,INNER JOIN 连接了两个表 employees 和 departments,其中使用 department 列匹配行。
3.2 CROSS JOIN 示例:
假设我们有两个表 colors 和 sizes:
colors
+----+-------+
| id | color |
+----+-------+
| 1 | Red |
| 2 | Blue |
+----+-------+
sizes
+----+-------+
| id | size |
+----+-------+
| 1 | Small |
| 2 | Large |
+----+-------+
我们可以使用 CROSS JOIN 将它们连接在一起,以便我们可以查看每种颜色的每种大小:
SELECT colors.color, sizes.size
FROM colors
CROSS JOIN sizes;
这将返回以下结果:
+-------+-------+
| color | size |
+-------+-------+
| Red | Small |
| Red | Large |
| Blue | Small |
| Blue | Large |
+-------+-------+
在这个例子中,CROSS JOIN 将两个表 colors 和 sizes 连接在一起,其中第一个表中的每一行都将与第二个表中的每一行匹配。
4. 总结
INNER JOIN 和 CROSS JOIN 都是将表连接起来的常见方法,但它们的行匹配行为不同。在使用 JOIN 语句时,请确保您了解您想要匹配哪些行以及哪种 JOIN 类型最适合您的需求。