下面是sql查询,用于选择所有教师的名字,这些教师的薪水至少超过一名教师。(即留下最少付费的一名教师)。该查询来自Silberchatz,Korth的Database System Concepts。但是我无法将查询的使用方式视为一种,除此之外,这就是以这种方式进行查询的必要条件。
我猜你可以看到表格。
select distinct T.name
from instructor as T,instructor as S
where T.salary > S.salary;
答案 0 :(得分:2)
编写该查询的另一种方法是......
SELECT DISTINCT
T.name
FROM
instructor AS T
CROSS JOIN
instructor AS S
WHERE
T.salary > S.salary
一般来说,CROSS JOIN
是一个坏主意。在这里,他们是一个非常糟糕的主意。如果您有100名教师,您可以评估4950种不同的组合,以获得99名教师的唯一列表
- Instructor001有99名教师,他们的薪酬较低
- Instructor002有98名教师,他们的薪酬较低
- ......
- Instructor100有00名教师,他们的薪水较低
- 总计4950种组合
如果您有1000名教师,您可以评估499500种组合,以获得999名教师的唯一列表。
更好的主意是......
SELECT
i.Name
FROM
instructor i
WHERE
i.salary > (SELECT MIN(salary) FROM instructor)
或者...
SELECT
i.Name
FROM
instructor i
WHERE
i.Name <> (SELECT Name FROM instructor ORDER BY Salary ASC LIMIT 1)
或者...
SELECT
i.*
FROM
instructor i
EXCEPT
SELECT
i.*
FROM
instructor i
ORDER BY
Salary ASC
LIMIT 1
所以,你是对的,没有必要(或者甚至是个好主意)这样做。
答案 1 :(得分:0)
让我们稍微重构一下这个查询。
SELECT DISTINCT T.name
FROM instructor as T
JOIN instructor as S ON T.salary > S.salary;
它完全相同,但它用不同的语法表达(并且更有效)。这样它更具可读性。
现在,T
表是您查询的 base 表。接下来,您在S
别名下加入相同的表格,以匹配其他付费较低的教师(T.salary > S.salary
),这意味着您从T
结果行中排除S
}讲师不存在。
最后,您在DISTINCT
子句中使用SELECT
关键字,以便不会获得重复的T
教师,这些教师有多个薪酬较低的S
教师。