演習1:Accessの利用開始
目的
Microsoft Accessの基本的な起動方法と新しいデータベースの作成方法を身につける。
手順
- Accessの起動
- スタートメニューまたはデスクトップからMicrosoft Accessを起動する
- データベースの新規作成
- スタート画面で「空のデスクトップデータベース」をクリックする
- ファイル名は初期設定のまま使用可能である
- 「作成」ボタンをクリックする
- 画面確認
- 期待される結果:テーブルツール画面が表示される
- 画面の各部分を確認する
重要な注意点
今回は、必ず「空のデスクトップデータベース」を選択すること。
演習2:テーブルの新規作成
目的
データベースの基本構成要素であるテーブルを作成し、属性の設定とデータ型の指定方法を身につける。
専門用語の説明
- テーブル:データを表形式で格納する構造
- 属性:テーブルの列にあたる項目
- データ型:格納するデータの種類を指定する設定
手順
ステップ1:「商品」属性の追加
- 「クリックして追加」を右クリックする
- 「短いテキスト」を選択する
- 「フィールド1」をダブルクリックして選択状態にする
- 「商品」と入力する
期待される結果:列名が「商品」に変更される
ステップ2:「単価」属性の追加
- 再度「クリックして追加」を右クリックする
- 今度は「数値」を選択する
- 「フィールド1」を「単価」に変更する
期待される結果:数値用の列が追加される
重要なデータ型について
- 短いテキスト:文字列データ
- 数値:数値データ
- ID:自動的に連番が設定される
つまずきポイントの回避
単価属性では「数値」を選択すること。
演習3:データの挿入と保存
目的
作成したテーブルに実際のデータを挿入し、テーブルの保存方法を身につける。
手順
ステップ1:データの挿入
- 1行目のデータ入力
- 商品欄に「みかん」と入力する
- 単価欄に「50」と入力する
期待される結果:ID欄に自動的に「1」が設定される
- 2行目のデータ入力
- 商品欄に「りんご」と入力する
- 単価欄に「100」と入力する
期待される結果:ID欄に自動的に「2」が設定される
- 3行目のデータ入力
- 商品欄に「りんご」と入力する
- 単価欄に「150」と入力する
ステップ2:テーブルの保存
- 「テーブル1」タブを右クリックする
- 「閉じる」を選択する
- 「変更を保存しますか?」で「はい」を選択する
- テーブル名を「商品」に変更する
- 「OK」をクリックする
重要な注意点
- 数値データは必ず半角数字で入力すること
- 最初の保存時に必ずテーブル名を設定すること
つまずきポイントの回避
数値欄に全角数字を入力するとエラーが発生する。単価欄では必ず半角数字を使用すること。
エラー対処法
テーブルの削除方法
間違ってテーブルを作成した場合:
- ナビゲーションペインでテーブルを右クリックする
- 「削除」を選択する
新しいテーブルの作成方法
- リボンの「作成」タブをクリックする
- 「テーブル」をクリックする
データベースの終了方法
- リボンの「ファイル」をクリックする
- 「閉じる」をクリックする
- ウィンドウ右上の「×」ボタンでAccessを終了する
このガイドを参考に、段階的に学習を進めること。失敗した場合でも必ず実力は向上する。
2.SQLの基本
資料
PDFファイル
https://www.kkaneko.jp/de/ds/d2.pdf
パワーポイントファイル(PDFファイルと同じ内容)
https://www.kkaneko.jp/de/ds/d2.pptx
関連する外部ページ
SQLFiddle(推奨)
DBFiddle(代替案)
演習全体について
準備
この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。
SQLFiddle(推奨)
DBFiddle(代替案)
SQLFiddleの基本操作
コピー:
- マウスの左ボタンを押しながら範囲を選択し、右クリックメニューで「コピー」を選択してください
SQLFiddleへの貼り付け:
重要な注意事項
SQLFiddle、DBFiddleはオンラインツールです。秘密情報はオンラインツールにアップロードしないでください。情報漏洩のリスクがあります。
演習1:SQLFiddleを用いたテーブル定義とデータ追加
学習目標
SQLFiddleを使用してテーブル定義とデータ追加を行う方法を習得します。
演習の目的
この演習では、オンラインツールSQLFiddleを使用して、テーブルの定義とデータの追加を実際に行います。SQLFiddleはインストール不要で利用できるため、SQLの基本操作を手軽に学習できます。
演習手順
ステップ1:SQLFiddleまたはDBFiddleにアクセスする
- Webブラウザを開く
- アドレスバーにSQLFiddleのページ http://sqlfiddle.com/ を入力する
または DBFiddleのページ https://www.db-fiddle.com/ にアクセスする
- 表示されたページで「MySQL」を選択する
- SQLFiddleの場合:表示されたリストから「MySQL」をクリックする
- DBFiddleの場合:上部で「MySQL」のバージョン8または9を選択する
ステップ2:SQLを入力して実行する
SQLFiddleの場合は上のパネルに、DBFiddleの場合は左側の「Schema SQL」に以下のSQLを入力する。
注意: 最初に表示されているサンプルSQLは削除。
create table 朝食と値段 (
名前 text,
朝食 text,
値段 integer
);
insert into 朝食と値段 values ('A', 'カレーライス', 400);
insert into 朝食と値段 values ('B', 'うどん', 250);
insert into 朝食と値段 values ('C', 'カレーライス', 400);
SQLFiddleへの貼り付けは CTRLキーとvキーの同時押し
ステップ3:「Execute」をクリックしてください
下側のウィンドウで、結果が何も出ないのは正しい動作です。
テーブル定義とデータ追加は成功していますが、データを表示する命令を実行していないため、下側のウィンドウには結果が表示されません。
補足説明
SQLFiddleの画面構成
- 上のパネル:SQLの入力欄
- 実行ボタン:「Execute」ボタン
- 結果ウィンドウ:下側のウィンドウ
基本用語
演習2:テーブル定義とデータ追加と問い合わせ
学習目標
- テーブル定義、データ追加、問い合わせの一連の流れを理解する
- SELECT文による基本的なデータ検索を習得する
- WHERE句を用いた条件付き検索を習得する
演習の目的
この演習では、従業員テーブルを作成し、データを追加した後、様々なパターンの問い合わせを実行します。SQLによるデータ操作の基本的な流れを体験します。
問い合わせとは、必要なデータを検索・加工するためのコマンドです。
パート1:全データの取得
ステップ1:Webブラウザを使用してください
- Webブラウザを開いてください
- アドレスバーにSQLFiddleのURLを入力してください
ここで「MySQL」を選択してください。
ステップ2:上のパネルにもともとあるSQLは不要なので消してください
ステップ3:上のパネルに、テーブル定義とデータ追加と問い合わせを行うSQLを入れてください
以下のSQLを上のパネルに入力してください:
CREATE TABLE 従業員 (
id INTEGER,
name TEXT,
age INTEGER,
salary INTEGER,
department_id INTEGER);
INSERT INTO 従業員 VALUES (1, 'Alice', 30, 50000, 1);
INSERT INTO 従業員 VALUES (2, 'Bob', 40, 60000, 1);
INSERT INTO 従業員 VALUES (3, 'Charlie', 35, 70000, 2);
select * from 従業員;
SQLFiddleへの貼り付けは CTRLキーとvキーの同時押し
ステップ4:「Execute」をクリックしてください
下側のウィンドウで、結果を確認してください。
表示が見えないときは、スクロールバーでスクロールしてください。
期待される結果:
従業員テーブルの全データが表示されます。
パート2:特定の属性のみ取得
ステップ1:上のパネルのSQLは不要なので消してください
ステップ2:上のパネルに、テーブル定義とデータ追加と問い合わせを行うSQLを入れてください
以下のSQLを上のパネルに入力してください:
CREATE TABLE 従業員 (
id INTEGER,
name TEXT,
age INTEGER,
salary INTEGER,
department_id INTEGER);
INSERT INTO 従業員 VALUES (1, 'Alice', 30, 50000, 1);
INSERT INTO 従業員 VALUES (2, 'Bob', 40, 60000, 1);
INSERT INTO 従業員 VALUES (3, 'Charlie', 35, 70000, 2);
SELECT age FROM 従業員;
SQLFiddleへの貼り付けは CTRLキーとvキーの同時押し
ステップ3:「Execute」をクリックしてください
下側のウィンドウで、結果を確認してください。
表示が見えないときは、スクロールバーでスクロールしてください。
期待される結果:
age属性のデータのみが表示されます。
パート3:条件付き検索
ステップ1:上のパネルのSQLは不要なので消してください
ステップ2:上のパネルに、テーブル定義とデータ追加と問い合わせを行うSQLを入れてください
以下のSQLを上のパネルに入力してください:
CREATE TABLE 従業員 (
id INTEGER,
name TEXT,
age INTEGER,
salary INTEGER,
department_id INTEGER);
INSERT INTO 従業員 VALUES (1, 'Alice', 30, 50000, 1);
INSERT INTO 従業員 VALUES (2, 'Bob', 40, 60000, 1);
INSERT INTO 従業員 VALUES (3, 'Charlie', 35, 70000, 2);
SELECT * FROM 従業員 WHERE age = 30;
SQLFiddleへの貼り付けは CTRLキーとvキーの同時押し
ステップ3:「Execute」をクリックしてください
下側のウィンドウで、結果を確認してください。
表示が見えないときは、スクロールバーでスクロールしてください。
期待される結果:
ageが30の従業員のデータのみが表示されます。
補足説明
SQLFiddleでの実行について
- SQLFiddleでは、各実行が独立しています
- そのため、問い合わせを実行するたびに、テーブル定義とデータ追加のコードも含める必要があります
SELECT文の基本
SELECT 取得したい属性 FROM テーブル名;
- アスタリスク(*)はすべての属性を意味します
- 特定の属性のみ取得する場合は属性名を指定します
WHERE句の使い方
SELECT * FROM テーブル名 WHERE 条件;
- 条件には比較演算子を使用できます:=、>、<、>=、<=
- 例:WHERE age > 30 は「年齢が30より大きい」という条件を表します
基本用語
処理の流れ
SQLは大文字小文字を区別しません。SELECTとselectは同じ意味です。
よくある間違い
- 1つのSQL文のみの場合、末尾のセミコロンは省略可能です
- 2つ以上のSQL文を連ねる場合は、セミコロンで文を区切る必要があります
3.SQL入門:SQLFiddleを活用したデータベース操作の基礎と応用
資料
PDFファイル
https://www.kkaneko.jp/de/ds/d4.pdf
パワーポイントファイル(PDFファイルと同じ内容)
https://www.kkaneko.jp/de/ds/d4.pptx
関連する外部ページ
SQLFiddle(推奨)
DBFiddle(代替案)
演習全体について
準備
この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。
SQLFiddle(推奨)
DBFiddle(代替案)
SQLFiddleの基本操作
コピー:
- マウスの左ボタンを押しながら範囲を選択し、右クリックメニューで「コピー」を選択してください
SQLFiddleへの貼り付け:
重要な注意事項
SQLFiddle、DBFiddleはオンラインツールです。秘密情報はオンラインツールにアップロードしないでください。情報漏洩のリスクがあります。
演習1:SQLFiddleを用いたテーブル定義とデータ追加
1.1 学習目標
- CREATE TABLE文によるテーブル定義を実行
- INSERT INTO文によるデータ追加を実行
- SELECT文による基本的なデータ取得を実行
1.2 演習の目的
この演習では、オンラインツールSQLFiddleを使用して、テーブルの定義とデータの追加を行います。SQLFiddleはインストール不要で利用できるため、SQLの基本操作を手軽に学習できます。
1.3 演習手順
ステップ1:SQLFiddleまたはDBFiddleにアクセスする
- Webブラウザを開く
- アドレスバーにSQLFiddleのページ http://sqlfiddle.com/ を入力する
または DBFiddleのページ https://www.db-fiddle.com/ にアクセスする
- 表示されたページで「MySQL」を選択する
- SQLFiddleの場合:表示されたリストから「MySQL」をクリックする
- DBFiddleの場合:上部で「MySQL」のバージョン8または9を選択する
ステップ2:SQLを入力して実行する
SQLFiddleの場合は上のパネルに、DBFiddleの場合は左側の「Schema SQL」に以下のSQLを入力する。
注意: 最初に表示されているサンプルSQLは削除。
CREATE TABLE 従業員 (
id INTEGER,
name TEXT,
age INTEGER,
salary INTEGER,
department_id INTEGER);
CREATE TABLE 部署 (
id INTEGER,
name TEXT);
INSERT INTO 従業員 VALUES (1, 'Alice', 30, 50000, 1);
INSERT INTO 従業員 VALUES (2, 'Bob', 40, 60000, 1);
INSERT INTO 従業員 VALUES (3, 'Charlie', 35, 70000, 2);
INSERT INTO 部署 VALUES (1, 'HR');
INSERT INTO 部署 VALUES (2, 'Engineering');
select * from 従業員;
select * from 部署;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
ステップ3:実行と結果の確認
「Execute」ボタンをクリックしてください。下側のウインドウで結果を確認してください。表示が見えないときは、スクロールバーでスクロールしてください。
1.4 期待される結果
- 従業員テーブルの全データが表示されます(3行:Alice、Bob、Charlie)
- 部署テーブルの全データが表示されます(2行:HR、Engineering)
各テーブルの内容が正しく表示されていることを確認してください。
1.5 ヒントと考察のポイント
SQLのキーワードについて
CREATE TABLE:テーブルを定義(作成)する命令です
INSERT INTO:テーブルにデータを追加する命令です
SELECT:テーブルからデータを取得する命令です
テーブル構造の理解
- 従業員テーブルには5つの属性(列)があります:id(番号)、name(名前)、age(年齢)、salary(給与)、department_id(部署番号)
- 部署テーブルには2つの属性があります:id(番号)、name(名前)
- department_idは、従業員テーブルと部署テーブルを関連付けるための属性です
SQLFiddleでの実行について
SQLFiddleでは、各実行が独立しています。そのため、問い合わせを実行するたびに、テーブル定義とデータ追加のコードも含める必要があります。
処理の流れ:
- テーブルを定義します(CREATE TABLE)
- データを追加します(INSERT INTO)
- データを取得します(SELECT)
よくある間違い:
- テーブル定義のセミコロン忘れ
- テキストデータのシングルクォート忘れ
- 全角文字と半角文字の混同
1.6 次のステップ
このブラウザウインドウは閉じないでください。次の演習で使用します。
1.7 余裕がある人向け
次のSQLを試してみてください:
SELECT age FROM 従業員;
SELECT * FROM 従業員 WHERE age = 30;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
これらのSQLは、特定の属性だけを取得したり、条件に合う行だけを取得したりする例です。
演習2:問い合わせ(クエリ)
2.1 学習目標
- WHERE句を用いた条件による行の選択を理解
- LIKE演算子を用いたパターンマッチを理解
- 様々な検索条件を組み合わせたデータ取得を実行
2.2 演習の目的
この演習では、データベースから必要なデータを検索・取得するための基本的な問い合わせ(クエリ)を学びます。都道府県のデータを使用して、全データの表示、条件に合うデータの選択、パターンマッチによる検索など、実用的な問い合わせ操作を体験します。
2.3 演習手順
ステップ1:SQLFiddleへのアクセス
演習1と同様に、SQLFiddleにアクセスし、「MySQL」を選択してください。
http://sqlfiddle.com/
ステップ2:既存のSQLコードの削除
上のパネルに元からあるSQLコードは不要なので消してください。
ステップ3:SQLコードの入力
以下のSQLを上のパネルに入力してください。
create table 都道府県 (
コード integer,
都道府県名 text,
人口 integer,
面積 real );
insert into 都道府県 values (1, '北海道', 5224614, 83424.31);
insert into 都道府県 values (2, '青森県', 1237984, 9645.64);
insert into 都道府県 values (3, '岩手県', 1210534, 15275.01);
insert into 都道府県 values (4, '宮城県', 2301996, 7282.29);
insert into 都道府県 values (5, '秋田県', 959502, 11637.52);
insert into 都道府県 values (6, '山形県', 1068027, 9323.15);
insert into 都道府県 values (7, '福島県', 1833152, 13784.14);
insert into 都道府県 values (8, '茨城県', 2867009, 6097.39);
insert into 都道府県 values (9, '栃木県', 1933146, 6408.09);
insert into 都道府県 values (10, '群馬県', 1939110, 6362.28);
insert into 都道府県 values (11, '埼玉県', 7344765, 3797.75);
insert into 都道府県 values (12, '千葉県', 6284480, 5157.61);
insert into 都道府県 values (13, '東京都', 14047594, 2194.07);
insert into 都道府県 values (14, '神奈川県', 9237337, 2416.17);
insert into 都道府県 values (15, '新潟県', 2201272, 12584.10);
insert into 都道府県 values (16, '富山県', 1044588, 4247.61);
insert into 都道府県 values (17, '石川県', 1132526, 4186.09);
insert into 都道府県 values (18, '福井県', 766863, 4190.49);
insert into 都道府県 values (19, '山梨県', 809974, 4465.27);
insert into 都道府県 values (20, '長野県', 2048011, 13561.56);
insert into 都道府県 values (21, '岐阜県', 1978742, 10621.29);
insert into 都道府県 values (22, '静岡県', 3633202, 7777.42);
insert into 都道府県 values (23, '愛知県', 7542415, 5172.92);
insert into 都道府県 values (24, '三重県', 1770254, 5774.40);
insert into 都道府県 values (25, '滋賀県', 1413610, 4017.38);
insert into 都道府県 values (26, '京都府', 2578087, 4612.19);
insert into 都道府県 values (27, '大阪府', 8837685, 1905.14);
insert into 都道府県 values (28, '兵庫県', 5465002, 8401.02);
insert into 都道府県 values (29, '奈良県', 1324473, 3690.94);
insert into 都道府県 values (30, '和歌山県', 922584, 4724.64);
insert into 都道府県 values (31, '鳥取県', 553407, 3507.13);
insert into 都道府県 values (32, '島根県', 671126, 6708.26);
insert into 都道府県 values (33, '岡山県', 1888432, 7114.62);
insert into 都道府県 values (34, '広島県', 2799702, 8479.63);
insert into 都道府県 values (35, '山口県', 1342059, 6112.54);
insert into 都道府県 values (36, '徳島県', 719559, 4146.65);
insert into 都道府県 values (37, '香川県', 950244, 1876.72);
insert into 都道府県 values (38, '愛媛県', 1334841, 5676.11);
insert into 都道府県 values (39, '高知県', 691527, 7103.63);
insert into 都道府県 values (40, '福岡県', 5135214, 4986.52);
insert into 都道府県 values (41, '佐賀県', 811442, 2440.69);
insert into 都道府県 values (42, '長崎県', 1312317, 4130.98);
insert into 都道府県 values (43, '熊本県', 1738301, 7409.35);
insert into 都道府県 values (44, '大分県', 1123852, 6340.73);
insert into 都道府県 values (45, '宮崎県', 1069576, 7735.31);
insert into 都道府県 values (46, '鹿児島県', 1588256, 9186.94);
insert into 都道府県 values (47, '沖縄県', 1467480, 2282.59);
-- 全データ表示
select * from 都道府県;
-- 人口が300万人以上の都道府県
select 都道府県名, 人口 from 都道府県 where 人口 >= 3000000;
-- 「県」を含む都道府県
select 都道府県名 from 都道府県 where 都道府県名 like '%県%';
-- 「山」で始まる都道府県
select 都道府県名 from 都道府県 where 都道府県名 like '山%';
-- 「島」を含む都道府県
select 都道府県名 from 都道府県 where 都道府県名 like '%島%';
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
ステップ4:実行と結果の確認
「Execute」ボタンをクリックしてください。下側のウインドウで結果を確認してください。表示が見えないときは、スクロールバーでスクロールしてください。
2.4 期待される結果
問い合わせ1:全データ表示
全都道府県のデータ(47行)が表示されます。
問い合わせ2:人口が300万人以上の都道府県
北海道、埼玉県、千葉県、東京都、神奈川県、静岡県、愛知県、大阪府、兵庫県、福岡県の10都道府県が表示されます。
問い合わせ3:「県」を含む都道府県
「県」という文字を含む都道府県名が表示されます(北海道、東京都、大阪府、京都府を除く43県)。
問い合わせ4:「山」で始まる都道府県
山形県、山梨県、山口県の3県が表示されます。
問い合わせ5:「島」を含む都道府県
福島県、島根県、広島県、徳島県、鹿児島県の5県が表示されます。
2.5 ヒントと考察のポイント
WHERE句による選択について
WHERE句は、特定の条件に一致する行だけを選択するために使用します。
例:WHERE 人口 >= 3000000 は、人口が300万人以上という条件を指定しています。
LIKE演算子によるパターンマッチについて
LIKE演算子は、テキストのパターンマッチに使用します。
%(パーセント記号):0文字以上の任意の文字列を表します
'%県%':「県」という文字を含む文字列
'山%':「山」で始まる文字列
'%島%':「島」を含む文字列
処理の流れ:
- テーブルから都道府県名を取得します
- 指定されたパターンに一致する行を選択します
- 該当する行を表示します
よくある間違い:
- LIKE演算子での%の位置間違い
- シングルクォートで囲み忘れ
- 全角の%を使用してしまう
演習3:SQL問い合わせ(クエリ)の概観
3.1 学習目標
SQLの主要な機能を体系的に体験する:
- データの検索や射影(SELECT)
- 問い合わせ対象テーブルの指定(FROM)
- 選択(WHERE)
- 結合、結合条件(JOIN、ON)
- 重複行の除去(DISTINCT)
- 行数のカウント(COUNT)
- 平均、最大、最小、合計の計算(AVG、MAX、MIN、SUM)
- 属性でグループ化(GROUP BY)
- 並べ替え(ORDER BY)
- 副問い合わせ
3.2 演習の目的
この演習では、SQLの主要な機能を1つずつ順番に試していきます。各パートで1つの機能に焦点を当て、その動作を確認することで、SQLの全体像を把握します。すべてのパートで、「従業員」テーブルと「部署」テーブルを使用します。
3.3 重要な注意事項
- 各パートでは、テーブル定義とデータ追加のSQLも含めて実行する必要があります
- 期待される結果と実際の結果を比較しながら進めてください
3.4 演習手順
事前準備:SQLFiddleへのアクセスとテーブルの準備
演習1と同様に、SQLFiddleにアクセスし、「MySQL」を選択してください。
http://sqlfiddle.com/
上のパネルに元からあるSQLコードは不要なので消してください。
共通のテーブル定義とデータ追加
すべてのパートで、以下のSQLを最初に含めてください:
CREATE TABLE 従業員 (
id INTEGER,
name TEXT,
age INTEGER,
salary INTEGER,
department_id INTEGER);
CREATE TABLE 部署 (
id INTEGER,
name TEXT);
INSERT INTO 従業員 VALUES (1, 'Alice', 30, 50000, 1);
INSERT INTO 従業員 VALUES (2, 'Bob', 40, 60000, 1);
INSERT INTO 従業員 VALUES (3, 'Charlie', 35, 70000, 2);
INSERT INTO 部署 VALUES (1, 'HR');
INSERT INTO 部署 VALUES (2, 'Engineering');
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
パート1:SELECT(データの検索や射影)
SELECT文の基本的な使い方を理解する
説明
SELECTは、データベースからデータを取得するための基本的な命令です。
SELECT *:すべての属性(列)を取得
SELECT 属性名1, 属性名2:特定の属性だけを取得(これを「射影」と呼びます)
試すSQL
以下のSQLを追加して実行してください:
SELECT * FROM 従業員;
SELECT name, age FROM 従業員;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
期待される結果
- 1つめのSELECT:従業員テーブルのすべての属性が表示されます(id、name、age、salary、department_id)
- 2つめのSELECT:name(名前)とage(年齢)の2つの属性だけが表示されます
考察のポイント
「射影」とは、テーブルから必要な属性(列)だけを抽出する操作です。すべてのデータが必要でない場合、必要な属性だけを指定することで、結果が見やすくなります。
処理の流れ:
- テーブルから指定された属性を取得します
- すべての行について取得します
- 結果を表示します
パート2:FROM(問い合わせ対象テーブルの指定)
FROM句の役割を理解する
説明
FROMは、問い合わせ(クエリ)が対象とするテーブルを指定します。複数のテーブルがある場合、どのテーブルからデータを取得するかを明示する必要があります。
試すSQL
以下のSQLを追加して実行してください:
SELECT name FROM 従業員;
SELECT name FROM 部署;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
期待される結果
- 1つめのSELECT:従業員テーブルのname属性が表示されます(Alice、Bob、Charlie)
- 2つめのSELECT:部署テーブルのname属性が表示されます(HR、Engineering)
考察のポイント
同じ「name」という属性名でも、どのテーブルから取得するかによって結果が異なります。FROMで対象テーブルを明確に指定することが重要です。
処理の流れ:
- FROM句で指定されたテーブルを特定します
- そのテーブルから指定された属性を取得します
- 結果を表示します
パート3:WHERE(選択)
WHERE句を用いた条件による行の選択を理解する
説明
WHEREは、特定の条件に一致する行を選択するために使用します。これを「選択」と呼びます。条件には比較演算子(>、<、>=、<=、=、<>)を使用できます。
試すSQL
以下のSQLを追加して実行してください:
SELECT * FROM 従業員 WHERE age > 30;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
期待される結果
age(年齢)が30より大きい従業員だけが表示されます(Bob:40歳、Charlie:35歳)。Aliceは30歳なので、age > 30の条件に合わず表示されません。
考察のポイント
「選択」とは、テーブルから条件に合う行だけを抽出する操作です。WHEREを使わない場合はすべての行が取得されますが、WHEREを使うことで必要な行だけに絞り込むことができます。
処理の流れ:
- テーブルからすべての行を取得します
- WHERE句の条件を各行に適用します
- 条件を満たす行だけを選択します
- 結果を表示します
よくある間違い
age > 30は「30より大きい」なので、30は含まれません
- 「30以上」にしたい場合は
age >= 30と書きます
パート4:JOIN、ON(結合、結合条件)
JOINは、関係のあるテーブルを結合条件を指定して1つにまとめる操作です。ONで結合条件を指定します。従業員テーブルのdepartment_id属性と部署テーブルのid属性が一致する行を結合することで、従業員名と所属部署名を一緒に表示できます。
試すSQL
以下のSQLを追加して実行してください:
SELECT 従業員.name, 部署.name
FROM 従業員
JOIN 部署 ON 従業員.department_id = 部署.id;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
期待される結果
従業員名と所属部署名が対応して表示されます:
- Alice - HR
- Bob - HR
- Charlie - Engineering
考察のポイント
- リレーショナルデータベースでは、情報を複数のテーブルに分けて管理します
- 必要に応じてJOINで結合することで、関連する情報を一緒に取得できます
- 従業員.name、部署.nameのように「テーブル名.属性名」と書くことで、どのテーブルの属性かを明示します
処理の流れ:
- 従業員テーブルと部署テーブルを準備します
- ON句の条件に基づいて行を結合します
- 結合された結果から指定された属性を取得します
- 結果を表示します
パート5:DISTINCT(重複行の除去)
重複する行を除去する方法を理解する
説明
DISTINCTは、重複する行を除去します。同じ値が複数回表示されるのを防ぎたい場合に使用します。
試すSQL
以下のSQLを追加して実行してください:
SELECT department_id FROM 従業員;
SELECT DISTINCT department_id FROM 従業員;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
期待される結果
- 1つめのSELECT(DISTINCTなし):1、1、2と表示されます(従業員ごとにdepartment_idが表示される)
- 2つめのSELECT(DISTINCTあり):1、2と表示されます(重複が除去される)
考察のポイント
DISTINCTを使わない場合、各行のdepartment_idがそのまま表示されるため、同じ値が複数回表示されます。DISTINCTを使うことで、「どのような値が存在するか」を知ることができます。
処理の流れ:
- テーブルから指定された属性を取得します
- 重複する値を除去します
- 一意な値だけを表示します
パート6:COUNT(行数のカウント)
COUNTは、テーブルの行数や、特定の条件に合う行数をカウントする集計関数です。COUNT(*)で全行数をカウントできます。
試すSQL
以下のSQLを追加して実行してください:
SELECT COUNT(*) FROM 従業員;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
期待される結果
3が表示されます(従業員テーブルには3行のデータがあります)。
考察のポイント
COUNTは「集計関数」の1つです。集計関数は、複数の行のデータをまとめて1つの値を計算します。
処理の流れ:
- テーブルのすべての行を確認します
- 行数をカウントします
- 結果を表示します
パート7:AVG、MAX、MIN、SUM(平均、最大、最小、合計の計算)
数値データに対する集計関数を理解する
説明
これらは、数値データに対する集計を行う関数です:
- AVG:平均値を計算
- MAX:最大値を求める
- MIN:最小値を求める
- SUM:合計値を計算
試すSQL
以下のSQLを追加して実行してください:
SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary)
FROM 従業員;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
期待される結果
salary(給与)について以下が表示されます:
- AVG(平均):60000.0000
- MAX(最大):70000
- MIN(最小):50000
- SUM(合計):180000
考察のポイント
これらの集計関数を使うことで、データの統計的な情報を簡単に取得できます。
計算の確認:
- 平均:(50000 + 60000 + 70000) ÷ 3 = 60000
- 合計:50000 + 60000 + 70000 = 180000
処理の流れ:
- 指定された属性の全データを取得します
- 各集計関数に応じた計算を行います
- 結果を表示します
パート8:GROUP BY(属性でグループ化)
GROUP BYは、指定した属性についてデータをグループ化する機能です。各グループに対して集計関数を適用できます。
試すSQL
以下のSQLを追加して実行してください:
SELECT department_id, COUNT(*)
FROM 従業員
GROUP BY department_id;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
期待される結果
department_idごとに従業員数がカウントされます:
- department_id = 1:2人(AliceとBob)
- department_id = 2:1人(Charlie)
考察のポイント
GROUP BYを使うことで、「部署ごとの従業員数」や「カテゴリごとの売上合計」など、グループ単位での集計ができます。
処理の流れ:
- department_idの値でグループ化(1のグループと2のグループ)
- 各グループの行数をCOUNTでカウント
- 結果を表示
パート9:ORDER BY(並べ替え(ソート))
ORDER BYは、指定した属性について結果をソート(並べ替え)します。
ORDER BY 属性名:昇順(小さい順)でソート
ORDER BY 属性名 DESC:降順(大きい順)でソート
試すSQL
以下のSQLを追加して実行してください:
SELECT name, age
FROM 従業員
ORDER BY age DESC;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
期待される結果
age(年齢)の高い順に表示されます:
- Bob:40歳
- Charlie:35歳
- Alice:30歳
考察のポイント
ORDER BYを使わない場合、結果の順序は保証されません(データが追加された順や、データベース内部の格納順に依存します)。特定の順序で結果を表示したい場合は、必ずORDER BYを使用してください。
処理の流れ:
- 指定された属性を取得します
- ORDER BY句で指定された属性に基づいてソートします
- 並べ替えた結果を表示します
パート10:副問い合わせ
副問い合わせ(サブクエリ)は、SQL文の中に別のSQL文を埋め込む機能です。ある問い合わせの結果を、別の問い合わせの条件として使用できます。
試すSQL
以下のSQLを追加して実行してください:
SELECT * FROM 従業員
WHERE salary > (SELECT AVG(salary) FROM 従業員);
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
期待される結果
salary(給与)が平均給与より高い従業員が表示されます:
- Charlie:70000(平均60000より高い)
考察のポイント
この問い合わせは以下のように処理されます:
- 内側の問い合わせ
(SELECT AVG(salary) FROM 従業員)が先に実行され、平均給与60000が計算される
- 外側の問い合わせで
WHERE salary > 60000という条件で選択される
副問い合わせを使うことで、動的な条件(データの内容に応じて変化する条件)を指定できます。
3.5 演習3のまとめ
この演習では、SQLの主要な機能を10のパートに分けて体験しました。
- SELECT:必要なデータを取得する
- FROM:対象テーブルを指定する
- WHERE:条件に合う行を選択する
- JOIN、ON:複数のテーブルを結合する
- DISTINCT:重複行を除去する
- COUNT:行数をカウントする
- AVG、MAX、MIN、SUM:数値データを集計する
- GROUP BY:データをグループ化して集計する
- ORDER BY:結果を並べ替える
- 副問い合わせ:問い合わせの中に問い合わせを含める
これらの機能を組み合わせることで、様々な問い合わせを実現できます。
難しく考えないでください。今回は体験です。詳しい説明は時間をかけて別の回で行っていきます。
全体のまとめ
このガイドでは、以下の内容を学びました:
- 演習1:SQLFiddleの使い方とテーブルの定義・データ追加の基本
- 演習2:WHERE句とLIKE演算子を使った条件検索
- 演習3:SQLの主要な機能の体系的な学習
SQLは、データベースを操作するための標準的な言語です。これらの基本的な機能を組み合わせることで、複雑なデータ分析や業務処理を実現できます。
4.SQL基礎:SELECT文による効率的なデータ検索と操作の基本
資料
PDFファイル
https://www.kkaneko.jp/de/ds/spsqlintro.pdf
パワーポイントファイル(PDFファイルと同じ内容)
https://www.kkaneko.jp/de/ds/spsqlintro.pptx
関連する外部ページ
SQLFiddle(推奨)
DBFiddle(代替案)
演習全体について
準備
この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。
SQLFiddle(推奨)
DBFiddle(代替案)
SQLFiddleの基本操作
コピー:
- マウスの左ボタンを押しながら範囲を選択し、右クリックメニューで「コピー」を選択してください
SQLFiddleへの貼り付け:
重要な注意事項
SQLFiddle、DBFiddleはオンラインツールです。秘密情報はオンラインツールにアップロードしないでください。情報漏洩のリスクがあります。
学習目標
この演習で習得する内容:
- SELECT文による基本的なデータ取得
- WHERE句を用いた条件指定によるデータの絞り込み
- DISTINCTによる重複除去
- 集約関数を用いたデータ集計
SQL構文要素の基本
この演習で使用する主なSQL構文要素の役割は以下の通りです:
- SELECT: 取得したいデータの列を指定します。SELECT * はすべての列を取得します
- FROM: データを取得するテーブルを指定します
- WHERE: データを絞り込む条件を指定します
- DISTINCT: 重複する値を除いて表示します
- 集約関数: 複数行のデータを1つの値にまとめます
基本用語:
- テーブル: データを表形式で保存する構造
- 列: テーブルの縦方向の項目
- 行: テーブルの横方向のデータ
演習1:テーブル定義とデータの追加、基本的なSELECT文
演習の目的
この演習では、データベースの基本操作を学びます。具体的には、テーブルを作成し、データを追加し、そのデータを取得する一連の流れを体験します。
手順
ステップ1:SQLFiddleまたはDBFiddleにアクセスする
- Webブラウザを開く
- アドレスバーにSQLFiddleのページ http://sqlfiddle.com/ を入力する
または DBFiddleのページ https://www.db-fiddle.com/ にアクセスする
- 表示されたページで「MySQL」を選択する
- SQLFiddleの場合:表示されたリストから「MySQL」をクリックする
- DBFiddleの場合:上部で「MySQL」のバージョン8または9を選択する
ステップ2:SQLを入力して実行する
SQLFiddleの場合は上のパネルに、DBFiddleの場合は左側の「Schema SQL」に以下のSQLを入力する。
注意: 最初に表示されているサンプルSQLは削除。
create table 記録 (
名前 text,
得点 integer,
居室 text
);
insert into 記録 values ('徳川家康', 85, '1階');
insert into 記録 values ('源義経', 78, '2階');
insert into 記録 values ('西郷隆盛', 90, '3階');
insert into 記録 values ('豊臣秀吉', 82, '1階');
insert into 記録 values ('織田信長', 75, '2階');
select * from 記録;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
入力後、「Execute」ボタンをクリックしてください。
ステップ3:結果を確認してください
下のパネルに以下の結果が表示されることを確認してください。
記録テーブルの全データが表示されます(5行:徳川家康、源義経、西郷隆盛、豊臣秀吉、織田信長)。
期待される結果:
| 名前 |
得点 |
居室 |
| 徳川家康 |
85 |
1階 |
| 源義経 |
78 |
2階 |
| 西郷隆盛 |
90 |
3階 |
| 豊臣秀吉 |
82 |
1階 |
| 織田信長 |
75 |
2階 |
各テーブルの内容が正しく表示されていることを確認してください。
ステップ4:追加のSELECT文を試してください
上のパネルの最後に、以下のSQLを追加してください。
select 名前, 得点 from 記録;
select 名前, 得点 from 記録 where 得点 > 80;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
再度「Execute」ボタンをクリックし、結果を確認してください。
1つ目のSQLは、名前と得点の2つの列だけが表示されます(5行)。
2つ目のSQLは、得点が80より大きい行だけが表示されます(3行)。
期待される結果:
1つ目のSQL:
| 名前 |
得点 |
| 徳川家康 |
85 |
| 源義経 |
78 |
| 西郷隆盛 |
90 |
| 豊臣秀吉 |
82 |
| 織田信長 |
75 |
2つ目のSQL:
| 名前 |
得点 |
| 徳川家康 |
85 |
| 西郷隆盛 |
90 |
| 豊臣秀吉 |
82 |
ヒントと考察のポイント
テーブル定義について:
- create table 記録 でテーブルを作成しています
- 列は「名前」「得点」「居室」の3つです
- データ型を指定しています。text はテキスト、integer は整数です
データ追加について:
- insert into 文で1行ずつデータを追加しています
- 重要: テキストデータは半角シングルクォートで囲む必要があります
SELECT文について:
- select * from 記録 の * はすべての列を意味します
- select 名前, 得点 from 記録 のように、特定の列だけを指定することもできます
- where 得点 > 80 は条件を指定しています。得点が80より大きい行のみを取得します
よくある間違い:
- テキストデータのクォート忘れ
- SQLの最後のセミコロン忘れ
- 全角文字と半角文字の混同
演習2:より実践的なSQL
演習の目的
この演習では、データの絞り込み、重複除去、データ集計といった実務で頻繁に使用するSQL操作を学びます。
手順
ステップ1:重複除去を確認してください
上のパネルに以下のSQLを入力してください。
注意: 以前のSQLは削除してください。
create table 記録 (
名前 text,
得点 integer,
居室 text
);
insert into 記録 values ('徳川家康', 85, '1階');
insert into 記録 values ('源義経', 78, '2階');
insert into 記録 values ('西郷隆盛', 90, '3階');
insert into 記録 values ('豊臣秀吉', 82, '1階');
insert into 記録 values ('織田信長', 75, '2階');
select 居室 from 記録;
select distinct 居室 from 記録;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
「Execute」ボタンをクリックし、2つのSELECT文の結果の違いを確認してください。
1つ目のSQLは、すべての行の居室の値が表示されます(5行、重複あり)。
2つ目のSQLは、重複を除いて居室の値が表示されます(3行)。
期待される結果:
1つ目のSQL:
2つ目のSQL:
各結果が正しく表示されていることを確認してください。
ステップ2:WHERE句の応用を試してください
上のパネルの最後に、以下のSQLを追加してください。
select 名前, 得点 from 記録 where 得点 > 80;
select 名前, 得点 from 記録 where 得点 between 80 and 85;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
「Execute」ボタンをクリックし、結果を確認してください。
1つ目のSQLは、得点が80より大きい行が表示されます(3行)。
2つ目のSQLは、得点が80以上85以下の行が表示されます(2行)。
期待される結果:
1つ目のSQL:
| 名前 |
得点 |
| 徳川家康 |
85 |
| 西郷隆盛 |
90 |
| 豊臣秀吉 |
82 |
2つ目のSQL:
各結果が正しく表示されていることを確認してください。
ステップ3:集約関数を使用してください
上のパネルの最後に、以下のSQLを追加してください。
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
「Execute」ボタンをクリックし、結果を確認してください。
得点の平均値が表示されます。
期待される結果:
結果が正しく表示されていることを確認してください。
ステップ4:IN演算子を使用してください
上のパネルの最後に、以下のSQLを追加してください。
select * from 記録 where 居室 in ('1階', '2階');
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
「Execute」ボタンをクリックし、結果を確認してください。
居室が1階または2階の行が表示されます(4行)。
期待される結果:
| 名前 |
得点 |
居室 |
| 徳川家康 |
85 |
1階 |
| 源義経 |
78 |
2階 |
| 豊臣秀吉 |
82 |
1階 |
| 織田信長 |
75 |
2階 |
結果が正しく表示されていることを確認してください。
ヒントと考察のポイント
DISTINCTについて:
- select 居室 from 記録 は、すべての行の居室の値を表示します
- select distinct 居室 from 記録 は、重複を除いて表示します
- 確認ポイント: 同じ値が複数あっても1回だけ表示されることを確認してください
処理の流れ:
- テーブルから居室の値を取得します
- 重複する値を除去します
- 残った値を表示します
WHERE句の条件指定について:
- where 得点 > 80 は、80より大きい値を指定します。80は含みません
- where 得点 between 80 and 85 は、80以上85以下を指定します。両端を含みます
- BETWEENは範囲指定に便利です
集約関数について:
- avg(得点) は、得点の平均値を計算します
- 他の集約関数も使えます。max は最大値、min は最小値、sum は合計、count は件数です
- 重要: 集約関数は常に1つの値を返します
処理の流れ:
- テーブルからすべての得点の値を取得します
- 得点の合計を計算します(85 + 78 + 90 + 82 + 75 = 410)
- 行数で割ります(410 ÷ 5 = 82)
- 平均値を表示します
IN演算子について:
- where 居室 in ('1階', '2階') は、居室が1階または2階のいずれかに一致する行を選択します
- 値は半角カンマで区切り、全体を半角丸かっこで囲みます
- テキスト値は半角シングルクォートで囲みます
よくある間違い:
- BETWEENの大小関係の逆転
- IN演算子でのカンマ・かっこの忘れ
- テキスト値のクォート忘れ
余裕がある人向け
次のSQLを試してみてください:
select max(得点), min(得点) from 記録;
select 名前, 得点 from 記録 where 得点 between 75 and 80;
select * from 記録 where 居室 = '3階';
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
これらのSQLは、最大値・最小値の取得、異なる範囲指定、特定の値の検索を行う例です。
確認問題
これらの問題に自分で挑戦してください。解答例は後述していますが、まずは自力で考えてみることが重要です。
確認問題①
以下のテーブル「記録」から、得点が70以上80以下の行を選択するSQLを作成してください。
| 名前 |
得点 |
居室 |
| 徳川家康 |
85 |
1階 |
| 源義経 |
78 |
2階 |
| 西郷隆盛 |
90 |
3階 |
| 豊臣秀吉 |
82 |
1階 |
| 織田信長 |
75 |
2階 |
ヒント: BETWEENを使うと範囲指定が簡単にできます。
確認問題②
テーブル「記録」から、得点の最大値を求めるSQLを作成してください。
ヒント: 集約関数のMAXを使用します。
解答例
確認問題①の解答
SELECT * FROM 記録 WHERE 得点 BETWEEN 70 AND 80;
得点が70以上80以下の行が選択されます(2行)。
期待される結果:
| 名前 |
得点 |
居室 |
| 源義経 |
78 |
2階 |
| 織田信長 |
75 |
2階 |
解説:
- BETWEEN 70 AND 80 は70以上かつ80以下を意味します
- 両端の値を含むことに注意してください
- この条件に該当するのは、源義経と織田信長の2行です
確認問題②の解答
得点の最大値が表示されます。
期待される結果:
解説:
- MAX は、指定した列の最大値を返す集約関数です
- テーブル全体から得点列の最も大きい値を算出します
- 結果は1つの値になります
- 他の集約関数も同様の構文で使用できます
エラー対処法
Q1: SQLを実行してもエラーが出ます
確認事項:
- SQLの構文が正しいかを確認してください
- セミコロンが各SQL文の最後についているかを確認してください
- テキストデータを半角シングルクォートで囲んでいるかを確認してください
- 半角文字と全角文字を混在させていないかを確認してください
Q2: SQLFiddleが動作しません
対処法:
- ページを再読み込みしてください
- 別のWebブラウザを試してください
- DBFiddleを代替として使用してください
Q3: DBFiddleでの操作方法がわかりません
手順:
- MySQL 8または9を選択してください
- 左側のパネルにテーブル定義とデータ追加のSQLを入力してください
- 右側のパネルにSELECT文を入力してください
- 「Run」ボタンをクリックしてください
Q4: 結果が表示されません
確認事項:
- 「Execute」ボタンをクリックしたかを確認してください
- テーブル定義とデータ追加のSQLが正しく実行されているかを確認してください
- エラーメッセージが表示されていないかを確認してください
このガイドを使って、自分のペースで学習を進めてください。実際に手を動かしてSQLを書くことが、理解を深める最良の方法です。
5. テーブルの結合とSQLによるデータ統合
資料
PDFファイル
https://www.kkaneko.jp/de/ds/d7.pdf
パワーポイントファイル(PDFファイルと同じ内容)
https://www.kkaneko.jp/de/ds/d7.pptx
関連する外部ページ
SQLFiddle(推奨)
DBFiddle(代替案)
演習全体について
準備
この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。
SQLFiddle(推奨)
DBFiddle(代替案)
SQLFiddleの基本操作
コピー:
- マウスの左ボタンを押しながら範囲を選択し、右クリックメニューで「コピー」を選択してください
SQLFiddleへの貼り付け:
重要な注意事項
SQLFiddle、DBFiddleはオンラインツールです。秘密情報はオンラインツールにアップロードしないでください。情報漏洩のリスクがあります。
演習1:テーブル定義とデータの追加
学習目標
この演習で習得する内容:
- 複数のテーブルに分散した情報を結合して扱えるようになる
- INNER JOINと結合条件(ON句)の使い方を理解する
- リレーショナルデータベースの設計思想を理解する
演習の目的
この演習では、データベースの基本操作を学びます。具体的には、テーブルを作成し、データを追加し、そのデータを取得する一連の流れを体験します。
手順
ステップ1:SQLFiddleまたはDBFiddleにアクセスする
- Webブラウザを開く
- アドレスバーにSQLFiddleのページ http://sqlfiddle.com/ を入力する
または DBFiddleのページ https://www.db-fiddle.com/ にアクセスする
- 表示されたページで「MySQL」を選択する
- SQLFiddleの場合:表示されたリストから「MySQL」をクリックする
- DBFiddleの場合:上部で「MySQL」のバージョン8または9を選択する
ステップ2:SQLを入力して実行する
SQLFiddleの場合は上のパネルに、DBFiddleの場合は左側の「Schema SQL」に以下のSQLを入力する。
注意: 最初に表示されているサンプルSQLは削除。
CREATE TABLE 商品 (
ID INTEGER,
商品名 TEXT,
単価 INTEGER);
INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);
SELECT * FROM 商品;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
入力後、「Execute」ボタンをクリックしてください。
ステップ3:結果を確認してください
下のパネルに以下の結果が表示されることを確認してください。
商品テーブルの全データが表示されます(3行:みかん、りんご、メロン)。
期待される結果:
| ID |
商品名 |
単価 |
| 1 |
みかん |
50 |
| 2 |
りんご |
100 |
| 3 |
メロン |
500 |
各テーブルの内容が正しく表示されていることを確認してください。
ヒントと考察のポイント
テーブル定義について:
- CREATE TABLE でテーブルを作成しています
- 列は「ID」「商品名」「単価」の3つです
- データ型を指定しています。INTEGER は整数、TEXT はテキストです
データ追加について:
- INSERT INTO 文で1行ずつデータを追加しています
- 重要: テキストデータは半角シングルクォートで囲む必要があります
SELECT文について:
- SELECT * FROM 商品 の * はすべての列を意味します
- テーブルの全データを取得します
よくある間違い:
- セミコロン(;)の付け忘れ
- 列名や値のスペルミス
- 日本語の全角文字と半角文字の混同
演習2:SQLによる結合
演習の目的
この演習では、2つのテーブルを結合する方法を学びます。具体的には、INNER JOINを使用して、関連性のあるデータを結び付ける方法を体験します。
手順
ステップ1:SQLFiddleにアクセスしてください
- Webブラウザを開いてください
- アドレスバーに http://sqlfiddle.com/ を入力してください
- 表示されたページで「MySQL」を選択してください
ステップ2:SQLを入力して実行してください
上のパネルに以下のSQLを入力してください。
注意: 最初に表示されているサンプルSQLは削除してください。
CREATE TABLE 商品 (
ID INTEGER,
商品名 TEXT,
単価 INTEGER);
INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);
CREATE TABLE 購入 (
購入者 TEXT,
商品番号 INTEGER);
INSERT INTO 購入 VALUES('X', 1);
INSERT INTO 購入 VALUES('X', 3);
INSERT INTO 購入 VALUES('Y', 2);
SELECT * FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
入力後、「Execute」ボタンをクリックしてください。
ステップ3:結果を確認してください
下のパネルに以下の結果が表示されることを確認してください。
商品テーブルと購入テーブルが結合され、購入者がどの商品を購入したかが表示されます(3行)。
期待される結果:
| ID |
商品名 |
単価 |
購入者 |
商品番号 |
| 1 |
みかん |
50 |
X |
1 |
| 3 |
メロン |
500 |
X |
3 |
| 2 |
りんご |
100 |
Y |
2 |
各テーブルの内容が正しく表示されていることを確認してください。
ヒントと考察のポイント
なぜテーブルを分けるのか:
- データの重複を避ける
- 更新作業を効率化する(例:商品の単価変更は商品テーブルの1行だけ修正すればよい)
- データの整合性を保つ
INNER JOINについて:
- INNER JOIN は2つのテーブルを関連性に基づいて結合します
- 結合条件(ON句)で指定した条件に合致する行だけを結果に含めます
結合条件について:
- ON 商品.ID = 購入.商品番号 は結合条件です
- 商品テーブルのID列と購入テーブルの商品番号列の値が等しい行を結び付けます
- テーブル名.列名の形式で列を指定します
よくある間違い:
- ON句の省略(結合条件なしになってしまう)
- テーブル名と列名の指定ミス
- 結合条件の等号(=)の間違い
演習3:発展問題①:SELECTの応用
演習の目的
この演習では、結合後のテーブルから必要な列のみを選択する方法を学びます。
問題
結合の結果のテーブルは5列です。このうち、「商品名」と「購入者」の列のみを表示し、他の列は表示しないようなSQLを作成してください。
ヒント: SELECT * を変更して、必要な列のみを指定してください。
期待される結果:
| 商品名 |
購入者 |
| みかん |
X |
| メロン |
X |
| りんご |
Y |
解答例
SELECT 商品名, 購入者 FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号;
解説
- SELECT * を SELECT 商品名, 購入者 に変更することで、必要な列のみを指定できる
- 結合後のテーブルには5つの列があるが、このクエリでは「商品名」と「購入者」の2列のみが表示される
演習4:発展問題②:COUNT(*)の応用
演習の目的
この演習では、結合後のテーブルの行数を数える方法を学びます。
問題
結合の結果のテーブルは、1つのテーブルです。この行数3を得るSQLを作成してください。
ヒント: COUNT(*) を使用してください。
期待される結果:
解答例
SELECT COUNT(*) FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号;
解説
- COUNT(*) は、テーブルの行数を数える集約関数である
- 結合の結果、条件に合致した行が3行できるため、結果は「3」になる
演習5:複数の条件の指定
演習の目的
この演習では、INNER JOINとWHERE句を組み合わせて使用する方法を学びます。具体的には、結合後のデータを条件で絞り込む方法を体験します。
手順
ステップ1:SQLFiddleにアクセスしてください
- Webブラウザを開いてください
- アドレスバーに http://sqlfiddle.com/ を入力してください
- 表示されたページで「MySQL」を選択してください
ステップ2:SQLを入力して実行してください
上のパネルに以下のSQLを入力してください。
注意: 最初に表示されているサンプルSQLは削除してください。
CREATE TABLE 商品 (
ID INTEGER,
商品名 TEXT,
単価 INTEGER);
INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);
CREATE TABLE 購入 (
購入者 TEXT,
商品番号 INTEGER);
INSERT INTO 購入 VALUES('X', 1);
INSERT INTO 購入 VALUES('X', 3);
INSERT INTO 購入 VALUES('Y', 2);
SELECT * FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号 WHERE 購入.購入者 = 'X';
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
入力後、「Execute」ボタンをクリックしてください。
ステップ3:結果を確認してください
下のパネルに以下の結果が表示されることを確認してください。
購入者がXの行のみが表示されます(2行)。
期待される結果:
| ID |
商品名 |
単価 |
購入者 |
商品番号 |
| 1 |
みかん |
50 |
X |
1 |
| 3 |
メロン |
500 |
X |
3 |
各テーブルの内容が正しく表示されていることを確認してください。
ステップ4:追加のSELECT文を試してください
上のパネルの最後に、以下のSQLを追加してください。
SELECT 商品名, 購入者, 単価 FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号 WHERE 購入.購入者 = 'X';
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
再度「Execute」ボタンをクリックし、結果を確認してください。
指定した列のみが表示されます(2行)。
期待される結果:
| 商品名 |
購入者 |
単価 |
| みかん |
X |
50 |
| メロン |
X |
500 |
ヒントと考察のポイント
WHERE句について:
- WHERE句 は結合後のテーブルから条件に合致する行だけを取り出します
- 複数の条件を指定する場合はANDやORで繋ぐことができます
SELECT句での列の指定について:
- SELECT * はすべての列を表示します
- SELECT 列名1, 列名2 は指定した列のみを表示します
- 必要な情報だけを取り出すことで結果が見やすくなります
よくある間違い:
- WHERE句の条件式でのスペルミス
- シングルクォート(')の付け忘れ
- 列名の指定ミス
演習6:発展問題③:条件変更による結果の予想
演習の目的
この演習では、WHERE句の条件を変更した場合の結果を予想する力を養います。
問題
いまの演習において、次のSQLを実行したら、どのような結果になるか、予想してください。そして、実際に動作させてください。
SELECT 商品名, 購入者, 単価 FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号 WHERE 購入.購入者 = 'Y';
ヒント: 購入.購入者 = 'X' でなく、購入.購入者 = 'Y' になっていることに注意
解答
期待される結果:
演習7:結合条件のない結合
演習の目的
この演習では、CROSS JOINの動作を学びます。具体的には、結合条件を指定しない場合に、2つのテーブルの全ての組み合わせが作成されることを体験します。
手順
ステップ1:SQLFiddleにアクセスしてください
- Webブラウザを開いてください
- アドレスバーに http://sqlfiddle.com/ を入力してください
- 表示されたページで「MySQL」を選択してください
ステップ2:SQLを入力して実行してください
上のパネルに以下のSQLを入力してください。
注意: 最初に表示されているサンプルSQLは削除してください。
CREATE TABLE 商品 (
ID INTEGER,
商品名 TEXT,
単価 INTEGER);
INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);
CREATE TABLE 購入 (
購入者 TEXT,
商品番号 INTEGER);
INSERT INTO 購入 VALUES('X', 1);
INSERT INTO 購入 VALUES('X', 3);
INSERT INTO 購入 VALUES('Y', 2);
SELECT * FROM 商品
CROSS JOIN 購入;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
入力後、「Execute」ボタンをクリックしてください。
ステップ3:結果を確認してください
下のパネルに以下の結果が表示されることを確認してください。
全ての組み合わせが表示されます(9行:商品3行×購入3行)。
期待される結果:
| ID |
商品名 |
単価 |
購入者 |
商品番号 |
| 3 |
メロン |
500 |
X |
1 |
| 2 |
りんご |
100 |
X |
1 |
| 1 |
みかん |
50 |
X |
1 |
| 3 |
メロン |
500 |
X |
3 |
| 2 |
りんご |
100 |
X |
3 |
| 1 |
みかん |
50 |
X |
3 |
| 3 |
メロン |
500 |
Y |
2 |
| 2 |
りんご |
100 |
Y |
2 |
| 1 |
みかん |
50 |
Y |
2 |
各テーブルの内容が正しく表示されていることを確認してください。
ヒントと考察のポイント
CROSS JOINについて:
- CROSS JOIN は結合条件を指定しない結合です
- 2つのテーブルの全ての行の組み合わせを作成します
- 商品テーブル3行×購入テーブル3行=9行の結果が得られます
INNER JOINとの違い:
- INNER JOIN:結合条件に合致する行のみを結合(関連性のある行だけ)
- CROSS JOIN:全ての組み合わせを結合(関連性に関わらず全て)
考察のポイント:
- なぜCROSS JOINでは意味のない組み合わせ(例:みかんと購入者Y・商品番号2)も含まれるのか
- 実際のデータ分析では、どちらの結合をよく使うか
演習8:結合の総合演習
演習の目的
この演習では、これまで学んだ内容を統合して使用します。具体的には、テーブルの作成、結合、列の選択、条件による絞り込み、集計を体験します。
手順
ステップ1:SQLFiddleにアクセスしてください
- Webブラウザを開いてください
- アドレスバーに http://sqlfiddle.com/ を入力してください
- 表示されたページで「MySQL」を選択してください
ステップ2:SQLを入力して実行してください
上のパネルに以下のSQLを入力してください。
注意: 最初に表示されているサンプルSQLは削除してください。
CREATE TABLE 名簿(
ID INTEGER,
name TEXT,
buy INTEGER
);
INSERT INTO 名簿 VALUES(1, '織田', 1);
INSERT INTO 名簿 VALUES(2, '豊臣', 2);
INSERT INTO 名簿 VALUES(3, '徳川', 2);
CREATE TABLE 食材(
ID INTEGER,
name TEXT
);
INSERT INTO 食材 VALUES(1, 'とうふ');
INSERT INTO 食材 VALUES(2, '納豆');
SELECT * FROM 名簿
CROSS JOIN 食材;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
入力後、「Execute」ボタンをクリックしてください。
ステップ3:結果を確認してください
下のパネルに結果が表示されることを確認してください。
全ての組み合わせが表示されます(6行:名簿3行×食材2行)。
ステップ4:追加のSELECT文を試してください
上のパネルの最後に、以下のSQLを追加してください。
SELECT * FROM 名簿
JOIN 食材
ON 名簿.buy = 食材.ID;
SELECT 名簿.name, 食材.name FROM 名簿
INNER JOIN 食材
ON 名簿.buy = 食材.ID;
SELECT 名簿.name, 食材.name FROM 名簿
INNER JOIN 食材
ON 名簿.buy = 食材.ID WHERE 食材.name ='とうふ';
SELECT COUNT(*) FROM 名簿
INNER JOIN 食材
ON 名簿.buy = 食材.ID;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。
再度「Execute」ボタンをクリックし、結果を確認してください。
1つ目のSQLは、結合条件を指定した結合の結果が表示されます(3行)。
2つ目のSQLは、名前の列のみが表示されます(3行)。
3つ目のSQLは、とうふを買った人のみが表示されます(1行)。
4つ目のSQLは、行数が表示されます(3)。
期待される結果:
1つ目のSQL:
| ID |
name |
buy |
ID |
name |
| 1 |
織田 |
1 |
1 |
とうふ |
| 2 |
豊臣 |
2 |
2 |
納豆 |
| 3 |
徳川 |
2 |
2 |
納豆 |
2つ目のSQL:
| name |
name |
| 織田 |
とうふ |
| 豊臣 |
納豆 |
| 徳川 |
納豆 |
3つ目のSQL:
4つ目のSQL:
ヒントと考察のポイント
データの関連性について:
- 名簿テーブルのbuy列が食材テーブルのIDを参照しています
- この参照関係により「誰が何を買ったか」という情報が表現されます
段階的なデータ抽出について:
- 全ての組み合わせを確認(CROSS JOIN)
- 関連性のある行のみを結合(INNER JOIN)
- 必要な列のみを表示(SELECT句)
- 条件で絞り込み(WHERE句)
- 集計(COUNT関数)
エラー対処法
Syntax errorが表示される
原因: SQLの文法エラー
対処法:
- セミコロン(;)の付け忘れを確認
- スペルミスを確認
- 全角文字と半角文字の混同を確認
- カンマ(,)の過不足を確認
予期しない結果が表示される、何も結果が表示されない
原因: 結合条件や絞り込み条件の間違い
対処法:
- ON句の結合条件を確認
- WHERE句の条件を確認
- テーブル名.列名の指定を確認
SQLFiddleが動かない場合
- DBFiddle(https://www.db-fiddle.com/)を試してみる
- ブラウザを変更してみる(Chrome、Firefox、Edgeなど)
- ブラウザのキャッシュをクリアする
まとめ
この演習で学んだこと
- リレーショナルデータベースでデータを複数のテーブルに分けて管理する意義
- INNER JOINによるテーブルの結合方法
- ON句による結合条件の指定
- WHERE句による結合後のデータの絞り込み
- CROSS JOIN(結合条件のない結合)との違い
重要なポイント
- データの正規化:情報を複数のテーブルに分けることで、データの重複を避け、整合性を保つ
- 結合の必要性:分けられたデータを必要に応じて結合し、意味のある情報を取り出す
- 結合条件の重要性:適切な結合条件を指定することで、関連性のあるデータだけを取り出せる
6.SQL によるデータ分析:GROUP BY を用いたグループ化と集約
資料
PDFファイル
https://www.kkaneko.jp/de/ds/d5.pdf
パワーポイントファイル(PDFファイルと同じ内容)
https://www.kkaneko.jp/de/ds/d5.pptx
関連する外部ページ
SQLFiddle(推奨)
DBFiddle(代替案)
演習全体について
準備
この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。
SQLFiddle(推奨)
DBFiddle(代替案)
SQLFiddleの基本操作
コピー:
- マウスの左ボタンを押しながら範囲を選択し、右クリックメニューで「コピー」を選択してください
SQLFiddleへの貼り付け:
重要な注意事項
SQLFiddle、DBFiddleはオンラインツールです。秘密情報はオンラインツールにアップロードしないでください。情報漏洩のリスクがあります。
学習目標
- グループ化によるデータ分析を行えるようになる
- GROUP BY と集約関数(COUNT, AVG など)の使い方を理解する
演習1:テーブル定義とデータの追加
演習の目的
この演習では、SQLによるテーブル定義(CREATE TABLE)の基本を理解し、データの追加(INSERT INTO)とSELECT文による確認方法を習得する。
手順
ステップ1:SQLFiddleまたはDBFiddleにアクセスする
- Webブラウザを開く
- アドレスバーにSQLFiddleのページ http://sqlfiddle.com/ を入力する
または DBFiddleのページ https://www.db-fiddle.com/ にアクセスする
- 表示されたページで「MySQL」を選択する
- SQLFiddleの場合:表示されたリストから「MySQL」をクリックする
- DBFiddleの場合:上部で「MySQL」のバージョン8または9を選択する
ステップ2:SQLを入力して実行する
SQLFiddleの場合は上のパネルに、DBFiddleの場合は左側の「Schema SQL」に以下のSQLを入力する。
注意: 最初に表示されているサンプルSQLは削除。
CREATE TABLE 成績 (
科目 TEXT,
受講者 TEXT,
得点 INTEGER);
INSERT INTO 成績 VALUES('国語', 'A', 85);
INSERT INTO 成績 VALUES('国語', 'B', 90);
INSERT INTO 成績 VALUES('算数', 'A', 90);
INSERT INTO 成績 VALUES('算数', 'B', 96);
INSERT INTO 成績 VALUES('理科', 'A', 95);
SELECT * FROM 成績;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行える。
入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックする。
ステップ3:結果を確認する
下のパネルまたは右側に以下の結果が表示されることを確認する。
成績テーブルの全データが表示される(5行)。
期待される結果:
| 科目 |
受講者 |
得点 |
| 国語 |
A |
85 |
| 国語 |
B |
90 |
| 算数 |
A |
90 |
| 算数 |
B |
96 |
| 理科 |
A |
95 |
各テーブルの内容が正しく表示されていることを確認する。
ヒントと考察のポイント
CREATE TABLE文について:
- CREATE TABLE でテーブルを作成する
- テーブル名と列名、データ型を指定する
- TEXT:文字列型
- INTEGER:整数型
INSERT INTO文について:
- INSERT INTO 文でVALUES の後に、列の順序に従ってデータを指定する
- 重要:文字列はシングルクォーテーション(')で囲む必要がある
SELECT文について:
- SELECT * FROM 成績 の * はすべての列を意味する
- アスタリスク(*)はすべての列を意味する
よくある間違い:
- 文字列をシングルクォーテーション(')で囲み忘れる
演習2:集約関数の基本
演習の目的
この演習では、集約関数(AVG, MAX, MIN, SUM, COUNT)の使い方を習得し、WHERE句と集約関数の組み合わせを理解する。
手順
ステップ1:SQLFiddleまたはDBFiddleにアクセスする
- 前回と同じ手順でアクセスする
- 「MySQL」を選択する
ステップ2:SQLを入力して実行する
以下のSQLを入力する(前回と同じテーブル定義とデータ追加、その後に集約関数を使用)。
注意: 最初に表示されているサンプルSQLは削除。
CREATE TABLE 成績 (
科目 TEXT,
受講者 TEXT,
得点 INTEGER);
INSERT INTO 成績 VALUES('国語', 'A', 85);
INSERT INTO 成績 VALUES('国語', 'B', 90);
INSERT INTO 成績 VALUES('算数', 'A', 90);
INSERT INTO 成績 VALUES('算数', 'B', 96);
INSERT INTO 成績 VALUES('理科', 'A', 95);
SELECT AVG(得点) FROM 成績 WHERE 科目 = '国語';
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行える。
入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックする。
ステップ3:結果を確認する
実行すると、国語の平均点(87.5)が表示される。
期待される結果:
ステップ4:他の集約関数も試す
以下のSQLを順に試す(最後のSELECT文の部分だけを変更して実行)。
-- 算数の平均点
SELECT AVG(得点) FROM 成績 WHERE 科目 = '算数';
-- 全体の最高点
SELECT MAX(得点) FROM 成績;
-- 全体の最低点
SELECT MIN(得点) FROM 成績;
-- 全体の合計点
SELECT SUM(得点) FROM 成績;
-- 全体の行数
SELECT COUNT(*) FROM 成績;
ヒントと考察のポイント
集約関数について:
- 集約関数:複数行のデータを1つの値にまとめる関数である
- AVG:平均値
- MAX:最大値
- MIN:最小値
- SUM:合計値
- COUNT:行数
WHERE句について:
- WHERE句:集約の前にデータを絞り込む
- 集約関数は常に1つの値を返す
よくある間違い:
- 列名を間違える(得点を「点数」と書くなど)
- WHERE句での文字列比較でシングルクォーテーション(')を忘れる
- COUNT(*) のアスタリスクを忘れる
発展問題
発展問題①:算数の平均点の計算
目的:成績テーブルから算数の平均得点を算出する。
科目が算数の行について、得点の平均値を求めるSQL文を書く。
ヒント:AVGを使い、WHERE 句で科目を算数に絞り込む。
発展問題②:科目は問わず全体の最高点の計算
目的:成績テーブルから最高得点を算出する。
得点の最大値を求めるSQL文を書く。
ヒント:MAXを使う。
演習3:GROUP BYによるグループ化と集約
演習の目的
この演習では、GROUP BY句の基本的な使い方を理解し、グループ化と集約の組み合わせ、WHERE句とGROUP BYの組み合わせを習得する。
手順
ステップ1:科目ごとの受講者数を計算する
SQLFiddleまたはDBFiddleにアクセスし、「MySQL」を選択する。
以下のSQLを入力して実行する。
注意: 最初に表示されているサンプルSQLは削除。
CREATE TABLE 成績 (
科目 TEXT,
受講者 TEXT,
得点 INTEGER);
INSERT INTO 成績 VALUES('国語', 'A', 85);
INSERT INTO 成績 VALUES('国語', 'B', 90);
INSERT INTO 成績 VALUES('算数', 'A', 90);
INSERT INTO 成績 VALUES('算数', 'B', 96);
INSERT INTO 成績 VALUES('理科', 'A', 95);
SELECT 科目, COUNT(*) FROM 成績 GROUP BY 科目;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行える。
入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックする。
期待される結果:
| 科目 |
COUNT(*) |
| 国語 |
2 |
| 算数 |
2 |
| 理科 |
1 |
ステップ2:WHERE句との組み合わせを試す
90点以上の成績について、科目ごとの受講者数を計算する。
最後のSELECT文を以下に変更して実行する。
SELECT 科目, COUNT(*) FROM 成績 WHERE 得点 >= 90 GROUP BY 科目;
期待される結果:
| 科目 |
COUNT(*) |
| 国語 |
1 |
| 算数 |
2 |
| 理科 |
1 |
ヒントと考察のポイント
GROUP BY句について:
- GROUP BY句:指定した列の値が同じ行をグループ化する
- 実行順序:WHERE句でフィルタリング → GROUP BYでグループ化 → 集約関数で計算
- SELECT句:GROUP BY句で指定した列と集約関数のみ記述できる
よくある間違い:
- GROUP BY句に指定していない列をSELECT句に記述する
- WHERE句とGROUP BY句の順序を間違える(正しい順序:WHERE → GROUP BY)
- 集約関数の引数に列名を指定し忘れる(COUNT(*) を除く)
発展問題
以下の問題に挑戦する。
発展問題③:受講者ごとの科目数
SELECT 受講者, COUNT(*) FROM 成績 GROUP BY 受講者;
発展問題④:科目ごとの平均点
SELECT 科目, AVG(得点) FROM 成績 GROUP BY 科目;
発展問題⑤:受講者ごとの平均点
ヒント:AVG と GROUP BY を使用する。発展問題④の「科目」を「受講者」に変更する。
演習4:売上データでのGROUP BY活用
演習の目的
この演習では、実務に近いデータでGROUP BYを活用し、複数列でのグループ化を理解し、計算式(個数 * 単価)を含む集約を習得する。
手順
ステップ1:日付ごとの売上合計を計算する
SQLFiddleまたはDBFiddleにアクセスし、「MySQL」を選択する。
以下のSQLを入力して実行する。
注意: 最初に表示されているサンプルSQLは削除。
CREATE TABLE 売上 (
日付 DATETIME,
商品 TEXT,
個数 INTEGER,
単価 INTEGER
);
INSERT INTO 売上 VALUES('2024-01-01', '商品A', 1, 500);
INSERT INTO 売上 VALUES('2024-01-01', '商品A', 2, 500);
INSERT INTO 売上 VALUES('2024-01-01', '商品A', 3, 500);
INSERT INTO 売上 VALUES('2024-01-01', '商品A', 4, 500);
INSERT INTO 売上 VALUES('2024-01-01', '商品B', 1, 1500);
INSERT INTO 売上 VALUES('2024-01-01', '商品B', 2, 1500);
INSERT INTO 売上 VALUES('2024-01-01', '商品B', 3, 1500);
INSERT INTO 売上 VALUES('2024-01-01', '商品B', 4, 1500);
INSERT INTO 売上 VALUES('2024-01-02', '商品A', 1, 500);
INSERT INTO 売上 VALUES('2024-01-02', '商品A', 2, 500);
INSERT INTO 売上 VALUES('2024-01-02', '商品A', 3, 500);
INSERT INTO 売上 VALUES('2024-01-02', '商品A', 4, 500);
INSERT INTO 売上 VALUES('2024-01-02', '商品B', 1, 1500);
INSERT INTO 売上 VALUES('2024-01-02', '商品B', 2, 1500);
INSERT INTO 売上 VALUES('2024-01-02', '商品B', 3, 1500);
INSERT INTO 売上 VALUES('2024-01-02', '商品B', 4, 1500);
INSERT INTO 売上 VALUES('2024-01-03', '商品A', 1, 500);
INSERT INTO 売上 VALUES('2024-01-03', '商品A', 2, 500);
INSERT INTO 売上 VALUES('2024-01-03', '商品A', 3, 500);
INSERT INTO 売上 VALUES('2024-01-03', '商品A', 4, 500);
INSERT INTO 売上 VALUES('2024-01-03', '商品B', 1, 1500);
INSERT INTO 売上 VALUES('2024-01-03', '商品B', 2, 1500);
INSERT INTO 売上 VALUES('2024-01-03', '商品B', 3, 1500);
INSERT INTO 売上 VALUES('2024-01-03', '商品B', 4, 1500);
SELECT 日付, SUM(個数 * 単価)
FROM 売上
GROUP BY 日付;
SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行える。
入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックする。
期待される結果:
| 日付 |
SUM(個数 * 単価) |
| 2024-01-01 00:00:00 |
20000 |
| 2024-01-02 00:00:00 |
20000 |
| 2024-01-03 00:00:00 |
20000 |
ヒントと考察のポイント
計算式の使用について:
- 計算式の使用:SUM(個数 * 単価) のように、集約関数内で計算式を使用できる
- DATETIME型:日付と時刻を保存するデータ型である
- 売上の計算:個数 × 単価 = 売上金額
よくある間違い:
- 計算式(個数 * 単価)を集約関数の外に書く
- GROUP BYに複数列を指定するときのカンマを忘れる
- 日付の文字列表記で時刻部分(00:00:00)を考慮しない
発展問題
発展問題⑥:商品Aの総売上を計算
ヒント:WHERE句で商品Aのみを選択し、SUMで合計する。
解答を見る
SELECT SUM(個数 * 単価)
FROM 売上
WHERE 商品 = '商品A';
期待される結果: 15000
計算の内訳:
- 2024-01-01: (1+2+3+4) × 500 = 5000
- 2024-01-02: (1+2+3+4) × 500 = 5000
- 2024-01-03: (1+2+3+4) × 500 = 5000
- 合計:15000
発展問題⑦:日付別・商品別の総売上を計算
以下のSQLを実行し、結果を確認する。
SELECT 日付, 商品, SUM(個数 * 単価)
FROM 売上
GROUP BY 日付, 商品;
期待される結果:
| 日付 |
商品 |
SUM(個数 * 単価) |
| 2024-01-01 00:00:00 |
商品A |
5000 |
| 2024-01-01 00:00:00 |
商品B |
15000 |
| 2024-01-02 00:00:00 |
商品A |
5000 |
| 2024-01-02 00:00:00 |
商品B |
15000 |
| 2024-01-03 00:00:00 |
商品A |
5000 |
| 2024-01-03 00:00:00 |
商品B |
15000 |
解説:
- GROUP BY 日付, 商品 により、日付と商品の組み合わせごとにグループ化される
- 各グループ内でSUM(個数 * 単価)が計算される
- 日付と商品の両方を分析軸にすることで、より詳細な傾向が把握できる
エラー対処法
SQLFiddleで実行できない場合
エラーメッセージが表示される場合
- 文字列がシングルクォーテーション(')で囲まれているか確認
- 列名やテーブル名のスペルミスがないか確認
- 全角スペースが混入していないか確認
結果が期待と異なる場合
- WHERE句の条件を確認
- GROUP BY句に指定した列を確認
- 集約関数の引数(列名)を確認