クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

SQLで欲しい行だけを取り出す

このレッスンのあとで: 欲しい行だけを、SELECT 文で取り出せる。

50分のレッスンコマンド8件MySQL と phpMyAdmin のラボ:ショップのデータベースで SQL を練習する

数百の商品から1つを探す

SQLの SELECT 文は、データベースの表から、欲しい列と欲しい行だけを取り出す命令です。WHERE で行を絞り、ORDER BY で並べ、LIMIT で件数を切ります。

ネットショップには、商品が何千もあります。でも、画面に出るのは「1,000円以下の本」のような、自分が探した分だけです。その裏で働いているのが、この命令です。

このレッスンのゴール

メモ

欲しい行だけを、SELECT 文で取り出せる。

キーワード

ことばいみれい
クエリデータベースへの問い合わせの文
SELECT見せる列を決める句SELECT name
WHERE条件に合う行だけを残す句WHERE price < 10
ORDER BY行の順番を決める句ORDER BY price
LIMIT結果を決めた行数で切る句LIMIT 3
NULL値がないことを表す印

学生が入力するセルは、このプレビューでは空白です。

SELECT と FROM で列を選ぶ

クエリは、いくつかの句を並べて書きます。SELECT は見せる列、FROM は読む表を決めます。

SELECT * の * は「すべての列」です。必要な列だけを書くほうが、読みやすく、速くなります。次の表は、音楽アプリの曲の一覧です。

試す: 新しい曲を探す

コード: sql
-- 2022年以降の曲を探します。
SELECT title, artist, released FROM songs
WHERE released >= 2022;
-- 再生回数が 7000 回以上の曲を探す形に変えてみましょう。

WHERE は条件に合う行を残す

WHERE のあとに条件を書くと、条件が本当になる行だけが残ります。比べるときは、次の記号を使います。

文字を比べるときは、シングルクォートで囲みます。AND は両方、OR はどちらか、NOT は反対です。

例: 比べる記号

書き方意味例
=等しいartist = 'ソラ'
<>等しくないartist <> 'ソラ'
< と >小さい、大きいplays > 5000
<= と >=以下、以上released >= 2022
BETWEEN2つの値のあいだ(両端を含む)plays BETWEEN 4000 AND 8000

学生が入力するセルは、このプレビューでは空白です。

始める前に

メモ

上のバーの Start the lab を押し、マシンが動き出すまで待ってください。ターミナルを開き直したときは、最初の2つの Run をもう一度押します。

証明書を受け入れる設定

コマンド
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnf

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

ショップ用の短い名前

コマンド
alias sql='mariadb -h db -u student -pstudent shop -t -e'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

10ドル未満の商品

コマンド
sql "SELECT name, price FROM products WHERE price < 10 ORDER BY price"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

AND と OR で条件をつなぐ

AND でつなぐと、条件がどちらも本当の行だけが残ります。OR でつなぐと、どちらか一方が本当なら残ります。

次の Run は、カテゴリ6(アウトドア)の商品のうち、在庫があるものだけを探します。在庫が0の商品は消えます。

在庫があるアウトドア用品

コマンド
sql "SELECT name, price, stock FROM products WHERE category_id = 6 AND stock > 0 ORDER BY price"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

LIKE は文字の一部で探す

名前の一部しかわからないときは、LIKE を使います。% は「何文字でもよい」という意味です。

name LIKE 'Wooden%' は、Wooden で始まる名前です。'%Set%' なら、名前のどこかに Set が入っています。

名前に Wooden が入る商品

コマンド
sql "SELECT name FROM products WHERE name LIKE '%Wooden%' ORDER BY name"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

NULL は IS NULL で探す

NULL は、値がないことを表す印です。0でも空の文字でもありません。

NULL は何とも等しくありません。だから phone = NULL は、どの行にも当てはまりません。探すときは IS NULL と書きます。

電話番号のない顧客の数

コマンド
sql "SELECT COUNT(*) AS no_phone FROM customers WHERE phone IS NULL"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

まちがった書き方を試す

コマンド
sql "SELECT COUNT(*) AS no_phone FROM customers WHERE phone = NULL"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある間違い

注意

phone = NULL は、エラーにならず、何も見つけません。結果は0件です。動いてしまう間違いが、一番見つけにくいものです。NULL を探すときは、必ず IS NULL を使います。

ORDER BY と LIMIT は一組

ORDER BY は並べる列を決めます。小さい順が標準で、DESC を付けると大きい順です。

LIMIT 3 は、最初の3行だけを返します。順番がなければ「最初の3行」に意味がないので、LIMIT は ORDER BY と一緒に使います。

試す: 人気の曲を2つ

コード: sql
-- 再生回数の多い順に、上位2曲を出します。
SELECT title, plays FROM songs
ORDER BY plays DESC
LIMIT 2;
-- 上位3曲にして、ASC で一番少ない曲も見てみましょう。

一番高い商品を3つ

コマンド
sql "SELECT name, price FROM products ORDER BY price DESC LIMIT 3"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

さらに挑戦: ページを分ける

ショップのサイトは、商品を安い順に、1ページに5件ずつ表示します。3ページ目は LIMIT 5 OFFSET 10 と書きます。この OFFSET は、最初の何行を飛ばすかです。

ショップには、価格が 19.99 の商品が2つあります。ORDER BY price だけだと、この2つの順番がページごとに入れかわるかもしれません。ORDER BY price, id にすると、なぜ安全になりますか。

このラボとソースについて: MySQL と phpMyAdmin のラボ:ショップのデータベースで SQL を練習する

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。