我正在使用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';
现在这条件将首先应用?
我正在使用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';
现在这条件将首先应用?
将应用整个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视为弃用。
正如蒂姆在他的回答中提到的那样,整个标准被考虑在哪里。我还向他评论说,我认为你所要求的是来自其他部门的导师,他们的薪水比物理部门的任何人都高。如果你有三个物理学员,每个人的薪水都不同,那么两个人的薪水比最低薪酬的物理学要高,但所有三个人的薪水可能都比学校其他人高。
这将与子查询更好地处理先找到最低的物理部门的工资,然后再寻找任何大于该值...
而且,你有它的方式,你将有一个由于没有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'
这里没有优先权的问题。有一个评估顺序问题,这不是一回事。 – EJP
@EJP,你能告诉我这些记录将如何比较吗?是否每个记录都与's'或其他方式相关。 – BabyboB