数据库系列 | left join加上where条件咋了?

2023-03-08 20:15:48 浏览数 (1)

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

Google

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)

Google

New York

107895

1

Apple

New York

77895

1

Google

London

87895

0

LEFT JOIN 关键字会从左表 (sql_person) 那里返回所有的行,即使在右表 (sql_order) 中没有匹配的行。

(2)再对中间表过滤 where 条件:sql_order.status = 1

username

city

order_no

status

Google

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)

Google

New York

107895

1

Apple

London

77895

1

注意:条件不为真也会返回左表中的记录。

6小结

  • 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
  • where条件是在临时表生成好后,再对临时表进行过滤的条件
  • where 条件加上,已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉
  • 过滤条件放在 where后面: 是先连接然生成临时查询结果,然后再筛选
  • 过滤条件放在 on后面: 先根据条件过滤筛选,再连,生成临时查询结果
sql

0 人点赞