2016-06-10 82 views
0

我正在使用MySQL。我有一个名为id,name,dept_name,salary作为属性的教师表。我已经写了一个查询“找到所有其薪水比物理系至少一个导师更大的教官”作为where子句中的条件的优先顺序是什么?

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

现在这条件将首先应用?

+0

这里没有优先权的问题。有一个评估顺序问题,这不是一回事。 – EJP

+0

@EJP,你能告诉我这些记录将如何比较吗?是否每个记录都与's'或其他方式相关。 – BabyboB

回答

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视为弃用。

+0

“如果第一个条件(工资检查)失败,那么MySQL可能会跳过检查第二个条件。” ---这是完全错误的。在mysql(和任何其他成熟的RDBMS)中没有谓词顺序的概念 – zerkms

+0

@zerkms我不知道这是因为在大多数编程语言中,逻辑的顺序被保存在诸如“if”语句之类的东西中。知道评估的顺序在很多情况下都是有用的。 –

+1

“知道评估的顺序在很多情况下是有用的”---而不是DBMS。数据库比你知道的更多,并且可以对如何评估查询做出更好的决定。 – zerkms

0

正如蒂姆在他的回答中提到的那样,整个标准被考虑在哪里。我还向他评论说,我认为你所要求的是来自其他部门的导师,他们的薪水比物理部门的任何人都高。如果你有三个物理学员,每个人的薪水都不同,那么两个人的薪水比最低薪酬的物理学要高,但所有三个人的薪水可能都比学校其他人高。

这将与子查询更好地处理先找到最低的物理部门的工资,然后再寻找任何大于该值...

而且,你有它的方式,你将有一个由于没有JOIN条件,所以笛卡儿比较。将教师表中的每条记录与SECOND教师表中的每条记录进行比较(包括与其比较的记录)。

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

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'