夜色灵魂 2022-12-30 20:47 采纳率: 75%
浏览 119
已结题

LEFT JOIN 嵌套子查询时速度慢的问题

tab_student 为 左表,5000 + 数据,存储三个年级的学生基本信息,通过‘入学年份’区分
yk_2020 为 右表,30000 + 数据,存储学生多次考试成绩,根据‘考试编号’区分
现要查询 2020 级学生的某次成绩,

###代码如下:

SELECT st. 学号,st. 姓名,st. 班级,sc. 总分
FROM (SELECT 学号,姓名,班级 FROM tab_student where 入学年份 = 2020) st
left join (select 学号,总分 from yk_2020 where 考试编号 =’2020313’) sc on st. 学号 = sc. 学号

存在问题,查询需要 5 秒左右。
如果使用以下代码,速度0.2秒,但不是想要的结果,因为,有的学生没有考试成绩,就会被过滤掉,不能显示左表数据。
#####

SELECT st.学号,st.姓名,st.班级,sc.总分
FROM tab_student st left join yk_2020 sc on st.学号=sc.学号
where st.入学年份=2020 and sc.考试编号=2020313

有没有办法能优化。特请指点。感激。 可以联系qq:52128402
链接:https://pan.baidu.com/s/1vWPgBppxwQaPVDWgsgD4sw?pwd=6666
提取码:6666
数据文件已传到网盘。

  • 写回答

8条回答 默认 最新

  • 游一游走一走 2022-12-31 09:03
    关注
    1. 创建索引
      CREATE INDEX index_tab_student_id ON tab_student (学号,入学年份);
      CREATE INDEX index_yk_2020_id ON yk_2020 (学号,考试编号);
      
    2. 执行查询计划确认你的索引有生效,如果还慢把结果贴出来,多半是你的索引没生效
      explain
      SELECT st.学号,st.姓名,st.班级,sc.总分
      FROM tab_student st
      LEFT JOIN yk_2020 sc ON st.学号 = sc.学号 AND sc.考试编号 = '2019123465'
      WHERE st.入学年份 = '2019'
      
    3. 这个SQL就是你要的结果啦
      SELECT st.学号,st.姓名,st.班级,sc.总分
      FROM tab_student st
      LEFT JOIN yk_2020 sc ON st.学号 = sc.学号 AND sc.考试编号 = '2019123465'
      WHERE st.入学年份 = '2019'
      
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 1月8日
  • 已采纳回答 12月31日
  • 修改了问题 12月30日
  • 修改了问题 12月30日
  • 展开全部

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看