Mysql WHERE条款和ON条款中的条件

Mysql WHERE条款和ON条款中的条件,mysql,sql,Mysql,Sql,假设我有两张桌子 Student Test Id Name TestId Type StudentId -- ---- ------ ---- --------- 1 Mark 774 Hard 1 2 Sam 774

假设我有两张桌子

   Student                           Test

Id    Name                   TestId   Type  StudentId
--    ----                   ------   ----  --------- 
1     Mark                     774    Hard     1  
2     Sam                      774    Hard     2 
3     John                     775    Easy     3
现在我必须找到那些在MySql中进行了“硬”测试的学生(学生id、姓名和testid)

哪一个更好(在性能方面)


我可以知道原因吗?(假设有数百万学生和数百万种测试)

这些查询完全相同,应该有完全相同的查询计划。执行时间不太可能有任何可测量的差异

但是,如果将
JOIN
更改为
LEFT JOIN
,则会有不同。在这种情况下,您需要使用第一个版本。第二个版本不会给出相同的结果。

两者都相同,但性能不同。如果您想选择性能更好的查询,我建议您使用
EXPLAIN PLAN
进行查询

看看


此外,您还可以使用
索引改进查询,对于
WHERE
子句中使用频率最高的列,您还可以查看关系代数。

从性能角度看,这两种方法大致相同。您可以使用EXPLAIN命令验证这一点

因此,问题变成了数据模型表达的清晰性。这看起来像是天使在大头针上跳舞。但是,如果您要使用JOIN命令提取所有测试结果,然后请求子集,请使用
WHERE type='hard'

但是,如果从概念上讲,你只是在做一些困难的事情,那么就按照
的公式去做


请注意,如果使用
左联接
,这两种方法的工作方式将不同。如果将
公式与
左连接一起使用,您将为每个没有参加过硬测试的学生获得一行,以及每个学生参加过的硬测试获得一行。如果您通过分析器运行查询,执行计划中的差异是什么?(附带问题:
Test
User
真的是多对一吗?也许我不知道你的领域,但我认为会有有限数量的测试实体和有限数量的用户实体,以及两者之间的多对多关系。真的有数百万个唯一的测试实体吗?)@David是的,这是一个多对多的关系,但我的示例没有显示出来…是的,可能我说了数百万个唯一的实体有点夸张了。但我说有许多唯一的测试类型的原因是,我认为对于少数唯一的实体,两个查询都有相同的性能,但对于大量的实体,差异可能很大。@vyegorov请正确阅读问题…我不是说左外联接。我还知道where子句在联接后执行…我只想知道性能,我想使用explain plan,但我可以作为web服务运行查询。(即,我键入查询,当我单击run时,将调用一个web服务,返回结果)。所以我没有解释计划的权限。而且,我只有100多条记录。所以性能上的差异不会很大。您可以创建本地数据库,创建并填充表,然后创建要使用的语句,并测试它们哪一条性能最好。@kannan:“而且,我只有100多张唱片。所以表现上的差异不会太大。”如果差异不会太大,为什么你会在意哪个更快?
1.Select student.id,student.name,test.testid 
  from student 
  join test 
  on test.studentid=student.id and test.type='hard'

2.Select student.id,student.name,test.testid 
  from student 
  join test 
  on test.studentid=student.id 
  where test.type='hard'