我正在使用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';
现在首先应用哪个条件?
答案 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'