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

無料レッスン

欲しい行を取り出す

このレッスンのあとで: 必要な行を、データベースに頼んで取り出せる。

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

保証が切れたパソコンはどれ

会社のヘルプデスクに、こんな問い合わせが来ました。2023年より前に買ったパソコンはどれで、誰が使っていますか。

表計算ソフトなら、画面をスクロールして目で探します。データベースなら、一瞬で答えます。

必要なのは、データベースに分かる形で質問することだけです。

このレッスンのゴール

メモ

必要な行を、データベースに頼んで取り出せる。

重要な言葉

ことばいみれい
クエリSQL でデータベースにする質問
句クエリの一部分。決まった言葉で始まるWHERE
条件行が通るか落ちるかを決めるテストprice < 3000
結果クエリが返してくる行
ワイルドカード何の文字にでも当てはまる、パターンの記号%
NULL値がないことを表す印

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

WHERE は通る行を残す

クエリは SELECT で始まり、見たい列を並べます。FROM で表を指します。

WHERE は条件を付けます。条件を通った行だけが、結果に残ります。条件は AND と OR でつなぎます。

文字はシングルクォートで囲みます。数字は囲みません。

まず準備の2行を Run します。前回と同じですが、もう一度実行しても害はありません。

証明書を受け入れる設定

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

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

ショップ用の短い名前

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

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

文字を比べる

コマンド
sql "SELECT first_name, city FROM customers WHERE country = 'France' ORDER BY city, first_name"

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

2つの条件を同時に

コマンド
sql "SELECT name, price FROM products WHERE category_id = 4 AND price < 30 ORDER BY price"

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

例: 使える条件

書き方意味例
= <>等しい、等しくないcountry = 'Spain'
< <= > >=小さい、大きいprice < 30
BETWEEN範囲の中。両端を含むstock BETWEEN 5 AND 10
LIKEパターンに合う。% は任意の文字name LIKE '%Set%'
IS NULL値がないphone IS NULL

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

パターンで名前を探す

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

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

在庫が5から10の商品

コマンド
sql "SELECT name, stock FROM products WHERE stock BETWEEN 5 AND 10 ORDER BY stock, name"

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

NULL は「ない」で、ゼロではない

電話番号を持たない顧客がいます。その列には NULL が入っています。何も分かっていないという印です。

NULL は何とも等しくなりません。NULL どうしも等しくありません。だから = NULL は1行にも合いません。

代わりに IS NULL で聞きます。2つを実行して比べましょう。

電話のない顧客を数える

コマンド
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 で、電話のない行が見つかると思いがちです。1行も見つからず、警告も出ません。値がないものは何とも等しくないからです。必ず IS NULL か IS NOT NULL と書きます。

ORDER BY と LIMIT で整える

表には決まった順番がありません。順番が大事なら、ORDER BY で指定します。DESC は大きい順です。

LIMIT 3 は、結果の最初の3行だけを残します。OFFSET 2 は、先に2行を飛ばします。

LIMIT は ORDER BY と一緒に使います。順番がなければ、「最初の3行」に意味はありません。

安い方から3つの商品

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

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

2つ飛ばして、2つ取る

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

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

例: クエリを読む順番

順句データベースがすること
1FROM表を選ぶ
2WHEREテストに落ちた行を捨てる
3SELECT指定した列だけを残す
4ORDER BY行を並べる
5LIMIT頼まれた数に切る

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

試す: 部署でパソコンを探す

コード: sql
-- 法務か営業のパソコンを探します。
SELECT tag, model, dept FROM pcs
WHERE dept = '法務' OR dept = '営業';
-- 2024年以降に買ったパソコンを探す形に変えてみましょう。

試す: 一番高いパソコン

コード: sql
-- 一番高い3台を、高い順に出します。
SELECT tag, price FROM pcs
ORDER BY price DESC
LIMIT 3;
-- DESC を ASC に変えて、もう一度実行しましょう。

さらに挑戦

ショップのサイトは、商品を安い順に、1ページに5件ずつ表示します。3ページ目を出すクエリを、LIMIT と OFFSET で書いてください。

ショップには、価格が 19.99 の商品が2つあります。クエリを2回実行すると、この2つの順番が入れ替わることがあります。なぜか説明してください。そのあと、順番がいつも同じになるように、ORDER BY に2つ目の列を足します。

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

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