MySQL left join的on、and和where的区别

MySQL left join的on、and和where的区别

MySQL left join的on、and和where的区别

引言

在MySQL中,使用JOIN语句可以将两个或多个表中的数据连接在一起,从而实现对这些表进行联合查询。其中最常用的JOIN类型之一是LEFT JOIN。在LEFT JOIN中,将从左表中选取所有的记录,并根据指定的条件连接右表中的记录。在这个过程中,我们可以使用ONANDWHERE来定义连接和筛选的条件。本文将详细解释这三者之间的区别和使用方法。

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 JohnsonLisa 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关键字定义了连接条件和筛选条件。最终返回了满足条件的记录。

ONvsANDvsWHERE的区别

ONANDWHERELEFT JOIN中担任了不同的角色和功能,它们之间的区别可总结如下:

  • ON:用于定义连接条件,指定两个表之间的字段关系。
  • AND:用于在ONWHERE子句中通过逻辑运算符连接多个条件。
  • WHERE:用于对查询结果进行筛选,不一定与JOIN有关。

需要注意的是,ON关键字只能在连接表时使用,而ANDWHERE关键字可以在连接表时使用,也可以在不连接表时使用。

结论

在使用LEFT JOIN语句时,使用ON关键字定义连接条件,AND关键字连接多个条件,WHERE关键字用于筛选结果。这三者在LEFT JOIN中分别承担了不同的角色和功能,掌握它们之间的区别和使用方法是进行联合查询的关键。

总之,在编写MySQL查询语句时,要根据实际需求选择合适的语句和关键字,避免混淆和错误的结果。

注意事项

在使用ON关键字时,必须确保连接条件是正确的,否则可能会导致无结果或错误的结果。同时,也要注意避免使用不必要的连接条件,以免降低查询效率。

使用AND关键字时,要注意逻辑运算符的优先级,并使用括号来明确逻辑关系。

在使用WHERE关键字时,要注意条件的顺序和逻辑关系,以避免错误的结果。

示例代码与运行结果

为了更好地理解LEFT JOINONANDWHERE的区别,下面提供一个示例代码,展示了这三者的不同使用方式和运行结果。

-- 创建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的视角详细解释了ONANDWHERE在MySQL中的不同使用方式和区别。通过正确理解和灵活运用这些关键字,可以更好地进行表的联合查询,并满足实际需求。在编写MySQL查询语句时,记得要根据实际场景选择合适的关键字和语法,避免混淆和错误的结果。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程