sql中left join on 和where的执行顺序 ? 浅谈,SQL语句中LEFT JOIN ON WHERE和LE...

\u6d45\u8c08\uff0cSQL\u8bed\u53e5\u4e2dLEFT JOIN ON WHERE\u548cLEFT JOIN ON AND\u7684\u533a\u522b

\u4f60\u597d\uff0cleft
join\uff0cright\uff0cfull\u540eon\u548cwhere\u7684\u533a\u522b\u5c31\u5728\u4e8e\uff1a
on\u6761\u4ef6\u662f\u5728\u751f\u6210\u4e34\u65f6\u8868\u65f6\u4f7f\u7528\u7684\u6761\u4ef6\uff0c\u5b83\u4e0d\u7ba1on\u4e2d\u7684\u6761\u4ef6\u662f\u5426\u4e3a\u771f\uff0c\u90fd\u4f1a\u8fd4\u56de\u5de6\u8fb9\u8868\u4e2d\u7684\u8bb0\u5f55\uff0c\u800cwhere\u6761\u4ef6\u662f\u5728\u4e34\u65f6\u8868\u751f\u6210\u597d\u540e\uff0c\u518d\u5bf9\u4e34\u65f6\u8868\u8fdb\u884c\u8fc7\u6ee4\u7684\u6761\u4ef6\u3002
\u800c\u4e14\u9664\u4e86stu_id=1\u7684\u90a3\u6761\u8bb0\u5f55\uff0cclass\u8868\u4e2d\u5b57\u6bb5\u4e0d\u6ee1\u8db3\u8fc7\u6ee4\u6761\u4ef6\u7684\u8bb0\u5f55\uff08\u5373\u4f7f\u88ab\u5173\u8054\u5230\u4e86\uff09\u5168\u662fnull\uff0c\u6240\u4ee5on\u540e\u9762\u7684\u8bed\u53e5\u6700\u597d\u53ea\u5199\u4e24\u4e2a\u8868\u76f8\u5173\u8054\u7684\u8bed\u53e5\uff0c\u5e76\u4e0d\u80fd\u505a\u5355\u65b9\u9762\u7684\u8fc7\u6ee4\u3002
\u4e5f\u53ef\u4ee5\u8fd9\u4e48\u7b80\u5355\u7684\u7406\u89e3\uff0c\u4ee5\u5750\u6807\u4e3a\u4e3b\uff0c\u5148\u67e5\u8be2\u51fa\u5de6\u8868\u7684\u5168\u90e8\u8bb0\u5f55\uff0c\u7136\u540e\u5173\u8054\u53f3\u8868\uff0c\u5c06\u7b26\u5408\u6761\u4ef6\u7684\u8bb0\u5f55\u7684\u6570\u636e\u586b\u5145\u8fdb\u67e5\u8be2\u51fa\u6765\u7684\u7ed3\u679c\u3002
right
join
\u548c
full
join
\u5177\u6709\u76f8\u540c\u7684\u7279\u6027\uff0c\u4f46\u662finner
join\u4e0d\u540c\uff0c\u5b83\u53ef\u4ee5\u5728on
\u90a3\u91cc\u505a\u8fc7\u6ee4\u5904\u7406\uff0c\u4e5f\u5c31\u662f\u8bf4\u653e\u5728on\u540e\u9762\u548cwhere\u540e\u9762\u4f5c\u7528\u662f\u4e00\u6837\u7684\u3002
\u5e0c\u671b\u5bf9\u4f60\u6709\u5e2e\u52a9

\u7b2c\u4e00\u79cd\u6548\u7387\u9ad8\uff0c\u5b50\u67e5\u8be2\u662f\u4e0d\u4f1a\u6709\u7d22\u5f15\u7684\uff0c\u5e76\u4e14\u4ee5\u7ed3\u679c\u96c6\u4f5c\u4e3a\u5b50\u67e5\u8be2\u66f4\u6162

SELECT * FROM TABLEA A LEFT JOIN TABLEB ON A.ID = B.ID AND B.NAME = '123'

\u5982\u679c\u6570\u636e\u91cf\u5927\u7684\u8bdd\uff0c\u60f3\u8981\u6548\u7387\u66f4\u9ad8\u628a*\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u4ee3\u66ff

(8)SELECT (9)DISTINCT (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>

逻辑查询处理阶段简介
FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1
ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。
OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4.
GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.
CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.
HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入VT7.
SELECT:处理SELECT列表,产生VT8.
DISTINCT:将重复的行从VT8中移除,产生VT9.
ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).
TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。

http://www.cnblogs.com/qanholas/archive/2010/10/24/1859924.html

看执行计划不就知道了,现在都是基于成本的优化器了,只有看计划才能知道先执行那部分

先连接,应该是从from之后顺序执行,所以先连接

扩展阅读:xbox series x ... java windowbuilder ... vlookup精确匹配为na ... vlookup万能查找公式 ... vlookup匹配出现#na ... mysql inner join ... sql left outer join ... 满足两个条件的vlookup ... vlookup if多条件查询 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网