各种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会产生大量是数据,是不是应该避免使用这个啊?

或者有其他更加合适的方法?
...全文
1584 22 打赏 收藏 转发到动态 举报
写回复
用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)
[JAVA工程师必会知识点之并发编程]1、现在几乎100%的公司面试都必须面试并发编程,尤其是互联网公司,对于并发编程的要求更高,并发编程能力已经成为职场敲门砖。2、现在已经是移动互联和大数据时代,对于应用程序的性能、处理能力、处理时效性要求更高了,传统的串行化编程无法充分利用现有的服务器性能。3、并发编程是几乎所有框架的底层基础,掌握好并发编程更有利于我们学习各种框架。想要让自己的程序执行、接口响应、批处理效率更高,必须使用并发编程。4、并发编程是中高级程序员的标配,是拿高薪的必备条件。 【主讲讲师】尹洪亮Kevin:现任职某互联网公司首席架构师,负责系统架构、项目群管理、产品研发工作。10余年软件行业经验,具有数百个线上项目实战经验。擅长JAVA技术栈、高并发高可用伸缩式微服务架构、DevOps。主导研发的蜂巢微服务架构已经成功支撑数百个微服务稳定运行【推荐你学习这门课的理由:知识体系完整+丰富学习资料】1、 本课程总计122课时,由五大体系组成,目的是让你一次性搞定并发编程。分别是并发编程基础、进阶、精通篇、Disruptor高并发框架、RateLimiter高并发访问限流吗,BAT员工也在学。2、课程附带附带3个项目源码,几百个课程示例,5个高清PDF课件。3、本课程0基础入门,从进程、线程、JVM开始讲起,每一个章节只专注于一个知识点,每个章节均有代码实例。 【课程分为基础篇、进阶篇、高级篇】一、基础篇基础篇从进程与线程、内存、CPU时间片轮训讲起,包含线程的3种创建方法、可视化观察线程、join、sleep、yield、interrupt,Synchronized、重入锁、对象锁、类锁、wait、notify、线程上下文切换、守护线程、阻塞式安全队列等内容。二、进阶篇进阶篇课程涵盖volatied关键字、Actomic类、可见性、原子性、ThreadLocal、Unsafe底层、同步类容器、并发类容器、5种并发队列、COW容器、InheritableThreadLocal源码解析等内容。三、精通篇精通篇课程涵盖JUC下的核心工具类,CountDownLath、CyclicBarrier、Phaser、Semaphore、Exchanger、ReentrantLock、ReentrantReadWriteLock、StampedLock、LockSupport、AQS底层、悲观锁、乐观锁、自旋锁、公平锁、非公平锁、排它锁、共享锁、重入锁、线程池、CachedThreadPool、FixedThreadPool、ScheduledThreadPool、SingleThreadExecutor、自定义线程池、ThreadFactory、线程池切面编程、线程池动态管理等内容,高并发设计模式,Future模式、Master Worker模式、CompletionService、ForkJoin等课程中还包含Disruptor高并发无锁框架讲解:Disruptor支持每秒600万订单处理的恐怖能力。深入到底层原理和开发模式,让你又懂又会用。高并发访问限流讲解:涵盖木桶算法、令牌桶算法、Google RateLimiter限流开发、Apache JMeter压力测试实战。 【学完后我将达到什么水平?】1、 吊打一切并发编程相关的笔试题、面试题。2、 重构自己并发编程的体系知识,不再谈并发色变。3、 精准掌握JAVA各种并发工具类、方法、关键字的原理和使用。4、 轻松上手写出更高效、更优雅的并发程序,在工作中能够提出更多的解决方案。  【面向人群】1、 总感觉并发编程很难、很复杂、不敢学习的人群。2、 准备跳槽、找工作、拿高薪的程序员。3、 希望提高自己的编程能力,开发出更高效、性能更强劲系统的人群。4、 想要快速、系统化、精准掌握并发编程的人群。【课程知识体系图】

34,587

社区成员

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

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