データベース入門(授業資料)

本授業は、データベースの基礎概念から実践的なアプリケーション開発、さらにNoSQL技術までを体系的に学習する全15回の演習科目である。SQLFiddleやMicrosoft Accessを演習環境として使用し、各回で理論説明と実践演習を組み合わせた構成となっている。

カリキュラム構成

本授業は以下の4つの部で構成される。

  1. 第1部:導入とSQL基礎(ds-1〜ds-4)

    データベースの基本概念を学んだ後、SQLFiddleを活用してSQLの文法とSELECT文によるデータ検索の基礎を習得する。

  2. 第2部:SQL応用(ds-5〜ds-8)

    テーブル結合、GROUP BYによる集約処理、副問い合わせを学び、総合演習でこれらの知識を統合的に活用する。

  3. 第3部:データベース設計と理論(ds-9〜ds-12)

    主キーと参照整合性制約、正規化理論、トランザクション管理を学習し、オンライントランザクション処理とデータウェアハウスの違いを理解する。

  4. 第4部:実践と発展(ds-13〜ds-15)

    Microsoft Accessを用いたアプリケーション開発を実践し、NoSQLデータベースの概念と特徴を学んでデータ管理技術への視野を広げる。

学習内容一覧

タイトル 主要な学習内容
ds-1 データベースの基本 データベースの概念、基本用語
ds-2 SQLの基本 SQL文法の基礎
ds-3 SQL入門:SQLFiddleを活用したデータベース操作の基礎と応用 SQLFiddle環境、基本操作
ds-4 SQL基礎:SELECT文による効率的なデータ検索と操作の基本 SELECT文、データ検索
ds-5 テーブルの結合とSQLによるデータ統合 JOIN、複数テーブルの操作
ds-6 SQLによるデータ分析:GROUP BYを用いたグループ化と集約 GROUP BY、集約関数
ds-7 副問い合わせ サブクエリ、入れ子構造
ds-8 SQL総合演習 SQL知識の統合、実践演習
ds-9 主キーと参照整合性制約 主キー、外部キー、制約
ds-10 データベース設計、正規化 正規化理論、設計手法
ds-11 データベース操作とトランザクション管理:データ整合性と永続性 ACID特性、トランザクション
ds-12 データ管理の基礎:オンライントランザクションとデータウェアハウスの特徴と活用 OLTP、データウェアハウス
ds-13 Microsoft Accessの使い方、データの並べ替え(ソート) Access基本操作、ソート
ds-14 データベースアプリケーションの実践 アプリケーション開発
ds-15 NoSQLデータベースシステム NoSQLの概念と特徴

補充教材

本授業には以下の補充教材が用意されている。

教材名 内容
データベース設計と正規化 設計の留意点、異状、正規化の基本概念と手法
関数従属性 関数従属性の概念と応用
インデックス、セキュリティ、データベースの歴史と展望 性能最適化、セキュリティ、発展的内容
全体まとめ 授業全体の総括

到達目標

本授業を修了した受講者は、SQLを用いたデータ操作と分析ができるようになる。また、正規化理論に基づくデータベース設計を理解し、リレーショナルデータベースとNoSQLの特性を踏まえた技術選択ができるようになる。

授業の特徴

本授業は、SQLFiddleによるオンライン演習環境とMicrosoft Accessによるアプリケーション開発実習を組み合わせ、理論と実践の両面からデータベース技術を習得できる構成となっている。リレーショナルデータベースを中心としながらもNoSQLまで扱うことで、現代のデータ管理技術を俯瞰できる視野を養成する。

教材の利用条件: クリエイティブコモンズ 表示-非営利-継承 4.0 国際ライセンス(CC BY-NC-SA 4.0)に基づき、著作者表示・非営利目的・同一ライセンスでの再配布を条件として自由に利用可能である。

ds-1. データベースの基本

資料(スライド): [PDF], [パワーポイント]

関連する外部ページ

演習

難しく考えず、Access で、データベースを体験してみてください

演習1.Access の利用開始

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

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

演習1: Accessの利用開始

目的

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

手順

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

重要な注意点

今回は、必ず「空のデスクトップデータベース」を選択してください。

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

目的

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

専門用語の説明

手順

ステップ1: 「商品」属性の追加

  1. 「クリックして追加」を右クリックしてください
  2. 「短いテキスト」を選択してください
  3. 「フィールド1」をダブルクリックして選択状態にしてください
  4. 「商品」と入力してください

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

ステップ2: 「単価」属性の追加

  1. 再度「クリックして追加」を右クリックしてください
  2. 今度は「数値」を選択してください
  3. 「フィールド1」を「単価」に変更してください

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

重要なデータ型について

つまずきポイントの回避

単価属性では「数値」を選択してください。

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

目的

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

手順 ステップ1: データの挿入

  1. 1行目のデータ入力
    • 商品欄に「みかん」と入力してください
    • 単価欄に「50」と入力してください

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

  1. 2行目のデータ入力
    • 商品欄に「りんご」と入力してください
    • 単価欄に「100」と入力してください

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

  1. 3行目のデータ入力
    • 商品欄に「りんご」と入力してください
    • 単価欄に「150」と入力してください

ステップ2: テーブルの保存

  1. 「テーブル1」タブを右クリックしてください
  2. 「閉じる」を選択してください
  3. 「変更を保存しますか?」で「はい」を選択してください
  4. テーブル名を「商品」に変更してください
  5. 「OK」をクリックしてください

重要な注意点

つまずきポイントの回避

数値欄に全角数字を入力するとエラーが発生します。単価欄では必ず半角数字を使用してください。

エラー対処法

テーブルの削除方法

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

  1. ナビゲーションペインでテーブルを右クリックしてください
  2. 「削除」を選択してください

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

  1. リボンの「作成」タブをクリックしてください
  2. 「テーブル」をクリックしてください

データベースの終了方法

  1. リボンの「ファイル」をクリックしてください
  2. 「閉じる」をクリックしてください
  3. ウィンドウ右上の「×」ボタンでAccessを終了してください

学習の振り返り

この演習完了後、以下を確認してください:

データベースの基本概念

実践的なスキル

ds-2. SQLの基本

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

【関連する外部サイトへのリンク】

SQLFiddle(推奨)

DBFiddle(代替案)

演習全般について

準備

この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。

SQLFiddle(推奨)

DBFiddle(代替案)

SQLFiddleの基本操作

コピー:

SQLFiddleへの貼り付け:

演習1: SQLFiddleを用いたテーブル定義とデータ追加

学習目標

SQLFiddleを使用してテーブル定義とデータ追加を行う

演習の目的

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

手順

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

  1. Webブラウザを開いてください
  2. アドレスバーに SQLFiddle のページ [http://sqlfiddle.com/](http://sqlfiddle.com/) を入力してください またはDBFiddle のページ [https://www.db-fiddle.com/](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:SQLFiddleまたはDBFiddleにアクセスしてください。 前回と同じ手順でアクセス。「MySQL」を選択

ステップ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 従業員;

SQLFiddleへの貼り付けCTRLキーとvキーの同時押し

ステップ3:「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は同じです。

よくある間違い:

ds-3. SQL入門:SQLFiddleを活用したデータベース操作の基礎と応用

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

【関連する外部サイトへのリンク】

SQLFiddle(推奨)

DBFiddle(代替案)

演習全般について

準備

この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。

SQLFiddle(推奨)

DBFiddle(代替案)

SQLFiddleの基本操作

コピー:

SQLFiddleへの貼り付け:

1. 演習1: SQLFiddleを用いたテーブル定義とデータ追加

学習目標

演習の目的

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

手順

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

  1. Webブラウザを開いてください
  2. アドレスバーに SQLFiddle のページ [http://sqlfiddle.com/](http://sqlfiddle.com/) を入力してください またはDBFiddle のページ [https://www.db-fiddle.com/](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」ボタンをクリックしてください。

下側のウインドウで結果を確認してください。表示が見えないときは、スクロールバーでスクロールしてください。

期待される結果

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

ヒントと考察のポイント

SQLのキーワードについて

テーブル構造の理解

SQLFiddleでの実行について

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

処理の流れ:

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

よくある間違い:

次のステップ

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

余裕がある人向け

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

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

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

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

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

2.1 学習目標

2.2 演習の目的

この演習では、データベースから必要なデータを検索・取得するための基本的な問い合わせ(クエリ)を学びます。

都道府県のデータを使用して、全データの表示、条件に合うデータの選択、パターンマッチによる検索など、実用的な問い合わせ操作を体験します。

2.3 演習手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。 前回と同じ手順でアクセス。「MySQL」を選択

ステップ2: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キーの同時押しで行えます。

ステップ3:実行と結果の確認

「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. 該当する行を表示します

よくある間違い:

ds-4. SQL基礎:SELECT 文による効率的なデータ検索と操作の基本

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

【関連する外部サイトへのリンク】

SQLFiddle(推奨)

DBFiddle(代替案)

演習全般について

準備

この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。

SQLFiddle(推奨)

DBFiddle(代替案)

SQLFiddleの基本操作

コピー:

SQLFiddleへの貼り付け:

重要な注意事項

SQLFiddle、DBFiddle はオンラインツールです。秘密情報はオンラインツールにアップロードしないでください。情報漏洩のリスクがあります。

学習目標

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

SQL構文要素の基本

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

基本用語:

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

2.1 演習の目的

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

2.2 手順

手順

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

  1. Webブラウザを開いてください
  2. アドレスバーに SQLFiddle のページ [http://sqlfiddle.com/](http://sqlfiddle.com/) を入力してください またはDBFiddle のページ [https://www.db-fiddle.com/](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

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

テーブル定義について:

データ追加について:

SELECT文について:

よくある間違い:

3. 演習2:より実践的なSQL

3.1 演習の目的

この演習では、データの絞り込み、重複除去、データ集計といった実務で頻繁に使用するSQL操作を学びます。

3.2 手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。 前回と同じ手順でアクセス。「MySQL」を選択

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

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

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

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

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

DISTINCTについて:

処理の流れ:

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

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

集約関数について:

処理の流れ:

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

IN演算子について:

よくある間違い:

3.4 余裕がある人向け

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

select max(得点), min(得点) from 記録;

select 名前, 得点 from 記録 where 得点 between 75 and 80;

select * from 記録 where 居室 = '3階';

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

これらのSQLは、最大値・最小値の取得、異なる範囲指定、特定の値の検索を行う例です。

4. 確認問題

これらの問題に自分で挑戦してください。解答例は後述していますが、まずは自力で考えてみることが重要です。

確認問題①

以下のテーブル「記録」から、得点が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

解説:

5. よくある質問とトラブルシューティング

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

確認事項:

Q2: SQLFiddleが動作しません

対処法:

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

手順:

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

確認事項:

ds-5. テーブルの結合と SQL によるデータ統合

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

【関連する外部サイトへのリンク】

SQLFiddle(推奨)

DBFiddle(代替案)

演習全般について

準備

この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。

SQLFiddle(推奨)

DBFiddle(代替案)

SQLFiddleの基本操作

コピー:

SQLFiddleへの貼り付け:

学習目標

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

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

2.1 演習の目的

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

2.2 手順

手順

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

  1. Webブラウザを開いてください
  2. アドレスバーに SQLFiddle のページ [http://sqlfiddle.com/](http://sqlfiddle.com/) を入力してください またはDBFiddle のページ [https://www.db-fiddle.com/](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

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

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

テーブル定義について:

データ追加について:

SELECT文について:

よくある間違い:

3. 演習2:SQLによる結合

3.1 演習の目的

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

3.2 手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。 前回と同じ手順でアクセス。「MySQL」を選択

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

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

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

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

INNER JOINについて:

結合条件について:

よくある間違い:

4. 発展問題①:SELECTの応用

4.1 演習の目的

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

4.2 手順

問題:

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

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

期待される結果:

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

4.3 解答例

SELECT 商品名, 購入者 FROM 商品



INNER JOIN 購入



ON 商品.ID = 購入.商品番号;

4.4 解説

5. 発展問題②:COUNT(*)の応用

5.1 演習の目的

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

5.2 手順

問題:

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

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

期待される結果:

COUNT(*)
3

5.3 解答例

SELECT COUNT(*) FROM 商品



INNER JOIN 購入



ON 商品.ID = 購入.商品番号;

5.4 解説

6. 演習3:複数の条件の指定

6.1 演習の目的

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

6.2 手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。 前回と同じ手順でアクセス。「MySQL」を選択

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

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

WHERE句について:

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

よくある間違い:

7. 発展問題③:条件変更による結果の予想

7.1 演習の目的

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

7.2 手順

問題:

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

SELECT 商品名, 購入者, 単価 FROM 商品



INNER JOIN 購入



ON 商品.ID = 購入.商品番号 WHERE 購入.購入者 = 'Y';

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

7.3 解答

期待される結果:

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

8. 演習4:結合条件のない結合

8.1 演習の目的

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

8.2 手順

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

  1. Webブラウザを開いてください
  2. アドレスバーに [http://sqlfiddle.com/](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

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

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

CROSS JOINについて:

INNER JOINとの違い:

考察のポイント:

9. 演習5:結合の総合演習

9.1 演習の目的

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

9.2 手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。 前回と同じ手順でアクセス。「MySQL」を選択

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

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

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

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

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

10. トラブルシューティング

エラーが出た場合

Syntax errorが表示される

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

SQLFiddleが動かない場合

11. まとめ

この演習で学んだこと

重要なポイント

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

ds-6. SQL によるデータ分析:GROUP BY を用いたグループ化と集約

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

【関連する外部サイトへのリンク】

SQLFiddle(推奨)

DBFiddle(代替案)

演習全般について

準備

この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。

SQLFiddle(推奨)

DBFiddle(代替案)

SQLFiddleの基本操作

コピー:

SQLFiddleへの貼り付け:

学習目標

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

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

演習の目的

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

手順

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

  1. Webブラウザを開いてください
  2. アドレスバーに SQLFiddle のページ [http://sqlfiddle.com/](http://sqlfiddle.com/) を入力してください またはDBFiddle のページ [https://www.db-fiddle.com/](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にアクセスしてください。 前回と同じ手順でアクセス。「MySQL」を選択

ステップ2: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」を選択

ステップ2: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」を選択

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

計算の内訳:

発展問題⑦:日付別・商品別の総売上を計算

以下の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で実行できない場合

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

結果が期待と異なる場合

ds-7. 副問い合わせ

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

【関連する外部サイトへのリンク】

SQLFiddle(推奨)

DBFiddle(代替案)

演習全般について

準備

この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。

SQLFiddle(推奨)

DBFiddle(代替案)

SQLFiddleの基本操作

コピー:

SQLFiddleへの貼り付け:

演習1:SQLのIN演算子

この演習では、IN演算子を使用して、複数の値のいずれかに一致するデータを検索する方法を習得します。IN演算子は、複数の条件を簡潔に記述するための機能です。後の副問い合わせと組み合わせることで、より複雑なデータ抽出が可能になります。

手順

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

  1. Webブラウザを開いてください
  2. アドレスバーに SQLFiddle のページ [http://sqlfiddle.com/](http://sqlfiddle.com/) を入力してください またはDBFiddle のページ [https://www.db-fiddle.com/](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 成績 WHERE 科目 IN ('国語', '算数');

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

入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。

ステップ3:結果を確認してください

下のパネルまたは右側に以下の結果が表示されることを確認してください。

科目が「国語」または「算数」の行がすべて表示されます(4行)。

期待される結果:

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

ヒントと考察のポイント

IN演算子について:

SELECT文について:

発展演習① 得点による検索(2つの値)

課題

得点が80点または90点である成績を検索するSQL文を書いてください。IN演算子を使用してください。

ヒント

解答例

SELECT * FROM 成績 WHERE 得点 IN (80, 90);

このSQLは、得点が80または90のレコードを検索します。

解説:得点列の値が80または90に一致する行を取得します。実際のデータでは、得点90の行(A・算数、B・国語)が該当しますが、80点のレコードはデータに含まれていないため表示されません。

考察のポイント:実行後、結果に80点のレコードが含まれていない理由を考えてください。

発展演習② 得点による検索(3つの値)

課題

得点が80点、85点、または90点である成績を検索するSQL文を書いてください。IN演算子を使用してください。

ヒント

解答例

SELECT * FROM 成績 WHERE 得点 IN (80, 85, 90);

このSQLは、得点が80、85、または90のレコードを検索します。

解説:得点列の値が80、85、または90に一致する行を取得します。

INの丸かっこ内には、必要な数だけ値を追加できます。

演習2:副問い合わせ

副問い合わせ(サブクエリ)の基本構造と実行順序を理解し、別のSQL文の結果を利用したデータ検索を習得します。副問い合わせは、複雑なデータ抽出を1つのSQL文で実現する重要な技術です。実務では、動的な条件設定や複数テーブルからのデータ抽出に頻繁に使用されます。

副問い合わせの基礎知識

副問い合わせとは

副問い合わせ(サブクエリ)は、別のSQL文の中に埋め込まれたSQL文のことです。

基本構造:

SELECT … FROM … WHERE … = (別の SQL 文);

特徴:

なぜ副問い合わせが必要か

問題設定:最高得点を取った受講者を検索したい場合

方法1:2段階で実行

  1. まず最高得点を調べる
    SELECT MAX(得点) FROM 成績; → 結果:96
  2. その値を使って検索
    SELECT 受講者 FROM 成績 WHERE 得点 = 96;

方法2:副問い合わせで1つのSQLにまとめる

 SELECT 受講者 FROM 成績 WHERE 得点 = (SELECT MAX(得点) FROM 成績);

副問い合わせの利点:

手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。 前回と同じ手順でアクセス。「MySQL」を選択

ステップ2: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 成績 WHERE 得点 = (SELECT MAX(得点) FROM 成績);

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

入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。

ステップ3:結果を確認してください

実行すると、最高得点を取った受講者「B」が表示されます。

期待される結果:最高得点を取った受講者「B」が表示される

ヒントと考察のポイント

副問い合わせの実行順序:

  1. ステップ1:副問い合わせを実行
    (SELECT MAX(得点) FROM 成績) → 結果:96
  2. ステップ2:副問い合わせの結果を使って主問い合わせを実行
    SELECT 受講者 FROM 成績 WHERE 得点 = 96 → 結果:B

考察のポイント:

発展演習③ 平均点より高い得点の検索

課題

成績テーブルから、全科目の平均点よりも高い得点のレコードをすべて選択してください。副問い合わせを使用してください。

ヒント

解答例

SELECT * FROM 成績 WHERE 得点 > (SELECT AVG(得点) FROM 成績);

このSQLは、平均点よりも高い得点のレコードを検索します。

解説:

  1. 副問い合わせで平均点を計算
    (SELECT AVG(得点) FROM 成績) → (85 + 90 + 90 + 96 + 95) ÷ 5 = 91.2
  2. 主問い合わせで91.2より高い得点を検索
    SELECT * FROM 成績 WHERE 得点 > 91.2 → 96点(B・算数)と95点(A・理科)が該当

重要なポイント:

演習3:

手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。 前回と同じ手順でアクセス。「MySQL」を選択

ステップ2:従業員テーブルの作成とデータ追加

注意: 以前使用したSQLは削除

CREATE TABLE 従業員 (
従業員ID INTEGER,
名前 TEXT,
部署ID INTEGER,
給与 INTEGER
);

INSERT INTO 従業員 VALUES(5, '伊藤', 104, 280000);
INSERT INTO 従業員 VALUES(6, '渡辺', 101, 320000);
INSERT INTO 従業員 VALUES(7, '小林', 102, 270000);
INSERT INTO 従業員 VALUES(8, '加藤', 103, 290000);
INSERT INTO 従業員 VALUES(9, '吉田', 104, 310000);
INSERT INTO 従業員 VALUES(10, '中村', 101, 330000);
INSERT INTO 従業員 VALUES(11, '小川', 102, 260000);
INSERT INTO 従業員 VALUES(12, '高橋', 103, 340000);
INSERT INTO 従業員 VALUES(13, '山本', 104, 300000);
INSERT INTO 従業員 VALUES(14, '石川', 101, 350000);
INSERT INTO 従業員 VALUES(15, '中島', 102, 280000);
INSERT INTO 従業員 VALUES(16, '佐々木', 103, 360000);
INSERT INTO 従業員 VALUES(17, '山口', 104, 290000);
INSERT INTO 従業員 VALUES(18, '松本', 101, 370000);
INSERT INTO 従業員 VALUES(19, '井上', 102, 310000);
INSERT INTO 従業員 VALUES(20, '木村', 103, 280000);
INSERT INTO 従業員 VALUES(21, '林', 104, 320000);
INSERT INTO 従業員 VALUES(22, '清水', 101, 330000);
INSERT INTO 従業員 VALUES(23, '山崎', 102, 340000);
INSERT INTO 従業員 VALUES(24, '中田', 103, 300000);
SELECT 名前 FROM 従業員 WHERE 給与 = (SELECT MAX(給与) FROM 従業員);

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

このSQLは、最高給与を受け取る従業員の名前を検索します。

ステップ4:実行と結果確認

  1. 「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリック
  2. 下のパネルで結果を確認

期待される結果:最高給与を受け取る従業員の名前「松本」が表示される

ステップ5:平均よりも高い給与を受け取る従業員の検索

次に、上のパネルのSELECT文を以下に書き換えます

CREATE TABLE 従業員 (
従業員ID INTEGER,
名前 TEXT,
部署ID INTEGER,
給与 INTEGER
);

INSERT INTO 従業員 VALUES(5, '伊藤', 104, 280000);
INSERT INTO 従業員 VALUES(6, '渡辺', 101, 320000);
INSERT INTO 従業員 VALUES(7, '小林', 102, 270000);
INSERT INTO 従業員 VALUES(8, '加藤', 103, 290000);
INSERT INTO 従業員 VALUES(9, '吉田', 104, 310000);
INSERT INTO 従業員 VALUES(10, '中村', 101, 330000);
INSERT INTO 従業員 VALUES(11, '小川', 102, 260000);
INSERT INTO 従業員 VALUES(12, '高橋', 103, 340000);
INSERT INTO 従業員 VALUES(13, '山本', 104, 300000);
INSERT INTO 従業員 VALUES(14, '石川', 101, 350000);
INSERT INTO 従業員 VALUES(15, '中島', 102, 280000);
INSERT INTO 従業員 VALUES(16, '佐々木', 103, 360000);
INSERT INTO 従業員 VALUES(17, '山口', 104, 290000);
INSERT INTO 従業員 VALUES(18, '松本', 101, 370000);
INSERT INTO 従業員 VALUES(19, '井上', 102, 310000);
INSERT INTO 従業員 VALUES(20, '木村', 103, 280000);
INSERT INTO 従業員 VALUES(21, '林', 104, 320000);
INSERT INTO 従業員 VALUES(22, '清水', 101, 330000);
INSERT INTO 従業員 VALUES(23, '山崎', 102, 340000);
INSERT INTO 従業員 VALUES(24, '中田', 103, 300000);
SELECT 名前 FROM 従業員 WHERE 給与 > (SELECT AVG(給与) FROM 従業員);

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

このSQLは、平均よりも高い給与を受け取る従業員の名前を検索します。

ステップ6:実行と結果確認

  1. 「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリック
  2. 下のパネルで結果を確認

期待される結果:平均よりも高い給与を受け取る従業員の名前が複数表示される

ヒントと考察のポイント

学習の振り返り

学習した内容のまとめ

演習1で学んだこと

演習2で学んだこと

発展演習③で学んだこと

演習3で学んだこと

ds-8. SQL 総合演習

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

【関連する外部サイトへのリンク】

SQLFiddle(推奨)

DBFiddle(代替案)

演習全般について

準備

この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。

SQLFiddle(推奨)

DBFiddle(代替案)

SQLFiddleの基本操作

コピー:

SQLFiddleへの貼り付け:

演習1:SQLの様々な機能

WHERE句を使った条件指定によるデータの絞り込み、副問い合わせの理解と活用、IN演算子による複数条件の指定、AND演算子による複数条件の組み合わせを習得します。

従業員テーブルを使用して、以下のSQL問い合わせを実行します。

手順

ステップ1:テーブル定義とデータ追加

  1. Webブラウザを開いてください
  2. アドレスバーに SQLFiddle のページ [http://sqlfiddle.com/](http://sqlfiddle.com/) を入力してください またはDBFiddle のページ [https://www.db-fiddle.com/](https://www.db-fiddle.com/) にアクセスしてください
  3. 表示されたページで「MySQL」を選択してください
    • SQLFiddleの場合:表示されたリストから「MySQL」をクリックします
    • DBFiddleの場合:上部で「MySQL」のバージョン8または9を選択します

SQLFiddleの場合は上のパネルに、DBFiddleの場合は左側の「Schema SQL」に以下のSQLを入力してください。

注意: 最初に表示されているサンプルSQLは削除

CREATE TABLE 従業員 (
従業員ID INTEGER,
名前 TEXT,
部署ID INTEGER,
給与 INTEGER
);

INSERT INTO 従業員 VALUES(5, '伊藤', 104, 280000);
INSERT INTO 従業員 VALUES(6, '渡辺', 101, 320000);
INSERT INTO 従業員 VALUES(7, '小林', 102, 270000);
INSERT INTO 従業員 VALUES(8, '加藤', 103, 290000);
INSERT INTO 従業員 VALUES(9, '吉田', 104, 310000);
INSERT INTO 従業員 VALUES(10, '中村', 101, 330000);
INSERT INTO 従業員 VALUES(11, '小川', 102, 260000);
INSERT INTO 従業員 VALUES(12, '高橋', 103, 340000);
INSERT INTO 従業員 VALUES(13, '山本', 104, 300000);
INSERT INTO 従業員 VALUES(14, '石川', 101, 350000);
INSERT INTO 従業員 VALUES(15, '中島', 102, 280000);
INSERT INTO 従業員 VALUES(16, '佐々木', 103, 360000);
INSERT INTO 従業員 VALUES(17, '山口', 104, 290000);
INSERT INTO 従業員 VALUES(18, '松本', 101, 370000);
INSERT INTO 従業員 VALUES(19, '井上', 102, 310000);
INSERT INTO 従業員 VALUES(20, '木村', 103, 280000);
INSERT INTO 従業員 VALUES(21, '林', 104, 320000);
INSERT INTO 従業員 VALUES(22, '清水', 101, 330000);
INSERT INTO 従業員 VALUES(23, '山崎', 102, 340000);
INSERT INTO 従業員 VALUES(24, '中田', 103, 300000);

SELECT 名前, 給与 FROM 従業員 WHERE 部署ID = 101;

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

入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。

ステップ2:結果を確認してください

下のパネルまたは右側に以下の結果が表示されることを確認してください。

部署ID 101の従業員の名前と給与が表示されます。

期待される結果:

部署ID 101の従業員の名前と給与が正しく表示されていることを確認してください。

ヒントと考察のポイント

WHERE句について:

ステップ3:副問い合わせを使った条件指定

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

SELECT * FROM 従業員 WHERE 給与 >= (SELECT AVG(給与) FROM 従業員);

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

入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。

ステップ4:結果を確認してください

結果をスクロールして、給与が平均以上の従業員のみが表示されていることを確認してください。

期待される結果:

給与が平均以上の従業員のみが正しく表示されていることを確認してください。

ヒントと考察のポイント

副問い合わせについて:

ステップ5:IN演算子による複数条件の指定

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

SELECT * FROM 従業員 WHERE 部署ID IN (101, 102);

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

入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。

ステップ6:結果を確認してください

部署ID 101または102の従業員のみが表示されることを確認してください。

期待される結果:

部署ID 101または102の従業員のみが正しく表示されていることを確認してください。

ヒントと考察のポイント

IN演算子について:

ステップ7:AND演算子による複数条件の組み合わせ

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

SELECT * FROM 従業員 WHERE 給与 >= 300000 AND 部署ID = 102;

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

入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。

ステップ8:結果を確認してください

条件を満たす従業員が表示されることを確認してください。

期待される結果:

条件を満たす従業員が正しく表示されていることを確認してください。

ヒントと考察のポイント

AND演算子について:

演習2:2つのテーブルを用いた本格的なデータ処理

複数のテーブルの作成とデータ追加、INNER JOINによるテーブル結合の理解、結合条件の指定方法、結合結果を使った計算、GROUP BYによるグループ化とSUM関数による集計を習得します。

商品テーブルと申し込みテーブルを使用して、複数のSQL問い合わせを実行します。

手順

ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。 前回と同じ手順でアクセス。「MySQL」を選択

ステップ2:SQLを入力して実行してください。

注意: 以前使用したSQLは削除

CREATE TABLE 商品 (
id INTEGER,
商品名 TEXT,
単価 INTEGER
);

CREATE TABLE 申し込み (
id INTEGER,
日時 DATETIME,
氏名 TEXT,
商品番号 INTEGER,
個数 INTEGER
);

INSERT INTO 商品 VALUES (1, '商品A', 100);
INSERT INTO 商品 VALUES (2, '商品B', 200);
INSERT INTO 商品 VALUES (3, '商品C', 150);

INSERT INTO 申し込み VALUES (101, NOW(), 'X', 1, 1);
INSERT INTO 申し込み VALUES (102, NOW(), 'X', 2, 10);
INSERT INTO 申し込み VALUES (103, NOW(), 'Y', 2, 5);
INSERT INTO 申し込み VALUES (104, NOW(), 'X', 1, 1);

SELECT * FROM 商品;

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

入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。

ステップ2:結果を確認してください

下のパネルまたは右側に以下の結果が表示されることを確認してください。

商品テーブルの内容が表示されます。id、商品名、単価の3列が表示されます。

期待される結果:

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

ヒントと考察のポイント

SELECT文について:

ステップ3:申し込みテーブルの確認

上のパネルの最後の行を以下に変更してください。

SELECT * FROM 申し込み;

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

入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。

ステップ4:結果を確認してください

下のパネルまたは右側に以下の結果が表示されることを確認してください。

申し込みテーブルの内容が表示されます。日時は実行時の時刻が記録されます。

期待される結果:

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

ヒントと考察のポイント

SELECT文について:

ステップ5:テーブル結合の実行

上のパネルの最後の行を以下に変更してください。

SELECT * FROM 申し込み
INNER JOIN 商品 ON 申し込み.商品番号 = 商品.id;

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

入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。

ステップ6:結果を確認してください

下のパネルまたは右側に以下の結果が表示されることを確認してください。

結果には、申し込みテーブルと商品テーブルの両方の列が含まれています。各申し込みに対応する商品名と単価が表示されていることを確認してください。

期待される結果:

申し込みテーブルと商品テーブルの両方の列が正しく表示されていることを確認してください。

ヒントと考察のポイント

INNER JOINについて:

ステップ7:結合結果を使った計算

上のパネルの最後のところを以下に変更してください。

SELECT 申し込み.日時,申し込み.氏名,申し込み.個数 * 商品.単価
FROM 申し込み
INNER JOIN 商品 ON 申し込み.商品番号 = 商品.id;

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

入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。

ステップ8:結果を確認してください

下のパネルまたは右側に以下の結果が表示されることを確認してください。

各申し込みの日時、氏名、および合計金額が表示されることを確認してください。合計金額は個数×単価で計算されます。

期待される結果:

各申し込みの日時、氏名、および合計金額が正しく表示されていることを確認してください。

ヒントと考察のポイント

SELECT文について:

ステップ9:グループ化と集計

上のパネルの最後のところを以下に変更してください。

SELECT 氏名, SUM(個数 * 商品.単価)
FROM 申し込み
INNER JOIN 商品 ON 申し込み.商品番号 = 商品.id
GROUP BY 氏名;

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

入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。

ステップ10:結果を確認してください

下のパネルまたは右側に以下の結果が表示されることを確認してください。

氏名ごとの合計金額が表示されることを確認してください。Xさんは2200円、Yさんは1000円と表示されます。

期待される結果:

氏名ごとの合計金額が正しく表示されていることを確認してください。

ヒントと考察のポイント

GROUP BYについて:

発展演習

基本的な演習を完了したら、以下の発展演習に挑戦してください。各問題には、目的、ヒント、期待される結果が示されています。

発展演習1:商品の単価の最大値を取得

目的

集約関数MAXの使用方法を理解します。

問題

商品テーブルを使用して、商品の単価の最大値を取得するSQLを作成してください。

ヒント

集約関数MAXを使用します。

期待される結果

MAX(単価)
200 

使用する知識

集約関数MAX

発展演習2:特定の氏名による申し込み情報の取得

目的

WHERE句を使った条件指定を復習します。

問題

申し込みテーブルを使用して、氏名が'X'のすべての申し込み情報を取得するSQLを作成してください。

ヒント

WHERE句を使用して条件を指定します。

注意事項

日時の値は、実際にデータを追加した日時になるため、人によって結果が異なります。

期待される結果の例

+-----+---------------------+------+----------+------+
| id | 日時 | 氏名 | 商品番号 | 個数 |
+-----+---------------------+------+----------+------+
| 101 | 2025-10-31 15:19:24 | X | 1 | 1 |
| 102 | 2025-10-31 15:19:24 | X | 2 | 10 |
| 104 | 2025-10-31 15:19:24 | X | 1 | 1 |
+-----+---------------------+------+----------+------+

発展演習3:特定商品を申し込んだ人の氏名取得

目的

テーブル結合、条件指定、重複除去の組み合わせを理解します。

問題

商品テーブルと申し込みテーブルを結合し、商品名が'商品A'である商品を申し込んだすべての人の氏名を取得するSQLを作成してください。ただし、重複行は除去してください。

ヒント

INNER JOINでテーブルを結合し、WHERE句で商品名を指定し、DISTINCTで重複を除去します。

期待される結果

+------+
| 氏名 |
+------+
| X |
+------+

発展演習4:氏名別の申し込み回数の集計

目的

GROUP BYとCOUNT関数の使用方法を理解します。

問題

申し込みテーブルを使用して、氏名ごとに申し込みの回数を集計するSQLを作成してください。

ヒント

COUNT(*)で行数をカウントし、GROUP BYで氏名ごとにグループ化します。

期待される結果

+------+------------+
| 氏名 | |
+------+------------+
| X | 3 |
| Y | 1 |
+------+------------+

発展演習5:特定商品に対する申し込み総数の計算

目的

テーブル結合、条件指定、SUM関数の組み合わせを理解します。

問題

商品テーブルと申し込みテーブルを結合し、商品名が'商品B'に対する申し込みの総個数を計算するSQLを作成してください。

ヒント

INNER JOINでテーブルを結合し、WHERE句で商品名を指定し、SUM関数で個数の合計を求めます。

期待される結果

+----------------------+
| 15 |
+----------------------+

発展演習の解答

自分で考えた後、以下の解答を参考にしてください。

発展演習1の解答

SELECT MAX(単価) FROM 商品;

解説

MAX関数は指定した列の最大値を返す集約関数です。商品テーブルの単価列から最大値200が得られます。

発展演習2の解答

SELECT * FROM 申し込み WHERE 氏名 = 'X';

解説

WHERE句で氏名が'X'の行のみを抽出します。*はすべての列を意味します。結果として、Xさんによる3件の申し込み情報が表示されます。

発展演習3の解答

SELECT DISTINCT 申し込み.氏名
FROM 申し込み
INNER JOIN 商品 ON 申し込み.商品番号 = 商品.id
WHERE 商品.商品名 = '商品A';

解説

INNER JOINで申し込みテーブルと商品テーブルを結合し、WHERE句で商品名が'商品A'の行を抽出し、DISTINCTで重複する氏名を除去します。結果として、商品Aを申し込んだ人の氏名が1件だけ表示されます。

発展演習4の解答

SELECT 氏名, COUNT(*)
FROM 申し込み GROUP BY 氏名;

解説

GROUP BY 氏名で、氏名ごとにグループ化し、COUNT(*)で各グループの行数をカウントします。結果として、Xさんは3回、Yさんは1回の申し込みがあることがわかります。

発展演習5の解答

SELECT SUM(申し込み.個数)
FROM 申し込み
INNER JOIN 商品 ON 申し込み.商品番号 = 商品.id
WHERE 商品.商品名 = '商品B';

解説

INNER JOINで申し込みテーブルと商品テーブルを結合し、WHERE句で商品名が'商品B'の行を選択し、SUM関数で個数列の合計を計算します。結果として、商品Bの申し込み総数15が得られます。Xさんが10個、Yさんが5個です。

学習のポイント

テーブル結合について

INNER JOINは、2つのテーブルを結合条件に基づいて結合します。結合条件は `ON テーブル1.列名 = テーブル2.列名` の形式で指定します。テーブルを分割してデータの重複を避けつつ、必要な情報を組み合わせて取得できます。

集約関数について

AVGは平均値を計算し、MAXは最大値を取得し、MINは最小値を取得し、SUMは合計値を計算し、COUNTは行数をカウントします。

GROUP BYについて

指定した列の値が同じ行をグループ化します。集約関数と組み合わせて、グループごとの統計情報を計算できます。

ds-9. 主キーと参照整合性制約

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

【関連する外部サイトへのリンク】

SQLFiddle(推奨)

DBFiddle(代替案)

演習全般について

準備

この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。

SQLFiddle(推奨)

DBFiddle(代替案)

SQLFiddleの基本操作

コピー:

SQLFiddleへの貼り付け:

このガイドは、データベース設計の基礎(主キー・外部キーを用いたテーブル間の関連付けとSQL実践)の演習を自習するためのものです。SQLFiddle([http://sqlfiddle.com/](http://sqlfiddle.com/))またはDBFiddle([https://www.db-fiddle.com/](https://www.db-fiddle.com/))を使用してオンラインで演習を実施できます。

演習1:テーブル定義とデータの追加、主キー制約

演習の目的

主キーは、テーブルの各行を一意に識別するためのキーです。この演習では、主キー制約を設定し、重複したデータの挿入が自動的にブロックされることを確認します。

手順

1. Webブラウザを使用

アドレスバーにSQLFiddleのURLを入力します:[http://sqlfiddle.com/](http://sqlfiddle.com/)

2. MySQLを選択

データベース管理システムとして「MySQL」を選択します。

3. 上のパネルにSQLを入力

テーブル定義、データの追加、問い合わせを行うSQLを入力します(SQLFiddleで最初に出てくるSQLは不要なので消します)。

CREATE TABLE 商品 (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);

INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);

SELECT * FROM 商品;

4. Executeをクリック

SQL文が実行され、結果が表示されます。

5. 下のパネルで結果を確認

商品テーブルにID=1(みかん)、ID=2(りんご)、ID=3(メロン)の3件のデータが正常に追加されたことを確認します。

6. 主キー制約の確認

上のパネルのSQLを以下に変更します(以前のSQLは不要なので消します)。

CREATE TABLE 商品 (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);

INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);
INSERT INTO 商品 VALUES(1, 'いちご', 1000);

7. Executeをクリック

8. 下のパネルで結果を確認

エラーメッセージ「ERROR 1062 (23000): Duplicate entry '1' for key '商品.PRIMARY'」が表示されることを確認します。

ヒント

考察のポイント

理解のポイント

よくある間違い

発展演習1:複数列の主キー制約

演習の目的

単一の列ではなく、複数の列の組み合わせで一意性を保証する主キー制約を学びます。

手順

1. 上のパネルにSQLを入力

テーブル定義、データの追加、問い合わせを行うSQLを入力します(以前のSQLは不要なので消します)。

CREATE TABLE 成績 (
学生ID INTEGER,
科目ID INTEGER,
得点 INTEGER,
PRIMARY KEY(学生ID, 科目ID));

INSERT INTO 成績 VALUES(1, 1001, 90);
INSERT INTO 成績 VALUES(1, 1002, 100);
INSERT INTO 成績 VALUES(2, 1001, 85);
INSERT INTO 成績 VALUES(2, 1002, 90);
INSERT INTO 成績 VALUES(2, 1003, 95);

SELECT * FROM 成績;

2. Executeをクリック

SQL文が実行され、結果が表示されます。

3. 下のパネルで結果を確認

成績テーブルに学生ID=1の2件、学生ID=2の3件、合計5件のデータが正常に追加されたことを確認します。

ヒント

考察のポイント

理解のポイント

よくある間違い

発展演習2:主キー制約の違反

演習の目的

発展演習1に1行追加し、主キー制約に違反する場合、実行できないことを確認します。

手順

1. 上のパネルにSQLを入力(発展演習1に1行増やしています)

テーブル定義、データの追加を行うSQLを入力します(以前のSQLは不要なので消します)。

CREATE TABLE 成績 (
学生ID INTEGER,
科目ID INTEGER,
得点 INTEGER,
PRIMARY KEY(学生ID, 科目ID));

INSERT INTO 成績 VALUES(1, 1001, 90);
INSERT INTO 成績 VALUES(1, 1002, 100);
INSERT INTO 成績 VALUES(2, 1001, 85);
INSERT INTO 成績 VALUES(2, 1002, 90);
INSERT INTO 成績 VALUES(2, 1003, 95);
INSERT INTO 成績 VALUES(1, 1001, 95);

SELECT * FROM 成績;

2. Executeをクリック

3. 下のパネルで結果を確認

エラーメッセージ「ERROR 1062 (23000): Duplicate entry '1-1001' for key '成績.PRIMARY'」が表示されることを確認します。

ヒント

考察のポイント

理解のポイント

よくある間違い

演習2:外部キー、参照整合性制約

演習の目的

外部キーを使用してテーブル間の関連を表現し、参照整合性制約によってデータの整合性が保証されることを確認します。また、複数のテーブルを結合して情報を取得する方法を学びます。

手順

1. 商品テーブルの作成

上のパネルに以下のSQLを入力します(以前のSQLは不要なので消します)。

CREATE TABLE 商品 (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);

INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);

SELECT * FROM 商品;

2. Executeをクリック

SQL文が実行され、結果が表示されます。

3. 下のパネルで結果を確認

商品テーブルにID=1(みかん)、ID=2(りんご)、ID=3(メロン)の3件のデータが正常に追加されたことを確認します。

4. 購入テーブルの作成(外部キー制約付き)

上のパネルに以下のSQLを入力します(以前のSQLは不要なので消します)。

CREATE TABLE 商品 (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);

INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);

CREATE TABLE 購入 (
ID INTEGER PRIMARY KEY,
購入者 TEXT,
商品ID INTEGER,
数量 INTEGER,
FOREIGN KEY (商品ID) REFERENCES 商品(ID));

INSERT INTO 購入 VALUES(1, 'X', 1, 10);
INSERT INTO 購入 VALUES(2, 'Y', 2, 5);

SELECT * FROM 購入;

5. Executeをクリック

SQL文が実行され、結果が表示されます。

6. 下のパネルで結果を確認

購入テーブルにID=1(購入者X、商品ID=1、数量10)、ID=2(購入者Y、商品ID=2、数量5)の2件のデータが正常に追加されたことを確認します。

7. テーブルの結合

上のパネルに以下のSQLを入力します(以前のSQLは不要なので消します)。

CREATE TABLE 商品 (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);

INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);

CREATE TABLE 購入 (
ID INTEGER PRIMARY KEY,
購入者 TEXT,
商品ID INTEGER,
数量 INTEGER,
FOREIGN KEY (商品ID) REFERENCES 商品(ID));

INSERT INTO 購入 VALUES(1, 'X', 1, 10);
INSERT INTO 購入 VALUES(2, 'Y', 2, 5);

SELECT 購入.購入者, 商品.商品名, 商品.単価 * 購入.数量
FROM 購入
INNER JOIN 商品 ON 購入.商品ID = 商品.ID;

8. Executeをクリック

SQL文が実行され、結果が表示されます。

9. 下のパネルで結果を確認

購入者X(みかん、500円)、購入者Y(りんご、500円)の2件の結果が表示されることを確認します。2つのテーブルの利用により、各購入者の購入商品とその総額が表示されることを確認します。

ヒント

考察のポイント

理解のポイント

よくある間違い

発展演習3:参照整合性制約の違反

演習の目的

存在しない商品IDを挿入しようとして、参照整合性制約違反を確認します。

手順

1. 上のパネルにSQLを入力(演習2に1行増やしています)

テーブル定義、データの追加を行うSQLを入力します(以前のSQLは不要なので消します)。

CREATE TABLE 商品 (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);

INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);

CREATE TABLE 購入 (
ID INTEGER PRIMARY KEY,
購入者 TEXT,
商品ID INTEGER,
数量 INTEGER,
FOREIGN KEY (商品ID) REFERENCES 商品(ID));

INSERT INTO 購入 VALUES(1, 'X', 1, 10);
INSERT INTO 購入 VALUES(2, 'Y', 2, 5);
INSERT INTO 購入 VALUES(3, 'X', 22, 1);

2. Executeをクリック

3. 下のパネルで結果を確認

エラーメッセージ「ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails」が表示されることを確認します。

ヒント

考察のポイント

理解のポイント

よくある間違い

日常生活との対応

ds-10. データベース設計、正規化

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

【関連する外部サイトへのリンク】

SQLFiddle(推奨)

DBFiddle(代替案)

演習全般について

準備

この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。

SQLFiddle(推奨)

DBFiddle(代替案)

SQLFiddleの基本操作

コピー:

SQLFiddleへの貼り付け:

演習1: テーブルの分割による正規化

学習目標

背景知識

テーブルとは、データを行と列の形式で整理したものです。正規化とは、テーブルの構造を最適化し、データの重複を減らす手法です。

正規化前のテーブルには「カレーライス 400円」という情報が2回出現しています。このような冗長性は、データ更新時に複数箇所を変更する必要があり、更新ミスのリスクを生みます。正規化により、同じ情報を1箇所だけに保存することでこの問題を解決します。

演習手順

ステップ1: SQLFiddleへのアクセス

[http://sqlfiddle.com/](http://sqlfiddle.com/) にアクセスし、MySQLを選択してください。

ステップ2: SQLの入力

上のパネルに以下のSQLを入力してください。以前のSQLがあれば消してください。

CREATE TABLE T (
名前 TEXT,
昼食 TEXT,
料金 INTEGER);

INSERT INTO T VALUES('A', 'そば', 250);
INSERT INTO T VALUES('B', 'カレーライス', 400);
INSERT INTO T VALUES('C', 'カレーライス', 400);
INSERT INTO T VALUES('D', 'うどん', 250);

CREATE TABLE X AS SELECT DISTINCT 名前, 昼食 FROM T;
CREATE TABLE Y AS SELECT DISTINCT 昼食, 料金 FROM T;

SELECT * FROM X;
SELECT * FROM Y;

ステップ3: 実行と結果確認

「Execute」ボタンをクリックしてください。下側のウィンドウに結果が表示されます。

期待される結果:

テーブルXの内容:

名前  昼食
A      そば
B      カレーライス
C      カレーライス
D      うどん

テーブルYの内容:

昼食            料金
そば            250
カレーライス    400
うどん          250

考察のポイント

テーブルTの問題点について

正規化後のテーブルXとYについて

よくある間違いと回避方法

間違い1: DISTINCTキーワードを忘れる

間違い2: CREATE TABLE ... AS構文の理解不足

演習2: 正規化における情報無損失

学習目標

背景知識

情報無損失とは、正規化によってテーブルを分割しても、元の情報が失われないことを意味します。INNER JOINとは、2つのテーブルを指定した条件に基づいて結合する操作です。属性とは、テーブルの列のことを指します。

正規化の目的は冗長性の削減であって情報の削減ではありません。正しく正規化されたテーブル群は、結合することで元のテーブルを正確に復元できます。

演習手順

ステップ1: SQLFiddleへのアクセス

[http://sqlfiddle.com/](http://sqlfiddle.com/) にアクセスし、MySQLを選択してください。

ステップ2: SQLの入力

上のパネルに以下のSQLを入力してください。以前のSQLがあれば消してください。

CREATE TABLE T (
名前 TEXT,
昼食 TEXT,
料金 INTEGER);

INSERT INTO T VALUES('A', 'そば', 250);
INSERT INTO T VALUES('B', 'カレーライス', 400);
INSERT INTO T VALUES('C', 'カレーライス', 400);
INSERT INTO T VALUES('D', 'うどん', 250);

CREATE TABLE X AS SELECT DISTINCT 名前, 昼食 FROM T;
CREATE TABLE Y AS SELECT DISTINCT 昼食, 料金 FROM T;

SELECT X.名前, X.昼食, Y.料金 FROM X INNER JOIN Y ON X.昼食 = Y.昼食;

ステップ3: 実行と結果確認

「Execute」ボタンをクリックしてください。下側のウィンドウに結果が表示されます。

結合結果が元のテーブルTと一致することを確認してください。

期待される結果:

名前  昼食            料金
A      そば            250
B      カレーライス    400
C      カレーライス    400
D      うどん          250

考察のポイント

INNER JOINの動作について

情報無損失の確認について

適切な正規化の条件について

よくある間違いと回避方法

間違い1: 結合条件を間違える

間違い2: 結合結果と元のテーブルの比較を忘れる

発展演習1: 学生情報のためのテーブル作成

学習目標

演習手順

ステップ1: SQLFiddleへのアクセス

[http://sqlfiddle.com/](http://sqlfiddle.com/) にアクセスし、MySQLを選択してください。

ステップ2: SQLの入力と実行

上のパネルに以下のSQLを入力し、「Execute」をクリックしてください。

CREATE TABLE S (
StudentID INTEGER,
StudentName TEXT,
Course TEXT
);

INSERT INTO S VALUES (1, 'Alice', 'Math');
INSERT INTO S VALUES (1, 'Alice', 'Science');
INSERT INTO S VALUES (2, 'Bob', 'History');
INSERT INTO S VALUES (3, 'Charlie', 'Math');
INSERT INTO S VALUES (3, 'Charlie', 'History');
INSERT INTO S VALUES (3, 'Charlie', 'Science');

SELECT * FROM S;

考察のポイント

冗長性の確認について

ヒント

解答例

期待される結果:

StudentID  StudentName  Course
1          Alice        Math
1          Alice        Science
2          Bob          History
3          Charlie      Math
3          Charlie      History
3          Charlie      Science

冗長性の分析:

これは冗長なデータです。学生の名前を変更する場合、その学生が受講しているすべての科目の行を更新する必要があります。

発展演習2: 冗長なデータの確認

学習目標

演習手順

ステップ1: SQLの追加

発展演習1のSQLは消さないで、下のSQLを追加して実行してください。

SELECT StudentID, StudentName FROM S;

考察のポイント

冗長性の確認について

ヒント

解答例

期待される結果:

StudentID  StudentName
1          Alice
1          Alice
2          Bob
3          Charlie
3          Charlie
3          Charlie

冗長性の分析:

これは明らかにデータの冗長性です。学生の基本情報が受講科目の数だけ重複して格納されています。

発展演習3: 重複なしの学生情報抽出

学習目標

演習手順

ステップ1: SQLの追加

SQLは消さないで、下のSQLを追加して実行してください。

SELECT DISTINCT StudentID, StudentName FROM S;

考察のポイント

DISTINCTの効果について

ヒント

解答例

期待される結果:

StudentID  StudentName
1          Alice
2          Bob
3          Charlie

DISTINCTの効果:

DISTINCTキーワードを使用することで、冗長なデータを除去し、各学生の基本情報を一度だけ取得できます。

発展演習4: 正規化

学習目標

演習手順

ステップ1: SQLの追加

SQLは消さないで、下のSQLを追加して実行してください。

CREATE TABLE U AS SELECT DISTINCT StudentID, StudentName FROM S;
CREATE TABLE V AS SELECT DISTINCT StudentID, Course FROM S;

SELECT * FROM U;
SELECT * FROM V;

考察のポイント

正規化の効果について

ヒント

解答例

期待される結果:

テーブルU(学生基本情報):

StudentID  StudentName
1          Alice
2          Bob
3          Charlie

テーブルV(受講情報):

StudentID  Course
1          Math
1          Science
2          History
3          Math
3          History
3          Science

正規化の効果:

  1. テーブルUの役割: 学生の基本情報(IDと名前)を格納しています。各学生の名前は1回だけ出現しています。
  2. テーブルVの役割: 学生の受講情報(IDと科目)を格納しています。学生名は含まれていません。
  3. 冗長性の削減:
    • 元のテーブルSでは、Aliceの名前が2回、Charlieの名前が3回出現していました
    • 正規化後は、各学生の名前がテーブルUに1回だけ出現します
    • 学生名の変更が必要な場合、テーブルUの1箇所だけを更新すれば済みます
  4. データの整合性向上:
    • 学生名の更新ミスのリスクが無くなりました
    • StudentIDを通じて両テーブルを関連付けることができます

この正規化により、データの冗長性が削減され、データの整合性が向上しました。

ds-11. データベース操作とトランザクション管理:データ整合性と永続性

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

【関連する外部サイトへのリンク】

SQLFiddle(推奨)

DBFiddle(代替案)

演習全般について

準備

この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。

SQLFiddle(推奨)

DBFiddle(代替案)

SQLFiddleの基本操作

コピー:

SQLFiddleへの貼り付け:

SQLFiddleを使用してデータベース操作とトランザクション管理を実践的に学ぶ。各演習を順番に進めることで、データベースの基本概念とトランザクションの重要性を理解できる。

演習1:データベース操作の実践

学習目標

データベースの基本操作であるINSERT(追加)SELECT(問い合わせ)UPDATE(更新)DELETE(削除)を実際に実行し、その動作を理解する。

事前準備:SQLFiddleへのアクセス

  1. Webブラウザを開く
  2. アドレスバーに以下のURLを入力する
    [http://sqlfiddle.com/](http://sqlfiddle.com/)
  3. 「MySQL」を選択する

演習1-1:テーブルの作成とデータの追加

目的

テーブルを定義し、初期データを追加する方法を学ぶ。

手順

  1. 上のパネルに以下のSQLを入力する
    CREATE TABLE T (
    名前 VARCHAR(20) PRIMARY KEY,
    昼食 TEXT,
    料金 INTEGER);
    INSERT INTO T VALUES('A', 'そば', 250);
    INSERT INTO T VALUES('B', 'カレーライス', 400);
    INSERT INTO T VALUES('C', 'カレーライス', 400);
    INSERT INTO T VALUES('D', 'うどん', 250);
    SELECT * FROM T;
  2. 「Execute」をクリックする
  3. 下側のウィンドウで結果を確認する

期待される実行結果

+--------+------------------+-------+
| 名前   | 昼食             | 料金  |
+--------+------------------+-------+
| A      | そば             | 250   |
| B      | カレーライス     | 400   |
| C      | カレーライス     | 400   |
| D      | うどん           | 250   |
+--------+------------------+-------+

4行のデータが正しく追加され、各列の値が表示される。

ヒント

演習1-2:データの更新(UPDATE)

目的

既存のデータを変更する方法を学ぶ。

手順

  1. 上のパネルのSQLを以下に書き換える
    CREATE TABLE T (
    名前 VARCHAR(20) PRIMARY KEY,
    昼食 TEXT,
    料金 INTEGER);
    INSERT INTO T VALUES('A', 'そば', 250);
    INSERT INTO T VALUES('B', 'カレーライス', 400);
    INSERT INTO T VALUES('C', 'カレーライス', 400);
    INSERT INTO T VALUES('D', 'うどん', 250);
    UPDATE T SET 料金 = 450 WHERE 昼食 = 'カレーライス';
    SELECT * FROM T;
  2. 「Execute」をクリックする
  3. 下側のウィンドウで結果を確認する

期待される実行結果

+--------+------------------+-------+
| 名前   | 昼食             | 料金  |
+--------+------------------+-------+
| A      | そば             | 250   |
| B      | カレーライス     | 450   |
| C      | カレーライス     | 450   |
| D      | うどん           | 250   |
+--------+------------------+-------+

カレーライスの料金が400円から450円に変更されている。BとCの両方が更新される。

ヒント

演習1-3:特定行の更新

目的

特定の行のみを更新する方法を学ぶ。

手順

  1. 上のパネルのSQLを以下に書き換える
    CREATE TABLE T (
    名前 VARCHAR(20) PRIMARY KEY,
    昼食 TEXT,
    料金 INTEGER);
    INSERT INTO T VALUES('A', 'そば', 250);
    INSERT INTO T VALUES('B', 'カレーライス', 400);
    INSERT INTO T VALUES('C', 'カレーライス', 400);
    INSERT INTO T VALUES('D', 'うどん', 250);
    UPDATE T SET 昼食 = 'ラーメン' WHERE 名前 = 'C';
    SELECT * FROM T;
  2. 「Execute」をクリックする
  3. 下側のウィンドウで結果を確認する

期待される実行結果

+--------+------------------+-------+
| 名前   | 昼食             | 料金  |
+--------+------------------+-------+
| A      | そば             | 250   |
| B      | カレーライス     | 400   |
| C      | ラーメン         | 400   |
| D      | うどん           | 250   |
+--------+------------------+-------+

名前が'C'の行のみが更新され、Cの昼食が「カレーライス」から「ラーメン」に変更されている。

演習1-4:データの削除(DELETE)

目的

特定のデータを削除する方法を学ぶ。

手順

  1. 上のパネルのSQLを以下に書き換える
    CREATE TABLE T (
    名前 VARCHAR(20) PRIMARY KEY,
    昼食 TEXT,
    料金 INTEGER);
    INSERT INTO T VALUES('A', 'そば', 250);
    INSERT INTO T VALUES('B', 'カレーライス', 400);
    INSERT INTO T VALUES('C', 'カレーライス', 400);
    INSERT INTO T VALUES('D', 'うどん', 250);
    DELETE FROM T WHERE 名前 = 'B';
    SELECT * FROM T;
  2. 「Execute」をクリックする
  3. 下側のウィンドウで結果を確認する

期待される実行結果

+--------+------------------+-------+
| 名前   | 昼食             | 料金  |
+--------+------------------+-------+
| A      | そば             | 250   |
| C      | カレーライス     | 400   |
| D      | うどん           | 250   |
+--------+------------------+-------+

名前が'B'の行が削除され、残りの3行(A、C、D)のデータが保持されている。

注意点

発展演習1:複数条件での更新

目的

OR条件を使用して、複数の条件に合致する行を一度に更新する方法を学ぶ。

課題

「そば」と「うどん」の料金を300円に更新する。

ヒント

解答例

UPDATE T SET 料金 = 300 WHERE 昼食 = 'そば' OR 昼食 = 'うどん';

このSQL文は、昼食が「そば」または「うどん」であるすべての行の料金を300円に更新する。

発展演習2:新しいデータの追加

目的

INSERT INTOを使用して新しいレコードをテーブルに追加する方法を学ぶ。

課題

新しく「E」が「天ぷら」を料金500円で食べた情報をテーブルTに追加する。

ヒント

解答例

INSERT INTO T VALUES ('E', '天ぷら', 500);

このSQL文は、名前「E」、昼食「天ぷら」、料金500円の新しい行をテーブルTに追加する。

演習2:トランザクション

学習目標

トランザクションの概念を理解し、COMMITROLLBACKの動作を実際に確認する。

トランザクションとは

複数のデータベース操作を一つの処理単位としてまとめたもの。すべての操作が成功した場合のみ変更を確定し、一つでも失敗すれば全体を取り消す仕組み。

演習2-1:ROLLBACKによる変更の取り消し

目的

トランザクション内の変更をROLLBACKで取り消す動作を確認する。

手順

  1. SQLFiddleにアクセスする([http://sqlfiddle.com/](http://sqlfiddle.com/))
  2. 「MySQL」を選択する
  3. 上のパネルに以下のSQLを入力する
    CREATE TABLE T (
    名前 VARCHAR(20) PRIMARY KEY,
    昼食 TEXT,
    料金 INTEGER);
    INSERT INTO T VALUES('A', 'そば', 250);
    INSERT INTO T VALUES('B', 'カレーライス', 400);
    INSERT INTO T VALUES('C', 'カレーライス', 400);
    INSERT INTO T VALUES('D', 'うどん', 250);
    START TRANSACTION;
    UPDATE T SET 料金 = 500 WHERE 名前 = 'A';
    UPDATE T SET 昼食 = 'ラーメン' WHERE 名前 = 'B';
    ROLLBACK;
    SELECT * FROM T;
  4. 「Execute」をクリックする
  5. 下側のウィンドウで結果を確認する

期待される実行結果

+--------+------------------+-------+
| 名前   | 昼食             | 料金  |
+--------+------------------+-------+
| A      | そば             | 250   |
| B      | カレーライス     | 400   |
| C      | カレーライス     | 400   |
| D      | うどん           | 250   |
+--------+------------------+-------+

トランザクション内で実行されたAとBの変更がROLLBACKにより取り消され、元のデータが保持されている。

ヒント

演習2-2:COMMITによる変更の確定

目的

トランザクション内の変更をCOMMITで確定する動作を確認する。

手順

  1. 上のパネルのSQLを以下に書き換える
    CREATE TABLE T (
    名前 VARCHAR(20) PRIMARY KEY,
    昼食 TEXT,
    料金 INTEGER);
    INSERT INTO T VALUES('A', 'そば', 250);
    INSERT INTO T VALUES('B', 'カレーライス', 400);
    INSERT INTO T VALUES('C', 'カレーライス', 400);
    INSERT INTO T VALUES('D', 'うどん', 250);
    START TRANSACTION;
    UPDATE T SET 料金 = 500 WHERE 名前 = 'A';
    UPDATE T SET 昼食 = 'ラーメン' WHERE 名前 = 'B';
    COMMIT;
    SELECT * FROM T;
  2. 「Execute」をクリックする
  3. 下側のウィンドウで結果を確認する

期待される実行結果

+--------+------------------+-------+
| 名前   | 昼食             | 料金  |
+--------+------------------+-------+
| A      | そば             | 500   |
| B      | ラーメン         | 400   |
| C      | カレーライス     | 400   |
| D      | うどん           | 250   |
+--------+------------------+-------+

トランザクション内で実行されたAとBの変更がCOMMITにより確定されている。

ヒント

COMMITとROLLBACKの比較

操作       | 動作                             | 結果
COMMIT     | トランザクション内の変更を確定 | データベースに永続的に反映
ROLLBACK   | トランザクション内の変更を取り消し | トランザクション開始時の状態に復元

よくある質問と注意点

Q1:WHERE句を忘れるとどうなるか

ADELETEUPDATEでWHERE句を省略すると、テーブル内のすべての行が対象となる。意図しないデータの削除や変更を防ぐため、WHERE句は必ず指定する。

Q2:主キー制約とは何か

A主キー制約は、列の値が重複しないことを保証する制約。主キーに設定された列には、同じ値を持つ行を追加できない。

Q3:トランザクションはいつ使うのか

A:複数の操作が互いに関連している場合に使用する。例えば、銀行の送金処理では、出金と入金の両方が成功した場合のみ確定する必要がある。

Q4:制約違反が発生するとどうなるか

A:制約違反(主キーの重複など)が発生すると、COMMITは実行されず、トランザクション全体が自動的にロールバックされる。

まとめ

この自習ガイドを通じて、以下の内容を学んだ。

  1. データベースの基本操作(INSERTSELECTDELETEUPDATE
  2. トランザクション管理(START TRANSACTIONCOMMITROLLBACK
  3. データベース管理システムの特徴機能(制約違反時の自動ロールバック、障害時の自動復旧)

これらは、データベースを扱うすべてのアプリケーション開発において基礎となる重要な概念である。演習を繰り返し実践することで、理解を深めることができる。

ds-12. データ管理の基礎:オンライントランザクションとデータウェアハウスの特徴と活用

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

【関連する外部サイトへのリンク】

SQLFiddle(推奨)

DBFiddle(代替案)

演習全般について

準備

この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。

SQLFiddle(推奨)

DBFiddle(代替案)

SQLFiddleの基本操作

コピー:

SQLFiddleへの貼り付け:

SQLFiddleを使用してデータベース操作とトランザクション管理を実践的に学ぶ。各演習を順番に進めることで、データベースの基本概念とトランザクションの重要性を理解できる。

演習の構成と学習の流れ

本ガイドでは以下の順序で演習を実施する。各演習は段階的に内容が発展していく構成となっている。

注意事項

重要: SQLFiddleではサーバの時刻が表示されるため、「2024-05-23 13:19:53」のように実際の現在日時と異なる場合があるが、演習の進行には影響しないので続行すること

演習1:テーブル定義とデータの追加、主キー制約

学習目標

この演習では以下を習得する。

演習の目的

データベースの基本操作として、テーブルを作成し、データを追加し、その内容を確認する一連の流れを体験する。主キー制約により、各行を一意に識別できることを確認する。

手順

  1. SQLFiddleでMySQLを選択する
  2. 上のパネルに以下のSQLを入力する
CREATE TABLE 商品 (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);
INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);
select * FROM 商品;
  1. Executeをクリックする
  2. 下のパネルで結果を確認する

期待される結果

実行すると、下のパネルに以下のような表が表示される。

+----+--------+------+
| ID | 商品名 | 単価 |
+----+--------+------+
| 1  | みかん | 50   |
| 2  | りんご | 100  |
| 3  | メロン | 500  |
+----+--------+------+

ヒント

演習2:外部キー、参照整合性制約

学習目標

この演習では以下を習得する。

演習の目的

商品テーブルと購入テーブルという2つのテーブルを作成し、外部キーによって両者を関連付ける。これにより、存在しない商品IDを購入テーブルに登録できないことを確認する。演習1で学んだ主キーの知識を活用し、テーブル間の関連を定義する。

手順

  1. SQLFiddleでMySQLを選択する
  2. 上のパネルに以下のSQLを入力する
CREATE TABLE 商品 (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);
INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);
CREATE TABLE 購入 (
ID INTEGER PRIMARY KEY,
購入者 TEXT,
商品ID INTEGER,
数量 INTEGER,
FOREIGN KEY (商品ID) REFERENCES 商品(ID));
INSERT INTO 購入 VALUES(1, 'X', 1, 10);
INSERT INTO 購入 VALUES(2, 'Y', 2, 5);
select * FROM 商品;
select * FROM 購入;
  1. Executeをクリックする
  2. 下のパネルで結果を確認する

期待される結果

実行すると、商品テーブルと購入テーブルの2つの表が表示される。

商品テーブル:

+----+--------+------+
| ID | 商品名 | 単価 |
+----+--------+------+
| 1  | みかん | 50   |
| 2  | りんご | 100  |
| 3  | メロン | 500  |
+----+--------+------+

購入テーブル:

+----+--------+--------+------+
| ID | 購入者 | 商品ID | 数量 |
+----+--------+--------+------+
| 1  | X      | 1      | 10   |
| 2  | Y      | 2      | 5    |
+----+--------+--------+------+

ヒント

演習3:now()による現在日時の取得

学習目標

この演習では以下を習得する。

演習の目的

データベースで日時情報を扱う第一歩として、現在日時を取得する方法を学ぶ。次の演習4で日時型の属性を持つテーブルを作成するための準備となる。

手順

  1. SQLFiddleでMySQLを選択する
  2. 上のパネルに以下のSQLを入力する
select now();
  1. Executeをクリックする
  2. 下のパネルで結果を確認する

期待される結果

実行すると、現在日時が表示される。

+---------------------+
| now()               |
+---------------------+
| 2024-05-23 13:19:53 |
+---------------------+

ヒント

演習4:日時を扱うテーブル

学習目標

この演習では以下を習得する。

演習の目的

購入テーブルに購入日時という日時型の属性を追加し、いつ購入されたかを記録できるようにする。演習3で学んだ日時の取得方法を活用し、実際にテーブルで日時を扱う。

手順

  1. SQLFiddleでMySQLを選択する
  2. 上のパネルに以下のSQLを入力する
CREATE TABLE 商品 (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);
INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);
CREATE TABLE 購入 (
ID INTEGER PRIMARY KEY,
購入者 TEXT,
商品ID INTEGER,
数量 INTEGER,
購入日時 DATETIME,
FOREIGN KEY (商品ID) REFERENCES 商品(ID));
INSERT INTO 購入 VALUES(1, 'X', 1, 10, '2026-12-04 09:00:00');
INSERT INTO 購入 VALUES(2, 'Y', 2, 5, '2025-12-04 10:00:00');
select * FROM 商品;
select * FROM 購入;
  1. Executeをクリックする
  2. 下のパネルで結果を確認する

期待される結果

購入テーブルに購入日時が追加されて表示される。

+----+--------+--------+------+---------------------+
| ID | 購入者 | 商品ID | 数量 | 購入日時            |
+----+--------+--------+------+---------------------+
| 1  | X      | 1      | 10   | 2026-12-04 09:00:00 |
| 2  | Y      | 2      | 5    | 2025-12-04 10:00:00 |
+----+--------+--------+------+---------------------+

ヒント

演習5:データウェアハウス

学習目標

この演習では以下を習得する。

演習の目的

商品の価格が変化する状況を想定し、価格改定の履歴を記録するテーブルを作成する。これにより、過去のある時点での価格を参照できることを確認する。演習1~4で学んだすべての知識を統合して活用する。

背景知識

手順1:テーブル作成とデータ追加

  1. SQLFiddleでMySQLを選択する
  2. 上のパネルに以下のSQLを入力する
CREATE TABLE 商品 (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER,
改訂日時 DATETIME);
INSERT INTO 商品 VALUES(1, 'みかん', 50, '2025-12-01 09:00:00');
INSERT INTO 商品 VALUES(2, 'りんご', 100, '2025-12-01 09:00:00');
INSERT INTO 商品 VALUES(3, 'メロン', 500, '2025-12-01 09:00:00');
INSERT INTO 商品 VALUES(4, 'りんご', 150, '2026-01-01 09:00:00');
INSERT INTO 商品 VALUES(5, 'メロン', 400, '2026-01-01 09:00:00');
CREATE TABLE 購入 (
ID INTEGER PRIMARY KEY,
購入者 TEXT,
商品ID INTEGER,
数量 INTEGER,
購入日時 DATETIME,
FOREIGN KEY (商品ID) REFERENCES 商品(ID));
INSERT INTO 購入 VALUES(1, 'X', 1, 10, '2025-12-10 10:00:00');
INSERT INTO 購入 VALUES(2, 'Y', 2, 5, '2025-12-20 12:00:00');
INSERT INTO 購入 VALUES(3, 'Y', 4, 20, '2026-01-05 09:00:00');
INSERT INTO 購入 VALUES(4, 'Z', 5, 3, '2026-01-05 11:00:00');
select * FROM 商品;
select * FROM 購入;
  1. Executeをクリックする
  2. 下のパネルで結果を確認する

期待される結果(手順1)

商品テーブルでは、同じ商品でも価格改定ごとに別の行として記録される。

商品テーブル:

+----+--------+------+---------------------+
| ID | 商品名 | 単価 | 改訂日時            |
+----+--------+------+---------------------+
| 1  | みかん | 50   | 2025-12-01 09:00:00 |
| 2  | りんご | 100  | 2025-12-01 09:00:00 |
| 3  | メロン | 500  | 2025-12-01 09:00:00 |
| 4  | りんご | 150  | 2026-01-01 09:00:00 |
| 5  | メロン | 400  | 2026-01-01 09:00:00 |
+----+--------+------+---------------------+

重要: りんごはID=2とID=4の2行があり、それぞれ異なる価格である。メロンも同様である

ヒント(手順1)

手順2:応用的な問い合わせの実行

この手順では、履歴データを活用した複数の問い合わせを実行する。

問い合わせ例1:商品と購入を結合して表示

上のパネルに以下のSQLを追加し、Executeをクリックする。

SELECT * FROM 商品
INNER JOIN 購入 ON 商品.ID = 購入.商品ID;

この問い合わせでは、2つのテーブルを結合し、購入時の商品情報と購入情報を一緒に表示する。

問い合わせ例2:購入者ごとの合計金額を計算

上のパネルに以下のSQLを追加し、Executeをクリックする。

SELECT 購入.購入者, SUM(購入.数量 * 商品.単価)
FROM 商品
INNER JOIN 購入 ON 商品.ID = 購入.商品ID
GROUP BY 購入.購入者;

この問い合わせでは、各購入者がいくら支払ったかを計算する。

問い合わせ例3:各商品の最新の改訂日時を取得

上のパネルに以下のSQLを追加し、Executeをクリックする。

SELECT 商品名, MAX(改訂日時)
FROM 商品
GROUP BY 商品名;

この問い合わせでは、各商品の最も新しい価格改定日時を取得する。

問い合わせ例4:各商品の最新価格を取得

上のパネルに以下のSQLを追加し、Executeをクリックする。

SELECT 商品名, 単価, 改訂日時
FROM 商品
WHERE (商品名, 改訂日時) IN (
SELECT 商品名, MAX(改訂日時)
FROM 商品
GROUP BY 商品名);

この問い合わせでは、各商品の現在の価格を取得する。副問い合わせとは、SELECT文の中にさらにSELECT文を含める手法である。

ヒント(手順2)

発展演習1:商品「りんご」を購入した人の取得

位置づけ

この演習は応用的な内容である。演習5を完了してから取り組むこと。

学習目標

この演習では以下を習得する。

演習の目的

商品名「りんご」を購入したすべての購入者を取得するSQLを作成する。同じ購入者が複数回購入している場合でも、重複を除いて1回だけ表示する。

課題

商品名が「りんご」である商品を購入したすべての購入者を得るSQLを作成する。DISTINCTによる重複行の除去も行うこと。

期待される結果

+--------+
| 購入者 |
+--------+
| Y      |
+--------+

ヒント

解答例

SELECT DISTINCT(購入.購入者)
FROM 購入
INNER JOIN 商品 ON 購入.商品ID = 商品.ID
WHERE 商品.商品名 = 'りんご';

学習のまとめ

重要概念の復習

データ管理の2つのアプローチ

ds-13. Microsoft Access の使い方、データの並べ替え(ソート)

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

演習で使用するデータベースファイル

db4-4.accdb

今回の演習では、SQL Fiddle を使わずに、Microsoft Access を使う。

Microsoft Access は、パソコン室のパソコンにインストール済み。

 今回の授業の特徴: Microsoft Access の練習。大量データの処理

演習全般について

学習目標

使用するソフトウェア

演習用データベースファイル

ds-14. データベースアプリケーションの実践

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

演習

今日は Google Colaboratory という、オンラインで Python プログラムを実行できるサイトを使用

[https://colab.research.google.com/drive/18F9rdskdANKrWkB9CTbzyi8e8Gpuj18V?usp=drive_link](https://colab.research.google.com/drive/18F9rdskdANKrWkB9CTbzyi8e8Gpuj18V?usp=drive_link)

本演習を通じて、以下の知識とスキルを習得する。

  1. PythonからSQLを実行する方法(ドライバ、接続、カーソルの使い方)
  2. SQLインジェクション攻撃の仕組みと、プレースホルダによる防御方法
  3. トランザクション処理(コミットとロールバック)によるデータ整合性の確保

事前準備

演習を開始する前に、以下を確認する。

演習用ノートブック

以下のURLからGoogle Colaboratoryのノートブックを開く。

[https://colab.research.google.com/drive/18F9rdskdANKrWkB9CTbzyi8e8Gpuj18V?usp=drive_link](https://colab.research.google.com/drive/18F9rdskdANKrWkB9CTbzyi8e8Gpuj18V?usp=drive_link)

演習の進め方

演習は全7つのセル(セル1〜セル7)で構成されている。各セルを上から順番に実行する。セルの実行方法は以下のいずれかである。

演習1:お店のデータベースを作る

目的

演習で使用するデータベースを準備する。データベースへの接続、テーブル作成、データ挿入、コミットの一連の流れを確認する。

関連する学習内容

手順

  1. セル1を見つける
  2. セル1を実行する

期待される出力

準備完了:お店を開店しました。

確認ポイント

ヒント

演習2:SQLインジェクション攻撃

目的

文字列連結でSQLを組み立てた場合に、SQLインジェクション攻撃によって情報漏洩が発生することを確認する。

関連する学習内容

手順

  1. セル1を実行済みであることを確認する
  2. セル2を見つける
  3. セル2を実行する

期待される出力

実行される危険なSQL: SELECT * FROM items WHERE name = '' OR '1'='1'
--- 検索結果 ---
[(1, 'パソコン', 120000), (2, 'マウス', 3000), (3, 'キーボード', 8000)]

確認ポイント

ヒント

注意

本演習で学ぶSQLインジェクションは、防御方法を理解するための学習である。他者が管理するシステムに対してSQLインジェクション攻撃を試みることは、不正アクセス禁止法に違反する犯罪行為である。

演習3:プレースホルダで守る

目的

プレースホルダ(

?
)を使用することで、SQLインジェクション攻撃を防御できることを確認する。

関連する学習内容

手順

  1. セル2を実行済みであることを確認する
  2. セル3を見つける
  3. セル3を実行する

期待される出力

--- 安全な検索結果 ---
[]

確認ポイント

ヒント

演習4:更新とコミット

目的

データを変更し、

commit()
で確定する操作を体験する。

関連する学習内容

手順

  1. セル3を実行済みであることを確認する
  2. セル4を見つける
  3. セル4を実行する

期待される出力

値上げを確定しました。
[(2, 'マウス', 3500)]

確認ポイント

ヒント

演習5:エラー体験

目的

commit()
の前にエラーが発生すると、変更が確定されないことを確認する。

関連する学習内容

手順

  1. セル4を実行済みであることを確認する
  2. セル5を見つける
  3. セル5を実行する

期待される出力

--- ここからトラブル実験 ---
パソコンを削除してしまいました...(まだ未確定)

その後、赤い背景で以下のエラーが表示される。

ZeroDivisionError: division by zero

確認ポイント

ヒント

演習6:手動ロールバック

目的

rollback()
を実行すると、最後の確定状態に戻ることを確認する。

関連する学習内容

手順

  1. セル5を実行済みであることを確認する
  2. セル6を見つける
  3. セル6を実行する

期待される出力

ロールバックを実行しました。
--- 在庫確認 ---
[(1, 'パソコン', 120000), (2, 'マウス', 3500), (3, 'キーボード', 8000)]

確認ポイント

ヒント

演習7:切断

目的

データベース接続を適切に終了する。

関連する学習内容

手順

  1. セル6を実行済みであることを確認する
  2. セル7を見つける
  3. セル7を実行する

確認ポイント

演習の総括

本演習で体験した内容を整理する。

演習 内容 学んだこと
演習1 データベースを作成 接続、カーソル、SQL実行、コミット
演習2 SQLインジェクション攻撃 文字列連結の危険性、情報漏洩
演習3 プレースホルダで防御
?
を使えば安全
演習4 更新とコミット 変更の確定方法
演習5 エラー体験 コミット前のエラーで変更は未確定
演習6 ロールバック
rollback()
で確定前の変更を取り消し
演習7 切断 接続の終了

Pythonでの3つの原則

本演習で学んだ原則を以下にまとめる。

  1. データはリスト
    []
    に格納して渡す
  2. SQLには
    ?
    を使用し、文字列連結(
    +
    )を行わない
  3. エラーが発生したら
    rollback()
    でデータを復旧する

用語集

ds-15. NoSQL データベースシステム

資料(スライド): [PDF], [パワーポイント]

演習パート(クリックして展開)

演習による体験と探求

Google Colaboratory を使用。次のページにアクセスし、説明、コード、まとめ、末尾の探求を各自で確認
[https://colab.research.google.com/drive/11-Id3LbEF_b-J8bQGMIOAc781v8HSG6A?usp=sharing](https://colab.research.google.com/drive/11-Id3LbEF_b-J8bQGMIOAc781v8HSG6A?usp=sharing)

補充