数百の商品から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 * の * は「すべての列」です。必要な列だけを書くほうが、読みやすく、速くなります。次の表は、音楽アプリの曲の一覧です。
試す: 新しい曲を探す
-- 2022年以降の曲を探します。
SELECT title, artist, released FROM songs
WHERE released >= 2022;
-- 再生回数が 7000 回以上の曲を探す形に変えてみましょう。
WHERE は条件に合う行を残す
WHERE のあとに条件を書くと、条件が本当になる行だけが残ります。比べるときは、次の記号を使います。
文字を比べるときは、シングルクォートで囲みます。AND は両方、OR はどちらか、NOT は反対です。
例: 比べる記号
| 書き方 | 意味 | 例 |
|---|---|---|
| = | 等しい | artist = 'ソラ' |
| <> | 等しくない | artist <> 'ソラ' |
| < と > | 小さい、大きい | plays > 5000 |
| <= と >= | 以下、以上 | released >= 2022 |
| BETWEEN | 2つの値のあいだ(両端を含む) | 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つ
-- 再生回数の多い順に、上位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 にすると、なぜ安全になりますか。