关于SQL查询的问题

关于SQL查询的问题,sql,select,Sql,Select,我需要选择7A班学生的考试成绩,但需要查看另一个表(学生档案),以确定7A班的学生(按学生id确定)。 假设在两个表中都创建了student_id的索引,我想知道以下哪种方法更快: 方法1: select * from exam_results r where exists (select 1 from student_profile p where p.student_id = r.student_id and p.class = '7A') 方法2: select *

我需要选择7A班学生的考试成绩,但需要查看另一个表(学生档案),以确定7A班的学生(按学生id确定)。 假设在两个表中都创建了student_id的索引,我想知道以下哪种方法更快:

方法1:

select * from exam_results r
where exists
 (select 1 
  from student_profile p
  where p.student_id = r.student_id
    and p.class = '7A')
方法2:

select * from exam_results
where student_id in
 (select student_id
  from student_profile
  where class = '7A')
提前感谢,


Jonathan

如果您比较这两个查询,那么带有
EXISTS
的查询速度更快。然而,正确(通常更快)解决此类问题的方法是
加入

select r.student_id, r.other_columns
from exam_results r
inner join student_profiles s
on r.student_id = s.student_id
where s.class = '7A'

简单的回答,没关系。查询引擎将对它们进行相同的处理

个人来说,我会考虑这个语法。

select
            r.*
    from
            exam_results r
        join
            student_profile p
                on p.student_id = r.student_id
    where
           p.class = '7A'
如果省略,
内部
是隐式的

您将获得相同的性能,因为现代查询引擎已经得到了很好的开发,但我认为这种标准语法更易于扩展和阅读



如果将来扩展此查询,多个连接条件将比多个exists或ins更容易优化。

在任何现代sql引擎上,查询执行计划都是相同的。+1对于JW。我会将方法3加入到混合中,对我的表进行适当的索引,然后将其吸收并查看。@Jodrell我认为第一个查询(使用EXISTS)将花费更少的时间。这两个项目的计划将有所不同query@pratikgarg,生成结果的最佳方式对于所有3条语句都是相同的。Oracle开发人员是否开发了一个引擎,可以为所有3条语句找到最佳计划?这三个都很简单,我想是的。如果您怀疑没有,您应该创建不同的计划并发布答案。然而,我不知道OP是否在使用Oracle。我会给join方法一个+1,但exists是否更快,正如Jodrell所说,这取决于太多的因素,因此没有一个通用的答案。数据库中查询的性能取决于许多参数(索引、统计信息、满足条件的记录计数等等)。最好通过检查访问计划来优化查询。但在尝试之前,先从一种查询形式开始。我认为开发人员应该从连接查询开始,然后进行优化。