SQL执行关键字的加载顺序
FROM # 先查询表是否存在
ON
JOIN
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
ORDER BY
LIMIT
为什么是on在join前面呢?
按我的理解,join on
数据库会进行三步处理:
先将两表做笛卡尔积产生中间表
通过on的全部条件过滤中间表的记录
根据join的类型判断是否要添加外部行(只有在外连接LEFT/RIGHT/FULL中才会发生),把保留表的记录添加到中间表
on与where的区别?
on是用于生成中间表的过滤条件,但不是最终的过滤条件,因为外连接有可能把结果加回来
where是在临时表生成好后再对临时表进行过滤
JOIN 关键字
left join:左连接,返回左表中所有的记录以及右表中连接字段相等的记录
right join:右连接,返回右表中所有的记录以及左表中连接字段相等的记录
inner join (join):内连接,又叫等值连接,只返回两个表中连接字段相等的行
full join:外连接,返回两个表中的行:left join + right join
cross join:结果是笛卡尔积,把左表和右表的数据进行一个N*M的组合
MySQL不支持full join
,可以使用union
代替