我有一个用于学习 SQL 的示例数据库,并且正在尝试编写一个查询来选择小狗来显示它知道的技巧,给定以下条件:
狗 ID 和名称 技巧 ID 和名称 学习日期和技能水平
这是我的数据库图的图片:
非常感谢任何帮助,在此先感谢
首先,您永远不应该真正选择 *(返回所有列),具体说明您想要的列。这样,将来,如果表发生更改并删除了列,它将立即崩溃,您将立即知道为什么某些事情失败了而不是猜测。
接下来,在编写查询时,在表之间使用显式连接,而不考虑条件。这只是为了让您了解 SQL 中的关系是如何工作的……以下内容适用于您的图表。我正在使用“别名”(P 表示小狗,PT 表示小狗技巧等)来帮助简化查询的长输入。
select
P.puppyID,
P.PuppyName,
P.Breed,
PT.TrickID,
PT.SkillLevel,
PT.DateLearned,
T.TrickName,
TK.KennelName,
TK.KennelAddress
from
Puppy P
JOIN Puppy_Trick PT
on P.PuppyID = PT.PuppyID
JOIN Trick T
on PT.TrickID = T.TrickID
JOIN Trick_Kennel TK
on T.TrickID = TK.TrickID
JOIN Kennel K
on TK.TrickKennelID = K.TrickKennelID
注意我的格式/对齐方式。我发现它有助于将一个与下一个的关系视为一条链……如果不经过所有其他人,就无法从 Puppy 到 Kennel。
现在,标准。一旦你了解了如何获得 abcde 关系,你在寻找什么。您可以通过将“AND”条件添加到表的相应连接来应用它。例如,如果您正在寻找“Jump through hoop”的技巧,它与实际描述的技巧表相关联,所以从上面
Join Trick T
on PT.TrickID = T.TrickID
AND T.TrickName = 'Jump through hoop'
如果您想要特定小狗的东西,因为那是根级别(即:查询中的第一个表),那将在上述所有内容的末尾添加一个“WHERE”子句......
(所以,加入犬舍后)
JOIN Kennel K
on TK.TrickKennelID = K.TrickKennelID
WHERE
P.PuppyName = 'Spot'
这是一个 SQL 查询:
SELECT *
From Puppy As p, Trick as t, Pappy_Trick as pt
Where
p.PuppyID = pt.PuppyId AND t.TrickID = pt.TrickID
AND p.PuppyID = 'value' AND PuppyName = 'value' AND t.TrickID = 'value' AND TrickName = 'value' AND DateLearned = 'value' AND SkillLevel = 'value';
重要的是 where 子句中的第一个条件
p.PuppyID = pt.PuppyId AND t.TrickID = pt.TrickID
这有助于链接 3 个表。
您需要使用链接表来加入 Puppy 和 Trick 表...
SELECT *
FROM Puppy AS P
INNER JOIN Puppy_Trick AS PT ON P.PuppyID = PT.PuppyID
INNER JOIN Trick AS T ON T.TrickID = PT.TrickID
然后,而不是SELECT *
选择您真正想要的字段。
Select PuppyName, TrickName
From Puppy
Join Puppy_Trick
On Puppy.PuppyID = Puppy_Trick.PuppyID
Join Trick
On Puppy_Trick.PuppyTrickID = Trick.TrickID