sql查询:子查询和联表查询有什么区别,效率、性能等有什么差异?

作业本_ 2015-09-15 11:11:49
例如:SELECT score,(SELECT userName FROM app_student WHERE app_score.user_id = app_student.app_user_id) userName FROM app_score
--------------------------------------------------------------------------------
SELECT app_score.score,app_student.userName FROM app_score LEFT JOIN app_student ON app_score.user_id = app_student.app_user_id

谢谢!
...全文
36897 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
weipt 2019-10-16
  • 打赏
  • 举报
回复
我的测试环境是sqlserver2008
weipt 2019-10-16
  • 打赏
  • 举报
回复
两张表,设备表和试验数据表
select DEVICEHISTORY.INFOID,(select DEVICE.DEVICENO from DEVICE where DEVICE.DEVICEID=DEVICEHISTORY.DEVICEID)DEVICENO from DEVICEHISTORY


select DEVICEHISTORY.INFOID,DEVICE.DEVICENO from DEVICEHISTORY left join DEVICE on DEVICEHISTORY.DEVICEID=DEVICE.DEVICEID

返回结果是一样的
(1768370 行受影响)
用时18秒
weipt 2019-10-16
  • 打赏
  • 举报
回复
楼主可以试一下,结果是一样的
xiaobluesky 2015-09-28
  • 打赏
  • 举报
回复
第一种尽量不要写。。 select 字段里有子查询,一个字段还好,多个字段都这样的话,外表一次查询,子查询要两次,关联的话就只需要一次就好。。 还有一种子查询,就是条件里面用in的,in后面的查询如果没有索引,会需要全表查询。
作业本_ 2015-09-15
  • 打赏
  • 举报
回复
引用 1 楼 mchdba 的回复:
1,表关联的效率要高于子查询,因为子查询走的是笛卡尔积 2,表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询
嗯,也就是说第一种子查询的形式在性能方面是优于联表查询的,而且这样写也是不会影响到查询结果的对吗?
九月茅桃 2015-09-15
  • 打赏
  • 举报
回复
1,表关联的效率要高于子查询,因为子查询走的是笛卡尔积 2,表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询
作业本_ 2015-09-15
  • 打赏
  • 举报
回复
引用 8 楼 yupeigu 的回复:
[quote=引用 7 楼 u011279706 的回复:] [quote=引用 5 楼 yupeigu 的回复:] 一般来说子查询和关联子表的性能,相对来说 关联表要好一些。 为什么呢? 主要在于优化器更加倾向于去优化 关联查询,且关联查询相对来说更易理解,语句也相对简单,所以优化效果比较好,能生成较优的执行计划。 但是,这个也不确定,性能是否好,还是要看优化器生成的执行计划,如果子查询生成的执行计划更好,那么就会更快。
谢谢!嗯性能上有一定差异,但是都不影响结果的正确性,那在正常的开发过程中更偏向于使用哪种方式呢? [/quote] 1、如果只需要返回 一个表的数据,建议用exists 或者in。 2、如果要返回2个或多个表的数据,那么就用关联。 像你上面举得例子是select子查询,如果有这种子查询,那么最好用关联,就是你举的例子。 [/quote] 嗯,明白,感谢。
LongRui888 2015-09-15
  • 打赏
  • 举报
回复
引用 7 楼 u011279706 的回复:
[quote=引用 5 楼 yupeigu 的回复:] 一般来说子查询和关联子表的性能,相对来说 关联表要好一些。 为什么呢? 主要在于优化器更加倾向于去优化 关联查询,且关联查询相对来说更易理解,语句也相对简单,所以优化效果比较好,能生成较优的执行计划。 但是,这个也不确定,性能是否好,还是要看优化器生成的执行计划,如果子查询生成的执行计划更好,那么就会更快。
谢谢!嗯性能上有一定差异,但是都不影响结果的正确性,那在正常的开发过程中更偏向于使用哪种方式呢? [/quote] 1、如果只需要返回 一个表的数据,建议用exists 或者in。 2、如果要返回2个或多个表的数据,那么就用关联。 像你上面举得例子是select子查询,如果有这种子查询,那么最好用关联,就是你举的例子。
作业本_ 2015-09-15
  • 打赏
  • 举报
回复
引用 5 楼 yupeigu 的回复:
一般来说子查询和关联子表的性能,相对来说 关联表要好一些。 为什么呢? 主要在于优化器更加倾向于去优化 关联查询,且关联查询相对来说更易理解,语句也相对简单,所以优化效果比较好,能生成较优的执行计划。 但是,这个也不确定,性能是否好,还是要看优化器生成的执行计划,如果子查询生成的执行计划更好,那么就会更快。
谢谢!嗯性能上有一定差异,但是都不影响结果的正确性,那在正常的开发过程中更偏向于使用哪种方式呢?
LongRui888 2015-09-15
  • 打赏
  • 举报
回复
另外,需要指出的是 索引会在很大程度上影响 查询的效率,所以通过分析执行计划,我们可以知道 是否缺少了索引。
LongRui888 2015-09-15
  • 打赏
  • 举报
回复
一般来说子查询和关联子表的性能,相对来说 关联表要好一些。 为什么呢? 主要在于优化器更加倾向于去优化 关联查询,且关联查询相对来说更易理解,语句也相对简单,所以优化效果比较好,能生成较优的执行计划。 但是,这个也不确定,性能是否好,还是要看优化器生成的执行计划,如果子查询生成的执行计划更好,那么就会更快。
作业本_ 2015-09-15
  • 打赏
  • 举报
回复
引用 1 楼 mchdba 的回复:
1,表关联的效率要高于子查询,因为子查询走的是笛卡尔积 2,表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询
。。 说岔纰了,谢谢。
九月茅桃 2015-09-15
  • 打赏
  • 举报
回复
引用 2 楼 u011279706 的回复:
[quote=引用 1 楼 mchdba 的回复:] 1,表关联的效率要高于子查询,因为子查询走的是笛卡尔积 2,表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询
嗯,也就是说第一种子查询的形式在性能方面是优于联表查询的,而且这样写也是不会影响到查询结果的对吗?[/quote] 子查询的性能要低于联表查询

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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