MySQL left join的on、and和where的区别
引言
在MySQL中,使用JOIN
语句可以将两个或多个表中的数据连接在一起,从而实现对这些表进行联合查询。其中最常用的JOIN
类型之一是LEFT JOIN
。在LEFT JOIN
中,将从左表中选取所有的记录,并根据指定的条件连接右表中的记录。在这个过程中,我们可以使用ON
、AND
和WHERE
来定义连接和筛选的条件。本文将详细解释这三者之间的区别和使用方法。
LEFT JOIN
语法
LEFT JOIN
的基本语法如下所示:
SELECT 列名
FROM 左表
LEFT JOIN 右表 ON 连接条件
ON
的使用
定义连接条件
使用ON
关键字可以在LEFT JOIN
中定义连接条件。连接条件是指在两个表进行连接时,通过指定某个字段的值相等来建立关联关系。ON
后面跟着的是一个逻辑表达式,用于指定两个表之间的连接条件。
示例代码:
SELECT customers.customer_name, orders.order_number
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
运行结果:
+---------------+--------------+
| customer_name | order_number |
+---------------+--------------+
| John Smith | 1001 |
| Alice Johnson | 1002 |
| Lisa Lee | NULL |
+---------------+--------------+
在上面的例子中,我们可以看到使用ON
关键字将customers
表和orders
表连接在一起,并通过customers.customer_id = orders.customer_id
建立了连接条件。这样就能够查询到客户名和订单号。
带有多个连接条件
当需要多个条件来进行连接时,可以通过使用AND
关键字来连接多个条件。具体语法如下所示:
SELECT 列名
FROM 左表
LEFT JOIN 右表 ON 连接条件1 AND 连接条件2;
示例代码:
SELECT customers.customer_name, orders.order_number
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id AND orders.amount > 1000;
运行结果:
+---------------+--------------+
| customer_name | order_number |
+---------------+--------------+
| John Smith | 1001 |
| Alice Johnson | NULL |
| Lisa Lee | NULL |
+---------------+--------------+
在上面的例子中,我们添加了一个条件orders.amount > 1000
,表示只查询订单金额大于1000的记录。由于Alice Johnson
和Lisa Lee
的订单金额都小于1000,所以最终结果中只包含了John Smith
的记录。
AND
的使用
定义连接条件
在LEFT JOIN
中,AND
关键字用于定义连接条件。与ON
不同,AND
关键字将连接条件放在WHERE
子句中而不是ON
子句中。
示例代码:
SELECT customers.customer_name, orders.order_number
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
WHERE orders.amount > 1000;
运行结果:
+---------------+--------------+
| customer_name | order_number |
+---------------+--------------+
| John Smith | 1001 |
+---------------+--------------+
在上面的例子中,我们将条件orders.amount > 1000
放在了WHERE
子句中,这样只有满足该条件的记录才会被返回。
筛选结果
除了用于定义连接条件外,AND
还可以用于筛选结果。通过在WHERE
子句中添加多个条件,并使用AND
连接这些条件,可以对查询结果进行过滤。
示例代码:
SELECT customers.customer_name, orders.order_number
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
WHERE orders.amount > 1000 AND customers.city = 'New York';
运行结果:
+---------------+--------------+
| customer_name | order_number |
+---------------+--------------+
| John Smith | 1001 |
+---------------+--------------+
在上面的例子中,我们添加了一个条件customers.city = 'New York'
,表示只查询客户所在城市为”New York”的记录。由于只有John Smith
是来自于”New York”的,所以最终结果只返回了他的记录。
WHERE
的使用
筛选结果
WHERE
关键字用于对查询结果进行筛选。与AND
不同,WHERE
关键字可以用于连接多个条件,也可以与JOIN
无关地使用。
示例代码:
SELECT customers.customer_name, orders.order_number
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
WHERE orders.amount > 1000;
运行结果:
+---------------+--------------+
| customer_name | order_number |
+---------------+--------------+
| John Smith | 1001 |
+---------------+--------------+
在上面的例子中,我们使用WHERE
关键字筛选了orders.amount > 1000
的记录。由于只有John Smith
的订单金额满足该条件,所以只返回了他的记录。
不使用JOIN
时使用WHERE
当不使用JOIN
语句进行表连接时,WHERE
关键字可以用于连接多个表的字段。
示例代码:
SELECT customers.customer_name, orders.order_number
FROM customers, orders
WHERE customers.customer_id = orders.customer_id
AND orders.amount > 1000;
运行结果:
+---------------+--------------+
| customer_name | order_number |
+---------------+--------------+
| John Smith | 1001 |
+---------------+--------------+
在上面的例子中,我们使用了逗号将customers
表和orders
表连接在一起,然后使用WHERE
关键字定义了连接条件和筛选条件。最终返回了满足条件的记录。
ON
vsAND
vsWHERE
的区别
ON
、AND
和WHERE
在LEFT JOIN
中担任了不同的角色和功能,它们之间的区别可总结如下:
ON
:用于定义连接条件,指定两个表之间的字段关系。AND
:用于在ON
或WHERE
子句中通过逻辑运算符连接多个条件。WHERE
:用于对查询结果进行筛选,不一定与JOIN
有关。
需要注意的是,ON
关键字只能在连接表时使用,而AND
和WHERE
关键字可以在连接表时使用,也可以在不连接表时使用。
结论
在使用LEFT JOIN
语句时,使用ON
关键字定义连接条件,AND
关键字连接多个条件,WHERE
关键字用于筛选结果。这三者在LEFT JOIN
中分别承担了不同的角色和功能,掌握它们之间的区别和使用方法是进行联合查询的关键。
总之,在编写MySQL查询语句时,要根据实际需求选择合适的语句和关键字,避免混淆和错误的结果。
注意事项
在使用ON
关键字时,必须确保连接条件是正确的,否则可能会导致无结果或错误的结果。同时,也要注意避免使用不必要的连接条件,以免降低查询效率。
使用AND
关键字时,要注意逻辑运算符的优先级,并使用括号来明确逻辑关系。
在使用WHERE
关键字时,要注意条件的顺序和逻辑关系,以避免错误的结果。
示例代码与运行结果
为了更好地理解LEFT JOIN
中ON
、AND
和WHERE
的区别,下面提供一个示例代码,展示了这三者的不同使用方式和运行结果。
-- 创建customers表
CREATE TABLE customers (
customer_id INT,
customer_name VARCHAR(50),
city VARCHAR(50)
);
-- 插入数据
INSERT INTO customers (customer_id, customer_name, city)
VALUES
(1, 'John Smith', 'New York'),
(2, 'Alice Johnson', 'Los Angeles'),
(3, 'Lisa Lee', 'San Francisco');
-- 创建orders表
CREATE TABLE orders (
order_id INT,
order_number INT,
customer_id INT,
amount DECIMAL(10, 2)
);
-- 插入数据
INSERT INTO orders (order_id, order_number, customer_id, amount)
VALUES
(1, 1001, 1, 1500),
(2, 1002, 2, 800),
(3, 1003, 2, 1200),
(4, 1004, 3, 500);
-- 使用ON连接条件
SELECT customers.customer_name, orders.order_number
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
WHERE customers.city = 'New York';
运行结果:
+---------------+--------------+
| customer_name | order_number |
+---------------+--------------+
| John Smith | 1001 |
+---------------+--------------+
在上面的示例代码中,我们创建了一个包含两个表(customers和orders)的数据库,并插入了一些测试数据。然后,我们使用ON
关键字指定了连接条件customers.customer_id = orders.customer_id
,并在WHERE
子句中添加了过滤条件customers.city = 'New York'
。最终,我们只返回了John Smith
来自”New York”的记录,它的订单号是1001。
总结
本文从LEFT JOIN
的视角详细解释了ON
、AND
和WHERE
在MySQL中的不同使用方式和区别。通过正确理解和灵活运用这些关键字,可以更好地进行表的联合查询,并满足实际需求。在编写MySQL查询语句时,记得要根据实际场景选择合适的关键字和语法,避免混淆和错误的结果。