gpt4 book ai didi

mysql - 真的很难理解这个查询

转载 作者:行者123 更新时间:2023-11-29 11:56:49 24 4
gpt4 key购买 nike

以下查询应该返回“预订了所有船只的水手”

这是 mySQL 代码

SELECT S.sname
FROM Sailors S
WHERE NOT EXISTS
((SELECT B.bid
FROM Boats B)
Except
(SELECT R.bid
FROM Reserves R
WHERE R.sid = S.sid))

我只是...不知道如何阅读它。据我所知,“NOT EXISTS”后面的子查询应该返回 Boats 表上所有记录的船 id (bid)。因此,Except后面的查询应该返回所有已预订的船只的船只ID...这意味着如果有人预订了所有船只,则不应该返回任何内容,这意味着NOT EXISTS将评估为true,并且它将只要说出那个水手的名字就可以了?我认为最后一部分让我感到困惑......它最终如何返回水手的名字?

最佳答案

我们有一些可以由水手预订的船,水手已经注册并且我们知道他们,所以表的结构是:

[Table: Boats]          [Table: Sailors]        [Table: Reserves]
+-----+--------+ +-----+----------+ +-----+-----+-----+
| bid | bname | | sid | sname | | rid | bid | sid |
+-----+--------+ +-----+----------+ +-----+-----+-----+
| 1 | Boat 1 | | 1 | Sailor 1 | | 1 | 1 | 1 |
| 2 | Boat 2 | | 2 | Sailor 2 | | 2 | 2 | 3 |
| 3 | Boat 3 | | 3 | Sailor 3 | +-----+-----+-----+
+-----+--------+ +-----+----------+

在上面的数据中,当你需要知道哪些船没有被预订时;您可以使用以下查询,该查询将为您提供出价 => 3:

SELECT B.bid  FROM Boats B
EXCEPT
SELECT R.bid FROM Reserves R;

当您需要知道哪些船没有被水手预订时;您可以使用以下查询,为 sid = 3 提供 bid => [1, 3]:

SELECT B.bid  FROM Boats B
EXCEPT
SELECT R.bid FROM Reserves R WHERE R.[sid] = 3;

当水手预订所有船只时,上述查询将没有结果,所以NOT EXISTS(<above query>)将会是真的。现在您可以使用上面的查询来查找预订所有船只的水手,如下所示:

SELECT S.sname
FROM Sailors S
WHERE NOT EXISTS (
SELECT B.bid FROM Boats B
EXCEPT
SELECT R.bid FROM Reserves R
WHERE R.[sid] = S.[sid]);

所以如果 Reserves 的数据变成这样:

 [Table: Reserves]
+-----+-----+-----+
| rid | bid | sid |
+-----+-----+-----+
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 3 | 1 |
+-----+-----+-----+

您的查询将给出结果 Sailor 1 ;).

<小时/>

更多信息:
<强> EXCEPT 返回左侧输入查询中未由右侧输入查询输出的不同行。
<强> EXISTS :指定子查询来测试行是否存在。

关于mysql - 真的很难理解这个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33061631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com