where子句中条件的优先级是什么?

时间:2016-06-10 02:27:04

标签: mysql

我正在使用MySQL。我有一个名为讲师的表,其中包含id,name,dept_name,salary作为属性。我写了一个查询,找到所有教师的工资大于物理系的至少一名教师。如

select t.name, t.dept_name, t.salary
from instructor t, instructor s
where t.salary > s.salary and s.dept_name='physics';

现在首先应用哪个条件?

2 个答案:

答案 0 :(得分:2)

将应用整个WHERE条件,这意味着为了使记录显示在结果集中,它必须满足工资和部门要求。

您的查询看起来几乎正确,但您可能希望包含DISTINCT以确保不会在结果集中多次报告相同的讲师:

select distinct t.name, t.dept_name, t.salary
from instructor t
inner join instructor s
    on t.salary > s.salary and s.dept_name='physics'

您会注意到我还使用显式inner join替换了隐式连接语法。你应该避免将逗号放入from子句中,因为这是一种非常古老的学校连接方式,被现代RDBMS认为已弃用。

答案 1 :(得分:0)

正如蒂姆在答案中提到的那样,考虑整个标准。我还向他评论说,我认为你要求的是来自其他部门的教练,他们的薪水比物理系的任何人都要高。如果你有三个人在物理学,都有不同的工资,那么两个人的工资大于最低薪的物理,但所有3人可能比学校里的其他人都高。

使用子查询可以更好地处理,以便首先找到最低的物理部门薪水,然后查找大于该值的任何人......

此外,你拥有它的方式,你将进行笛卡尔比较,因为没有JOIN条件。将讲师表中的每条记录与SECOND讲师表中的每条记录进行比较(包括与之比较的记录。)

要解决此问题,下面别名中的第二个是预先计算物理系最低工资的ONCE,然后将该一个答案应用于物理系不在的所有其他教师工资。

select 
      t.name, 
      t.dept_name, 
      t.salary
   from 
      instructor t,
      ( select min( ps.salary ) PhysicsLowest
           from instructor ps
           where ps.dept_name='physics' ) as Phys
   where
          t.salary > Phys.PhysicsLowest
      AND NOT t.dept_name = 'physics'