SQLを学習するために使用しているサンプルデータベースがあり、子犬を選択するクエリを作成して、次の基準で認識されているトリックを表示しようとしています。
犬のIDと名前トリックのIDと名前学習日とスキルレベル
これが私のデータベース図の写真です:
どんな助けでも本当にありがたいです、事前に感謝します
まず、select * (すべての列を返す) を実際に行うべきではありません。必要な列を特定してください。このようにして、将来、テーブルが変更されて列が削除された場合、すぐにクラッシュし、推測ではなく何かが失敗した理由がすぐにわかります。
次に、クエリの作成時に、条件を考慮せずにテーブル間の明示的な結合を使用します。これは、SQL でリレーションシップがどのように機能するかを知っているためです。次の図は、図で機能します。「エイリアス」(puppy の場合は P、puppy_trick の場合は 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
私が持っているフォーマット/配置に注意してください。ある犬から次の犬への関係をチェーンとして見るのに役立つことがわかりました... 他のすべてを通過せずにパピーから犬小屋にたどり着くことはできません。
さて、基準。abcde関係を取得する基本的な方法がわかったら、何を探していますか。テーブルへのそれぞれの結合に「AND」条件を追加することで、これを適用できます。例えば「フープをくぐる」のトリックを探している場合、それは実際の説明のトリック表に関連付けられているので、上記から
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'
Select PuppyName, TrickName
From Puppy
Join Puppy_Trick
On Puppy.PuppyID = Puppy_Trick.PuppyID
Join Trick
On Puppy_Trick.PuppyTrickID = Trick.TrickID
これが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つのテーブルをリンクするのに役立ちます。
パピーテーブルとトリックテーブルを結合するには、リンクテーブルを使用する必要があります...
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 *
次に、実際に必要なフィールドを選択する代わりに。