SQL 実習

SQL (しーける) を使用する際、 商用を含めたくさんのソフトウェアがあるが、 本学では、無償で利用でき、かつ、完全なソースコードも提供している PostgresQL (ぽすとぐれしーける) で SQL の実習を行う。

前回学んだ DDL 文を実際に PostgresQL を使って、 ひとつひとつ試してみよう。

実際にデータを使って練習しよう。

データベース名 itdb にアクセスしよう。 情報処理基礎論での練習ユーザ名を ipausers とする。

% ssh ta05001@roy
% psql -d itdb -U ipausers;                               [~]
psql (8.4.2)
Type "help" for help.
itdb=> 
psql -d itdb -U アカウント名 

データベース練習帳

練習用紙

関係表の例:キャラクタと番組
属性
フィールド 1「名前」フィールド 2「番組名」 フィールド 3「性別」フィールド 4「キャラクタ」
レコード 1ブラサム パワパフガールズ
レコード 2バブルスパワパフガールズ
レコード 3バタカップパワパフガールズ
レコード 4モジョジョジョ パワパフガールズ
レコード 5ミス・キーンパワパフガールズ
レコード 6メイヨール パワパフガールズ
レコード 7プロフェッサパワパフガールズ
レコード 8ジャックサムライジャック
レコード 9アクサムライジャック
住んでいる町と趣味・特技
属性
フィールド 1「名前」フィールド 2「住んでいる町」フィールド 3「趣味・特技」
レコード 1ブラサム タウンズビル新しい服
レコード 2バブルスタウンズビル動物 と話す
レコード 3バタカップタウンズビルケ ンカ
レコード 4モジョジョジョ タウンズビル発明
レコード 5ジャック未来世界
レコード 6デクスタラボ 発明
レコード 7ディディラボ バレエ
番組ストーリー
属性
フィールド 1「番組名」フィールド 2「概要」
レコード 1 パワパフガールズ3 人の女の子たちのお話
レコード 2サムライジャック 未来世界の侍の話
レコード 3デクスタ研究所 姉と弟の兄弟げんかの話
レコード 4快適な生活 電気会社の CM 集
レコード 5ウォレスとグルミット 犬と発明家の話
マラソン順位
属性
名前順位
レコード 1カウ1
レコード 2チキン3
レコード 3アル4
レコード 4フレム2
レコード 5レッドガイ5
100 m 走順位
属性
名前順位
レコード 1ウィゼル 1
レコード 2カウ3
レコード 3チキン2
レコード 4レッドガイ6
レコード 5フレム4
レコード 6アル4
問屋一覧
属性
問屋コード店名所在地
レコード 1220 ウニクロ千葉県浦安市
レコード 2221ハッサン 北海道札幌市
在庫一覧
属性
問屋コード品物在庫数
レコード 1220 シャツグリーン4
レコード 2220タオル ブラウン2
レコード 3221ジャケット ブラック15

データベースサーバへのログイン

データベースにログインするには、 データベースサーバにログインする必要がある。 本学のデータベースサーバは roy である。

データベースにアクセスするには

本学では、roy のサーバ上にインストールしてある。よって roy に ssh で接続する。

irsv{ta05001}% ssh roy
ta05001@roy's password: 

パスワードを聞かれるので、入力する。

pan{ta05001}% ssh roy                                
Password:
Last login: Thu Dec 25 14:35:20 2008 from pan.e.koeki-u.ac.jp
NetBSD 4.0_STABLE (ROY.MP) #101: Tue Apr 22 20:26:57 JST 2008
roy{ta05001}% 

roy の表示が出れば成功。次に、roy のデータベースに接続する。 これから練習用に使うデータベース名は itdb である。 ゲストアカウントで入ってみよう。 接続に使うコマンドは psql である。

% psql -d データベース名 -U アカウント名 

データベースにアクセスすると、

roy{ta05001}% psql -d itdb  -U アカウント名                                                     [~]
Welcome to psql 8.1.3, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit
itdb=>

と出る。まずは英語を読み、help と quit を覚えよう。

練習用データベースの中に入っているもの

データベースには、今まで学んだ表

が含まれている。

データベースからのログアウト

postgresql では、終了は \q である。

ta05001=> \q

データベースサーバからのログアウト

データベースからログアウトしても、 まだ pan に接続している。


pan{ta05001}% ssh roy                                                        [~]
Password:
Last login: Thu Dec 25 18:46:27 2008 from pan.e.koeki-u.ac.jp
NetBSD 4.0_STABLE (ROY.MP) #101: Tue Apr 22 20:26:57 JST 2008
roy{ta05001}% exit                                                           [~]
roy への接続が閉じられました。
pan{ta05001}%                                                                [~]

関係データベース

関係データベース

関係データベースとは、 データベースを 2 次元表形式にまとたもので、 行(record [組])と列(field [属性])の表を作る。 作られた表は関係表と呼ぶこともある。

関係表の例:キャラクタと番組
属性
フィールド 1「名前」フィールド 2「番組名」フィールド 3「性別」フィールド 4「キャラクタ」
レコード 1ブラサムパワパフガールズ
レコード 2バブルスパワパフガールズ
レコード 3バタカップパワパフガールズ
レコード 4モジョジョジョパワパフガールズ
レコード 5ミス・キーンパワパフガールズ
レコード 6メイヨールパワパフガールズ
レコード 7プロフェッサパワパフガールズ
レコード 8ジャックサムライジャック
レコード 9アクサムライジャック

各属性には、「名前」、「番組名」、「性別」、「キャラクタ」が記録されている。属性を鍵 (key) として、必要な情報を取り出していく。

候補キーとは、属性のことで、例えば「名前」フィールドや「性別」フィールドを探すときにこれらを指すために使われる。

演習5-1:候補キーを「キャラクタ」とする。それらのレコードを全て挙げよ。

主キーーとは、その中でも、フィールド内で重複のないものをさす。 主キーをもとに、データを探すことになる。 ここでは、重なっていない属性は「名前」フィールドのみである。

この他、他の関係表と照しあわせるときに用いるキーを外部キーと呼ぶ。

演習5-2:下の関係表と合せて何か情報を取り出したい(「参照する」という)。 下の 2 つの関係表の属性を取り出すとき、上の関係表のどの属性が外部キーとして適切だろうか?

住んでいる町と趣味・特技
属性
フィールド 1「名前」フィールド 2「住んでいる町」フィールド 3「趣味・特技」
レコード 1ブラサムタウンズビル新しい服
レコード 2バブルスタウンズビル動物と話す
レコード 3バタカップタウンズビルケンカ
レコード 4モジョジョジョタウンズビル発明
レコード 5ジャック未来世界
レコード 6デクスタラボ発明
レコード 7ディディラボバレエ
番組ストーリー
属性
フィールド 1「番組名」フィールド 2「概要」
レコード 1パワーパフガールズ3 人の女の子たちのお話
レコード 2サムライジャック未来世界の侍の話
レコード 3デクスタ研究所姉と弟の兄弟げんかの話
レコード 4快適な生活電気会社の CM 集
レコード 5ウォレスとグルミット犬と発明家の話

関係表の操作について

何枚にもわたる資料の中から、必要なデータを取り出したり、組み合わせて分析することがある。関係表でも同じような動作を行うことができる。

集合演算

データの集まり (集合) について何か行動を起こす (演算する) ので、 データを整理することを集合演算と呼ぶ。和演算、積演算、差演算の 3 つと、直積演算がある。

和演算: 2 つの関係表から、 どちらか一方あるいはどちらにも含まれるデータを取り出す

少なくともどちらか一方に存在しているものを取り出すので、表は大きくなる。

数学でいう C = {A ∪ B} の集合のことである。

演習5-3:下の 2 つの関係表に和演算を施すとどうなるか。

マラソン順位
属性
名前順位
レコード 1カウ1
レコード 2チキン3
レコード 3アル4
レコード 4フレム2
レコード 5レッドガイ5
100 m 走順位
属性
名前順位
レコード 1ウィゼル1
レコード 2カウ3
レコード 3チキン2
レコード 4レッドガイ6
レコード 5フレム4
レコード 6アル4

実際 100 m 走とマラソンの順位を一緒にしても無意味であるが、 演算の練習のため行っている。

積演算(共通演算): 2 つの関係表から、両方に含まれるデータを取り出す

どちらかに存在しているものを取り出すので、表は小さくなる。

数学でいう C = A ∩ B の集合のことである。

演習5-4:上の「マラソン順位」と「100 m 走順位」に積演算を施すとどうなる か。

差演算: 2 つの関係表から、どちらか一方にしか含まれないデータを取り出す

重なり合いが大きい場合、表は小さくなるが、 重なり合いが小さければ、表は大きくなる。 また、差演算はどちらの表を引くかで結果が異なる。

演習5-5:「マラソン順位」から「100 m 走順位」の差演算を施したものと、 「100 m 走順位」から「マラソン順位」の差演算を施したものと結果を比較せよ。

直積演算

数学でいうC = A ⊗ B である。

具体的には 2 つの表を全て組み合わせたものを作る。以下の 2 つの表

問屋一覧
属性
問屋コード店名所在地
レコード 1220ウニクロ千葉県浦安市
レコード 2221ハッサン北海道札幌市

在庫一覧
属性
問屋コード品物在庫数
レコード 1220シャツグリーン4
レコード 2220タオルブラウン2
レコード 3221ジャケットブラック15

の直積は

属性
問屋コード店名所在地品物在庫数
レコード 1220ウニクロ千葉県浦安市シャツグリーン4
レコード 2220ウニクロ千葉県浦安市タオルブラウン2
レコード 3221ハッサン北海道札幌市ジャケットブラック15

となる。

関係演算

一つあるいは複数の関係表のデータをフィールドやレコードを取り出して、 新たに表を作ることである。射影、選択、結合の三種類がよく使われる。

射影 Projection:表からある属性を取り出す。

演習5-6:

選択 Selection:表からある行を取り出す。条件をつけることが多い。

演習5-7:

結合:複数の表から条件を満たす行を取り出して新しい表を作る。

演習5-8: