金子邦彦研究室プログラミングXML ドキュメントのリレーショナルデータベースへのマッピング(SQL, Java プログラムなど)テーブル定義とSQLのテスト実行

テーブル定義とSQLのテスト実行

テーブル定義とSQLのテスト実行を行う.

テーブル定義

特記事項:

create table 投稿者(
    投稿者ID integer primary key,
    名前表記 CHAR(32) not null,
    漢字姓 CHAR(32) not null,
    かな姓 CHAR(32),
    漢字名 CHAR(32) not null,
    かな名 CHAR(32),
    性別 CHAR(1),
    住所 VARCHAR(256),
    年齢 integer,
    電話番号 CHAR(16)
);

create table 作品評価(
    投稿者ID INTEGER not null REFERENCES 投稿者(投稿者ID),
    作成日 DATE not null,
    タイトル VARCHAR(128) not null,
    著者名 VARCHAR(128),
    発行所 VARCHAR(128),
    版 CHAR(16),
    評価 CHAR(8) not null,
    感想 VARCHAR(20000)
);

create table ファイル(
    ファイル名 VARCHAR(200) PRIMARY KEY,
    投稿者ID INTEGER not null REFERENCES 投稿者(投稿者ID)
);

SQL 演習

行の挿入

以後の SQL 演習を行う準備として,行の挿入を繰り返して,サンプルとなるテーブルを作る.

PostgreSQL の場合にはnullでは無く,NULLを使ってください.

insert into 投稿者 values(1,'日本語','山田','やまだ','花太郎','はなたろう','M','福岡県福岡市東区箱崎', 21,'090-1234-5678');
insert into 作品評価 values(1,'2007-09-25','ディジタル画像処理',NULL,'CG‐ARTS協会',NULL,'良い','画像処理技術に関してわかりやすく解説されている');
insert into 作品評価 values(1,'2006-11-25','システムバイオロジーの展開','北野宏明',NULL,NULL,'普通','システムバイオジーについて理解を深めることができた');
insert into 作品評価 values(1,'2007-09-26','オブジェクト指向データベース',NULL,NULL,NULL,'悪い','オブジェクト指向データベースを用いたシステム開発の特徴について理解することができた');

insert into 投稿者 values(2,'日本語','山本','やまもと','花子','はなこ','F','福岡県北九州市小倉南区曽根', 25,'090-8765-4321');
insert into 作品評価 values(2,'2007-09-27','関係データベースシステム','平尾隆行',NULL,NULL,'良い',NULL);
insert into 作品評価 values(2,'2007-09-28','画像処理アルゴリズム','斉藤恒雄','近代科学社','初版','良い','画像処理に関するアルゴリズムについて理解を深めることができた');

insert into ファイル values('sample1.xml',1);
insert into ファイル values('sample2.xml',2);

結合

PERSON_IDが1の感想

「substr(感想,1,100)」のように書くと,1文字目から50文字目まで抜き出します(全角の場合).

SELECT substr(感想,1,100) as ID1の感想一覧
FROM   投稿者, 作品評価
WHERE  投稿者.投稿者ID = 作品評価.投稿者ID
       AND 投稿者.投稿者ID=1
       AND 感想 is not null;

実行結果の例

ID1の感想一覧
===========================================================================================
画像処理技術に関してわかりやすく解説されている                           
システムバイオジーについて理解を深めることができた                         
オブジェクト指向データベースを用いたシステム開発の特徴について理解することができた         

'オブジェクト指向データベース'の評価をした人の氏名と電話番号

SELECT  投稿者.漢字姓, 投稿者.漢字名, 投稿者.電話番号
FROM    投稿者, 作品評価
WHERE   投稿者.投稿者ID = 作品評価.投稿者ID
        AND 作品評価.タイトル = 'オブジェクト指向データベース';

実行結果の例

漢字姓 漢字名 電話番号
======================
山田   花太郎 090-1234-5678

集約

評価と,評価ごとの数の集計値

SELECT   評価,COUNT(*)
FROM     作品評価
group by 評価;

実行結果の例

評価 count
======================
普通 1
良い 3
悪い 2

女性が報告した感想の数の集計

SELECT   count(*)
FROM     投稿者, 作品評価
WHERE    投稿者.投稿者ID = 作品評価.投稿者ID
         AND 性別='F'
         AND 感想 is not null;

実行結果の例

COUNT
============
1

2007年9月に男性が報告した作品の数の集約値

日付を処理するために,substr と cast を使う.

SELECT   count(*)
FROM     投稿者, 作品評価
WHERE    投稿者.投稿者ID=作品評価.投稿者ID
         AND 性別='M'
         AND substr(cast(作成日 as char(10)),1,7)='2007-09';

実行結果の例

COUNT
============
2

評価を'良い'または'普通'とつけた人と, その人がそのように評価した評価の数の集計値

SELECT  投稿者.投稿者ID, 投稿者.漢字姓, 投稿者.漢字名, COUNT(*)
FROM    投稿者, 作品評価
WHERE   投稿者.投稿者ID = 作品評価.投稿者ID
        AND
        ( 作品評価.評価 = '良い'
          OR 作品評価.評価 = '普通')
group by
        投稿者.投稿者ID, 投稿者.漢字姓, 投稿者.漢字名;

実行結果の例

投稿者ID 漢字姓 漢字名 count
==========================
1      山田   花太郎 2
2      山田   花子   2

評価を'良い'とつけた冊数が2冊以上の人とその人がそのように評価した本の冊数

SELECT  投稿者.投稿者ID, 投稿者.漢字姓, 投稿者.漢字名, COUNT(*)
FROM    投稿者, 作品評価
WHERE   投稿者.投稿者ID = 作品評価.投稿者ID AND 作品評価.評価 = '良い'
group by
        投稿者.投稿者ID, 投稿者.漢字姓, 投稿者.漢字名
HAVING
        COUNT(*) >= 2;

実行結果の例

投稿者ID 漢字姓 漢字名 count
==========================
2      山田   花子   2