1SQL语句:left join后面加上where条件
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户
2SQL LEFT JOIN 关键字
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
3LEFT JOIN 关键字语法
代码语言:javascript复制SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
**注释:**在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。
4原始的表
"sql_person" 表:
id | username | address | city |
---|---|---|---|
1 | Apple | Oxford Street | London |
2 | Fifth Avenue | New York | |
3 | Huawei | China Beijing | Beijing |
"sql_order" 表:
id | order_no | person_id | status |
---|---|---|---|
1 | 77895 | 1 | 1 |
2 | 87895 | 2 | 0 |
3 | 97895 | 98 | 1 |
4 | 107895 | 2 | 1 |
5左连接(LEFT JOIN)实例
现在,我们希望列出所有的人,以及他们的定购 - 如果有的话,您可以使用下面的 SELECT 语句:
1、使用where 条件查询
sql 查询语句
代码语言:javascript复制SELECT
sql_person.username,
sql_person.city,
sql_order.order_no,
sql_order.status
FROM
sql_person
LEFT JOIN sql_order ON sql_person.id = sql_order.person_id
WHERE
sql_order.`status` = 1
ORDER BY
sql_order.order_no.id
以上SQL执行过程:
(1)中间表 on 条件:sql_person.id = sql_order.person_id
查询中间的临时表记录
username | city | order_no | status |
---|---|---|---|
Huawei | Beijing | (null) | (null) |
New York | 107895 | 1 | |
Apple | New York | 77895 | 1 |
London | 87895 | 0 |
LEFT JOIN 关键字会从左表 (sql_person) 那里返回所有的行,即使在右表 (sql_order) 中没有匹配的行。
(2)再对中间表过滤 where
条件:sql_order.status = 1
username | city | order_no | status |
---|---|---|---|
New York | 107895 | 1 | |
Apple | London | 77895 | 1 |
(2)不使用where 条件查询
sql 查询语句
代码语言:javascript复制SELECT
sql_person.username,
sql_person.city,
sql_order.order_no,
sql_order.status
FROM
sql_person
LEFT JOIN sql_order ON ( sql_person.id = sql_order.person_id AND sql_order.status = 1 )
ORDER BY
sql_order.order_no
(1)中间表 on 条件:sql_person.id = sql_order.person_id AND sql_order.status = 1
查询中间的临时表记录
username | city | order_no | status |
---|---|---|---|
Huawei | Beijing | (null) | (null) |
New York | 107895 | 1 | |
Apple | London | 77895 | 1 |
注意:条件不为真也会返回左表中的记录。
6小结
- 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
- where条件是在临时表生成好后,再对临时表进行过滤的条件
- where 条件加上,已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉
- 过滤条件放在 where后面: 是先连接然生成临时查询结果,然后再筛选
- 过滤条件放在 on后面: 先根据条件过滤筛选,再连,生成临时查询结果