select * from a,b where a.id=b.id 和笛卡尔积的关系

hahadf 2016-04-09 11:47:27
select * from a,b where a.id=b.id 和 select * from a inner join b on a.id=b.id这两个SQL语句,是不是都是先生成表a和表b的笛卡尔积之后,再按照a.id=b.id 的条件 从笛卡尔积 中 提取符合a.id=b.id 的记录
...全文
1192 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
J狂奔的蜗牛 2019-09-16
  • 打赏
  • 举报
回复
还是没有解释清楚,select * from a,b where a.id=b.id 和 select * from a inner join b on a.id=b.id这两个虽然运行的结果一样,但是生成的行数有差别,还是希望大神能够讲解下。
中国风 2016-04-11
  • 打赏
  • 举报
回复
你这样写没问题 但是别去把表联接生成笛卡尔积结果集,再去条件,明白 不明白去看看执行计划,学会就了解了 语句经过数据库引擎优化后生成执行计划,你开销就行了,语句条件放在那个位置经过引擎生成的执行计划通常相同,很少一部份会位置改变执行顺序
hahadf 2016-04-11
  • 打赏
  • 举报
回复
引用 7 楼 roy_88 的回复:
[quote=引用 6 楼 hahadf 的回复:] 非常感谢,但我还是一头雾水。 象 select * from a inner join b on a.id=b.id 这个语句的执行,如果a b 这两个表都没有索引的话,我想应该是先 a b 两表生成笛卡尔积,而后,根据条件 a.id=b.id 将符合这一条件的记录筛选出来吧。 请问,对不?不对的话,请详细讲一下 select * from a inner join b on a.id=b.id 这个语句的分步执行过程 。
完全同笛卡尔积无关 不会有先生成笛卡尔积这个步骤,明白? 先生成笛卡尔积再用条件过滤,是什么情况需要这样做?为什么不直接表联接过滤 你这样操作数据越大越慢,学任何语言要学会灵活应用。如果两表数据性能上讲,你这样操作会让你的语句慢100倍左右懂不[/quote] 非常感谢,如果你写的话,那如何写这条SQL语句?
中国风 2016-04-10
  • 打赏
  • 举报
回复
引用 6 楼 hahadf 的回复:
非常感谢,但我还是一头雾水。 象 select * from a inner join b on a.id=b.id 这个语句的执行,如果a b 这两个表都没有索引的话,我想应该是先 a b 两表生成笛卡尔积,而后,根据条件 a.id=b.id 将符合这一条件的记录筛选出来吧。 请问,对不?不对的话,请详细讲一下 select * from a inner join b on a.id=b.id 这个语句的分步执行过程 。
完全同笛卡尔积无关 不会有先生成笛卡尔积这个步骤,明白? 先生成笛卡尔积再用条件过滤,是什么情况需要这样做?为什么不直接表联接过滤 你这样操作数据越大越慢,学任何语言要学会灵活应用。如果两表数据性能上讲,你这样操作会让你的语句慢100倍左右懂不
hahadf 2016-04-09
  • 打赏
  • 举报
回复
引用 2 楼 kingtiy 的回复:
说的没有错.
那岂不是效率很低。
fishparadise 2016-04-09
  • 打赏
  • 举报
回复
引用 楼主 hahadf 的回复:
select * from a,b where a.id=b.id 和 select * from a inner join b on a.id=b.id这两个SQL语句,是不是都是先生成表a和表b的笛卡尔积之后,再按照a.id=b.id 的条件 从笛卡尔积 中 提取符合a.id=b.id 的记录
这两个语句实现的功能是一样的,只是语法不同。建议使用后者。 从逻辑上可以认为是这样,从物理实现方面来说,不是。
kingtiy 2016-04-09
  • 打赏
  • 举报
回复
说的没有错.
hahadf 2016-04-09
  • 打赏
  • 举报
回复
引用 5 楼 roy_88 的回复:
看执行计划和查执行步骤SET SHOWPLAN_ALL ON ; 不强制查询提示时 笛卡尔积生成 结果集方式生成的嵌套循环 你这样的情况是合并联接 基本不存在先生成笛卡尔积结果集这样的说时,也不会多出这样步骤 语句的执行顺序
查询的逻辑执行顺序
  (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
  (8) SELECT (9) DISTINCT (11) top_specification select_list
  (9) ORDER BY order_by_list
  标准的 SQL 的解析顺序为:
  (1) FROM 子句 组装来自不同数据源的数据
  (2) WHERE 子句 基于指定的条件对记录进行筛选
  (3) GROUP BY 子句 将数据划分为多个分组
  (4) 使用聚合函数进行计算
  (5) 使用HAVING子句筛选分组
  (6) 计算所有的表达式
  (7) 使用ORDER BY对结果集进行排序
非常感谢,但我还是一头雾水。 象 select * from a inner join b on a.id=b.id 这个语句的执行,如果a b 这两个表都没有索引的话,我想应该是先 a b 两表生成笛卡尔积,而后,根据条件 a.id=b.id 将符合这一条件的记录筛选出来吧。 请问,对不?不对的话,请详细讲一下 select * from a inner join b on a.id=b.id 这个语句的分步执行过程 。
中国风 2016-04-09
  • 打赏
  • 举报
回复
看执行计划和查执行步骤SET SHOWPLAN_ALL ON ; 不强制查询提示时 笛卡尔积生成 结果集方式生成的嵌套循环 你这样的情况是合并联接 基本不存在先生成笛卡尔积结果集这样的说时,也不会多出这样步骤 语句的执行顺序
查询的逻辑执行顺序
  (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
  (8) SELECT (9) DISTINCT (11) top_specification select_list
  (9) ORDER BY order_by_list
  标准的 SQL 的解析顺序为:
  (1) FROM 子句 组装来自不同数据源的数据
  (2) WHERE 子句 基于指定的条件对记录进行筛选
  (3) GROUP BY 子句 将数据划分为多个分组
  (4) 使用聚合函数进行计算
  (5) 使用HAVING子句筛选分组
  (6) 计算所有的表达式
  (7) 使用ORDER BY对结果集进行排序
唐诗三百首 2016-04-09
  • 打赏
  • 举报
回复
需看具体情况而定, 涉及2个表的数据量, 2个id字段上是否有索引, 统计信息等等. 如果2个id字段上有索引,可直接关联匹配后产生结果集,无需先产生笛卡尔积后筛选.

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧