SQL语句中JOIN ON和WHERE用法的区别和联系

目录

JOIN的四种类型:

  • LEFT JOIN:返回左表所有记录以及右表中连接字段相等的记录。
  • RIGHT JOIN:返回右表所有记录以及左表中连接字段相等的记录。
  • INNER JOIN:只返回两表连接字段相等的行。
  • FULL JOIN:LEFT JOIN + RIGHT JOIN的并集。
  • CROSS JOIN:笛卡尔积,行数为两表行数的乘积。

ON和WHERE条件的区别

数据库在JOIN两表时会生成临时表,再将结果返回。

LEFT JOIN中的ON和WHERE:

  • ON条件:在生成临时表时使用,不管条件是否为真,都会返回左表的所有记录。
  • WHERE条件:在临时表生成后再过滤,条件不为真的行被完全过滤掉,失去了LEFT JOIN的含义。

INNER JOIN中的ON和WHERE的性能差异:

将条件放在ON中:

SELECT * FROM A
INNER JOIN B ON B.ID = A.ID AND B.State = 1
INNER JOIN C ON B.ID = C.ID

B表在JOIN时就被过滤,状态不等于1的行不参与后续与C表的联接。

将条件放在WHERE中:

SELECT * FROM A
INNER JOIN B ON B.ID = A.ID
INNER JOIN C ON B.ID = C.ID
WHERE B.State = 1

B表不论状态如何都与C表联接,之后才过滤,查询成本更高。

结论:ON条件在联接时过滤,WHERE在联接后过滤。对于需要过滤的字段,使用ON可提高效率。但对简单查询,WHERE的写法更简洁。

#sql-join