下面的SQL查询的说明

时间:2016-07-26 10:38:17

标签: mysql sql database

下面是sql查询,用于选择所有教师的名字,这些教师的薪水至少超过一名教师。(即留下最少付费的一名教师)。该查询来自Silberchatz,Korth的Database System Concepts。但是我无法将查询的使用方式视为一种,除此之外,这就是以这种方式进行查询的必要条件。

我猜你可以看到表格。

select distinct T.name
from instructor as T,instructor as S
where T.salary > S.salary;

2 个答案:

答案 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教师。