はじめに
これはSQLabさんの問題を解いていきながら,ステップバイステップでSQLについて学んでいこうと思います。
トライアル編
1
- 問題
出版年(release_year)が不明の書籍一覧を取得してください。
解答・解説
- 解答
SELECT * FROM books WHERE release_year IS NULL;
-
解説
SELECT * FROM booksbooksテーブルからすべての列を取得します。WHERE release_year IS NULL;release_yearがNULLである行を条件として指定します。
ポイント
- 条件検索は
WHERE句を使います。 -
NULL値の判定にはIS NULLを使用します。 -
=や!=ではNULL値の比較ができないため注意が必要です。
2
- 問題
書籍一覧をページ数が多い順に並び替えてください。
出力項目はname(書籍名)total_page(総ページ数)です。
解答・解説
- 解答
SELECT name, total_page FROM books ORDER BY total_page DESC;
-
解説
SELECT name, total_page FROM booksbooksテーブルからnameとtotal_pageの列を取得します。ORDER BY total_page DESC;total_pageを基準に降順(大きい順)で並び替えます。
ポイント
- 特定の列を選択する際は
SELECT句でカラム名を指定します。 - 並び替えには
ORDER BY句を使用します。 - 降順に並び替える場合は
DESCを指定します。昇順(小さい順)はASCまたは省略可能です。 - ASC→ascending(昇順)、DESC→descending(降順)みたいですが、わたしはAdd(増えていく)とDecrease(減っていく)と覚えています。以下のものも覚えやすいと思います
3
- 問題
書籍一覧をカテゴリー毎に集計して多い順に、カテゴリー名は昇順に並び替えてください。データの取得件数は先頭から3件のみにしてください。
出力項目はname(カテゴリー名)とnum(書籍数)です。
解答・解説
- 解答
SELECT cat.name, COUNT(book.name) AS num FROM categories AS cat INNER JOIN book_categories AS book_cat ON cat.id = book_cat.category_id INNER JOIN books AS book ON book_cat.book_id = book.id GROUP BY cat.name ORDER BY num DESC, cat.name ASC LIMIT 3;
-
解説
SELECT cat.name, COUNT(book.name) AS num FROM categories AS cat-
categoriesテーブルをcatと別名を付け、そのname列と、book.nameの数をカウントしたものをnumとして選択します。
INNER JOIN book_categories AS book_cat ON cat.id = book_cat.category_id-
categoriesテーブルとbook_categoriesテーブルをcategory_idで内部結合します。book_categoriesテーブルをbook_catと別名を付けています。
INNER JOIN books AS book ON book_cat.book_id = book.id-
book_categoriesテーブルとbooksテーブルをbook_idで内部結合します。booksテーブルをbookと別名を付けています。
GROUP BY cat.name-
cat.nameでグループ化し、カテゴリーごとに集計します。
ORDER BY num DESC, cat.name ASC-
numを降順に、同じnumの場合はcat.nameを昇順に並び替えます。
LIMIT 3;- 先頭から3件のみ取得します。
-
ポイント
- テーブルを結合する際には
JOIN句を使用し、結合条件をONで指定します。 - 別名(エイリアス)は
ASを使って付けられます。 - 集計関数(例:
COUNT)を使用する際には、GROUP BY句でグループ化します。 - 取得件数を制限するには
LIMIT句を使用します。
4
- 問題
idが1のデータを削除後、イベント一覧を取得してください。
解答・解説
- 解答
DELETE FROM events WHERE id = 1; SELECT * FROM events;
-
解説
DELETE FROM events-
eventsテーブルからデータを削除します。
WHERE id = 1;-
idが1の行を削除対象として指定します。
SELECT * FROM events;-
eventsテーブルの全データを取得し、削除が正しく行われたか確認します。
-
ポイント
- データを削除する際は
DELETE FROM文を使用します。 - 削除条件は
WHERE句で指定し、条件を明確にすることで誤ったデータ削除を防ぎます。 - データ操作後に結果を確認するために
SELECT文を使います。
おわりに
今回はトライアル編の問題の解き,解説を行いました。これらの問題を通して、SQLの基本的な操作であるデータの取得、並び替え、集計、削除について学ぶことができました。
今後も引き続き、より高度なSQLの機能や実践的なクエリの書き方について学んでいく予定です。