WHERE子句和ON子句中的条件

时间:2012-07-05 11:17:50

标签: mysql sql

假设我有两张桌子,

   Student                           Test

Id    Name                   TestId   Type  StudentId
--    ----                   ------   ----  --------- 
1     Mark                     774    Hard     1  
2     Sam                      774    Hard     2 
3     John                     775    Easy     3

现在我必须找到那些在MySql中进行“硬”测试的学生(学生ID,姓名和证词)。

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

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'

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

3 个答案:

答案 0 :(得分:6)

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

请查看Understanding the Query Execution Plan

此外,您可以使用INDEXESWHERE子句中最常使用的列改进查询,您也可以查看关系代数。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

在性能方面,这两者大致相同。您可以使用EXPLAIN命令验证它。

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

但是,从概念上讲,如果只拉动那些较难的那些,那么请使用ON表达式。

请注意,如果您使用LEFT JOIN,这两种方法的工作方式会有所不同。如果您使用ON表达式LEFT JOIN,那么每个学生都会进行一次没有经过严格考试的学生,以及每个学生参加的每项艰苦考试的行。< / p>