各种JOIN的效率和逗号的效率

aoyihuashao 2009-12-10 01:51:59
基本表Basic(int k(pk),....)
应用表Func(int k(fk),....)



现在要查询

1,SELECT * FROM Basic,Func WHERE Basic.k = Func.k

2,SELECT * FROM Basic RIGHT JOIN Func ON Basic.k = Func.k

结果是一样的,哪个更好一些?

如果按照SQL的执行顺序的话,先逗号后条件,那SELECT * FROM Basic,Func会产生大量是数据,是不是应该避免使用这个啊?

或者有其他更加合适的方法?
...全文
1627 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
水中影子 2009-12-12
  • 打赏
  • 举报
回复
以前真没用过Ctrl+L

学习了。。。
gaomiqzhi 2009-12-12
  • 打赏
  • 举报
回复
学习
pengjianbin04 2009-12-12
  • 打赏
  • 举报
回复
Ctrl+L测试执行效率
feixianxxx 2009-12-12
  • 打赏
  • 举报
回复
1,SELECT * FROM Basic,Func WHERE Basic.k = Func.k

2,SELECT * FROM Basic RIGHT JOIN Func ON Basic.k = Func.k

结果是一样的,哪个更好一些?
--》2个方法出来的结果可能不一样 ...

如果按照SQL的执行顺序的话,先逗号后条件,那SELECT * FROM Basic,Func会产生大量是数据,是不是应该避免使用这个啊?
--》 不需要,因为优化器会自动将
SELECT * FROM Basic inner JOIN Func ON Basic.k = Func.k 优化成
内连接
liu_ljj 2009-12-12
  • 打赏
  • 举报
回复
通常oracle写法采用方式1,而sqlserver更推荐方式2。
1.生成执行计划一致。
2.sqlserver left join,right join 对应oracle 外连接 即采用(+)的形式.
3.sql执行不看语句的顺序,具体请参考sqlserver技术内幕 --查询与调教 这本书
guguda2008 2009-12-11
  • 打赏
  • 举报
回复
如果按照SQL的执行顺序的话,先逗号后条件,那SELECT * FROM Basic,Func会产生大量是数据,是不是应该避免使用这个啊?

不会的,会自动优化成JOIN连接
guguda2008 2009-12-11
  • 打赏
  • 举报
回复
1,SELECT * FROM Basic,Func WHERE Basic.k = Func.k
--这个相当于INNER JOIN

2,SELECT * FROM Basic RIGHT JOIN Func ON Basic.k = Func.k

--两个语句意思都不一样,没法比较
Kurt_Yang_SH 2009-12-11
  • 打赏
  • 举报
回复
还是用join,清晰明了一些.简单的情况下两种写法没区别.如果复杂一点,有几个表right join,又left join,可能就只能用join了.
sz_free_bird 2009-12-11
  • 打赏
  • 举报
回复
select * from tableA,tableB where ...
select * form tableA right join tableB on...
这两者都会执行一个交叉连接,之后再交叉连接的结果中执行where或者on子句
但right join 会多一个操作,就是添加外部行的过程.
ACMAIN_CHM 2009-12-11
  • 打赏
  • 举报
回复
1,SELECT * FROM Basic,Func WHERE Basic.k = Func.k

2,SELECT * FROM Basic RIGHT JOIN Func ON Basic.k = Func.k

当然是1。 1等同于

SELECT * FROM Basic inner join Func on Basic.k = Func.k

inner join 要比 right join 好一些
gao__910 2009-12-11
  • 打赏
  • 举报
回复
数据多了话,可以看出哪个好,不过用inner join好
忆轩辕 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 aoyihuashao 的回复:]
引用 6 楼 colacat911 的回复:
这里结果一样是因为你的数据完全匹配


肯定是一样了,主键外键关系。
[/Quote]

我只是想说,right join和inner join是2种不同的连接,你这边一样不代表这2种写法等同,只有在你这种完全匹配的情况下结果才相同
  • 打赏
  • 举报
回复
Ctrl+L是个好方法
aoyihuashao 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 colacat911 的回复:]
这里结果一样是因为你的数据完全匹配
[/Quote]

肯定是一样了,主键外键关系。
Rotel-刘志东 2009-12-10
  • 打赏
  • 举报
回复
基本表Basic(int k(pk),....)
应用表Func(int k(fk),....)
--测试语句
if object_id[Basic] drop table [Basic]
create table [Basic](int k,pk varchar(20),content varchar(100))
insert [Basic] select 1,'',''
union all 2,'',''
union all 3,'',''
--查询
SELECT * FROM Basic,Func WHERE Basic.k = Func.k
----------------------------

--测试语句
if object_id[Func] drop table [Func]
create table [Func](int k,fk varchar(20),compact varchar(100))
insert [Basic] select 1,'',''
union all 2,'',''
union all 3,'',''
--执行查询
SELECT * FROM Basic RIGHT JOIN Func ON Basic.k = Func.k
分析执行计划相同
Rotel-刘志东 2009-12-10
  • 打赏
  • 举报
回复
ctr+L看一下执行计划是一样的。
忆轩辕 2009-12-10
  • 打赏
  • 举报
回复
这里结果一样是因为你的数据完全匹配
aoyihuashao 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fwacky 的回复:]
你先选中sql语句  同时按下 ctrl + L  看看!
[/Quote]

一模一样
fwacky 2009-12-10
  • 打赏
  • 举报
回复
你先选中sql语句 同时按下 ctrl + L 看看!
冷箫轻笛 2009-12-10
  • 打赏
  • 举报
回复
1. 两种方式的查询结果是不一样的,即使在某些查询中结果集一样,但是意义不同。

2. 第一种方式 跟 inner join是同效率的,如果可以的话,尽量使用
加载更多回复(2)

34,838

社区成员

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

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