データベース入門(授業資料)
カリキュラム構成
本授業は以下の4つの部で構成される。
- 第1部:導入とSQL基礎(ds-1〜ds-4)
データベースの基本概念を学んだ後、SQLFiddleを活用してSQLの文法とSELECT文によるデータ検索の基礎を習得する。
- 第2部:SQL応用(ds-5〜ds-8)
テーブル結合、GROUP BYによる集約処理、副問い合わせを学び、総合演習でこれらの知識を統合的に活用する。
- 第3部:データベース設計と理論(ds-9〜ds-12)
主キーと参照整合性制約、正規化理論、トランザクション管理を学習し、オンライントランザクション処理とデータウェアハウスの違いを理解する。
- 第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まで扱うことで、現代のデータ管理技術を俯瞰できる視野を養成する。
ds-1. データベースの基本
関連する外部ページ
演習
難しく考えず、Access で、データベースを体験してみてください
演習1.Access の利用開始
演習2.テーブルの新規作成
演習3.データの挿入と保存
演習1: Accessの利用開始
目的
Microsoft Accessの基本的な起動方法と新しいデータベースの作成方法を身につけます。
手順
- Accessの起動
- スタートメニューまたはデスクトップからMicrosoft Accessを起動してください
- データベースの新規作成
- スタート画面で「空のデスクトップデータベース」をクリックしてください
- ファイル名は初期設定のまま使用可能です
- 「作成」ボタンをクリックしてください
- 画面確認
- 期待される結果: テーブルツール画面が表示されます
- 画面の各部分を確認してください
重要な注意点
今回は、必ず「空のデスクトップデータベース」を選択してください。
演習2: テーブルの新規作成
目的
データベースの基本構成要素であるテーブルを作成し、属性の設定とデータ型の指定方法を身につけます。
専門用語の説明
- テーブル: データを表形式で格納する構造
- 属性: テーブルの列にあたる項目
- データ型: 格納するデータの種類を指定する設定
手順
ステップ1: 「商品」属性の追加
- 「クリックして追加」を右クリックしてください
- 「短いテキスト」を選択してください
- 「フィールド1」をダブルクリックして選択状態にしてください
- 「商品」と入力してください
期待される結果: 列名が「商品」に変更されます
ステップ2: 「単価」属性の追加
- 再度「クリックして追加」を右クリックしてください
- 今度は「数値」を選択してください
- 「フィールド1」を「単価」に変更してください
期待される結果: 数値用の列が追加されます
重要なデータ型について
- 短いテキスト: 文字列データ
- 数値: 数値データ
- ID: 自動的に連番が設定される
つまずきポイントの回避
単価属性では「数値」を選択してください。
演習3: データの挿入と保存
目的
作成したテーブルに実際のデータを挿入し、テーブルの保存方法を身につけます。
手順 ステップ1: データの挿入
- 1行目のデータ入力
- 商品欄に「みかん」と入力してください
- 単価欄に「50」と入力してください
期待される結果: ID欄に自動的に「1」が設定されます
- 2行目のデータ入力
- 商品欄に「りんご」と入力してください
- 単価欄に「100」と入力してください
期待される結果: ID欄に自動的に「2」が設定されます
- 3行目のデータ入力
- 商品欄に「りんご」と入力してください
- 単価欄に「150」と入力してください
ステップ2: テーブルの保存
- 「テーブル1」タブを右クリックしてください
- 「閉じる」を選択してください
- 「変更を保存しますか?」で「はい」を選択してください
- テーブル名を「商品」に変更してください
- 「OK」をクリックしてください
重要な注意点
- 数値データは必ず半角数字で入力してください
- 最初の保存時に必ずテーブル名を設定してください
つまずきポイントの回避
数値欄に全角数字を入力するとエラーが発生します。単価欄では必ず半角数字を使用してください。
エラー対処法
テーブルの削除方法
間違ってテーブルを作成した場合:
- ナビゲーションペインでテーブルを右クリックしてください
- 「削除」を選択してください
新しいテーブルの作成方法
- リボンの「作成」タブをクリックしてください
- 「テーブル」をクリックしてください
データベースの終了方法
- リボンの「ファイル」をクリックしてください
- 「閉じる」をクリックしてください
- ウィンドウ右上の「×」ボタンでAccessを終了してください
学習の振り返り
この演習完了後、以下を確認してください:
データベースの基本概念:
- データの構造化
- データの永続性
- データの整合性
実践的なスキル:
- Accessの基本操作
- テーブルの作成と属性設定
- データの挿入と保存
ds-2. SQLの基本
資料(スライド): [PDF], [パワーポイント]
SQLFiddle(推奨) DBFiddle(代替案) 準備 この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。 SQLFiddle(推奨) DBFiddle(代替案) コピー: SQLFiddleへの貼り付け: 学習目標 SQLFiddleを使用してテーブル定義とデータ追加を行う 演習の目的 この演習では、オンラインツールSQLFiddleを使用して、テーブルの定義とデータの追加を実際に行います。SQLFiddleはインストール不要で利用できるため、SQLの基本操作を手軽に学習できます。 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください ステップ2:SQLを入力して実行してください SQLFiddleの場合は上のパネルに、DBFiddleの場合は左側の「Schema SQL」に以下のSQLを入力してください。 注意: 最初に表示されているサンプルSQLは削除。 SQLFiddleへの貼り付けは CTRLキーとvキーの同時押し ステップ3:「Execute」をクリックしてください 下側のウィンドウで、結果が何も出ないのは正しい動作です。 テーブル定義とデータ追加は成功していますが、データを表示する命令を実行していないため、下側のウィンドウには結果が表示されません。 補足説明 SQLFiddleの画面構成 基本用語: 学習目標 演習の目的 この演習では、従業員テーブルを作成し、データを追加した後、様々なパターンの問い合わせを実行します。SQLによるデータ操作の基本的な流れを体験します。 問い合わせとは、必要なデータを検索・加工するためのコマンドです。 パート1:全データの取得 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。
前回と同じ手順でアクセス。「MySQL」を選択 ステップ2:SQLを入力して実行してください。 注意: 以前使用したSQLは削除。 SQLFiddleへの貼り付けは CTRLキーとvキーの同時押し ステップ3:「Execute」をクリックしてください 下側のウィンドウで、結果を確認してください。 表示が見えないときは、スクロールバーでスクロールしてください。 期待される結果: 従業員テーブルの全データが表示されます。 パート2:特定の属性のみ取得 ステップ1:上のパネルのSQLは不要なので消してください ステップ2:上のパネルに、テーブル定義とデータ追加と問い合わせを行うSQLを入れてください 以下のSQLを上のパネルに入力してください: SQLFiddleへの貼り付けは CTRLキーとvキーの同時押し ステップ3:「Execute」をクリックしてください 下側のウィンドウで、結果を確認してください。 表示が見えないときは、スクロールバーでスクロールしてください。 期待される結果: age属性のデータのみが表示されます。 パート3:条件付き検索 ステップ1:上のパネルのSQLは不要なので消してください ステップ2:上のパネルに、テーブル定義とデータ追加と問い合わせを行うSQLを入れてください 以下のSQLを上のパネルに入力してください: SQLFiddleへの貼り付けは CTRLキーとvキーの同時押し ステップ3:「Execute」をクリックしてください 下側のウィンドウで、結果を確認してください。 表示が見えないときは、スクロールバーでスクロールしてください。 期待される結果: ageが30の従業員のデータのみが表示されます。 補足説明 SQLFiddleでの実行について SELECT文の基本 WHERE句の使い方 基本用語: 処理の流れ: SQLは大文字小文字を区別しません。SELECTとselectは同じです。 よくある間違い:演習パート(クリックして展開)
【関連する外部サイトへのリンク】
演習全般について
演習1: SQLFiddleを用いたテーブル定義とデータ追加
create table 朝食と値段 (
名前 text,
朝食 text,
値段 integer
);
insert into 朝食と値段 values ('A', 'カレーライス', 400);
insert into 朝食と値段 values ('B', 'うどん', 250);
insert into 朝食と値段 values ('C', 'カレーライス', 400);
演習2: テーブル定義とデータ追加と問い合わせ
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 従業員;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 従業員;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;SELECT 取得したい属性 FROM テーブル名;
SELECT * FROM テーブル名 WHERE 条件;
ds-3. SQL入門:SQLFiddleを活用したデータベース操作の基礎と応用
資料(スライド): [PDF], [パワーポイント]
SQLFiddle(推奨) DBFiddle(代替案) 準備 この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。 SQLFiddle(推奨) DBFiddle(代替案) コピー: SQLFiddleへの貼り付け: 学習目標 演習の目的 この演習では、オンラインツールSQLFiddleを使用して、テーブルの定義とデータの追加を行います。SQLFiddleはインストール不要で利用できるため、SQLの基本操作を手軽に学習できます。 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください ステップ2:SQLを入力して実行してください SQLFiddleの場合は上のパネルに、DBFiddleの場合は左側の「Schema SQL」に以下のSQLを入力してください。 注意: 最初に表示されているサンプルSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 ステップ3:実行と結果の確認 「Execute」ボタンをクリックしてください。 下側のウインドウで結果を確認してください。表示が見えないときは、スクロールバーでスクロールしてください。 期待される結果 各テーブルの内容が正しく表示されていることを確認してください。 ヒントと考察のポイント SQLのキーワードについて テーブル構造の理解 SQLFiddleでの実行について SQLFiddleでは、各実行が独立しています。そのため、問い合わせを実行するたびに、テーブル定義とデータ追加のコードも含める必要があります。 処理の流れ: よくある間違い: 次のステップ このブラウザウインドウは閉じないでください。次の演習で使用します。 余裕がある人向け 次のSQLを試してみてください: SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 これらのSQLは、特定の属性だけを取得したり、条件に合う行だけを取得したりする例です。 2.1 学習目標 2.2 演習の目的 この演習では、データベースから必要なデータを検索・取得するための基本的な問い合わせ(クエリ)を学びます。 都道府県のデータを使用して、全データの表示、条件に合うデータの選択、パターンマッチによる検索など、実用的な問い合わせ操作を体験します。 2.3 演習手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。
前回と同じ手順でアクセス。「MySQL」を選択 ステップ2:SQLを入力して実行してください。 注意: 以前使用したSQLは削除。 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. 演習1: SQLFiddleを用いたテーブル定義とデータ追加
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 部署;
SELECT age FROM 従業員;
SELECT * FROM 従業員 WHERE age = 30;2. 演習2: 問い合わせ(クエリ)
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 '%島%';
ds-4. SQL基礎:SELECT 文による効率的なデータ検索と操作の基本
資料(スライド): [PDF], [パワーポイント]
SQLFiddle(推奨) DBFiddle(代替案) 準備 この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。 SQLFiddle(推奨) DBFiddle(代替案) コピー: SQLFiddleへの貼り付け: 重要な注意事項 SQLFiddle、DBFiddle はオンラインツールです。秘密情報はオンラインツールにアップロードしないでください。情報漏洩のリスクがあります。 学習目標 この演習で習得する内容: SQL構文要素の基本 この演習で使用する主なSQL構文要素の役割は以下の通りです: 基本用語: 2.1 演習の目的 この演習では、データベースの基本操作を学びます。具体的には、テーブルを作成し、データを追加し、そのデータを取得する一連の流れを体験します。 2.2 手順 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください ステップ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行:徳川家康、源義経、西郷隆盛、豊臣秀吉、織田信長)。 期待される結果: 各テーブルの内容が正しく表示されていることを確認してください。 ステップ4:追加のSELECT文を試してください 上のパネルの最後に、以下のSQLを追加してください。 select 名前, 得点 from 記録; select 名前, 得点 from 記録 where 得点 > 80; SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 再度「Execute」ボタンをクリックし、結果を確認してください。 1つ目のSQLは、名前と得点の2つの列だけが表示されます(5行)。 2つ目のSQLは、得点が80より大きい行だけが表示されます(3行)。 期待される結果: 1つ目のSQL: 2つ目のSQL: 2.3 ヒントと考察のポイント テーブル定義について: データ追加について: SELECT文について: よくある間違い: 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: 2つ目のSQL: 各結果が正しく表示されていることを確認してください。 ステップ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: 2つ目のSQL: 各結果が正しく表示されていることを確認してください。 ステップ3:集約関数を使用してください 上のパネルの最後に、以下のSQLを追加してください。 select avg(得点) from 記録; SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 「Execute」ボタンをクリックし、結果を確認してください。 得点の平均値が表示されます。 期待される結果: 結果が正しく表示されていることを確認してください。 ステップ4:IN演算子を使用してください 上のパネルの最後に、以下のSQLを追加してください。 select * from 記録 where 居室 in ('1階', '2階'); SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 「Execute」ボタンをクリックし、結果を確認してください。 居室が1階または2階の行が表示されます(4行)。 期待される結果: 結果が正しく表示されていることを確認してください。 3.3 ヒントと考察のポイント DISTINCTについて: 処理の流れ: WHERE句の条件指定について: 集約関数について: 処理の流れ: IN演算子について: よくある間違い: 3.4 余裕がある人向け 次のSQLを試してみてください: select max(得点), min(得点) from 記録; select 名前, 得点 from 記録 where 得点 between 75 and 80; select * from 記録 where 居室 = '3階'; SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 これらのSQLは、最大値・最小値の取得、異なる範囲指定、特定の値の検索を行う例です。 これらの問題に自分で挑戦してください。解答例は後述していますが、まずは自力で考えてみることが重要です。 確認問題① 以下のテーブル「記録」から、得点が70以上80以下の行を選択するSQLを作成してください。 ヒント: BETWEENを使うと範囲指定が簡単にできます。 確認問題② テーブル「記録」から、得点の最大値を求めるSQLを作成してください。 ヒント: 集約関数のMAXを使用します。 解答例 確認問題①の解答 SELECT * FROM 記録 WHERE 得点 BETWEEN 70 AND 80; 得点が70以上80以下の行が選択されます(2行)。 期待される結果: 解説: 確認問題②の解答 SELECT MAX(得点) FROM 記録; 得点の最大値が表示されます。 期待される結果: 解説: Q1: SQLを実行してもエラーが出ます 確認事項: Q2: SQLFiddleが動作しません 対処法: Q3: DBFiddleでの操作方法がわかりません 手順: Q4: 結果が表示されません 確認事項:演習パート(クリックして展開)
【関連する外部サイトへのリンク】
演習全般について
2. 演習1:テーブル定義とデータの追加、基本的なSELECT文
名前
得点
居室
徳川家康
85
1階
源義経
78
2階
西郷隆盛
90
3階
豊臣秀吉
82
1階
織田信長
75
2階
名前
得点
徳川家康
85
源義経
78
西郷隆盛
90
豊臣秀吉
82
織田信長
75
名前
得点
徳川家康
85
西郷隆盛
90
豊臣秀吉
82
3. 演習2:より実践的なSQL
居室
1階
2階
3階
1階
2階
居室
1階
2階
3階
名前
得点
徳川家康
85
西郷隆盛
90
豊臣秀吉
82
名前
得点
徳川家康
85
豊臣秀吉
82
avg(得点)
82.0000
名前
得点
居室
徳川家康
85
1階
源義経
78
2階
豊臣秀吉
82
1階
織田信長
75
2階
4. 確認問題
名前
得点
居室
徳川家康
85
1階
源義経
78
2階
西郷隆盛
90
3階
豊臣秀吉
82
1階
織田信長
75
2階
名前
得点
居室
源義経
78
2階
織田信長
75
2階
MAX(得点)
90
5. よくある質問とトラブルシューティング
ds-5. テーブルの結合と SQL によるデータ統合
資料(スライド): [PDF], [パワーポイント]
SQLFiddle(推奨) DBFiddle(代替案) 準備 この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。 SQLFiddle(推奨) DBFiddle(代替案) コピー: SQLFiddleへの貼り付け: 学習目標 この演習で習得する内容: 2.1 演習の目的 この演習では、データベースの基本操作を学びます。具体的には、テーブルを作成し、データを追加し、そのデータを取得する一連の流れを体験します。 2.2 手順 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください ステップ2:SQLを入力して実行してください SQLFiddleの場合は上のパネルに、DBFiddleの場合は左側の「Schema SQL」に以下のSQLを入力してください。 注意: 最初に表示されているサンプルSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタンをクリックしてください。 ステップ3:結果を確認してください 下のパネルに以下の結果が表示されることを確認してください。 商品テーブルの全データが表示されます(3行:みかん、りんご、メロン)。 期待される結果: 各テーブルの内容が正しく表示されていることを確認してください。 2.3 ヒントと考察のポイント テーブル定義について: データ追加について: SELECT文について: よくある間違い: 3.1 演習の目的 この演習では、2つのテーブルを結合する方法を学びます。具体的には、INNER JOINを使用して、関連性のあるデータを結び付ける方法を体験します。 3.2 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。
前回と同じ手順でアクセス。「MySQL」を選択 ステップ2:SQLを入力して実行してください。 注意: 以前使用したSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタンをクリックしてください。 ステップ3:結果を確認してください 下のパネルに以下の結果が表示されることを確認してください。 商品テーブルと購入テーブルが結合され、購入者がどの商品を購入したかが表示されます(3行)。 期待される結果: 各テーブルの内容が正しく表示されていることを確認してください。 3.3 ヒントと考察のポイント なぜテーブルを分けるのか: INNER JOINについて: 結合条件について: よくある間違い: 4.1 演習の目的 この演習では、結合後のテーブルから必要な列のみを選択する方法を学びます。 4.2 手順 問題: 結合の結果のテーブルは5列です。このうち、「商品名」と「購入者」の列のみを表示し、他の列は表示しないようなSQLを作成してください。 ヒント: SELECT * を変更して、必要な列のみを指定してください。 期待される結果: 4.3 解答例 4.4 解説 5.1 演習の目的 この演習では、結合後のテーブルの行数を数える方法を学びます。 5.2 手順 問題: 結合の結果のテーブルは、1つのテーブルです。この行数3を得るSQLを作成してください。 ヒント: COUNT(*) を使用してください。 期待される結果: 5.3 解答例 5.4 解説 6.1 演習の目的 この演習では、INNER JOINとWHERE句を組み合わせて使用する方法を学びます。具体的には、結合後のデータを条件で絞り込む方法を体験します。 6.2 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。
前回と同じ手順でアクセス。「MySQL」を選択 ステップ2:SQLを入力して実行してください。 注意: 以前使用したSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタンをクリックしてください。 ステップ3:結果を確認してください 下のパネルに以下の結果が表示されることを確認してください。 購入者がXの行のみが表示されます(2行)。 期待される結果: 各テーブルの内容が正しく表示されていることを確認してください。 ステップ4:追加のSELECT文を試してください 上のパネルの最後に、以下のSQLを追加してください。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 再度「Execute」ボタンをクリックし、結果を確認してください。 指定した列のみが表示されます(2行)。 期待される結果: 6.3 ヒントと考察のポイント WHERE句について: SELECT句での列の指定について: よくある間違い: 7.1 演習の目的 この演習では、WHERE句の条件を変更した場合の結果を予想する力を養います。 7.2 手順 問題: いまの演習において、次のSQLを実行したら、どのような結果になるか、予想してください。そして、実際に動作させてください。 ヒント: 購入.購入者 = 'X' でなく、購入.購入者 = 'Y' になっていることに注意 7.3 解答 期待される結果: 8.1 演習の目的 この演習では、CROSS JOINの動作を学びます。具体的には、結合条件を指定しない場合に、2つのテーブルの全ての組み合わせが作成されることを体験します。 8.2 手順 ステップ1:SQLFiddleにアクセスしてください ステップ2:SQLを入力して実行してください 上のパネルに以下のSQLを入力してください。 注意: 最初に表示されているサンプルSQLは削除してください。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタンをクリックしてください。 ステップ3:結果を確認してください 下のパネルに以下の結果が表示されることを確認してください。 全ての組み合わせが表示されます(9行:商品3行×購入3行)。 期待される結果: 各テーブルの内容が正しく表示されていることを確認してください。 8.3 ヒントと考察のポイント CROSS JOINについて: INNER JOINとの違い: 考察のポイント: 9.1 演習の目的 この演習では、これまで学んだ内容を統合して使用します。具体的には、テーブルの作成、結合、列の選択、条件による絞り込み、集計を体験します。 9.2 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。
前回と同じ手順でアクセス。「MySQL」を選択 ステップ2:SQLを入力して実行してください。 注意: 以前使用したSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタンをクリックしてください。 ステップ3:結果を確認してください 下のパネルに結果が表示されることを確認してください。 全ての組み合わせが表示されます(6行:名簿3行×食材2行)。 ステップ4:追加のSELECT文を試してください 上のパネルの最後に、以下のSQLを追加してください。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 再度「Execute」ボタンをクリックし、結果を確認してください。 1つ目のSQLは、結合条件を指定した結合の結果が表示されます(3行)。 2つ目のSQLは、名前の列のみが表示されます(3行)。 3つ目のSQLは、とうふを買った人のみが表示されます(1行)。 4つ目のSQLは、行数が表示されます(3)。 期待される結果: 1つ目のSQL:
2つ目のSQL:
3つ目のSQL:
4つ目のSQL: 9.3 ヒントと考察のポイント データの関連性について: 段階的なデータ抽出について: エラーが出た場合 Syntax errorが表示される 予期しない結果が表示される、何も結果が表示されない SQLFiddleが動かない場合 この演習で学んだこと 重要なポイント演習パート(クリックして展開)
【関連する外部サイトへのリンク】
演習全般について
2. 演習1:テーブル定義とデータの追加
CREATE TABLE 商品 (
ID INTEGER,
商品名 TEXT,
単価 INTEGER);
INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);
SELECT * FROM 商品;
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
3. 演習2: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 = 購入.商品番号;
ID
商品名
単価
購入者
商品番号
1
みかん
50
X
1
3
メロン
500
X
3
2
りんご
100
Y
2
4. 発展問題①:SELECTの応用
商品名
購入者
みかん
X
メロン
X
りんご
Y
SELECT 商品名, 購入者 FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号;
5. 発展問題②:COUNT(*)の応用
COUNT(*)
3
SELECT COUNT(*) FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号;
6. 演習3:複数の条件の指定
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';
ID
商品名
単価
購入者
商品番号
1
みかん
50
X
1
3
メロン
500
X
3
SELECT 商品名, 購入者, 単価 FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号 WHERE 購入.購入者 = 'X';
商品名
購入者
単価
みかん
X
50
メロン
X
500
7. 発展問題③:条件変更による結果の予想
SELECT 商品名, 購入者, 単価 FROM 商品
INNER JOIN 購入
ON 商品.ID = 購入.商品番号 WHERE 購入.購入者 = 'Y';
商品名
購入者
単価
りんご
Y
100
8. 演習4:結合条件のない結合
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 購入;
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
9. 演習5:結合の総合演習
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 食材;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;
ID
name
buy
ID
name
1
織田
1
1
とうふ
2
豊臣
2
2
納豆
3
徳川
2
2
納豆
name
name
織田
とうふ
豊臣
納豆
徳川
納豆
name
name
織田
とうふ
COUNT()
3
10. トラブルシューティング
11. まとめ
ds-6. SQL によるデータ分析:GROUP BY を用いたグループ化と集約
資料(スライド): [PDF], [パワーポイント]
SQLFiddle(推奨) DBFiddle(代替案) 準備 この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。 SQLFiddle(推奨) DBFiddle(代替案) コピー: SQLFiddleへの貼り付け: 学習目標 この演習で習得する内容: 演習の目的 この演習では、SQLによるテーブル定義(CREATE TABLE)の基本を理解し、データの追加(INSERT INTO)とSELECT文による確認方法を習得します。 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください ステップ2:SQLを入力して実行してください SQLFiddleの場合は上のパネルに、DBFiddleの場合は左側の「Schema SQL」に以下のSQLを入力してください。 注意: 最初に表示されているサンプルSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ3:結果を確認してください 下のパネルまたは右側に以下の結果が表示されることを確認してください。 成績テーブルの全データが表示されます(5行)。 期待される結果: 各テーブルの内容が正しく表示されていることを確認してください。 ヒントと考察のポイント CREATE TABLE文について: INSERT INTO文について: SELECT文について: よくある間違い: 演習の目的 この演習では、集約関数(AVG, MAX, MIN, SUM, COUNT)の使い方を習得し、WHERE句と集約関数の組み合わせを理解します。 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。
前回と同じ手順でアクセス。「MySQL」を選択 ステップ2:SQLを入力して実行してください。 注意: 以前使用したSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ3:結果を確認してください 実行すると、国語の平均点(87.5)が表示されます。 期待される結果: ステップ4:他の集約関数も試してください 以下のSQLを順に試してみましょう(最後のSELECT文の部分だけを変更して実行)。 ヒントと考察のポイント 集約関数について: WHERE句について: よくある間違い: 発展問題 発展問題①:算数の平均点の計算 目的:成績テーブルから算数の平均得点を算出する。 科目が算数の行について、得点の平均値を求めるSQL文を書いてください。 ヒント:AVGを使い、WHERE 句で科目を算数に絞り込みます。 発展問題②:科目は問わず全体の最高点の計算 目的:成績テーブルから最高得点を算出する。 得点の最大値を求めるSQL文を書いてください。 ヒント:MAXを使います。 演習の目的 この演習では、GROUP BY句の基本的な使い方を理解し、グループ化と集約の組み合わせ、WHERE句とGROUP BYの組み合わせを習得します。 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。
前回と同じ手順でアクセス。「MySQL」を選択 ステップ2:SQLを入力して実行してください。 注意: 以前使用したSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 期待される結果: ステップ2:WHERE句との組み合わせを試してください 90点以上の成績について、科目ごとの受講者数を計算します。 最後のSELECT文を以下に変更して実行してください。 期待される結果: ヒントと考察のポイント GROUP BY句について: よくある間違い: 発展問題 以下の問題に挑戦してみましょう。 発展問題③:受講者ごとの科目数 発展問題④:科目ごとの平均点 発展問題⑤:受講者ごとの平均点 ヒント:AVG と GROUP BY を使用します。発展問題④の「科目」を「受講者」に変更してみましょう。 演習の目的 この演習では、実務に近いデータでGROUP BYを活用し、複数列でのグループ化を理解し、計算式(個数 * 単価)を含む集約を習得します。 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。
前回と同じ手順でアクセス。「MySQL」を選択 ステップ2:SQLを入力して実行してください。 注意: 以前使用したSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 期待される結果: ヒントと考察のポイント 計算式の使用について: よくある間違い: 発展問題 発展問題⑥:商品Aの総売上を計算 ヒント:WHERE句で商品Aのみを選択し、SUMで合計します。
解答
期待される結果: 15000 計算の内訳: 発展問題⑦:日付別・商品別の総売上を計算 以下のSQLを実行し、結果を確認してください。 期待される結果: 解説: SQLFiddleで実行できない場合 エラーメッセージが表示される場合 結果が期待と異なる場合演習パート(クリックして展開)
【関連する外部サイトへのリンク】
演習全般について
演習1:テーブル定義とデータの追加
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 成績;
科目
受講者
得点
国語
A
85
国語
B
90
算数
A
90
算数
B
96
理科
A
95
演習2:集約関数の基本
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 科目 = '国語';
AVG(得点)
87.5000
-- 算数の平均点
SELECT AVG(得点) FROM 成績 WHERE 科目 = '算数';
-- 全体の最高点
SELECT MAX(得点) FROM 成績;
-- 全体の最低点
SELECT MIN(得点) FROM 成績;
-- 全体の合計点
SELECT SUM(得点) FROM 成績;
-- 全体の行数
SELECT COUNT(*) FROM 成績;
演習3:GROUP BYによるグループ化と集約
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 科目;
科目
COUNT(*)
国語
2
算数
2
理科
1
SELECT 科目, COUNT(*) FROM 成績 WHERE 得点 >= 90 GROUP BY 科目;
科目
COUNT(*)
国語
1
算数
2
理科
1
SELECT 受講者, COUNT(*) FROM 成績 GROUP BY 受講者;SELECT 科目, AVG(得点) FROM 成績 GROUP BY 科目;演習4:売上データでのGROUP BY活用
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 日付;
日付
SUM(個数 * 単価)
2024-01-01 00:00:00
20000
2024-01-02 00:00:00
20000
2024-01-03 00:00:00
20000
SELECT SUM(個数 * 単価)
FROM 売上
WHERE 商品 = '商品A';
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
トラブルシューティング
ds-7. 副問い合わせ
資料(スライド): [PDF], [パワーポイント]
SQLFiddle(推奨) DBFiddle(代替案) 準備 この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。 SQLFiddle(推奨) DBFiddle(代替案) コピー: SQLFiddleへの貼り付け: この演習では、IN演算子を使用して、複数の値のいずれかに一致するデータを検索する方法を習得します。IN演算子は、複数の条件を簡潔に記述するための機能です。後の副問い合わせと組み合わせることで、より複雑なデータ抽出が可能になります。 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください ステップ2:SQLを入力して実行してください SQLFiddleの場合は上のパネルに、DBFiddleの場合は左側の「Schema SQL」に以下のSQLを入力してください。 注意: 最初に表示されているサンプルSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ3:結果を確認してください 下のパネルまたは右側に以下の結果が表示されることを確認してください。 科目が「国語」または「算数」の行がすべて表示されます(4行)。 期待される結果: 各テーブルの内容が正しく表示されていることを確認してください。 ヒントと考察のポイント IN演算子について: SELECT文について: 課題 得点が80点または90点である成績を検索するSQL文を書いてください。IN演算子を使用してください。 ヒント 解答例 このSQLは、得点が80または90のレコードを検索します。 解説:得点列の値が80または90に一致する行を取得します。実際のデータでは、得点90の行(A・算数、B・国語)が該当しますが、80点のレコードはデータに含まれていないため表示されません。 考察のポイント:実行後、結果に80点のレコードが含まれていない理由を考えてください。 課題 得点が80点、85点、または90点である成績を検索するSQL文を書いてください。IN演算子を使用してください。 ヒント 解答例 このSQLは、得点が80、85、または90のレコードを検索します。 解説:得点列の値が80、85、または90に一致する行を取得します。 INの丸かっこ内には、必要な数だけ値を追加できます。 副問い合わせ(サブクエリ)の基本構造と実行順序を理解し、別のSQL文の結果を利用したデータ検索を習得します。副問い合わせは、複雑なデータ抽出を1つのSQL文で実現する重要な技術です。実務では、動的な条件設定や複数テーブルからのデータ抽出に頻繁に使用されます。 副問い合わせの基礎知識 副問い合わせとは 副問い合わせ(サブクエリ)は、別のSQL文の中に埋め込まれたSQL文のことです。 基本構造: 特徴: なぜ副問い合わせが必要か 問題設定:最高得点を取った受講者を検索したい場合 方法1:2段階で実行 方法2:副問い合わせで1つのSQLにまとめる 副問い合わせの利点: 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。
前回と同じ手順でアクセス。「MySQL」を選択 ステップ2:SQLを入力して実行してください。 注意: 以前使用したSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ3:結果を確認してください 実行すると、最高得点を取った受講者「B」が表示されます。 期待される結果:最高得点を取った受講者「B」が表示される ヒントと考察のポイント 副問い合わせの実行順序: 考察のポイント: 課題 成績テーブルから、全科目の平均点よりも高い得点のレコードをすべて選択してください。副問い合わせを使用してください。 ヒント 解答例 このSQLは、平均点よりも高い得点のレコードを検索します。 解説: 重要なポイント: 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。
前回と同じ手順でアクセス。「MySQL」を選択 ステップ2:従業員テーブルの作成とデータ追加 注意: 以前使用したSQLは削除 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 ステップ4:実行と結果確認 期待される結果:最高給与を受け取る従業員の名前「松本」が表示される ステップ5:平均よりも高い給与を受け取る従業員の検索 次に、上のパネルのSELECT文を以下に書き換えます SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 このSQLは、平均よりも高い給与を受け取る従業員の名前を検索します。 ステップ6:実行と結果確認 期待される結果:平均よりも高い給与を受け取る従業員の名前が複数表示される ヒントと考察のポイント 学習した内容のまとめ 演習1で学んだこと 演習2で学んだこと 発展演習③で学んだこと 演習3で学んだこと演習パート(クリックして展開)
【関連する外部サイトへのリンク】
演習全般について
演習1:SQLのIN演算子
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 ('国語', '算数');
発展演習① 得点による検索(2つの値)
SELECT * FROM 成績 WHERE 得点 IN (80, 90);発展演習② 得点による検索(3つの値)
SELECT * FROM 成績 WHERE 得点 IN (80, 85, 90);
演習2:副問い合わせ
SELECT … FROM … WHERE … = (別の SQL 文);
SELECT MAX(得点) FROM 成績; → 結果:96SELECT 受講者 FROM 成績 WHERE 得点 = 96; SELECT 受講者 FROM 成績 WHERE 得点 = (SELECT MAX(得点) FROM 成績);
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 成績);
(SELECT MAX(得点) FROM 成績) → 結果:96SELECT 受講者 FROM 成績 WHERE 得点 = 96 → 結果:B
発展演習③ 平均点より高い得点の検索
SELECT * FROM 成績 WHERE 得点 > (SELECT AVG(得点) FROM 成績);
(SELECT AVG(得点) FROM 成績) → (85 + 90 + 90 + 96 + 95) ÷ 5 = 91.2SELECT * FROM 成績 WHERE 得点 > 91.2 → 96点(B・算数)と95点(A・理科)が該当
演習3:
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 従業員);この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 AVG(給与) FROM 従業員);
考察のポイント:
学習の振り返り
ds-8. SQL 総合演習
資料(スライド): [PDF], [パワーポイント]
SQLFiddle(推奨) DBFiddle(代替案) 準備 この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。 SQLFiddle(推奨) DBFiddle(代替案) コピー: SQLFiddleへの貼り付け: WHERE句を使った条件指定によるデータの絞り込み、副問い合わせの理解と活用、IN演算子による複数条件の指定、AND演算子による複数条件の組み合わせを習得します。 従業員テーブルを使用して、以下のSQL問い合わせを実行します。 手順 ステップ1:テーブル定義とデータ追加 SQLFiddleの場合は上のパネルに、DBFiddleの場合は左側の「Schema SQL」に以下のSQLを入力してください。 注意: 最初に表示されているサンプルSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ2:結果を確認してください 下のパネルまたは右側に以下の結果が表示されることを確認してください。 部署ID 101の従業員の名前と給与が表示されます。 期待される結果: 部署ID 101の従業員の名前と給与が正しく表示されていることを確認してください。 ヒントと考察のポイント WHERE句について: ステップ3:副問い合わせを使った条件指定 上のパネルに以下のSQLを追加してください。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ4:結果を確認してください 結果をスクロールして、給与が平均以上の従業員のみが表示されていることを確認してください。 期待される結果: 給与が平均以上の従業員のみが正しく表示されていることを確認してください。 ヒントと考察のポイント 副問い合わせについて: ステップ5:IN演算子による複数条件の指定 上のパネルに以下のSQLを追加してください。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ6:結果を確認してください 部署ID 101または102の従業員のみが表示されることを確認してください。 期待される結果: 部署ID 101または102の従業員のみが正しく表示されていることを確認してください。 ヒントと考察のポイント IN演算子について: ステップ7:AND演算子による複数条件の組み合わせ 上のパネルに以下のSQLを追加してください。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ8:結果を確認してください 条件を満たす従業員が表示されることを確認してください。 期待される結果: 条件を満たす従業員が正しく表示されていることを確認してください。 ヒントと考察のポイント AND演算子について: 複数のテーブルの作成とデータ追加、INNER JOINによるテーブル結合の理解、結合条件の指定方法、結合結果を使った計算、GROUP BYによるグループ化とSUM関数による集計を習得します。 商品テーブルと申し込みテーブルを使用して、複数のSQL問い合わせを実行します。 手順 ステップ1:SQLFiddleまたはDBFiddleにアクセスしてください。
前回と同じ手順でアクセス。「MySQL」を選択 ステップ2:SQLを入力して実行してください。 注意: 以前使用したSQLは削除。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ2:結果を確認してください 下のパネルまたは右側に以下の結果が表示されることを確認してください。 商品テーブルの内容が表示されます。id、商品名、単価の3列が表示されます。 期待される結果: 商品テーブルの内容が正しく表示されていることを確認してください。 ヒントと考察のポイント SELECT文について: ステップ3:申し込みテーブルの確認 上のパネルの最後の行を以下に変更してください。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ4:結果を確認してください 下のパネルまたは右側に以下の結果が表示されることを確認してください。 申し込みテーブルの内容が表示されます。日時は実行時の時刻が記録されます。 期待される結果: 申し込みテーブルの内容が正しく表示されていることを確認してください。 ヒントと考察のポイント SELECT文について: ステップ5:テーブル結合の実行 上のパネルの最後の行を以下に変更してください。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ6:結果を確認してください 下のパネルまたは右側に以下の結果が表示されることを確認してください。 結果には、申し込みテーブルと商品テーブルの両方の列が含まれています。各申し込みに対応する商品名と単価が表示されていることを確認してください。 期待される結果: 申し込みテーブルと商品テーブルの両方の列が正しく表示されていることを確認してください。 ヒントと考察のポイント INNER JOINについて: ステップ7:結合結果を使った計算 上のパネルの最後のところを以下に変更してください。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ8:結果を確認してください 下のパネルまたは右側に以下の結果が表示されることを確認してください。 各申し込みの日時、氏名、および合計金額が表示されることを確認してください。合計金額は個数×単価で計算されます。 期待される結果: 各申し込みの日時、氏名、および合計金額が正しく表示されていることを確認してください。 ヒントと考察のポイント SELECT文について: ステップ9:グループ化と集計 上のパネルの最後のところを以下に変更してください。 SQLFiddleへの貼り付けは、CTRLキーとvキーの同時押しで行えます。 入力後、「Execute」ボタン(SQLFiddleの場合)または「Run」ボタン(DBFiddleの場合)をクリックしてください。 ステップ10:結果を確認してください 下のパネルまたは右側に以下の結果が表示されることを確認してください。 氏名ごとの合計金額が表示されることを確認してください。Xさんは2200円、Yさんは1000円と表示されます。 期待される結果: 氏名ごとの合計金額が正しく表示されていることを確認してください。 ヒントと考察のポイント GROUP BYについて: 基本的な演習を完了したら、以下の発展演習に挑戦してください。各問題には、目的、ヒント、期待される結果が示されています。 発展演習1:商品の単価の最大値を取得 目的 集約関数MAXの使用方法を理解します。 問題 商品テーブルを使用して、商品の単価の最大値を取得するSQLを作成してください。 ヒント 集約関数MAXを使用します。 期待される結果 使用する知識 集約関数MAX 発展演習2:特定の氏名による申し込み情報の取得 目的 WHERE句を使った条件指定を復習します。 問題 申し込みテーブルを使用して、氏名が'X'のすべての申し込み情報を取得するSQLを作成してください。 ヒント WHERE句を使用して条件を指定します。 注意事項 日時の値は、実際にデータを追加した日時になるため、人によって結果が異なります。 期待される結果の例 発展演習3:特定商品を申し込んだ人の氏名取得 目的 テーブル結合、条件指定、重複除去の組み合わせを理解します。 問題 商品テーブルと申し込みテーブルを結合し、商品名が'商品A'である商品を申し込んだすべての人の氏名を取得するSQLを作成してください。ただし、重複行は除去してください。 ヒント INNER JOINでテーブルを結合し、WHERE句で商品名を指定し、DISTINCTで重複を除去します。 期待される結果 発展演習4:氏名別の申し込み回数の集計 目的 GROUP BYとCOUNT関数の使用方法を理解します。 問題 申し込みテーブルを使用して、氏名ごとに申し込みの回数を集計するSQLを作成してください。 ヒント COUNT(*)で行数をカウントし、GROUP BYで氏名ごとにグループ化します。 期待される結果 発展演習5:特定商品に対する申し込み総数の計算 目的 テーブル結合、条件指定、SUM関数の組み合わせを理解します。 問題 商品テーブルと申し込みテーブルを結合し、商品名が'商品B'に対する申し込みの総個数を計算するSQLを作成してください。 ヒント INNER JOINでテーブルを結合し、WHERE句で商品名を指定し、SUM関数で個数の合計を求めます。 期待される結果 自分で考えた後、以下の解答を参考にしてください。 発展演習1の解答 解説 MAX関数は指定した列の最大値を返す集約関数です。商品テーブルの単価列から最大値200が得られます。 発展演習2の解答 解説 WHERE句で氏名が'X'の行のみを抽出します。*はすべての列を意味します。結果として、Xさんによる3件の申し込み情報が表示されます。 発展演習3の解答 解説 INNER JOINで申し込みテーブルと商品テーブルを結合し、WHERE句で商品名が'商品A'の行を抽出し、DISTINCTで重複する氏名を除去します。結果として、商品Aを申し込んだ人の氏名が1件だけ表示されます。 発展演習4の解答 解説 GROUP BY 氏名で、氏名ごとにグループ化し、COUNT(*)で各グループの行数をカウントします。結果として、Xさんは3回、Yさんは1回の申し込みがあることがわかります。 発展演習5の解答 解説 INNER JOINで申し込みテーブルと商品テーブルを結合し、WHERE句で商品名が'商品B'の行を選択し、SUM関数で個数列の合計を計算します。結果として、商品Bの申し込み総数15が得られます。Xさんが10個、Yさんが5個です。 テーブル結合について INNER JOINは、2つのテーブルを結合条件に基づいて結合します。結合条件は `ON テーブル1.列名 = テーブル2.列名` の形式で指定します。テーブルを分割してデータの重複を避けつつ、必要な情報を組み合わせて取得できます。 集約関数について AVGは平均値を計算し、MAXは最大値を取得し、MINは最小値を取得し、SUMは合計値を計算し、COUNTは行数をカウントします。 GROUP BYについて 指定した列の値が同じ行をグループ化します。集約関数と組み合わせて、グループごとの統計情報を計算できます。演習パート(クリックして展開)
【関連する外部サイトへのリンク】
演習全般について
演習1: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;
SELECT * FROM 従業員 WHERE 給与 >= (SELECT AVG(給与) FROM 従業員);
SELECT * FROM 従業員 WHERE 部署ID IN (101, 102);
SELECT * FROM 従業員 WHERE 給与 >= 300000 AND 部署ID = 102;
演習2:2つのテーブルを用いた本格的なデータ処理
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 商品;
SELECT * FROM 申し込み;
SELECT * FROM 申し込み
INNER JOIN 商品 ON 申し込み.商品番号 = 商品.id;
SELECT 申し込み.日時,申し込み.氏名,申し込み.個数 * 商品.単価
FROM 申し込み
INNER JOIN 商品 ON 申し込み.商品番号 = 商品.id;
SELECT 氏名, SUM(個数 * 商品.単価)
FROM 申し込み
INNER JOIN 商品 ON 申し込み.商品番号 = 商品.id
GROUP BY 氏名;
発展演習
MAX(単価)
200 +-----+---------------------+------+----------+------+
| 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 |
+-----+---------------------+------+----------+------++------+
| 氏名 |
+------+
| X |
+------++------+------------+
| 氏名 | |
+------+------------+
| X | 3 |
| Y | 1 |
+------+------------++----------------------+
| 15 |
+----------------------+発展演習の解答
SELECT MAX(単価) FROM 商品;SELECT * FROM 申し込み WHERE 氏名 = 'X';SELECT DISTINCT 申し込み.氏名
FROM 申し込み
INNER JOIN 商品 ON 申し込み.商品番号 = 商品.id
WHERE 商品.商品名 = '商品A';SELECT 氏名, COUNT(*)
FROM 申し込み GROUP BY 氏名;SELECT SUM(申し込み.個数)
FROM 申し込み
INNER JOIN 商品 ON 申し込み.商品番号 = 商品.id
WHERE 商品.商品名 = '商品B';学習のポイント
ds-9. 主キーと参照整合性制約
資料(スライド): [PDF], [パワーポイント]
SQLFiddle(推奨) DBFiddle(代替案) 準備 この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。 SQLFiddle(推奨) DBFiddle(代替案) コピー: SQLFiddleへの貼り付け: このガイドは、データベース設計の基礎(主キー・外部キーを用いたテーブル間の関連付けとSQL実践)の演習を自習するためのものです。SQLFiddle([http://sqlfiddle.com/](http://sqlfiddle.com/))またはDBFiddle([https://www.db-fiddle.com/](https://www.db-fiddle.com/))を使用してオンラインで演習を実施できます。 演習の目的 主キーは、テーブルの各行を一意に識別するためのキーです。この演習では、主キー制約を設定し、重複したデータの挿入が自動的にブロックされることを確認します。 手順 1. Webブラウザを使用 アドレスバーにSQLFiddleのURLを入力します:[http://sqlfiddle.com/](http://sqlfiddle.com/) 2. MySQLを選択 データベース管理システムとして「MySQL」を選択します。 3. 上のパネルにSQLを入力 テーブル定義、データの追加、問い合わせを行うSQLを入力します(SQLFiddleで最初に出てくるSQLは不要なので消します)。 4. Executeをクリック SQL文が実行され、結果が表示されます。 5. 下のパネルで結果を確認 商品テーブルにID=1(みかん)、ID=2(りんご)、ID=3(メロン)の3件のデータが正常に追加されたことを確認します。 6. 主キー制約の確認 上のパネルのSQLを以下に変更します(以前のSQLは不要なので消します)。 7. Executeをクリック 8. 下のパネルで結果を確認 エラーメッセージ「ERROR 1062 (23000): Duplicate entry '1' for key '商品.PRIMARY'」が表示されることを確認します。 ヒント 考察のポイント 理解のポイント よくある間違い 演習の目的 単一の列ではなく、複数の列の組み合わせで一意性を保証する主キー制約を学びます。 手順 1. 上のパネルにSQLを入力 テーブル定義、データの追加、問い合わせを行うSQLを入力します(以前のSQLは不要なので消します)。 2. Executeをクリック SQL文が実行され、結果が表示されます。 3. 下のパネルで結果を確認 成績テーブルに学生ID=1の2件、学生ID=2の3件、合計5件のデータが正常に追加されたことを確認します。 ヒント 考察のポイント 理解のポイント よくある間違い 演習の目的 発展演習1に1行追加し、主キー制約に違反する場合、実行できないことを確認します。 手順 1. 上のパネルにSQLを入力(発展演習1に1行増やしています) テーブル定義、データの追加を行うSQLを入力します(以前のSQLは不要なので消します)。 2. Executeをクリック 3. 下のパネルで結果を確認 エラーメッセージ「ERROR 1062 (23000): Duplicate entry '1-1001' for key '成績.PRIMARY'」が表示されることを確認します。 ヒント 考察のポイント 理解のポイント よくある間違い 演習の目的 外部キーを使用してテーブル間の関連を表現し、参照整合性制約によってデータの整合性が保証されることを確認します。また、複数のテーブルを結合して情報を取得する方法を学びます。 手順 1. 商品テーブルの作成 上のパネルに以下のSQLを入力します(以前のSQLは不要なので消します)。 2. Executeをクリック SQL文が実行され、結果が表示されます。 3. 下のパネルで結果を確認 商品テーブルにID=1(みかん)、ID=2(りんご)、ID=3(メロン)の3件のデータが正常に追加されたことを確認します。 4. 購入テーブルの作成(外部キー制約付き) 上のパネルに以下のSQLを入力します(以前のSQLは不要なので消します)。 5. Executeをクリック SQL文が実行され、結果が表示されます。 6. 下のパネルで結果を確認 購入テーブルにID=1(購入者X、商品ID=1、数量10)、ID=2(購入者Y、商品ID=2、数量5)の2件のデータが正常に追加されたことを確認します。 7. テーブルの結合 上のパネルに以下のSQLを入力します(以前のSQLは不要なので消します)。 8. Executeをクリック SQL文が実行され、結果が表示されます。 9. 下のパネルで結果を確認 購入者X(みかん、500円)、購入者Y(りんご、500円)の2件の結果が表示されることを確認します。2つのテーブルの利用により、各購入者の購入商品とその総額が表示されることを確認します。 ヒント 考察のポイント 理解のポイント よくある間違い 演習の目的 存在しない商品IDを挿入しようとして、参照整合性制約違反を確認します。 手順 1. 上のパネルにSQLを入力(演習2に1行増やしています) テーブル定義、データの追加を行うSQLを入力します(以前のSQLは不要なので消します)。 2. Executeをクリック 3. 下のパネルで結果を確認 エラーメッセージ「ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails」が表示されることを確認します。 ヒント 考察のポイント 理解のポイント よくある間違い 日常生活との対応演習パート(クリックして展開)
【関連する外部サイトへのリンク】
演習全般について
演習1:テーブル定義とデータの追加、主キー制約
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 商品;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);
発展演習1:複数列の主キー制約
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:主キー制約の違反
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:外部キー、参照整合性制約
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 商品;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 購入;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;
発展演習3:参照整合性制約の違反
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);
ds-10. データベース設計、正規化
資料(スライド): [PDF], [パワーポイント]
SQLFiddle(推奨) DBFiddle(代替案) 準備 この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。 SQLFiddle(推奨) DBFiddle(代替案) コピー: SQLFiddleへの貼り付け: 学習目標 背景知識 テーブルとは、データを行と列の形式で整理したものです。正規化とは、テーブルの構造を最適化し、データの重複を減らす手法です。 正規化前のテーブルには「カレーライス 400円」という情報が2回出現しています。このような冗長性は、データ更新時に複数箇所を変更する必要があり、更新ミスのリスクを生みます。正規化により、同じ情報を1箇所だけに保存することでこの問題を解決します。 演習手順 ステップ1: SQLFiddleへのアクセス [http://sqlfiddle.com/](http://sqlfiddle.com/) にアクセスし、MySQLを選択してください。 ステップ2: SQLの入力 上のパネルに以下のSQLを入力してください。以前のSQLがあれば消してください。 ステップ3: 実行と結果確認 「Execute」ボタンをクリックしてください。下側のウィンドウに結果が表示されます。 期待される結果: テーブルXの内容: テーブルYの内容: 考察のポイント テーブルTの問題点について 正規化後のテーブルXとYについて よくある間違いと回避方法 間違い1: DISTINCTキーワードを忘れる 間違い2: CREATE TABLE ... AS構文の理解不足 学習目標 背景知識 情報無損失とは、正規化によってテーブルを分割しても、元の情報が失われないことを意味します。INNER JOINとは、2つのテーブルを指定した条件に基づいて結合する操作です。属性とは、テーブルの列のことを指します。 正規化の目的は冗長性の削減であって情報の削減ではありません。正しく正規化されたテーブル群は、結合することで元のテーブルを正確に復元できます。 演習手順 ステップ1: SQLFiddleへのアクセス [http://sqlfiddle.com/](http://sqlfiddle.com/) にアクセスし、MySQLを選択してください。 ステップ2: SQLの入力 上のパネルに以下のSQLを入力してください。以前のSQLがあれば消してください。 ステップ3: 実行と結果確認 「Execute」ボタンをクリックしてください。下側のウィンドウに結果が表示されます。 結合結果が元のテーブルTと一致することを確認してください。 期待される結果: 考察のポイント INNER JOINの動作について 情報無損失の確認について 適切な正規化の条件について よくある間違いと回避方法 間違い1: 結合条件を間違える 間違い2: 結合結果と元のテーブルの比較を忘れる 学習目標 演習手順 ステップ1: SQLFiddleへのアクセス [http://sqlfiddle.com/](http://sqlfiddle.com/) にアクセスし、MySQLを選択してください。 ステップ2: SQLの入力と実行 上のパネルに以下のSQLを入力し、「Execute」をクリックしてください。 考察のポイント 冗長性の確認について ヒント 解答例 期待される結果: 冗長性の分析: これは冗長なデータです。学生の名前を変更する場合、その学生が受講しているすべての科目の行を更新する必要があります。 学習目標 演習手順 ステップ1: SQLの追加 発展演習1のSQLは消さないで、下のSQLを追加して実行してください。 考察のポイント 冗長性の確認について ヒント 解答例 期待される結果: 冗長性の分析: これは明らかにデータの冗長性です。学生の基本情報が受講科目の数だけ重複して格納されています。 学習目標 演習手順 ステップ1: SQLの追加 SQLは消さないで、下のSQLを追加して実行してください。 考察のポイント DISTINCTの効果について ヒント 解答例 期待される結果: DISTINCTの効果: DISTINCTキーワードを使用することで、冗長なデータを除去し、各学生の基本情報を一度だけ取得できます。 学習目標 演習手順 ステップ1: SQLの追加 SQLは消さないで、下のSQLを追加して実行してください。 考察のポイント 正規化の効果について ヒント 解答例 期待される結果: テーブルU(学生基本情報): テーブルV(受講情報): 正規化の効果: この正規化により、データの冗長性が削減され、データの整合性が向上しました。演習パート(クリックして展開)
【関連する外部サイトへのリンク】
演習全般について
演習1: テーブルの分割による正規化
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;名前 昼食
A そば
B カレーライス
C カレーライス
D うどん昼食 料金
そば 250
カレーライス 400
うどん 250
演習2: 正規化における情報無損失
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.昼食;名前 昼食 料金
A そば 250
B カレーライス 400
C カレーライス 400
D うどん 250
発展演習1: 学生情報のためのテーブル作成
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: 冗長なデータの確認
SELECT StudentID, StudentName FROM S;
StudentID StudentName
1 Alice
1 Alice
2 Bob
3 Charlie
3 Charlie
3 Charlie
発展演習3: 重複なしの学生情報抽出
SELECT DISTINCT StudentID, StudentName FROM S;
StudentID StudentName
1 Alice
2 Bob
3 Charlie
発展演習4: 正規化
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;
StudentID StudentName
1 Alice
2 Bob
3 CharlieStudentID Course
1 Math
1 Science
2 History
3 Math
3 History
3 Science
ds-11. データベース操作とトランザクション管理:データ整合性と永続性
資料(スライド): [PDF], [パワーポイント]
SQLFiddle(推奨) DBFiddle(代替案) 準備 この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。 SQLFiddle(推奨) DBFiddle(代替案) コピー: SQLFiddleへの貼り付け: SQLFiddleを使用してデータベース操作とトランザクション管理を実践的に学ぶ。各演習を順番に進めることで、データベースの基本概念とトランザクションの重要性を理解できる。 学習目標 データベースの基本操作であるINSERT(追加)、SELECT(問い合わせ)、UPDATE(更新)、DELETE(削除)を実際に実行し、その動作を理解する。 事前準備:SQLFiddleへのアクセス 演習1-1:テーブルの作成とデータの追加 目的 テーブルを定義し、初期データを追加する方法を学ぶ。 手順 期待される実行結果 4行のデータが正しく追加され、各列の値が表示される。 ヒント 演習1-2:データの更新(UPDATE) 目的 既存のデータを変更する方法を学ぶ。 手順 期待される実行結果 カレーライスの料金が400円から450円に変更されている。BとCの両方が更新される。 ヒント 演習1-3:特定行の更新 目的 特定の行のみを更新する方法を学ぶ。 手順 期待される実行結果 名前が'C'の行のみが更新され、Cの昼食が「カレーライス」から「ラーメン」に変更されている。 演習1-4:データの削除(DELETE) 目的 特定のデータを削除する方法を学ぶ。 手順 期待される実行結果 名前が'B'の行が削除され、残りの3行(A、C、D)のデータが保持されている。 注意点 目的 OR条件を使用して、複数の条件に合致する行を一度に更新する方法を学ぶ。 課題 「そば」と「うどん」の料金を300円に更新する。 ヒント 解答例 このSQL文は、昼食が「そば」または「うどん」であるすべての行の料金を300円に更新する。 目的 INSERT INTOを使用して新しいレコードをテーブルに追加する方法を学ぶ。 課題 新しく「E」が「天ぷら」を料金500円で食べた情報をテーブルTに追加する。 ヒント 解答例 このSQL文は、名前「E」、昼食「天ぷら」、料金500円の新しい行をテーブルTに追加する。 学習目標 トランザクションの概念を理解し、COMMITとROLLBACKの動作を実際に確認する。 トランザクションとは 複数のデータベース操作を一つの処理単位としてまとめたもの。すべての操作が成功した場合のみ変更を確定し、一つでも失敗すれば全体を取り消す仕組み。 演習2-1:ROLLBACKによる変更の取り消し 目的 トランザクション内の変更をROLLBACKで取り消す動作を確認する。 手順 期待される実行結果 トランザクション内で実行されたAとBの変更がROLLBACKにより取り消され、元のデータが保持されている。 ヒント 演習2-2:COMMITによる変更の確定 目的 トランザクション内の変更をCOMMITで確定する動作を確認する。 手順 期待される実行結果 トランザクション内で実行されたAとBの変更がCOMMITにより確定されている。 ヒント COMMITとROLLBACKの比較 よくある質問と注意点 Q1:WHERE句を忘れるとどうなるか A:DELETEやUPDATEでWHERE句を省略すると、テーブル内のすべての行が対象となる。意図しないデータの削除や変更を防ぐため、WHERE句は必ず指定する。 Q2:主キー制約とは何か A:主キー制約は、列の値が重複しないことを保証する制約。主キーに設定された列には、同じ値を持つ行を追加できない。 Q3:トランザクションはいつ使うのか A:複数の操作が互いに関連している場合に使用する。例えば、銀行の送金処理では、出金と入金の両方が成功した場合のみ確定する必要がある。 Q4:制約違反が発生するとどうなるか A:制約違反(主キーの重複など)が発生すると、COMMITは実行されず、トランザクション全体が自動的にロールバックされる。 まとめ この自習ガイドを通じて、以下の内容を学んだ。 これらは、データベースを扱うすべてのアプリケーション開発において基礎となる重要な概念である。演習を繰り返し実践することで、理解を深めることができる。演習パート(クリックして展開)
【関連する外部サイトへのリンク】
演習全般について
演習1:データベース操作の実践
[http://sqlfiddle.com/](http://sqlfiddle.com/)
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;+--------+------------------+-------+
| 名前 | 昼食 | 料金 |
+--------+------------------+-------+
| A | そば | 250 |
| B | カレーライス | 400 |
| C | カレーライス | 400 |
| D | うどん | 250 |
+--------+------------------+-------+
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;+--------+------------------+-------+
| 名前 | 昼食 | 料金 |
+--------+------------------+-------+
| A | そば | 250 |
| B | カレーライス | 450 |
| C | カレーライス | 450 |
| D | うどん | 250 |
+--------+------------------+-------+
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;+--------+------------------+-------+
| 名前 | 昼食 | 料金 |
+--------+------------------+-------+
| A | そば | 250 |
| B | カレーライス | 400 |
| C | ラーメン | 400 |
| D | うどん | 250 |
+--------+------------------+-------+
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;+--------+------------------+-------+
| 名前 | 昼食 | 料金 |
+--------+------------------+-------+
| A | そば | 250 |
| C | カレーライス | 400 |
| D | うどん | 250 |
+--------+------------------+-------+
発展演習1:複数条件での更新
UPDATE T SET 料金 = 300 WHERE 昼食 = 'そば' OR 昼食 = 'うどん';発展演習2:新しいデータの追加
INSERT INTO T VALUES ('E', '天ぷら', 500);演習2:トランザクション
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;+--------+------------------+-------+
| 名前 | 昼食 | 料金 |
+--------+------------------+-------+
| A | そば | 250 |
| B | カレーライス | 400 |
| C | カレーライス | 400 |
| D | うどん | 250 |
+--------+------------------+-------+
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;+--------+------------------+-------+
| 名前 | 昼食 | 料金 |
+--------+------------------+-------+
| A | そば | 500 |
| B | ラーメン | 400 |
| C | カレーライス | 400 |
| D | うどん | 250 |
+--------+------------------+-------+
操作 | 動作 | 結果
COMMIT | トランザクション内の変更を確定 | データベースに永続的に反映
ROLLBACK | トランザクション内の変更を取り消し | トランザクション開始時の状態に復元
ds-12. データ管理の基礎:オンライントランザクションとデータウェアハウスの特徴と活用
資料(スライド): [PDF], [パワーポイント]
SQLFiddle(推奨) DBFiddle(代替案) 準備 この演習では、インストール不要のオンラインツールを使用します。以下のいずれかのサイトにアクセスしてください。 SQLFiddle(推奨) DBFiddle(代替案) コピー: SQLFiddleへの貼り付け: SQLFiddleを使用してデータベース操作とトランザクション管理を実践的に学ぶ。各演習を順番に進めることで、データベースの基本概念とトランザクションの重要性を理解できる。 演習の構成と学習の流れ 本ガイドでは以下の順序で演習を実施する。各演習は段階的に内容が発展していく構成となっている。 注意事項 重要: SQLFiddleではサーバの時刻が表示されるため、「2024-05-23 13:19:53」のように実際の現在日時と異なる場合があるが、演習の進行には影響しないので続行すること。 学習目標 この演習では以下を習得する。 演習の目的 データベースの基本操作として、テーブルを作成し、データを追加し、その内容を確認する一連の流れを体験する。主キー制約により、各行を一意に識別できることを確認する。 手順 期待される結果 実行すると、下のパネルに以下のような表が表示される。 ヒント 学習目標 この演習では以下を習得する。 演習の目的 商品テーブルと購入テーブルという2つのテーブルを作成し、外部キーによって両者を関連付ける。これにより、存在しない商品IDを購入テーブルに登録できないことを確認する。演習1で学んだ主キーの知識を活用し、テーブル間の関連を定義する。 手順 期待される結果 実行すると、商品テーブルと購入テーブルの2つの表が表示される。 商品テーブル: 購入テーブル: ヒント 学習目標 この演習では以下を習得する。 演習の目的 データベースで日時情報を扱う第一歩として、現在日時を取得する方法を学ぶ。次の演習4で日時型の属性を持つテーブルを作成するための準備となる。 手順 期待される結果 実行すると、現在日時が表示される。 ヒント 学習目標 この演習では以下を習得する。 演習の目的 購入テーブルに購入日時という日時型の属性を追加し、いつ購入されたかを記録できるようにする。演習3で学んだ日時の取得方法を活用し、実際にテーブルで日時を扱う。 手順 期待される結果 購入テーブルに購入日時が追加されて表示される。 ヒント 学習目標 この演習では以下を習得する。 演習の目的 商品の価格が変化する状況を想定し、価格改定の履歴を記録するテーブルを作成する。これにより、過去のある時点での価格を参照できることを確認する。演習1~4で学んだすべての知識を統合して活用する。 背景知識 手順1:テーブル作成とデータ追加 期待される結果(手順1) 商品テーブルでは、同じ商品でも価格改定ごとに別の行として記録される。 商品テーブル: 重要: りんごはID=2とID=4の2行があり、それぞれ異なる価格である。メロンも同様である。 ヒント(手順1) 手順2:応用的な問い合わせの実行 この手順では、履歴データを活用した複数の問い合わせを実行する。 問い合わせ例1:商品と購入を結合して表示 上のパネルに以下のSQLを追加し、Executeをクリックする。 この問い合わせでは、2つのテーブルを結合し、購入時の商品情報と購入情報を一緒に表示する。 問い合わせ例2:購入者ごとの合計金額を計算 上のパネルに以下のSQLを追加し、Executeをクリックする。 この問い合わせでは、各購入者がいくら支払ったかを計算する。 問い合わせ例3:各商品の最新の改訂日時を取得 上のパネルに以下のSQLを追加し、Executeをクリックする。 この問い合わせでは、各商品の最も新しい価格改定日時を取得する。 問い合わせ例4:各商品の最新価格を取得 上のパネルに以下のSQLを追加し、Executeをクリックする。 この問い合わせでは、各商品の現在の価格を取得する。副問い合わせとは、SELECT文の中にさらにSELECT文を含める手法である。 ヒント(手順2) 位置づけ この演習は応用的な内容である。演習5を完了してから取り組むこと。 学習目標 この演習では以下を習得する。 演習の目的 商品名「りんご」を購入したすべての購入者を取得するSQLを作成する。同じ購入者が複数回購入している場合でも、重複を除いて1回だけ表示する。 課題 商品名が「りんご」である商品を購入したすべての購入者を得るSQLを作成する。DISTINCTによる重複行の除去も行うこと。 期待される結果 ヒント 解答例 重要概念の復習 データ管理の2つのアプローチ演習パート(クリックして展開)
【関連する外部サイトへのリンク】
演習全般について
演習1:テーブル定義とデータの追加、主キー制約
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 商品;
+----+--------+------+
| ID | 商品名 | 単価 |
+----+--------+------+
| 1 | みかん | 50 |
| 2 | りんご | 100 |
| 3 | メロン | 500 |
+----+--------+------+
演習2:外部キー、参照整合性制約
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 購入;
+----+--------+------+
| ID | 商品名 | 単価 |
+----+--------+------+
| 1 | みかん | 50 |
| 2 | りんご | 100 |
| 3 | メロン | 500 |
+----+--------+------++----+--------+--------+------+
| ID | 購入者 | 商品ID | 数量 |
+----+--------+--------+------+
| 1 | X | 1 | 10 |
| 2 | Y | 2 | 5 |
+----+--------+--------+------+
演習3:now()による現在日時の取得
select now();
+---------------------+
| now() |
+---------------------+
| 2024-05-23 13:19:53 |
+---------------------+
演習4:日時を扱うテーブル
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 購入;
+----+--------+--------+------+---------------------+
| ID | 購入者 | 商品ID | 数量 | 購入日時 |
+----+--------+--------+------+---------------------+
| 1 | X | 1 | 10 | 2026-12-04 09:00:00 |
| 2 | Y | 2 | 5 | 2025-12-04 10:00:00 |
+----+--------+--------+------+---------------------+
演習5:データウェアハウス
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 購入;
+----+--------+------+---------------------+
| 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 |
+----+--------+------+---------------------+
SELECT * FROM 商品
INNER JOIN 購入 ON 商品.ID = 購入.商品ID;SELECT 購入.購入者, SUM(購入.数量 * 商品.単価)
FROM 商品
INNER JOIN 購入 ON 商品.ID = 購入.商品ID
GROUP BY 購入.購入者;SELECT 商品名, MAX(改訂日時)
FROM 商品
GROUP BY 商品名;SELECT 商品名, 単価, 改訂日時
FROM 商品
WHERE (商品名, 改訂日時) IN (
SELECT 商品名, MAX(改訂日時)
FROM 商品
GROUP BY 商品名);
発展演習1:商品「りんご」を購入した人の取得
+--------+
| 購入者 |
+--------+
| Y |
+--------+
SELECT DISTINCT(購入.購入者)
FROM 購入
INNER JOIN 商品 ON 購入.商品ID = 商品.ID
WHERE 商品.商品名 = 'りんご';学習のまとめ
ds-13. Microsoft Access の使い方、データの並べ替え(ソート)
資料(スライド): [PDF], [パワーポイント]
db4-4.accdb 今回の演習では、SQL Fiddle を使わずに、Microsoft Access を使う。 Microsoft Access は、パソコン室のパソコンにインストール済み。 今回の授業の特徴: Microsoft Access の練習。大量データの処理 学習目標 使用するソフトウェア 演習用データベースファイル データについて 演習では「米国成人調査データ」(1994年、米国における統計調査データのうち32561人分)を使用する。 データの出典: Lichman, M. (2013). UCI Machine Learning Repository [[http://archive.ics.uci.edu/ml](http://archive.ics.uci.edu/ml)]. Irvine, CA: University of California, School of Information and Computer Science(米国) 注意: 演習では、特定の職業、学歴、性別、母国を差別的に見ないようにすること。 問い合わせ(クエリ)の基本 問い合わせ(クエリ)は、データベースから必要なデータを検索・加工するためのコマンド。 主なパターンは以下の通りである。 Accessの3つのビュー Accessには主に3つのビューがある。 本演習では、主にSQLビューとデータシートビューを使用する。 Accessの起動方法とデータベースの新規作成手順を理解する。 手順 Accessのスタート画面の構成 スタート画面には以下の要素がある。 リボンとタブについて リボンには、タブ、グループ、コマンドが配置される。各タブには、作業の種類ごとにコマンドがまとめられている。 ヒント SQLのORDER BY句を使用して、データの並べ替えを実行する方法を習得する。 並べ替えのバリエーション 本演習では以下のバリエーションを学習する。 SQLビューを開く操作 以下の手順でSQLビューを開く。 AccessでのSQL実行手順 以下の手順でSQLを実行する。 並べ替えの基本構文 WHERE句やGROUP BY句と組み合わせる場合は、ORDER BY句を最後に記述する。 重要 最初に db4-4.accdb を開き、その後下の演習 2-1 から開始する db4-4.accdb 演習2-1: 年齢による並べ替え(昇順) 目的: ORDER BY句による昇順の並べ替えを理解する SQL:(次のSQLを使用) 入力時の注意: 確認ポイント: 演習2-2: 年齢による並べ替え(降順) 目的: DESCキーワードを使用した降順の並べ替えを理解する SQL: 確認ポイント: 演習2-1との比較: 演習2-3: 教育年数による並べ替え(昇順) 目的: 異なる列(教育年数)での並べ替えを実践する SQL: 確認ポイント: 演習2-4: 複数の列による並べ替え(昇順) 目的: 複数の列を指定した並べ替えの動作を理解する SQL: 入力時の注意: 確認ポイント: 学習のポイント: ORDER BY句に複数の列を指定すると、左側の列が優先される。同じ値の場合に次の列で並べ替えが行われる。 演習2-4補足: 複数の列による並べ替え(降順) 目的: 複数の列での降順の並べ替えを実践する SQL: 入力時の注意: 確認ポイント: 学習のポイント: 各列に対して個別にDESCを指定することで、それぞれを降順にできる。 演習2-5: 選択と並べ替えの組み合わせ(昇順) 目的: WHERE句による選択とORDER BY句による並べ替えを組み合わせる方法を習得する SQL: 確認ポイント: 学習のポイント: WHERE句とORDER BY句を組み合わせる場合、WHEREが先、ORDER BYが後である。 演習2-6: 選択と並べ替えの組み合わせ(降順) 目的: 選択と降順の並べ替えの組み合わせを実践する SQL: 確認ポイント: 演習2-7: 集計と並べ替えの組み合わせ 目的: GROUP BY句による集計結果をORDER BY句で並べ替える方法を習得する SQL: 確認ポイント: 学習のポイント: GROUP BY句とORDER BY句を組み合わせる場合、GROUP BYが先、ORDER BYが後である。集計関数(COUNT、SUM、AVGなど)の結果で並べ替えることも可能である。 本演習で学習した内容を整理する。 データベースファイルを開く際に以下のメッセージが表示される場合がある。 信頼できるファイルのみを開くようにすること。 作業終了後は、ウィンドウ右上の×ボタンをクリックしてAccessを終了する。演習パート(クリックして展開)
演習で使用するデータベースファイル
演習全般について
基礎知識
演習1: Accessの利用開始
演習2: AccessのSQLビューを用いた並べ替え
SELECT 列名
FROM テーブル名
ORDER BY 並べ替えの列;
SELECT *
FROM 米国成人調査データ
ORDER BY 年齢;
SELECT *
FROM 米国成人調査データ
ORDER BY 年齢 DESC;
SELECT *
FROM 米国成人調査データ
ORDER BY 教育年数;
SELECT *
FROM 米国成人調査データ
ORDER BY 年齢, 教育年数;
SELECT *
FROM 米国成人調査データ
ORDER BY 年齢 DESC, 教育年数 DESC;
SELECT *
FROM 米国成人調査データ
WHERE 年齢 > 80
ORDER BY 年齢;
SELECT *
FROM 米国成人調査データ
WHERE 年齢 > 80
ORDER BY 年齢 DESC;
SELECT 母国, COUNT(*)
FROM 米国成人調査データ
GROUP BY 母国
ORDER BY COUNT(*);
まとめ
セキュリティに関する注意
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) 本演習を通じて、以下の知識とスキルを習得する。 事前準備 演習を開始する前に、以下を確認する。 演習用ノートブック 以下のURLからGoogle Colaboratoryのノートブックを開く。 演習の進め方 演習は全7つのセル(セル1〜セル7)で構成されている。各セルを上から順番に実行する。セルの実行方法は以下のいずれかである。 目的 演習で使用するデータベースを準備する。データベースへの接続、テーブル作成、データ挿入、コミットの一連の流れを確認する。 関連する学習内容 手順 期待される出力 確認ポイント ヒント 目的 文字列連結でSQLを組み立てた場合に、SQLインジェクション攻撃によって情報漏洩が発生することを確認する。 関連する学習内容 手順 期待される出力 確認ポイント ヒント 注意 本演習で学ぶSQLインジェクションは、防御方法を理解するための学習である。他者が管理するシステムに対してSQLインジェクション攻撃を試みることは、不正アクセス禁止法に違反する犯罪行為である。 目的 プレースホルダ(演習パート(クリックして展開)
演習
演習1:お店のデータベースを作る
)sqlite3.connect()
)conn.cursor()
)cur.execute()
)conn.commit()
準備完了:お店を開店しました。
によりデータが確定されたcommit()
を実行するまで、データベースへの変更は「仮保存」状態であるcommit()演習2:SQLインジェクション攻撃
)によるSQL組み立ての危険性+
実行される危険なSQL: SELECT * FROM items WHERE name = '' OR '1'='1'
--- 検索結果 ---
[(1, 'パソコン', 120000), (2, 'マウス', 3000), (3, 'キーボード', 8000)]
により、WHERE句の条件が常に真になった' OR '1'='1
は常に真であるため、すべてのデータが取得された'1'='1'
(偽)OR name = ''
(真)となる'1'='1'演習3:プレースホルダで守る
)を使用することで、SQLインジェクション攻撃を防御できることを確認する。?
関連する学習内容
- プレースホルダ:SQL文の中で、後からデータが入る場所をあらかじめ「?」記号で確保しておく仕組み
- データをリスト形式で渡す方法
手順
- セル2を実行済みであることを確認する
- セル3を見つける
- セル3を実行する
期待される出力
--- 安全な検索結果 ---
[]
確認ポイント
- 演習2と同じ攻撃文字列
を送信したが、何も表示されなかった(攻撃失敗)' OR '1'='1 - プレースホルダを使用したため、攻撃文字列は「ただの検索文字列」として処理された
- SQL文の構造(WHERE句には条件が1つある)が確定しているため、入力データがSQL命令として解釈されない
ヒント
- プレースホルダを使用すると、SQL文の構造が先に確定する
- データは後から「値」として埋め込まれるため、SQL命令として解釈される可能性がない
- SQLインジェクション対策として、常にプレースホルダを使用する習慣をつける
演習4:更新とコミット
目的
データを変更し、
commit()で確定する操作を体験する。
関連する学習内容
- UPDATE文によるデータ更新
- コミット:仮保存状態の変更をデータベースに確定する操作
手順
- セル3を実行済みであることを確認する
- セル4を見つける
- セル4を実行する
期待される出力
値上げを確定しました。
[(2, 'マウス', 3500)]
確認ポイント
- マウスの価格が3,000円から3,500円に変更された
により、この変更が確定されたcommit()- この確定状態が、演習6での「戻る先(ロールバック先)」になる
ヒント
を実行するまで、変更は仮保存状態であるcommit()
を実行した時点が、ロールバックで戻れる最新の確定状態となるcommit()
演習5:エラー体験
目的
commit()の前にエラーが発生すると、変更が確定されないことを確認する。
関連する学習内容
- トランザクション:複数の操作を「1つのまとまり」として扱う仕組み
- エラー発生時の動作
手順
- セル4を実行済みであることを確認する
- セル5を見つける
- セル5を実行する
期待される出力
--- ここからトラブル実験 ---
パソコンを削除してしまいました...(まだ未確定)
その後、赤い背景で以下のエラーが表示される。
ZeroDivisionError: division by zero
確認ポイント
- パソコンのデータは削除されたように見える
- しかし、エラーにより
が実行されなかったcommit() - 削除は「仮保存」のまま、確定されていない
ヒント
は0で割り算を行ったときに発生するエラーであるZeroDivisionError- このエラーは演習のために意図的に発生させている
- エラーが表示されることは、この演習では正常な動作である
演習6:手動ロールバック
目的
rollback()を実行すると、最後の確定状態に戻ることを確認する。
関連する学習内容
- ロールバック:変更を取り消し、最後にコミットした状態に戻す操作
- データの整合性(矛盾のない状態)の維持
手順
- セル5を実行済みであることを確認する
- セル6を見つける
- セル6を実行する
期待される出力
ロールバックを実行しました。
--- 在庫確認 ---
[(1, 'パソコン', 120000), (2, 'マウス', 3500), (3, 'キーボード', 8000)]
確認ポイント
- パソコンのデータが復旧した
により、演習4でrollback()
した直後の状態に戻ったcommit()- マウスは3,500円のまま(演習4で確定済みのため)
ヒント
は、最後にrollback()
した時点まで戻すcommit()
で確定した変更は、commit()
では取り消せないrollback()- トランザクションを使用することで、複数の操作を安全に実行できる
演習7:切断
目的
データベース接続を適切に終了する。
関連する学習内容
- 接続の切断(
)conn.close()
手順
- セル6を実行済みであることを確認する
- セル7を見つける
- セル7を実行する
確認ポイント
でデータベースとの接続を終了するclose()- 接続を切断した後に再度演習を行う場合は、セル1から実行し直す
演習の総括
本演習で体験した内容を整理する。
| 演習 | 内容 | 学んだこと |
|---|---|---|
| 演習1 | データベースを作成 | 接続、カーソル、SQL実行、コミット |
| 演習2 | SQLインジェクション攻撃 | 文字列連結の危険性、情報漏洩 |
| 演習3 | プレースホルダで防御 | を使えば安全 |
| 演習4 | 更新とコミット | 変更の確定方法 |
| 演習5 | エラー体験 | コミット前のエラーで変更は未確定 |
| 演習6 | ロールバック | で確定前の変更を取り消し |
| 演習7 | 切断 | 接続の終了 |
Pythonでの3つの原則
本演習で学んだ原則を以下にまとめる。
- データはリスト
に格納して渡す[] - SQLには
を使用し、文字列連結(?
)を行わない+ - エラーが発生したら
でデータを復旧するrollback()
用語集
- ドライバ:プログラミング言語とデータベースの間の通信を担うソフトウェア
- カーソル:SQL文を実行し、結果を取得するためのオブジェクト
- プレースホルダ:SQL文中でデータの挿入位置を示す記号(
)? - SQLインジェクション:悪意のある入力によってSQL文を改ざんする攻撃手法
- トランザクション:複数の操作を1つのまとまりとして扱い、整合性を保証する仕組み
- コミット:仮保存状態の変更をデータベースに確定する操作
- ロールバック:変更を取り消す操作
ds-15. NoSQL データベースシステム
資料(スライド): [PDF], [パワーポイント]
演習パート(クリックして展開)
演習による体験と探求