| English | 意味 |
|---|---|
| SQL/ˌes kjuː ˈel/ | 構造化クエリ言語(SQL) |
| JOIN/dʒɔɪn/ | ジョイン |
| GROUP BY/ɡruːp baɪ/ | グループ化 |
二つの異なる科目が同じタイトルを持つ
- 二つの科目がどちらも「Robotics」と呼ばれています。タイトルのみでグループ化すると、それらの登録を合体させ、異なる科目であることを隠してしまいます。
- SQL は、あなたが望むデータ結果を記述します。妥当と思われるカウントを信用する前に、行の同一性と期待される出力を確認してください。
ジョインにおける関係性を追跡する
- JOIN は、
e.course_id = c.idなどの関係性を用いて行を結合します。意図した関係性を明示的に記述してください。 - クロスジョインは、片側のすべての行を他方のすべての行とペアにします。SQLite では、制約のないジョインがその積生成物产生することを許容しますが、他のSQLシステムは欠落したジョイン条件を拒否することがあります。
SQLiteにおいて、制約のないジョインは3つのコースと3つの登録を結びつけます。このジョインが生成できるペアはいくつですか?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
後続のフィルタリングが行われる前のクロス積は、3 × 3 の行数を持ちます。
登録数がゼロの科目を保持する
- LEFT JOINでは、一致する履修がないコースもすべて保持されます。一致しない履修のフィールドはnullになります。
- nullを除外する
e.student_idを使用し、保持された未一致行もカウントしてしまうCOUNT(*)は使用しないでください。空のコースにはゼロが報告されるべきです。
左結合された関連しない科目について、 enrolment がゼロであることを正しくカウントする式はどれですか?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
関連していないnullableフィールドのCOUNTはnullを除きますが、COUNT(*)は保持された行をカウントします。
既知の答えを持つクエリを実行する
- この完全なスクリプトをローカルのSQLiteデータベースで実行してください。Roboticsの2つのコースは異なるIDを持ち、Artには履修がありません。
- GROUP BY でコースIDとタイトルの両方に基づいてグループ化します。期待される行は
(7, Robotics, 1)、(8, Robotics, 2)、(9, Art, 0)です。
CREATE TABLE courses (id INTEGER PRIMARY KEY, title TEXT NOT NULL);
CREATE TABLE enrolments (student_id INTEGER, course_id INTEGER);
INSERT INTO courses VALUES (7, 'Robotics'), (8, 'Robotics'), (9, 'Art');
INSERT INTO enrolments VALUES (1, 7), (1, 8), (2, 8);
SELECT c.id, c.title, COUNT(e.student_id) AS enrolled
FROM courses AS c
LEFT JOIN enrolments AS e ON e.course_id = c.id
GROUP BY c.id, c.title
ORDER BY c.id;
コースの識別子とタイトルでグループ化する句を完成させなさい:____ c.id, c.title
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
GROUP BYはグループを定義します。IDを含めることで、タイトルが同じでも異なるコースを分離できます。
完全なクエリは、科目ID 7、8、9に対してそれぞれどのような enrolment カウントを返しますか?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
サンプルでは、7に1件、8に2件、9には関連がありません。
異なる段階で行とグループをフィルタリングする
WHEREはグループ化之前に入力行をフィルタリングします。HAVINGはCOUNT(e.student_id) >= 2などの条件を使用してグループをフィルタリングします。- この例では、ORDER BYの前にHAVING条件を追加すると、コース 8 のみが表示されます。WHEREで
e.student_idをフィルタリングすると、保持したいはずの未一致行が削除されてしまいます。
どの句が、登録学生が最低2人以上いるグループのみをフィルタリングするか?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
HAVINGはグループに対して条件を適用し、WHEREは入力行をフィルタリングします。
カウント例を用いて、WHEREとHAVINGの使い分けを説明してください。
難易度 3/5 · 200 コイン + 今日初回完了時に小ボーナス付与
WHEREは行をフィルタリングし、HAVINGは各グループのカウントを検証します。
エッジケースを使用して結果を確認する
- 重複したタイトル、一致なし、複数一致が既知のカウントと一致するか確認してください。見かけ上妥当な結果だけでは不十分です。
- 選択されたフィールド、ジョイン条件、グループ化、カウントについて説明してください。重複する関係行が有効か、スキーマによって防止すべきかを判断してください。
関係に基づいて結合し、アイデンティティでグループ化し、意図したものをカウントします。小さな既知のデータセットは、誤ったクエリの可視化に役立ちます。
妥当な推計値は、SQLクエリが正しいことの証拠として十分です。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
ゼロ一致や重複したタイトルを含む、既知の期待される行数と比較してください。
タイトルでのみグループ化すると、2つのロボット工学コースが別々のグループとして扱われます。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
同一タイトルのものは一つのグループとなります。コースの固有IDでもグループ化してください。