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

無料レッスン

SQL の基本 2:数える、グループにする、結び付ける

レッスン全文をここで読めます。無料アカウントを作成すると、実際のラボで実践できます。

コンテナラボ読了目安 9分コマンド6個

このレッスンでやること

データベースは、たくさんの行をまとめて調べるのが得意です。いくつあるか、種類ごとにいくつあるか、対応するものがないのはどれか。このレッスンでは、ショップのデータベースに COUNT、GROUP BY、JOIN、LEFT JOIN を使って4つの質問をします。データは何も変えません。

はじめる前に

メモ

このレッスンの上のバーにある ラボを起動 を押して、実行中と表示されるまで待ちます。最初の起動は少し時間がかかります。そのときにショップのデータベースが作られるからです。下の 実行 ボタンを押すと、コマンドがラボのターミナルに順番に入力されます。同じセッションの中で続けて動きます。動きを見たり自分で入力したりするには、バーの ターミナルを開く(新しいタブ) を押します。

1. ターミナルにサインイン方法を教える

SQL の基本と同じ2つのコマンドです。1つ目は、クライアント(データベースに接続するプログラム)が MySQL 自身の証明書を受け入れるようにします。2つ目は、shop データベースにサインインして文を1つ実行するための短い名前 sql を作ります。ターミナルを再起動したときは、もう一度実行してください。何度やっても問題ありません。

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

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

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

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

2. 行を数える

COUNT(*) は行の数を数えます。AS customers は、答えの列に customers という名前を付けます。このショップのお客さんは40人です。

コマンド
sql "SELECT COUNT(*) AS customers FROM customers"

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

3. 種類ごとに数える

GROUP BY country は、国ごとに答えの行を1つ作ります。COUNT(*) は、それぞれの国のお客さんの数を数えます。ORDER BY customers DESC は、多い順に並べます。イギリスが14人で一番多くなります。

コマンド
sql "SELECT country, COUNT(*) AS customers FROM customers GROUP BY country ORDER BY customers DESC LIMIT 3"

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

4. 2つの表をまたいで数える

商品は、カテゴリを数字でしか持っていません。JOIN を使うと、その数字のとなりにカテゴリの名前が並ぶので、カテゴリごとの商品の数を数えられます。Books、Kitchen、Outdoors は5つずつです。カテゴリのない商品が2つあり、JOIN ではその2つは結果に出ません。

コマンド
sql "SELECT categories.name, COUNT(*) AS products FROM products JOIN categories ON products.category_id = categories.id GROUP BY categories.name ORDER BY products DESC LIMIT 4"

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

5. ないものを見つける

普通の JOIN は、対応する行があるものだけを残します。LEFT JOIN はお客さん全員を残し、対応する注文がないところには NULL(何も入っていないという印)を入れます。WHERE orders.id IS NULL でそれだけを選ぶと、一度も注文したことのないお客さん4人が出てきます。

コマンド
sql "SELECT customers.first_name, customers.country FROM customers LEFT JOIN orders ON orders.customer_id = customers.id WHERE orders.id IS NULL"

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

先生へ

ヒント

このレッスンは、ラボで進めるレッスンの小さな例です。手順と実行ボタンがレッスンで、ラボは生徒一人ひとりのコピーです。このレッスンは SQL の基本と同じ MySQL のラボを使うので、生徒の sql のショートカットや履歴も引き継がれます。ショップのデータベースは、見つけるものがあるように作ってあります。注文したことのないお客さん、売れたことのない商品、空の値などです。ご自分のモジュールにコピーして変更するか、レッスンビルダーの ラボ メニューから最初から作ってください。

このラボのほかのレッスン

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

授業で教えていますか?これらのレッスンを生徒に割り当て、採点と生徒ごとのラボを使えます。