sql join (以left join为例)的表的先后顺序主要如何考虑? sql中left join on 和where的执行顺序 ?

sql join \uff08\u4ee5left join\u4e3a\u4f8b\uff09\u7684\u8868\u7684\u5148\u540e\u987a\u5e8f\u4e3b\u8981\u5982\u4f55\u8003\u8651\uff1f

1.
\u8bf4\u660e\uff1a
left
join
\u662f\u5de6\u8fde\u63a5\u67e5\u8be2

LEFT
JOIN
\u5173\u952e\u5b57\u4f1a\u4ece\u5de6\u8868
(A)
\u90a3\u91cc\u8fd4\u56de\u6240\u6709\u7684\u884c\uff0c\u5373\u4f7f\u5728\u53f3\u8868
(B)
\u4e2d\u6ca1\u6709\u5339\u914d\u7684\u884c\u3002
2.
\u8bed\u6cd5\uff1a
select
A.*,B.*
from
A left join
B on
A.x=B.x
3.
\u5206\u6790\uff1a
\u4e0a\u9762sql\u4e2d\uff1aleft
join\u662f\u4ee5A\u8868\u7684\u8bb0\u5f55\u4e3a\u57fa\u7840\u7684,A\u53ef\u4ee5\u770b\u6210\u5de6\u8868,B\u53ef\u4ee5\u770b\u6210\u53f3\u8868,left
join\u662f\u4ee5\u5de6\u8868\u4e3a\u51c6\u7684\u3002\u6362\u53e5\u8bdd\u8bf4,\u5de6\u8868(A)\u7684\u8bb0\u5f55\u5c06\u4f1a\u5168\u90e8\u8868\u793a\u51fa\u6765,\u800c\u53f3\u8868(B)\u53ea\u4f1a\u663e\u793a\u7b26\u5408\u641c\u7d22\u6761\u4ef6\u7684\u8bb0\u5f55(\u4f8b\u5b50\u4e2d\u4e3a:
A.aID
=
B.bID)\u3002B\u8868\u8bb0\u5f55\u4e0d\u8db3\u7684\u5730\u65b9\u5747\u4e3aNULL\u3002

(8)SELECT (9)DISTINCT (11)
(1)FROM [left_table]
(3) JOIN
(2)ON
(4)WHERE
(5)GROUP BY
(6)WITH
(7)HAVING
(10)ORDER BY

\u903b\u8f91\u67e5\u8be2\u5904\u7406\u9636\u6bb5\u7b80\u4ecb
FROM\uff1a\u5bf9FROM\u5b50\u53e5\u4e2d\u7684\u524d\u4e24\u4e2a\u8868\u6267\u884c\u7b1b\u5361\u5c14\u79ef\uff08Cartesian product)(\u4ea4\u53c9\u8054\u63a5\uff09\uff0c\u751f\u6210\u865a\u62df\u8868VT1
ON\uff1a\u5bf9VT1\u5e94\u7528ON\u7b5b\u9009\u5668\u3002\u53ea\u6709\u90a3\u4e9b\u4f7f\u4e3a\u771f\u7684\u884c\u624d\u88ab\u63d2\u5165VT2\u3002
OUTER(JOIN)\uff1a\u5982 \u679c\u6307\u5b9a\u4e86OUTER JOIN\uff08\u76f8\u5bf9\u4e8eCROSS JOIN \u6216(INNER JOIN),\u4fdd\u7559\u8868\uff08preserved table\uff1a\u5de6\u5916\u90e8\u8054\u63a5\u628a\u5de6\u8868\u6807\u8bb0\u4e3a\u4fdd\u7559\u8868\uff0c\u53f3\u5916\u90e8\u8054\u63a5\u628a\u53f3\u8868\u6807\u8bb0\u4e3a\u4fdd\u7559\u8868\uff0c\u5b8c\u5168\u5916\u90e8\u8054\u63a5\u628a\u4e24\u4e2a\u8868\u90fd\u6807\u8bb0\u4e3a\u4fdd\u7559\u8868\uff09\u4e2d\u672a\u627e\u5230\u5339\u914d\u7684\u884c\u5c06\u4f5c\u4e3a\u5916\u90e8\u884c\u6dfb\u52a0\u5230 VT2,\u751f\u6210VT3.\u5982\u679cFROM\u5b50\u53e5\u5305\u542b\u4e24\u4e2a\u4ee5\u4e0a\u7684\u8868\uff0c\u5219\u5bf9\u4e0a\u4e00\u4e2a\u8054\u63a5\u751f\u6210\u7684\u7ed3\u679c\u8868\u548c\u4e0b\u4e00\u4e2a\u8868\u91cd\u590d\u6267\u884c\u6b65\u9aa41\u5230\u6b65\u9aa43\uff0c\u76f4\u5230\u5904\u7406\u5b8c\u6240\u6709\u7684\u8868\u4e3a\u6b62\u3002
WHERE\uff1a\u5bf9VT3\u5e94\u7528WHERE\u7b5b\u9009\u5668\u3002\u53ea\u6709\u4f7f\u4e3atrue\u7684\u884c\u624d\u88ab\u63d2\u5165VT4.
GROUP BY\uff1a\u6309GROUP BY\u5b50\u53e5\u4e2d\u7684\u5217\u5217\u8868\u5bf9VT4\u4e2d\u7684\u884c\u5206\u7ec4\uff0c\u751f\u6210VT5.
CUBE|ROLLUP\uff1a\u628a\u8d85\u7ec4(Suppergroups)\u63d2\u5165VT5,\u751f\u6210VT6.
HAVING\uff1a\u5bf9VT6\u5e94\u7528HAVING\u7b5b\u9009\u5668\u3002\u53ea\u6709\u4f7f\u4e3atrue\u7684\u7ec4\u624d\u4f1a\u88ab\u63d2\u5165VT7.
SELECT\uff1a\u5904\u7406SELECT\u5217\u8868\uff0c\u4ea7\u751fVT8.
DISTINCT\uff1a\u5c06\u91cd\u590d\u7684\u884c\u4eceVT8\u4e2d\u79fb\u9664\uff0c\u4ea7\u751fVT9.
ORDER BY\uff1a\u5c06VT9\u4e2d\u7684\u884c\u6309ORDER BY \u5b50\u53e5\u4e2d\u7684\u5217\u5217\u8868\u6392\u5e8f\uff0c\u751f\u6210\u6e38\u6807\uff08VC10).
TOP\uff1a\u4eceVC10\u7684\u5f00\u59cb\u5904\u9009\u62e9\u6307\u5b9a\u6570\u91cf\u6216\u6bd4\u4f8b\u7684\u884c\uff0c\u751f\u6210\u8868VT11,\u5e76\u8fd4\u56de\u8c03\u7528\u8005\u3002

您好,SQL语句有join是因为把优化后的数据重新联结完整,体现直观数据表达的作用.(这样讲可能还是太抽象).
我们做数据优化的时候.一般要理清楚数据实体的关联关系.
例如:E-R
所以先后顺序的问题.
left join的话.
第一张表就是主体表
后面的都是与这张表有关联关系的表(一般是明细表,辅表)
把主体表与left join tablename的关联字段作为on条件
希望我的回答能帮助您理解.

  1. 说明:

    left join 是左连接查询  

    LEFT JOIN 关键字会从左表 (A) 那里返回所有的行,即使在右表 (B) 中没有匹配的行。

  2. 语法:

    select A.*,B.*  from A  left join B on A.x=B.x

  3. 分析:

    上面sql中:left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的。换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID)。B表记录不足的地方均为NULL。



在不影响速度的情况下可以不考虑顺序,当查询速度慢时,优化查询速度时要考虑left join表的顺序。以查询表的数据量小的放置在前,以有查询过滤条件的放置在前面,优先关联

select * from
A left join B on A.Id=B.Id
sql是这样做的
以A表的某一个A.Id为基准 查询B表的B.id是否有该A.id的记录
有几行 那么查询节点 关于当前A.id的记录就有几条

如果B表彻底没有A.id的记录 B表的所有字段全部按null处理

楼主问的意思,应该是从性能上面考虑!我记得在哪看过,连接应该把较小的表放在前面!

扩展阅读:xboxone港版欧版美版区别 ... full join ... texas instruments ... paperpass免费入口 ... java windowbuilder ... xbox series x ... join left join ... mysql join on ... sqlite left join ...

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