金子邦彦研究室データベースリレーショナルデータベースシステム(スライド資料と SQL 演習)(全15回)

リレーショナルデータベースシステム(スライド資料と SQL 演習)(全15回)

大学で使用した自作の資料等を,手直しの上公開している. クリエイティブ・コモンズ BY NC SA.

目次

  1. ds-1. データベースの基本: データベースの定義と用途,データベースシステムの特徴、情報とデータの違い [PDF], [パワーポイント], HTML]
  2. ds-2. SQL の基本: SQL の役割、テーブルと属性、テーブル定義、問い合わせ(クエリ) [PDF], [パワーポイント], [HTML]
  3. ds-3. データベース設計と正規化: データベース設計の留意点とメリット、異状、正規化の基本概念、正規化の手法 [PDF], [パワーポイント], [HTML]
  4. ds-4. SQL 問い合わせの能力: SQL 問い合わせの広範な能力(結合や副問い合わせなど)、使用法 [PDF], [パワーポイント], [HTML]
  5. ds-5. SQL 問い合わせの基本: SELECT、FROM、WHERE、DISTINCT、IN、BETWEEN、SQL 問い合わせの基本構造、SQL による集計(AVG, SUM, COUNTなど) [PDF], [パワーポイント], [HTML]
  6. ds-6. テーブルの結合: JOIN、結合と SQL 問い合わせ [PDF], [パワーポイント], [HTML]
  7. ds-7. グループ化と集約: GROUP BY、SQL によるグループ化と集約、データの分析 [PDF], [パワーポイント], [HTML]
  8. ds-8. 種々の問い合わせ: IN、副問い合わせ、論理演算、AND、OR [PDF], [パワーポイント], [HTML]
  9. ds-9. データベース設計の実践: 正規化の目的と手順、種々の正規形、SQLを用いた正規化 [PDF], [パワーポイント], [HTML]
  10. ds-10. データベース設計ベストプラクティス:主キーと外部キー,設計手法,ITシステムとの連携,正規化の選択 [PDF], [パワーポイント], [HTML]
  11. ds-11. データベース操作,トランザクション,リカバリ,ロック,同時実行制御 [PDF], [パワーポイント], [HTML]
  12. ds-12. 中間まとめ [PDF], [パワーポイント], [HTML]
  13. ds-13. データ管理とデータウェアハウス [PDF], [パワーポイント], [HTML]
  14. ds-14. 準備中 (d14.pptx)
  15. ds-15. データベースの応用,データベースの種類 [PDF], [パワーポイント], [スライド HTML]
  16. ds-16. 並べ替え(ソート) [PDF], [パワーポイント], [HTML]

YouTube 再生リスト「リレーショナルデータベースの基本」: https://youtube.com/playlist?list=PLwoDcGBEg9WGKPP6dExr8DcUf9nV2kYGD

【サイト内のリレーショナルデータベース関連の資料】

1. データベースの基本: データベースの定義と用途,データベースシステムの特徴、情報とデータの違い

資料

概要

データベースは、日常生活や社会にも広く影響を与えており、重要な存在である。オンラインでのデータのやり取りやデータの蓄積には、データベースシステムが不可欠である。まずは、データベースとデータベースシステムについての理解が重要であり、Excelとの違いやデータベースシステムの特徴や機能を把握する必要がある。データベースは、人工知能、マルチメディア、情報セキュリティなど、多くの技術と密接に関連している。

関連する外部ページへのリンク

2. SQL の基本: SQL の役割、テーブルと属性、テーブル定義、問い合わせ(クエリ)

資料

概要

データベースシステムは、データの効率的な管理を可能にするITシステムです。その中でも、最も普及しているデータベースシステムはリレーショナルデータベースシステムです。リレーショナルデータベースシステムでは、データは「テーブル」と呼ばれる表形式で保管され、各テーブルのセルには単一の値が格納されます。必要なデータを取得するためには、リレーショナルデータベースシステムが提供する主要機能である「問い合わせ(クエリ)」を使用します。問い合わせは、SQL言語のコマンドを利用して行います。これにより、データを簡単に取得できるようになります。問い合わせは、人間がSQL言語のコマンドを編集して実行する場合だけでなく、リレーショナルデータベースシステムと連携するさまざまなアプリケーションで広く活用され、データの効率的な管理と共有を実現しています。このように、リレーショナルデータベースシステムの「問い合わせ」の機能は、重要な役割を果たしています。

3. データベース設計、異状、正規化

資料

概要

リレーショナルデータベースの設計は、データの整合性と効率的な管理を重視するものであり、冗長なデータの排除やデータ型の統一、関連するテーブル間の参照整合性を確保することが求められます。不適切な設計は「異状」を引き起こし、例えば、同じ情報を複数箇所で更新する必要が生じる「更新異状」などの問題を生じさせます。これを解消するための「正規化」というプロセスを通じて、テーブルの冗長性を排除し、整合性を高めることが目指されます。具体的には、混在している情報を持つテーブルを「テーブルの分割」を通じて複数のテーブルに分け、必要に応じて「テーブルの結合」を行うことで、関連するデータを効率的に管理できるようにします。

演習

  1. 冗長なデータの発見

    | 注文ID | 顧客名   | 住所              | 商品名  | 価格  | 購入日     |
    |-------|----------|--------------------|---------|-------|------------|
    | 1     | 田中太郎 | 東京都中央区1-1-1  | テレビ  | 50000 | 2023-10-01 |
    | 2     | 田中太郎 | 東京都中央区1-1-1  | 冷蔵庫  | 100000| 2023-10-02 |
    | 3     | 山田花子 | 大阪府北区2-2-2    | 洗濯機  | 30000 | 2023-10-03 |
    | 4     | 田中太郎 | 東京都中央区1-1-1  | 掃除機  | 15000 | 2023-10-04 |
    
  2. データの不整合の確認

    商品テーブル

    | 商品ID| 商品名  | 価格  |
    |-------|---------|-------|
    | 1     | テレビ  | 50000 |
    | 2     | 冷蔵庫  | 100000|
    | 3     | 洗濯機  | 30000 |
    

    注文履歴テーブル

    | 注文ID| 商品ID| 商品名  | 価格  | 注文日     |
    |-------|-------|---------|-------|------------|
    | A     | 1     | テレビ  | 50000 | 2023-10-01 |
    | B     | 2     | 冷蔵庫  | 95000 | 2023-10-02 |
    | C     | 3     | 洗濯機  | 31000 | 2023-10-03 |
    

4. SQL 問い合わせの能力: SQL 問い合わせの広範な能力(結合や副問い合わせなど)、使用法

資料

概要

オンラインツール「SQLFiddle」を使用しながら、SQL問い合わせ(クエリ)の基本から応用までを広く体験し、SQLの全体像を把握します。オンラインツール「SQLFiddle」のメリットとして、場所や時間に縛られず、ソフトウェアのインストールなしで学習できる点があります。内容は、SQL を用いたテーブル定義、データの追加、基本的な問い合わせ(SELECT, FROM, WHERE)から応用的なクエリ(JOIN, GROUP BY など)まで多岐にわたります。今回は全体像の把握と、オンラインツール「SQLFiddle」に慣れることであり、次回以降で、SQLの基本を確実にマスターしながら、少しずつ応用に進みます。今回の授業で、SQL問い合わせの多様な用途と能力を早期に把握できます。これにより、学習意欲が高まり、効率的にスキルを習得することを期待します。さらに、全体像を早い段階で理解することで、何を深く学ぶべきか、どの方向で学習を進めるべきかが明確になります。

関連する外部ページへのリンク

http://sqlfiddle.com/

【演習】

  1. 演習1.SQLFiddle を用いたSQL の実行

    SQLFiddle のURL: http://sqlfiddle.com/

    左側のパネル

    create table 朝食と値段 (
      名前 text, 
      朝食 text, 
      値段 integer
    );
    insert into 朝食と値段 values ('A', 'カレーライス', 400);
    insert into 朝食と値段 values ('B', 'うどん', 250);
    insert into 朝食と値段 values ('C', 'カレーライス', 400);
    

    右側のパネル

    select * from 朝食と値段;
    
  2. 演習2.テーブル定義とデータの追加

    SQLFiddle のURL: http://sqlfiddle.com/

    左側のパネル

    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;
    
  3. 演習3.種々の問い合わせ(クエリ)

    SQLFiddle のURL: http://sqlfiddle.com/

    1. SELECT(データの検索・加工や射影)

      SELECTは、データベースからデータを取得するための基本。

      SELECT * FROM 従業員;
      SELECT name, age FROM 従業員;
      
    2. FROM(問い合わせ対象テーブルの指定)

      FROMは、問い合わせ(クエリ)が対象とするテーブルを指定する。

      SELECT name FROM 従業員;
      SELECT name FROM 部署;
      
    3. WHERE(選択)

      WHEREは、特定の条件に一致する行を選択するために使う。

      SELECT * FROM 従業員 WHERE age > 30;
      
    4. JOIN、ON(結合、結合条件)

      関係のあるテーブルを、結合条件を指定して1つに結合する。

      SELECT 従業員.name, 部署.name
          FROM 従業員
          JOIN 部署 ON 従業員.department_id = 部署.id;
      
    5. DISTINCT(重複行の除去)

      SELECT DISTINCT department_id FROM 従業員;
      
    6. COUNT(行数のカウント)

      COUNTは、行数をカウントする。

      SELECT COUNT(*) FROM 従業員;
      
    7. AVG、MAX、MIN、SUM(平均、最大、最小、合計の計算)

      これらは、数値データに対する平均、最大、最小、合計を計算する。

      SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary) FROM 従業員;
      
    8. GROUP BY(属性でグループ化)

      GROUP BY は、指定した属性についてグループ化する。

      SELECT department_id, COUNT(*)
          FROM 従業員
          GROUP BY department_id;
      
    9. ORDER BY(並べ替え(ソート))

      ORDER BY は、指定した属性についてソートする。

      SELECT name, salary
          FROM 従業員
          ORDER BY salary DESC;
      
    10. 副問い合わせ

      INや括弧()は、SQLでさまざまな用語があるが、問い合わせ内に別の問い合わせを含めるときにも使える。 これは、ある問い合わせの結果を別の問い合わせのために使うもの。

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

5. SQL 問い合わせの基本: SELECT、FROM、WHERE、DISTINCT、IN、BETWEEN、SQL 問い合わせの基本構造、SQL による集計(AVG, SUM, COUNTなど)

資料

概要

SQLの基本的なキーワード、SELECT、FROM、WHEREを理解することで、リレーショナルデータベースのテーブルでのデータ管理について理解が深まり、条件指定による柔軟なデータアクセスのスキルを習得できます。例えば、SELECT * FROM T;はテーブルTの全てのデータを取得し、SELECT a, b FROM T WHERE b > 80;は特定の条件を満たすデータだけを選択します。また、SELECT DISTINCT a FROM T;やSELECT * FROM T WHERE c LIKE '%階';のように、重複行の排除や特定のパターンに一致するデータの取得、AVG(平均)、MAX(最大)、MIN(最小)、SUM(合計)、COUNT(行数のカウント)による集計など、多彩な方法でデータを取得、分析できます。これらの基本操作は、データベースの日常的な操作や更に複雑な問い合わせの基盤となり、効果的なデータ取得や分析が可能となります。

関連する外部ページへのリンク

http://sqlfiddle.com/

【演習】

  1. 演習1.テーブル定義とデータの追加(SQLFiddle を使用)

    SQLFiddle のURL: http://sqlfiddle.com/

    左側のパネル

    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 記録;
    
  2. 演習2.SQLによる問い合わせ(クエリ)(SQLFiddle を使用)

    SQLFiddle のURL: http://sqlfiddle.com/

    右側のパネル

    SELECT 居室 FROM 記録;
    SELECT DISTINCT 居室 FROM 記録;
    

    SELECT 名前, 得点 FROM 記録 WHERE 得点 > 80;
    SELECT 名前, 得点 FROM 記録 WHERE 得点 BETWEEN 80 AND 85;
    

    SELECT AVG(得点) FROM 記録;
    

    SELECT * FROM 記録 WHERE 居室 LIKE '%階';
    SELECT * FROM 記録 WHERE 居室 IN ('1階', '2階');
    

自習

自習(右側のパネルを使用)

SELECT 名前 FROM 記録;

SELECT 得点 FROM 記録;

6. テーブルの結合: JOIN、結合と SQL 問い合わせ

資料

概要

結合は、リレーショナルデータベースにおいて異なるテーブルを結びつけ、新たなテーブルを生成する操作です。通常、結合条件は2つのテーブルの特定の属性同士の値が等しいという条件を指定しますが、複雑な条件も指定できます。結合はSQL言語を用いて行われ、複数のテーブルを効果的に組み合わせてデータを取得でき、データベースの柔軟性と効率性を向上させます。結合を習得することで、データベースのクエリや分析を効果的に行い、意思決定や問題解決能力が向上します。結合を行う際、SQLでは通常、以下のような構文を使用します。JOINキーワードを使用して2つのテーブルを結合し、ON句で結合条件を指定します。ここでは、結合条件として、2つのテーブルの特定の属性同士の値が等しいという条件を指定していますが、他の条件も指定できます。このSQL文を実行することで、2つのテーブルが結合され、新しい結合されたテーブルが生成されます。

関連する外部ページへのリンク

http://sqlfiddle.com/

【演習】

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

    SQLFiddle のURL: http://sqlfiddle.com/

    左側のパネル

    CREATE TABLE 商品 (
        ID INTEGER,
        商品名 TEXT,
        単価 INTEGER);
    INSERT INTO 商品 VALUES(1, 'みかん', 50);
    INSERT INTO 商品 VALUES(2, 'りんご', 100);
    INSERT INTO 商品 VALUES(3, 'メロン', 500);
    

    右側のパネル

    select * FROM 商品;
    
  2. 演習2.SQL による結合

    SQLFiddle のURL: http://sqlfiddle.com/

    左側のパネル

    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 商品
    JOIN 購入
    ON 商品.ID = 購入.商品番号;
    
  3. 演習3.複数の条件の指定

    SQLFiddle のURL: http://sqlfiddle.com/

    左側のパネル

    演習2と同じ

    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 商品
    JOIN 購入
    ON 商品.ID = 購入.商品番号 AND 購入.購入者 = 'X';
    
    SELECT 商品名, 購入者, 単価 FROM 商品
    JOIN 購入
    ON 商品.ID = 購入.商品番号 AND 購入.購入者 = 'X';
    
  4. 自習3

    SELECT 商品名, 購入者, 単価 FROM 商品
    JOIN 購入
    ON 商品.ID = 購入.商品番号 AND 購入.購入者 = 'Y';
    
  5. 演習4.結合条件のない結合

    SQLFiddle のURL: http://sqlfiddle.com/

    左側のパネル

    演習2と同じ

    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 商品
    JOIN 購入;
    
  6. 演習5

    SQLFiddle のURL: http://sqlfiddle.com/

    左側のパネル

    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 名簿
    JOIN 食材;
    
    SELECT * FROM 名簿
    JOIN 食材
    ON 名簿.buy = 食材.ID;
    
    SELECT 名簿.name, 食材.name FROM 名簿
    JOIN 食材
    ON 名簿.buy = 食材.ID;
    
    SELECT 名簿.name, 食材.name FROM 名簿
    JOIN 食材
    ON 名簿.buy = 食材.ID AND 食材.name ='とうふ';
    
    SELECT count(*) FROM 名簿
    JOIN 食材
    ON 名簿.buy = 食材.ID;
    

7. グループ化と集約: GROUP BY、SQL によるグループ化と集約、データの分析

資料

概要

SQLのGROUP BYと集約は、データをまとめ、大量のデータからの分析を行うための強力なツールです。たとえば、成績テーブルにおいて科目や受講者ごとにデータをグループ化することで、科目別の平均点や受講者ごとの得点合計を算出できます。このようにグループ化することでデータが見やすくなり、GROUP BY に集約(SUM、AVG、COUNTなど)を組み合わせることで、それぞれのグループに対する行数、平均、最大値、最小値を計算し、データの傾向やパターンを明らかにすることが可能になります。これらの分析結果は、ビジネスの意思決定を支援するために利用できます。GROUP BYの能力を理解しておくことは、SQL以外のツールを使うときにも役に立つ考え方であり、ビジネスや研究の課題にアプローチする上で不可欠です。

関連する外部ページへのリンク

http://sqlfiddle.com/

【演習】

  1. 演習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 成績;
    
  2. 演習2

        SELECT AVG(得点) FROM 成績 WHERE 科目 = '国語';
    
  3. 演習3

        SELECT 科目, COUNT(*) FROM 成績 GROUP BY 科目;
    

        SELECT 科目, COUNT(*) FROM 成績 WHERE 得点 >= 90 GROUP BY 科目;
    
  4. 自習3

        SELECT 受講者, COUNT(*) FROM 成績 GROUP BY 受講者;
    
  5. 自習4

        SELECT 科目, AVG(得点) FROM 成績 GROUP BY 科目;
    
  6. 演習4

        CREATE TABLE 売上 (
            日付 DATETIME,
            商品 TEXT,
            個数 INTEGER,
            単価 INTEGER
        );
        INSERT INTO 売上 VALUES('2023-01-01', '商品A', 1, 500);
        INSERT INTO 売上 VALUES('2023-01-01', '商品A', 2, 500);
        INSERT INTO 売上 VALUES('2023-01-01', '商品A', 3, 500);
        INSERT INTO 売上 VALUES('2023-01-01', '商品A', 4, 500);
        INSERT INTO 売上 VALUES('2023-01-01', '商品B', 1, 1500);
        INSERT INTO 売上 VALUES('2023-01-01', '商品B', 2, 1500);
        INSERT INTO 売上 VALUES('2023-01-01', '商品B', 3, 1500);
        INSERT INTO 売上 VALUES('2023-01-01', '商品B', 4, 1500);
        INSERT INTO 売上 VALUES('2023-01-02', '商品A', 1, 500);
        INSERT INTO 売上 VALUES('2023-01-02', '商品A', 2, 500);
        INSERT INTO 売上 VALUES('2023-01-02', '商品A', 3, 500);
        INSERT INTO 売上 VALUES('2023-01-02', '商品A', 4, 500);
        INSERT INTO 売上 VALUES('2023-01-02', '商品B', 1, 1500);
        INSERT INTO 売上 VALUES('2023-01-02', '商品B', 2, 1500);
        INSERT INTO 売上 VALUES('2023-01-02', '商品B', 3, 1500);
        INSERT INTO 売上 VALUES('2023-01-02', '商品B', 4, 1500);
        INSERT INTO 売上 VALUES('2023-01-03', '商品A', 1, 500);
        INSERT INTO 売上 VALUES('2023-01-03', '商品A', 2, 500);
        INSERT INTO 売上 VALUES('2023-01-03', '商品A', 3, 500);
        INSERT INTO 売上 VALUES('2023-01-03', '商品A', 4, 500);
        INSERT INTO 売上 VALUES('2023-01-03', '商品B', 1, 1500);
        INSERT INTO 売上 VALUES('2023-01-03', '商品B', 2, 1500);
        INSERT INTO 売上 VALUES('2023-01-03', '商品B', 3, 1500);
        INSERT INTO 売上 VALUES('2023-01-03', '商品B', 4, 1500);
    

        SELECT 日付, SUM(個数 * 単価)
        FROM 売上
        GROUP BY 日付;
    
  7. 自習7.

        SELECT 日付, 商品, SUM(個数 * 単価) FROM 売上 GROUP BY 日付, 商品;
    

8. 種々の問い合わせ: IN、副問い合わせ、論理演算、AND、OR

資料

概要

SQLのIN、副問い合わせ、論理演算子ANDとORは、データベースクエリの柔軟性と効率を高める重要な要素です。INは複数の値の中から一致するものを選択します。副問い合わせは、他の問い合わせ内に埋め込まれた問い合わせで、複雑なデータ抽出や最新のデータに基づいた条件設定を可能にします。例えば、最高得点を取った受講者の特定や平均点以上の得点を持つ行の選択などが可能です。ANDとORは、複数の条件を組み合わせる際に使用され、ANDは両方の条件が成立する場合、ORはいずれか一方、または両方が成立する場合に適用されます。これらの機能を理解し適切に使用することで、データベースの操作がより効率的かつ効果的になります。

関連する外部ページへのリンク

http://sqlfiddle.com/

【演習】

  1. 演習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 成績;
    
  2. 演習2.範囲指定

        SELECT * FROM 成績 WHERE 得点 >= 85 AND 得点 <= 90;
        SELECT * FROM 成績 WHERE 得点 BETWEEN 85 AND 90;
    
  3. 演習3.SQL の IN

        SELECT * FROM 成績 WHERE 科目 IN ('国語', '算数');
    
  4. 演習4.副問い合わせ

        SELECT 受講者 FROM 成績 WHERE 得点 =
        (SELECT MAX(得点) FROM 成績);
    
  5. 演習5.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);
    

    部署ID 101 の従業員の名前と給与を選択:

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

    給与が平均以上の従業員を選択:

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

    部署ID 101 または 102 に所属する従業員を選択:

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

    給与が300000以上かつ部署IDが102の従業員を選択:

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

9. データベース設計の実践: 正規化の目的と手順、種々の正規形、SQLを用いた正規化

資料

概要

データベース設計では、テーブル名、属性、データ型、制約、索引などを定め、データベース全体の構造を決定します。正規化の目的は、データベース構造を最適化し、効果的な管理を実現することです。正規化により、データの冗長性を減少させ、異状の防止、効率の向上、信頼性の確保、管理の容易化など多くの利点が得られます。既存のデータベースに対する正規化は、情報無損失原則に基づき、データの冗長性を減少させるようにテーブルを分割することで行います。このプロセスは、「SELECT」や「CREATE TABLE ... AS」などのSQLコマンドを使用して実行できます。以上のことは、正規化を理解し、実際に適用するうえで役立ちます。今回の内容は、より効率的で信頼性の高いデータベースの構築と運用に寄与します。

関連する外部ページへのリンク

http://sqlfiddle.com/

【演習】

  1. 演習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);
    

    SELECT * FROM T;
    

    SELECT 昼食 FROM T;
    SELECT DISTINCT 昼食 FROM T;
    
  2. 演習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 * FROM X;
    SELECT * FROM Y;
    
  3. 演習3.正規化における情報無損失

    SELECT X.名前, X.昼食, Y.料金 FROM X JOIN Y ON X.昼食 = Y.昼食;
    
  4. 自習3.学生情報のためのテーブル作成

    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;
    
  5. 自習4.冗長なデータの確認

    SELECT StudentID, StudentName FROM S;
    
  6. 自習5.重複なしの学生情報抽出

    SELECT DISTINCT StudentID, StudentName FROM S;
    
  7. 自習6.正規化

    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;
    

10. データベース設計ベストプラクティス:主キーと外部キー,設計手法,ITシステムとの連携,正規化の選択

資料

11. データベース操作,トランザクション,リカバリ,ロック,同時実行制御

資料

【演習】

paiza.IO の URL: https://paiza.io/

MySQL を選んで使ってください

①挿入

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);
select * from T;

②更新

次を書き加える

update T set 料金 = 300 where 昼食 = 'うどん';
select * from T;

③削除

次を書き加える

delete from T where 名前 = 'A';
select * from T;

ロールバック

create table T(名前 text, 昼食 text, 料金 integer) engine = InnoDB;
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 料金 = 300 where 昼食 = 'うどん';
delete from T where 名前 = 'A';
select * from T;
rollback;
select * from T;

12. 中間まとめ

資料

13. データ管理とデータウェアハウス

資料

14. (準備中)

資料

【演習】

paiza.IO の URL: https://paiza.io/

MySQL を選んで使ってください

テーブルを分割した後,結合することにより元に戻る場合.

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 A as select distinct 名前, 昼食 from T;
create table B as select distinct 昼食, 料金 from T;
select * from A;
select * from B;
select A.名前, A.昼食, B.料金 from A, B where A.昼食 = B.昼食;

テーブルを分割した後,結合しても元に戻らない場合.

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 A as select distinct 昼食, 料金 from T;
create table B as select distinct 名前, 料金 from T;
select * from A;
select * from B;
select A.昼食, A.料金, B.料金 from A, B where A.料金 = B.料金;

15. データベースの応用,データベースの種類

資料

16. 並べ替え(ソート)

資料

SQL による並べ替え(ソート)

【演習】

Accessデータベースファイル

db4-4.accdb

SELECT *
FROM 米国成人調査データ
ORDER BY 年齢;
SELECT *
FROM 米国成人調査データ
ORDER BY 年齢 DESC;
SELECT *
FROM 米国成人調査データ
ORDER BY 教育年数;
SELECT *
FROM 米国成人調査データ
ORDER BY 教育年数 DESC;
SELECT *
FROM 米国成人調査データ
ORDER BY 年齢, 教育年数;
SELECT *
FROM 米国成人調査データ
ORDER BY 年齢 DESC, 教育年数 DESC;
SELECT *
FROM 米国成人調査データ
WHERE 年齢 > 80
ORDER BY 年齢;
SELECT *
FROM 米国成人調査データ
WHERE 年齢 > 80
ORDER BY 年齢 DESC;
SELECT *
FROM 米国成人調査データ
WHERE 年齢 BETWEEN 20 AND 30
ORDER BY 年齢;
SELECT 母国, COUNT(*)
FROM 米国成人調査データ
GROUP BY 母国
ORDER BY COUNT(*);