以下是sql查询,用于选择所有导师的姓名,他们的薪水至少超过一位导师(这是留下最少薪酬的导师)。此查询来自Korth Silberchatz的Database System Concepts。但是我无法想象查询的使用方式,除此之外,就是这样做的必要条件。下面的SQL查询的说明
你可以想像我猜的表。
select distinct T.name
from instructor as T,instructor as S
where T.salary > S.salary;
以下是sql查询,用于选择所有导师的姓名,他们的薪水至少超过一位导师(这是留下最少薪酬的导师)。此查询来自Korth Silberchatz的Database System Concepts。但是我无法想象查询的使用方式,除此之外,就是这样做的必要条件。下面的SQL查询的说明
你可以想像我猜的表。
select distinct T.name
from instructor as T,instructor as S
where T.salary > S.salary;
书面查询的另一种方法是......
SELECT DISTINCT
T.name
FROM
instructor AS T
CROSS JOIN
instructor AS S
WHERE
T.salary > S.salary
一般CROSS JOIN
s为一个坏主意。在这里他们是一个非常糟糕的主意。如果你有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
所以,你说得对,这不是必要(或甚至一个好主意)这样做。
让我们稍微重构一下这个查询。
SELECT DISTINCT T.name
FROM instructor as T
JOIN instructor as S ON T.salary > S.salary;
它完全一样的东西,但它表达不同的语法(并更有效地)。这样它更具可读性。
现在,T
表是基地表,您查询。接下来,您加入S
别名下的同一个表,以便与其他付费较少的教师(T.salary > S.salary
)匹配,这意味着您从T
排除了S
指导教师不存在的结果行。
在最后你使用DISTINCT
关键字SELECT
条款,为了不要让复制T
教官其中有一个以上的少支付S
教练。
这是一个交叉连接,请参阅附加链接的解释:http://stackoverflow.com/questions/3538225/how-does-select-from-two-tables-separated-by-a-comma-work-select- from-t1-t2 –