SQL Puppy数据库:尝试使用内部联接进行特定查询,卡住?

时间:2012-12-01 22:16:07

标签: mysql database

我有一个示例数据库,我正在使用它来学习SQL,我正在尝试编写一个查询来选择小狗,以便根据以下标准显示它知道的技巧:

狗id&名称 诡计与娱乐名称 学习日期&技能水平

以下是我的数据库图表的图片:

dbdiagram

非常感谢任何帮助,提前谢谢

4 个答案:

答案 0 :(得分:1)

首先,你永远不应该选择*(返回所有列),具体说明你想要的列。这样,将来,如果某个表发生更改并删除了列,它将立即崩溃,您将立即知道为什么失败与猜测相关。

接下来,在编写查询时,在表之间使用显式连接而不考虑条件。这只是你在SQL中知道关系如何工作......以下内容适用于你的图表。我正在使用“别名”(P代表小狗,PT代表puppy_trick等)来帮助简化查询的长输入。

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而不经过所有其他人。

现在,标准。一旦你掌握了如何获得a-b-c-d-e关系的基础,你在寻找什么。您可以通过将“AND”条件添加到表的相应联接来应用它。例如,如果您正在寻找“跳过箍”的技巧,那就是与Trick表相关联的实际描述,所以从上面

Join Trick T
   on PT.TrickID = T.TrickID
   AND T.TrickName = 'Jump through hoop'

如果你想要一个特定的小狗的东西,因为那是根级(即:查询中的第一个表),这将在所有上述结尾添加一个“WHERE”子句......

(因此,在加入Kennel之后)

                      JOIN Kennel K
                         on TK.TrickKennelID = K.TrickKennelID
   WHERE
      P.PuppyName = 'Spot'

答案 1 :(得分:0)

这是一个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个表。

答案 2 :(得分:0)

您需要使用链接表来加入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 *选择您真正想要的字段。

答案 3 :(得分:0)

 Select PuppyName, TrickName
 From Puppy 
 Join Puppy_Trick
 On Puppy.PuppyID = Puppy_Trick.PuppyID
 Join Trick
 On Puppy_Trick.PuppyTrickID = Trick.TrickID