本文来说下mysql中where和and的区别


文章目录

  • 概述
  • 内连接的时候
  • 左外连接的时候
  • 本文小结



概述

多表查询语法结构:table_reference {[INNER] JOIN | {LEFT|RIGHT} [OUTER] JOIN} table_reference ON conditional_expr

  • and条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。和右边的表关联不上,右边表的字段显示null;
  • where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

内连接的时候

由于内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所有在内连接时on和where的结果是相同的。

SELECT
	T.id,
	T.content,
	T.create_time time,
	T.type,
	T.state,
	T.is_deleted t_is_deleted,
	k.is_deleted k_is_deleted
FROM
	p_alert T
	JOIN p_deal K ON T.alert_code = k.alert_code 
	AND K.is_deleted = 0 
	AND T.is_deleted = 0 
ORDER BY
	T.create_time DESC

结果信息

1 mysql where 影响 mysql where and_1 mysql where 影响

WHERE的情况

SELECT
	T.id,
	T.content,
	T.create_time time,
	T.type,
	T.state,
	T.is_deleted t_is_deleted,
	k.is_deleted k_is_deleted
FROM
	p_alert T
	JOIN p_deal K ON T.alert_code = k.alert_code 
	WHERE K.is_deleted = 0 
	AND T.is_deleted = 0 
ORDER BY
	T.create_time DESC

结果信息

1 mysql where 影响 mysql where and_mysql_02


左外连接的时候

在多表查询时,ON和where都表示筛选条件,on先执行,where后执行

区别:

外连接时,on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。而where条件是在临时表生成好后,再对临时表进行过滤的条件。

左外连接,使用and的时候

SELECT
	T.id,
	T.content,
	T.create_time time,
	T.type,
	T.state,
	T.is_deleted t_is_deleted,
	k.is_deleted k_is_deleted
FROM
	p_alert T
	LEFT JOIN p_deal K ON T.alert_code = k.alert_code 
	AND K.is_deleted = 0 
	AND T.is_deleted = 0 
ORDER BY
	T.create_time DESC

结果

1 mysql where 影响 mysql where and_mysql_03

左外连接,使用where的时候

SELECT
	T.id,
	T.content,
	T.create_time time,
	T.type,
	T.state,
	T.is_deleted t_is_deleted,
	k.is_deleted k_is_deleted
FROM
	p_alert T
	LEFT JOIN p_deal K ON T.alert_code = k.alert_code 
	AND K.is_deleted = 0 
	WHERE T.is_deleted = 0 
ORDER BY
	T.create_time DESC

结果

1 mysql where 影响 mysql where and_mysql_04

来我们分析一下为什么会造成以上两种不同的结果。

and是生成临时表时使用的条件,上面我们采用的是左外连接,左外连接是以左表为基础的,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。也就是说p_alert是左表,p_deal是右表,条件是p_alert的alert_code与p_deal中的alert_code相等且K.is_deleted = 0 且T.is_deleted = 0 时才连接,而记录不足的地方均用NULL来补充。而where是在临时表生成好后,再对临时表进行过滤。也就是说p_alert的alert_code与p_deal中的alert_code相等,然后在对生成的临时表进行筛选,找到符合条件的记录。


本文小结

本文详细说明了mysql中where和and的区别。