一、JOIN ON的作用
ON是在 联接 时就进行条件过滤,而 WHERE则是在 联接后才过滤。
ON是在 联接 时就进行条件过滤,而 WHERE则是在 联接后才过滤。
SELECT a.*,b.*
FROM a
LEFT JOIN b
ON a.a_zw = b.b_zw --联接时,对数据表进行条件过滤,将左表的所有行、右表的符合条件的行,插入到临时表(不可见)
WHERE a.a_name = b.b_name --对生成的临时表进行条件过滤,只输出符合条件的行给用户(可见)
JOIN ON和WHERE的本质区别:
ON:生成临时表时使用的条件,过滤数据表的内容,无论ON的条件是否为真,都将LEFT左表或RIGHT右表的行放到临时表;
WHERE:临时表已生成之后对临时表进行过滤的条件,条件部位真的就全部过滤掉。
总结:ON是对数据表进行过滤,无论条件成立否,都返回表的行给结果集;WHERE对结果集进行过滤,返回结果集中符合条件的行。
FROM a
LEFT JOIN b
ON a.a_zw = b.b_zw --联接时,对数据表进行条件过滤,将左表的所有行、右表的符合条件的行,插入到临时表(不可见)
WHERE a.a_name = b.b_name --对生成的临时表进行条件过滤,只输出符合条件的行给用户(可见)
JOIN ON和WHERE的本质区别:
ON:生成临时表时使用的条件,过滤数据表的内容,无论ON的条件是否为真,都将LEFT左表或RIGHT右表的行放到临时表;
WHERE:临时表已生成之后对临时表进行过滤的条件,条件部位真的就全部过滤掉。
总结:ON是对数据表进行过滤,无论条件成立否,都返回表的行给结果集;WHERE对结果集进行过滤,返回结果集中符合条件的行。
二、LEFT JOIN(左联接)
返回:左表的所有行,以及右表中符合连接条件的行。
SELECT * -- 输出范围
FROM a -- 要查询的主表(左表)
LEFT JOIN b -- 要连接的表(右表)
ON a.a_zw = b.b_zw -- 连接条件(右表的输出范围)
说明:
LEFT JOIN
以a(左表)为基础,a(左表)的记录将会全部输出,b(右表)只会输出符合条件的行,b(右表)行不足的地方均为NULL。
三、RIGHT JOIN(右联接)
返回:右表的所有行,以及左表中符合条件的行。
返回:右表的所有行,以及左表中符合条件的行。
SELECT * -- 输出范围
FROM a -- 要查询的主表(左表)
RIGHT JOIN b -- 要连接的表(右表)
ON a.a_zw = b.b_zw -- 连接条件(左表的输出范围)
说明: 与 LEFT JOIN 相反,RIGHT JOIN以b(右表)为基础,a(左表)不足的地方用NULL填充。
FROM a -- 要查询的主表(左表)
RIGHT JOIN b -- 要连接的表(右表)
ON a.a_zw = b.b_zw -- 连接条件(左表的输出范围)
说明: 与 LEFT JOIN 相反,RIGHT JOIN以b(右表)为基础,a(左表)不足的地方用NULL填充。
INNER JOIN(等值连接)
返回:两个表中联结字段相等的行。
FROM a -- 要查询的主表(左表)
INNER JOIN b -- 要连接的表(右表)
ON a.a_zw = b.b_zw -- 连接条件
说明: INNER JOIN 不以哪个表基础,它只输出符合条件的记录。