リレーショナルデータベースシステム(スライド資料16回)

大学授業用に作成した資料を更新・改良して公開しています.これらは クリエイティブコモンズ 表示-非営利-継承 4.0 国際ライセンス(CC BY-NC-SA 4.0) で提供しており,事前の許可なく自由に利用できます.条件は著作者表示(BY),非営利目的のみ(NC),同一ライセンスでの再配布(SA)です.

目次

  1. ds-1. データベースの基本 [PDF], [パワーポイント], [HTML]
  2. ds-2. SQL の基本 [PDF], [パワーポイント]
  3. ds-3. SQL入門:SQLFiddleを活用したデータベース操作の基礎と応用 [PDF], [パワーポイント]
  4. ds-4. SQL基礎:SELECT文による効率的なデータ検索と操作の基本 [PDF], [パワーポイント]
  5. ds-5. テーブル結合とSQLによるデータ統合 [PDF], [パワーポイント]
  6. ds-6. SQLによるデータ分析:GROUP BYを用いたグループ化と集約 [PDF], [パワーポイント]
  7. ds-7. SQLにおける副問い合わせ [PDF], [パワーポイント]
  8. ds-8. データベース設計と正規化: データベース設計の留意点とメリット,異状,正規化の基本概念,正規化の手法 [PDF], [パワーポイント]
  9. ds-9. データベース設計の基礎:主キー・外部キーを用いたテーブル間の関連付けとSQL実践 [PDF], [パワーポイント]
  10. ds-10. データベース操作とトランザクション管理:データ整合性と永続性 [PDF], [パワーポイント]
  11. ds-11. 中間まとめ:効率的なデータ管理と分析の実践 [PDF], [パワーポイント]
  12. ds-12. データ管理の基礎:オンライントランザクションとデータウェアハウスの特徴と活用 [PDF], [パワーポイント]
  13. ds-13. データベース設計演習,正規化 [PDF], [パワーポイント]
  14. ds-14. 関数従属性 [PDF], [パワーポイント]
  15. ds-15. 並べ替え(ソート)[PDF], [パワーポイント]
  16. ds-16. インデックス,セキュリティ,データベースの歴史と展望,データベースのバリエーション [PDF], [パワーポイント]

1.データベースの基本

資料

PDFファイル

https://www.kkaneko.jp/de/ds/d1.pdf

パワーポイントファイル(PDFファイルと同じ内容)

https://www.kkaneko.jp/de/ds/d1.pptx

関連する外部ページ

演習1:Accessの利用開始

目的

Microsoft Accessの基本的な起動方法と新しいデータベースの作成方法を身につける。

手順

  1. Accessの起動
    • スタートメニューまたはデスクトップからMicrosoft Accessを起動する
  2. データベースの新規作成
    • スタート画面で「空のデスクトップデータベース」をクリックする
    • ファイル名は初期設定のまま使用可能である
    • 「作成」ボタンをクリックする
  3. 画面確認
    • 期待される結果:テーブルツール画面が表示される
    • 画面の各部分を確認する

重要な注意点

今回は、必ず「空のデスクトップデータベース」を選択すること。

演習2:テーブルの新規作成

目的

データベースの基本構成要素であるテーブルを作成し、属性の設定とデータ型の指定方法を身につける。

専門用語の説明

  • テーブル:データを表形式で格納する構造
  • 属性:テーブルの列にあたる項目
  • データ型:格納するデータの種類を指定する設定

手順

ステップ1:「商品」属性の追加
  1. 「クリックして追加」を右クリックする
  2. 「短いテキスト」を選択する
  3. 「フィールド1」をダブルクリックして選択状態にする
  4. 「商品」と入力する

期待される結果:列名が「商品」に変更される

ステップ2:「単価」属性の追加
  1. 再度「クリックして追加」を右クリックする
  2. 今度は「数値」を選択する
  3. 「フィールド1」を「単価」に変更する

期待される結果:数値用の列が追加される

重要なデータ型について

  • 短いテキスト:文字列データ
  • 数値:数値データ
  • ID:自動的に連番が設定される

つまずきポイントの回避

単価属性では「数値」を選択すること。

演習3:データの挿入と保存

目的

作成したテーブルに実際のデータを挿入し、テーブルの保存方法を身につける。

手順

ステップ1:データの挿入
  1. 1行目のデータ入力
    • 商品欄に「みかん」と入力する
    • 単価欄に「50」と入力する

    期待される結果:ID欄に自動的に「1」が設定される

  2. 2行目のデータ入力
    • 商品欄に「りんご」と入力する
    • 単価欄に「100」と入力する

    期待される結果:ID欄に自動的に「2」が設定される

  3. 3行目のデータ入力
    • 商品欄に「りんご」と入力する
    • 単価欄に「150」と入力する
ステップ2:テーブルの保存
  1. 「テーブル1」タブを右クリックする
  2. 「閉じる」を選択する
  3. 「変更を保存しますか?」で「はい」を選択する
  4. テーブル名を「商品」に変更する
  5. 「OK」をクリックする

重要な注意点

  • 数値データは必ず半角数字で入力すること
  • 最初の保存時に必ずテーブル名を設定すること

つまずきポイントの回避

数値欄に全角数字を入力するとエラーが発生する。単価欄では必ず半角数字を使用すること。

エラー対処法

テーブルの削除方法

間違ってテーブルを作成した場合:

  1. ナビゲーションペインでテーブルを右クリックする
  2. 「削除」を選択する

新しいテーブルの作成方法

  1. リボンの「作成」タブをクリックする
  2. 「テーブル」をクリックする

データベースの終了方法

  1. リボンの「ファイル」をクリックする
  2. 「閉じる」をクリックする
  3. ウィンドウ右上の「×」ボタンで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にアクセスする

  1. Webブラウザを開く
  2. アドレスバーにSQLFiddleのページ http://sqlfiddle.com/ を入力する

    または DBFiddleのページ https://www.db-fiddle.com/ にアクセスする

  3. 表示されたページで「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の画面構成

基本用語

演習2:テーブル定義とデータ追加と問い合わせ

学習目標

演習の目的

この演習では、従業員テーブルを作成し、データを追加した後、様々なパターンの問い合わせを実行します。SQLによるデータ操作の基本的な流れを体験します。

問い合わせとは、必要なデータを検索・加工するためのコマンドです。

パート1:全データの取得

ステップ1:Webブラウザを使用してください

  1. Webブラウザを開いてください
  2. アドレスバーにSQLFiddleのURLを入力してください
http://sqlfiddle.com/

ここで「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での実行について

SELECT文の基本

SELECT 取得したい属性 FROM テーブル名;

WHERE句の使い方

SELECT * FROM テーブル名 WHERE 条件;

基本用語

処理の流れ

SQLは大文字小文字を区別しません。SELECTとselectは同じ意味です。

よくある間違い

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 学習目標

1.2 演習の目的

この演習では、オンラインツールSQLFiddleを使用して、テーブルの定義とデータの追加を行います。SQLFiddleはインストール不要で利用できるため、SQLの基本操作を手軽に学習できます。

1.3 演習手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスする

  1. Webブラウザを開く
  2. アドレスバーにSQLFiddleのページ http://sqlfiddle.com/ を入力する

    または DBFiddleのページ https://www.db-fiddle.com/ にアクセスする

  3. 表示されたページで「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 期待される結果

各テーブルの内容が正しく表示されていることを確認してください。

1.5 ヒントと考察のポイント

SQLのキーワードについて

テーブル構造の理解

SQLFiddleでの実行について

SQLFiddleでは、各実行が独立しています。そのため、問い合わせを実行するたびに、テーブル定義とデータ追加のコードも含める必要があります。

処理の流れ:

  1. テーブルを定義します(CREATE TABLE)
  2. データを追加します(INSERT INTO)
  3. データを取得します(SELECT)

よくある間違い:

1.6 次のステップ

このブラウザウインドウは閉じないでください。次の演習で使用します。

1.7 余裕がある人向け

次のSQLを試してみてください:

SELECT age FROM 従業員;
SELECT * FROM 従業員 WHERE age = 30;

SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。


これらのSQLは、特定の属性だけを取得したり、条件に合う行だけを取得したりする例です。

演習2:問い合わせ(クエリ)

2.1 学習目標

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演算子は、テキストのパターンマッチに使用します。

処理の流れ:

  1. テーブルから都道府県名を取得します
  2. 指定されたパターンに一致する行を選択します
  3. 該当する行を表示します

よくある間違い:

演習3:SQL問い合わせ(クエリ)の概観

3.1 学習目標

SQLの主要な機能を体系的に体験する:

  1. データの検索や射影(SELECT)
  2. 問い合わせ対象テーブルの指定(FROM)
  3. 選択(WHERE)
  4. 結合、結合条件(JOIN、ON)
  5. 重複行の除去(DISTINCT)
  6. 行数のカウント(COUNT)
  7. 平均、最大、最小、合計の計算(AVG、MAX、MIN、SUM)
  8. 属性でグループ化(GROUP BY)
  9. 並べ替え(ORDER BY)
  10. 副問い合わせ

3.2 演習の目的

この演習では、SQLの主要な機能を1つずつ順番に試していきます。各パートで1つの機能に焦点を当て、その動作を確認することで、SQLの全体像を把握します。すべてのパートで、「従業員」テーブルと「部署」テーブルを使用します。

3.3 重要な注意事項

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は、データベースからデータを取得するための基本的な命令です。

試すSQL

以下のSQLを追加して実行してください:

SELECT * FROM 従業員;
SELECT name, age FROM 従業員;

SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。


期待される結果

考察のポイント

「射影」とは、テーブルから必要な属性(列)だけを抽出する操作です。すべてのデータが必要でない場合、必要な属性だけを指定することで、結果が見やすくなります。

処理の流れ:

  1. テーブルから指定された属性を取得します
  2. すべての行について取得します
  3. 結果を表示します

パート2:FROM(問い合わせ対象テーブルの指定)

FROM句の役割を理解する

説明

FROMは、問い合わせ(クエリ)が対象とするテーブルを指定します。複数のテーブルがある場合、どのテーブルからデータを取得するかを明示する必要があります。

試すSQL

以下のSQLを追加して実行してください:

SELECT name FROM 従業員;
SELECT name FROM 部署;

SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。


期待される結果

考察のポイント

同じ「name」という属性名でも、どのテーブルから取得するかによって結果が異なります。FROMで対象テーブルを明確に指定することが重要です。

処理の流れ:

  1. FROM句で指定されたテーブルを特定します
  2. そのテーブルから指定された属性を取得します
  3. 結果を表示します

パート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を使うことで必要な行だけに絞り込むことができます。

処理の流れ:

  1. テーブルからすべての行を取得します
  2. WHERE句の条件を各行に適用します
  3. 条件を満たす行だけを選択します
  4. 結果を表示します

よくある間違い

パート4:JOIN、ON(結合、結合条件)

JOINは、関係のあるテーブルを結合条件を指定して1つにまとめる操作です。ONで結合条件を指定します。従業員テーブルのdepartment_id属性と部署テーブルのid属性が一致する行を結合することで、従業員名と所属部署名を一緒に表示できます。

試すSQL

以下のSQLを追加して実行してください:

SELECT 従業員.name, 部署.name
FROM 従業員
JOIN 部署 ON 従業員.department_id = 部署.id;

SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。


期待される結果

従業員名と所属部署名が対応して表示されます:

考察のポイント

処理の流れ:

  1. 従業員テーブルと部署テーブルを準備します
  2. ON句の条件に基づいて行を結合します
  3. 結合された結果から指定された属性を取得します
  4. 結果を表示します

パート5:DISTINCT(重複行の除去)

重複する行を除去する方法を理解する

説明

DISTINCTは、重複する行を除去します。同じ値が複数回表示されるのを防ぎたい場合に使用します。

試すSQL

以下のSQLを追加して実行してください:

SELECT department_id FROM 従業員;
SELECT DISTINCT department_id FROM 従業員;

SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。


期待される結果

考察のポイント

DISTINCTを使わない場合、各行のdepartment_idがそのまま表示されるため、同じ値が複数回表示されます。DISTINCTを使うことで、「どのような値が存在するか」を知ることができます。

処理の流れ:

  1. テーブルから指定された属性を取得します
  2. 重複する値を除去します
  3. 一意な値だけを表示します

パート6:COUNT(行数のカウント)

COUNTは、テーブルの行数や、特定の条件に合う行数をカウントする集計関数です。COUNT(*)で全行数をカウントできます。

試すSQL

以下のSQLを追加して実行してください:

SELECT COUNT(*) FROM 従業員;

SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。


期待される結果

3が表示されます(従業員テーブルには3行のデータがあります)。

考察のポイント

COUNTは「集計関数」の1つです。集計関数は、複数の行のデータをまとめて1つの値を計算します。

処理の流れ:

  1. テーブルのすべての行を確認します
  2. 行数をカウントします
  3. 結果を表示します

パート7:AVG、MAX、MIN、SUM(平均、最大、最小、合計の計算)

数値データに対する集計関数を理解する

説明

これらは、数値データに対する集計を行う関数です:

試すSQL

以下のSQLを追加して実行してください:

SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary)
FROM 従業員;

SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。


期待される結果

salary(給与)について以下が表示されます:

考察のポイント

これらの集計関数を使うことで、データの統計的な情報を簡単に取得できます。

計算の確認:

処理の流れ:

  1. 指定された属性の全データを取得します
  2. 各集計関数に応じた計算を行います
  3. 結果を表示します

パート8:GROUP BY(属性でグループ化)

GROUP BYは、指定した属性についてデータをグループ化する機能です。各グループに対して集計関数を適用できます。

試すSQL

以下のSQLを追加して実行してください:

SELECT department_id, COUNT(*)
FROM 従業員
GROUP BY department_id;

SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。


期待される結果

department_idごとに従業員数がカウントされます:

考察のポイント

GROUP BYを使うことで、「部署ごとの従業員数」や「カテゴリごとの売上合計」など、グループ単位での集計ができます。

処理の流れ:

  1. department_idの値でグループ化(1のグループと2のグループ)
  2. 各グループの行数をCOUNTでカウント
  3. 結果を表示

パート9:ORDER BY(並べ替え(ソート))

ORDER BYは、指定した属性について結果をソート(並べ替え)します。

試すSQL

以下のSQLを追加して実行してください:

SELECT name, age
FROM 従業員
ORDER BY age DESC;

SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。


期待される結果

age(年齢)の高い順に表示されます:

考察のポイント

ORDER BYを使わない場合、結果の順序は保証されません(データが追加された順や、データベース内部の格納順に依存します)。特定の順序で結果を表示したい場合は、必ずORDER BYを使用してください。

処理の流れ:

  1. 指定された属性を取得します
  2. ORDER BY句で指定された属性に基づいてソートします
  3. 並べ替えた結果を表示します

パート10:副問い合わせ

副問い合わせ(サブクエリ)は、SQL文の中に別のSQL文を埋め込む機能です。ある問い合わせの結果を、別の問い合わせの条件として使用できます。

試すSQL

以下のSQLを追加して実行してください:

SELECT * FROM 従業員
WHERE salary > (SELECT AVG(salary) FROM 従業員);

SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。


期待される結果

salary(給与)が平均給与より高い従業員が表示されます:

考察のポイント

この問い合わせは以下のように処理されます:

  1. 内側の問い合わせ(SELECT AVG(salary) FROM 従業員)が先に実行され、平均給与60000が計算される
  2. 外側の問い合わせでWHERE salary > 60000という条件で選択される

副問い合わせを使うことで、動的な条件(データの内容に応じて変化する条件)を指定できます。

3.5 演習3のまとめ

この演習では、SQLの主要な機能を10のパートに分けて体験しました。

  1. SELECT:必要なデータを取得する
  2. FROM:対象テーブルを指定する
  3. WHERE:条件に合う行を選択する
  4. JOIN、ON:複数のテーブルを結合する
  5. DISTINCT:重複行を除去する
  6. COUNT:行数をカウントする
  7. AVG、MAX、MIN、SUM:数値データを集計する
  8. GROUP BY:データをグループ化して集計する
  9. ORDER BY:結果を並べ替える
  10. 副問い合わせ:問い合わせの中に問い合わせを含める

これらの機能を組み合わせることで、様々な問い合わせを実現できます。

難しく考えないでください。今回は体験です。詳しい説明は時間をかけて別の回で行っていきます。

全体のまとめ

このガイドでは、以下の内容を学びました:

  1. 演習1:SQLFiddleの使い方とテーブルの定義・データ追加の基本
  2. 演習2:WHERE句とLIKE演算子を使った条件検索
  3. 演習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はオンラインツールです。秘密情報はオンラインツールにアップロードしないでください。情報漏洩のリスクがあります。

学習目標

この演習で習得する内容:

SQL構文要素の基本

この演習で使用する主なSQL構文要素の役割は以下の通りです:

基本用語:

演習1:テーブル定義とデータの追加、基本的なSELECT文

演習の目的

この演習では、データベースの基本操作を学びます。具体的には、テーブルを作成し、データを追加し、そのデータを取得する一連の流れを体験します。

手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスする

  1. Webブラウザを開く
  2. アドレスバーにSQLFiddleのページ http://sqlfiddle.com/ を入力する

    または DBFiddleのページ https://www.db-fiddle.com/ にアクセスする

  3. 表示されたページで「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

ヒントと考察のポイント

テーブル定義について:

データ追加について:

SELECT文について:

よくある間違い:

演習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:

居室
1階
2階
3階
1階
2階

2つ目のSQL:

居室
1階
2階
3階

各結果が正しく表示されていることを確認してください。

ステップ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:

名前 得点
徳川家康 85
豊臣秀吉 82

各結果が正しく表示されていることを確認してください。

ステップ3:集約関数を使用してください

上のパネルの最後に、以下のSQLを追加してください。

select avg(得点) from 記録;

SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。

「Execute」ボタンをクリックし、結果を確認してください。

得点の平均値が表示されます。

期待される結果:

avg(得点)
82.0000

結果が正しく表示されていることを確認してください。

ステップ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について:

処理の流れ:

  1. テーブルから居室の値を取得します
  2. 重複する値を除去します
  3. 残った値を表示します

WHERE句の条件指定について:

集約関数について:

処理の流れ:

  1. テーブルからすべての得点の値を取得します
  2. 得点の合計を計算します(85 + 78 + 90 + 82 + 75 = 410)
  3. 行数で割ります(410 ÷ 5 = 82)
  4. 平均値を表示します

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階

解説:

確認問題②の解答

SELECT MAX(得点) FROM 記録;

得点の最大値が表示されます。

期待される結果:

MAX(得点)
90

解説:

エラー対処法

Q1: SQLを実行してもエラーが出ます

確認事項:

Q2: SQLFiddleが動作しません

対処法:

Q3: DBFiddleでの操作方法がわかりません

手順:

Q4: 結果が表示されません

確認事項:


このガイドを使って、自分のペースで学習を進めてください。実際に手を動かして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:テーブル定義とデータの追加

学習目標

この演習で習得する内容:

演習の目的

この演習では、データベースの基本操作を学びます。具体的には、テーブルを作成し、データを追加し、そのデータを取得する一連の流れを体験します。

手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスする

  1. Webブラウザを開く
  2. アドレスバーにSQLFiddleのページ http://sqlfiddle.com/ を入力する

    または DBFiddleのページ https://www.db-fiddle.com/ にアクセスする

  3. 表示されたページで「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

各テーブルの内容が正しく表示されていることを確認してください。

ヒントと考察のポイント

テーブル定義について:

データ追加について:

SELECT文について:

よくある間違い:

演習2:SQLによる結合

演習の目的

この演習では、2つのテーブルを結合する方法を学びます。具体的には、INNER JOINを使用して、関連性のあるデータを結び付ける方法を体験します。

手順

ステップ1:SQLFiddleにアクセスしてください

  1. Webブラウザを開いてください
  2. アドレスバーに http://sqlfiddle.com/ を入力してください
  3. 表示されたページで「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

各テーブルの内容が正しく表示されていることを確認してください。

ヒントと考察のポイント

なぜテーブルを分けるのか:

INNER JOINについて:

結合条件について:

よくある間違い:

演習3:発展問題①:SELECTの応用

演習の目的

この演習では、結合後のテーブルから必要な列のみを選択する方法を学びます。

問題

結合の結果のテーブルは5列です。このうち、「商品名」と「購入者」の列のみを表示し、他の列は表示しないようなSQLを作成してください。

ヒント: SELECT * を変更して、必要な列のみを指定してください。

期待される結果:

商品名 購入者
みかん X
メロン X
りんご Y

解答例

SELECT 商品名, 購入者 FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号;

解説

演習4:発展問題②:COUNT(*)の応用

演習の目的

この演習では、結合後のテーブルの行数を数える方法を学びます。

問題

結合の結果のテーブルは、1つのテーブルです。この行数3を得るSQLを作成してください。

ヒント: COUNT(*) を使用してください。

期待される結果:

COUNT(*)
3

解答例

SELECT COUNT(*) FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号;

解説

演習5:複数の条件の指定

演習の目的

この演習では、INNER JOINとWHERE句を組み合わせて使用する方法を学びます。具体的には、結合後のデータを条件で絞り込む方法を体験します。

手順

ステップ1:SQLFiddleにアクセスしてください

  1. Webブラウザを開いてください
  2. アドレスバーに http://sqlfiddle.com/ を入力してください
  3. 表示されたページで「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句について:

SELECT句での列の指定について:

よくある間違い:

演習6:発展問題③:条件変更による結果の予想

演習の目的

この演習では、WHERE句の条件を変更した場合の結果を予想する力を養います。

問題

いまの演習において、次のSQLを実行したら、どのような結果になるか、予想してください。そして、実際に動作させてください。

SELECT 商品名, 購入者, 単価 FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号 WHERE 購入.購入者 = 'Y';

ヒント: 購入.購入者 = 'X' でなく、購入.購入者 = 'Y' になっていることに注意

解答

期待される結果:

商品名 購入者 単価
りんご Y 100

演習7:結合条件のない結合

演習の目的

この演習では、CROSS JOINの動作を学びます。具体的には、結合条件を指定しない場合に、2つのテーブルの全ての組み合わせが作成されることを体験します。

手順

ステップ1:SQLFiddleにアクセスしてください

  1. Webブラウザを開いてください
  2. アドレスバーに http://sqlfiddle.com/ を入力してください
  3. 表示されたページで「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について:

INNER JOINとの違い:

考察のポイント:

演習8:結合の総合演習

演習の目的

この演習では、これまで学んだ内容を統合して使用します。具体的には、テーブルの作成、結合、列の選択、条件による絞り込み、集計を体験します。

手順

ステップ1:SQLFiddleにアクセスしてください

  1. Webブラウザを開いてください
  2. アドレスバーに http://sqlfiddle.com/ を入力してください
  3. 表示されたページで「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:

name name
織田 とうふ

4つ目のSQL:

COUNT(*)
3

ヒントと考察のポイント

データの関連性について:

段階的なデータ抽出について:

  1. 全ての組み合わせを確認(CROSS JOIN)
  2. 関連性のある行のみを結合(INNER JOIN)
  3. 必要な列のみを表示(SELECT句)
  4. 条件で絞り込み(WHERE句)
  5. 集計(COUNT関数)

エラー対処法

Syntax errorが表示される

原因: SQLの文法エラー

対処法:

予期しない結果が表示される、何も結果が表示されない

原因: 結合条件や絞り込み条件の間違い

対処法:

SQLFiddleが動かない場合

まとめ

この演習で学んだこと

重要なポイント

  1. データの正規化:情報を複数のテーブルに分けることで、データの重複を避け、整合性を保つ
  2. 結合の必要性:分けられたデータを必要に応じて結合し、意味のある情報を取り出す
  3. 結合条件の重要性:適切な結合条件を指定することで、関連性のあるデータだけを取り出せる

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はオンラインツールです。秘密情報はオンラインツールにアップロードしないでください。情報漏洩のリスクがあります。

学習目標

演習1:テーブル定義とデータの追加

演習の目的

この演習では、SQLによるテーブル定義(CREATE TABLE)の基本を理解し、データの追加(INSERT INTO)とSELECT文による確認方法を習得する。

手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスする

  1. Webブラウザを開く
  2. アドレスバーにSQLFiddleのページ http://sqlfiddle.com/ を入力する

    または DBFiddleのページ https://www.db-fiddle.com/ にアクセスする

  3. 表示されたページで「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文について:

INSERT INTO文について:

SELECT文について:

よくある間違い:

演習2:集約関数の基本

演習の目的

この演習では、集約関数(AVG, MAX, MIN, SUM, COUNT)の使い方を習得し、WHERE句と集約関数の組み合わせを理解する。

手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスする

  1. 前回と同じ手順でアクセスする
  2. 「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)が表示される。

期待される結果:

AVG(得点)
87.5000

ステップ4:他の集約関数も試す

以下のSQLを順に試す(最後のSELECT文の部分だけを変更して実行)。

-- 算数の平均点
SELECT AVG(得点) FROM 成績 WHERE 科目 = '算数';

-- 全体の最高点
SELECT MAX(得点) FROM 成績;

-- 全体の最低点
SELECT MIN(得点) FROM 成績;

-- 全体の合計点
SELECT SUM(得点) FROM 成績;

-- 全体の行数
SELECT COUNT(*) FROM 成績;

ヒントと考察のポイント

集約関数について:

WHERE句について:

よくある間違い:

発展問題

発展問題①:算数の平均点の計算

目的:成績テーブルから算数の平均得点を算出する。

科目が算数の行について、得点の平均値を求める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句について:

よくある間違い:

発展問題

以下の問題に挑戦する。

発展問題③:受講者ごとの科目数

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

ヒントと考察のポイント

計算式の使用について:

よくある間違い:

発展問題

発展問題⑥:商品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

解説:

エラー対処法

SQLFiddleで実行できない場合

エラーメッセージが表示される場合

結果が期待と異なる場合