保証が切れたパソコンはどれ
会社のヘルプデスクに、こんな問い合わせが来ました。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"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: クエリを読む順番
| 順 | 句 | データベースがすること |
|---|---|---|
| 1 | FROM | 表を選ぶ |
| 2 | WHERE | テストに落ちた行を捨てる |
| 3 | SELECT | 指定した列だけを残す |
| 4 | ORDER BY | 行を並べる |
| 5 | LIMIT | 頼まれた数に切る |
学生が入力するセルは、このプレビューでは空白です。
試す: 部署でパソコンを探す
-- 法務か営業のパソコンを探します。
SELECT tag, model, dept FROM pcs
WHERE dept = '法務' OR dept = '営業';
-- 2024年以降に買ったパソコンを探す形に変えてみましょう。
試す: 一番高いパソコン
-- 一番高い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つ目の列を足します。