データベース工学および演習 第 5 章 リレーショナルデータベース言語 sql
DESCRIPTION
データベース工学および演習 第 5 章 リレーショナルデータベース言語 SQL. ジョン ジンヒ 全 眞嬉. 担当教員. 所属 東北大学 大学院情報科学研究科 准教授 名前 全 眞嬉(ジョン ジンヒ) 連絡先等 [email protected] Tel/ Fax 022-795-4747 http://www.dais.is.tohku.ac.jp/~jinhee/. 5. 1 背景. データベース( Database ). 特定のテーマに従って収集され,容易に再利用できるように整理されたデータの群 - PowerPoint PPT PresentationTRANSCRIPT
データベース工学および演習
第 5 章リレーショナルデータベース言語SQL
ジョン ジンヒ
全 眞嬉
1
担当教員
所属 東北大学 大学院情報科学研究科 准教授
名前 全 眞嬉(ジョン ジンヒ)
連絡先等 [email protected] Tel/ Fax 022-795-4747 http://www.dais.is.tohku.ac.jp/~jinhee/
2
5. 1 背景3
データベース( Database )
特定のテーマに従って収集され,容易に再利用できるように整理されたデータの群
再利用できるようになっているところが重要 データベースは複数の目的で使用される 再利用する為にはデータは良く整理されている
必要がある 複数の目的で共有できる何らかのテーマがある
のが一般的 例
音楽データベース,気象情報データベース,図書館データベース,顧客データベース・・・
4
データベース管理システム
データベース管理システム (Database Management System:DBMS) データベースをコンピュータ上に構築・管理す
る為の仕組み データベースシステム (Database Sytem)
データベース管理システムとそれによって管理されるデータの群を合わせてデータベースシステムと呼ぶ
5
SQL
SQL(Structured Query Languages) データベースを操作するための言語 1970 年代 IBM の E.F. Codd 氏のよっ
て リレーショナルデータベース概念が提唱E.F.Codd , “A Relational Model of Data for Large Shared Data Banks”,Communications of the ACM Vol.13, No.6, pp.377–387,1970
E.F. Codd
6
SQL
SQL(Structured Query Languages) System R の開発
世界初のリレーショナルデータベース管理システム( RDBMS )
IBM がリレーショナルモデルの有効性を実証する為開発した実験的データベースシステム
システムを操作するに当って SEQUEL ( Structured English Query Language )が採用
SQLSQL(Structured Query Languages) に改名
Oracle や Sybase, Informix などの商用 DBMSが SQL を実装し,各ベンダーごとに拡張されている
E.F. Codd
7
SQL
SQL の改良 Oracle や Sybase, Informix などの商用 DBMS
が SQL を実装し,各ベンダーごとに拡張されている
改良と共に SQL の標準化 1986 年 SQL86
ANSI(American National Standard Institute) 1987 年 SQL 87
ISO ( International Organization Standardization) JIS(Japanese Industrial Standard)
8
SQL
近年では SQL99
オブジェクト指向データベースへの拡張 OLAP(Online Analytical Processing) 関連そうあの
強化 SQL:2003
マルチメディアデータベース関連機能への拡張 XML データ関連のフィーチャが追加
SQL:2006 XQuery
9
SQL って何?
簡単に言えば リレーショナルデータベース管理システムと対
話する為の言語 リレーショナルデータベース管理システムに対
して問い合わせる際に SQL を使う
2005 年に発売されたハリーポッ
ターシリーズの本下さ
い
RDB
SQL 語
RDBMS
10
データベース言語の標準化のメリット ユーザは一つのデータベース言語を学ぶこと
で各種の DBMS を利用できる 異なる DBMS 巻のアプリケーションプログ
ラムの移植や連携が容易 標準データベース言語を用いたあるツールは
ユーティリティを開発したり利用したりすることが容易になる
異なるユーザ間での DBMS 利用技術のノウハウ共有が促進される
11
5.2基本概念12
SQL の対象とするデータ構造と RDBのデータ構造との相違点 重複したタプルの存在
リレーショナルデータモデルでは リレーションはタプルの集合として規定 全く同じ属性値の並びからなる重複したタプルは不可
現実のデータ操作において重複した値が自動的に除去されると都合が悪い場合がある 属性について平均値計算をした場合
属性のみを残すような射影演算の結果中に重複した値がジ除去されると正しい平均は計算できない
SQL では必要に応じて重複したタプルを許すことが可能 マルチ集合
重複した要素の存在を許すような集まり SQL は集合ではなくマルチ集合を基礎とした体系
13
SQL の対象とするデータ構造と RDBのデータ構造との相違点 属性やタプルの順序付け
リレーショナルデータモデルでは リレーションスキーマにおいては属性の並び順序は意味がない
SQL では 属性及び属性値は明示的に順序付けられたものとし
て扱う 問い合わせ結果を
アプリケーションに渡す時点においてタプル同士が並ぶ順序うぃ明示的に指定できる
14
SQL での用語
SQL の対象とするデータ構造と RDB のデータ構造との相違点から SQL では表,列,行と呼ぶ 表( table )
リレーション 列( column )
属性 行( low )
タプル
15
5. 3 データの定義16
実表( base table )
実表 SQL でデータの実体を伴う表
他の表 ビュー表( viewed table )
ビューを表現する表 導出表 (derived table)
問い合わせ結果として一般的に出来る表
17
図 3.3 リレーショナルデータベースの例
学生番号 氏名 専攻 住所
00001 山田一郎 情報工学 東京都 XXX
00002 鈴木明 情報工学 茨城県 XXX
00003 佐藤花子 情報工学 東京都 XXX
科目番号 科目名 単位数
001 データベース 2
002 システムプログラム
3
科目
科目番号 学籍番号 成績
001 00001 90
001 00002 80
002 00001 90
002 00003 70
履修
科目番号 課題番号 課題名
001 01 データモデリング
001 02 データベース設計
001 03 SQL
001 01 C プログラミング
002 02 7 システム k-る
実習課題
学生
18
実表の定義の例 : 科目
各列の列名とそのデータ型を指定する データ型
文字列、数、ビット列、日時など
CHAR(3) 3 文字の固定長文字列型
NCHAR(12) 12文字の固定長感じ文字列型
INTEGER 整数型
19
CREATE TABLE 科目(科目番号 CHAR ( 3) NOT NULL、 科目名 NCHAR(12) NOT NULL、 単位数 INTEGER、 PRIMARY KEY (科目番号)、 CHECK (単位数 BETWEEN 1 AND 12 ))
科目番号 科目名 単位数
001 データベース 2
002 システムプログラム
3
科目
実表の定義の例 : 科目 CHAR(3)
3 文字の固定長文字列型 NCHAR(12)
12文字の固定長感じ文字列型 INTEGER
整数型 PRIMARY KEY (科目番号)
科目表の主キーが科目番号であることを示したキー制御の記述
CHECK (単位数 BETWEEN 1 AND 12 )
単位数の値が 1 から 12までの範囲でなければならないとの整合性制御を記述
20
CREATE TABLE 科目(科目番号 CHAR ( 3) NOT NULL、 科目名 NCHAR(12) NOT NULL、 単位数 INTEGER、 PRIMARY KEY (科目番号)、 CHECK (単位数 BETWEEN 1 AND12 ))
科目番号 科目名 単位数
001 データベース 2
002 システムプログラム
3
科目
定義域( domain )
CREAT DOMAIN文で定義された対象を定義域( DOMAIN )と呼ぶ
実表定義の際のデータ型に変わって用いることも可能 その場合は CHECK で記述された整合制約が適
用される
21
CREATE DOMAIN 単位数 INTEGER CHECK ( VALUE BETWEEN 1 AND 12 )
実表の定義の例 : 履修
主キーは科目番号と学籍番号のペアとして指定
FOREIGN KEY記述 外部キーの指定 参照整合制約の記述に
相当
22
CREATE TABLE 履修( 学生番号 CHAR ( 3) NOT NULL、 科目番号 CHAR ( 5 ) NOT NULL、 成績 INTEGER、 PRIMARY KEY (科目番号、学籍番号)、 FOREIGN KEY (科目番号) REFERENCES 科目(科目番号)、 FOREIGN KEY (学籍番号) REFERENCES 学生(学籍番号)、 CHECK (成績 BETWEEN 0 AND 100))
科目番号 学籍番号 成績
001 00001 90
001 00002 80
002 00001 90
002 00003 70
履修
5.4.1 問合せの基本形
5. 4 問合せ23
問合せの基本形
SQL における典型的な問合せ記述の形式
T1,・・・ ,Tn は表名 CT1,・・・ ,Cnm はそれぞれ T1,・・・ ,Tn
中の表 Ti1., ・・・ ,Tim の例名 Ψは条件
SELECT Ti1.C1,・・・ ,Tim.Cm
FROM T1,・・・ ,Tn
WHERE ψ
24
Q1: 科目番号 005 の科目の履修者の学籍番号と成績の一覧
SELECT 履修 .学籍番号、履修 . 成績FROM 履修WHERE 履修 .科目番号=‘005’
SELECT 学籍番号、成績FROM 履修WHERE 科目番号=‘005’
25
Q2: 学籍番号 00100 のの学生が履修した科目番号,成績の一覧
SELECT 科目 .科目番号、科目名、成績FROM 科目WHERE 科目 .科目番号= 履修 .科目番号 AND 学籍番号=‘00100’
SELECT 科目番号、科目名、成績FROM 科目 NATURAL JOIN 履修WHERE 学籍番号=‘00100’
26
Q3: 情報工学専攻のいずれかの学生が履修した科目の科目番号と科目名の一覧
SELECT 科目 .科目番号、科目名FROM 科目、履修、学生WHERE 科目 .科目番号= 履修 .科目番号 AND 履修 .学籍番号=学生 .学籍番号 AND 専攻= N’ 情報工学’
SELECT 科目番号、科目名FROM 科目 NATURAL JOIN 履修 NATURAL JOIN 学生WHERE 専攻= N’ 情報工学’ORDER BY 科目番号
27
Q4: 科目番号 005 の科目に関して学籍番号 00100の学生よりも成績の良かった学生の学籍番号一覧
SELECT y. 学籍番号FROM 履修 AS x、履修 AS yWHERE x. 科目番号=‘ 005’ AND x .学籍番号=‘00100’ AND y. 科目番号=‘005’ AND y.成績>x.成績
28
Q5: 全科目の科目名と単位数一覧
SELECT 科目名、単位数FROM 科目
SELECT DISTINCT 科目名、単位数FROM 科目
29
Q6: 単位数が 3単位以上の科目の科目番号,科目名,単位数の一覧
SELECT *FROM 科目WHERE 単位数 >= 3
30
5.4.2 集合関数
5. 4 問合せ31
Q7: 科目番号 005 の科目の平均点
SELECT AVG(成績 )FROM 履修WHERE 科目番号 = ‘005’
32
5.4.3 グループ表
5. 4 問合せ33
Q8: 全科目について科目番号と平均点の一覧
SELECT 科目番号、 AVG(成績 )FROM 履修GROUP BY 科目番号
34
Q9: 情報工学専攻の学生が履修した科目の科目番号と情報工学専攻の学生に関する平均点の一覧
SELECT 履修 .科目番号、 AVG(成績 )FROM 履修、学生WHERE 履修 .学籍番号=学生.学籍番号 AND 専攻= N’ 情報工学’GROUP BY 履修 .科目番号
35
Q10: 履修者が 30人以上の科目の科目番号,履修者数,平均点の一覧
SELECT 科目番号、 COUNT(* ) 、 AVG( 成績 )FROM 履修GROUP BY 科目番号HAVING COUNT(* )>=30
36
5.4.4 集合演算
5. 4 問合せ37
Q11: 実習課題があるか,あるいは単位数が5 単位以上の科目の科目番号,科目名,科目の一覧
SELECT 科目 . *FROM 科目、実習課題WHERE 科目 .科目番号=実習課題 .科目番号UNION SELECT *FROM 科目WHERE 単位数 >=5
38
Q12: 実習課題のない科目の科目番号と科目名の一覧
SELECT 科目番号、科目名FROM 科目EXCEPTUNION SELECT 科目 .科目番号、科目名FROM 科目、実習課題WHERE 科目 .科目番号= 実習課題 .科目番号
39
5.4.5 副問合せ
5. 4 問合せ40
Q3: 情報工学専攻のいずれかの学生が履修した科目の科目番号と科目名の一覧
SELECT 科目番号、科目名FROM 科目 WHERE 科目番号 IN (SELECT 科目番号 FROM 履修、学生 WHERE 履修 .学籍番号= 学生 .学籍番号 AND 専攻= N’ 情報工学’)
Q3SELECT 科目 .科目番号、科目名FROM 科目、履修、学生WHERE 科目 .科目番号= 履修 .科目番号 AND 履修 .学籍番号=学生 .学籍番号 AND 専攻= N’ 情報工学’
41
Q12: 実習課題のない科目の科目番号と科目名の一覧
Q5SELECT 科目番号、科目名FROM 科目EXCEPTUNION SELECT 科目 .科目番号、科目名FROM 科目、実習課題WHERE 科目 .科目番号= 実習課題 .科目番号
SELECT 科目番号、科目名FROM 科目 WHERE NOT EXISTS (SELECT * FROM 実習問題 WHERE 実習問題 .科目番号=科目 .科目番号)
42
5.4.6 ビュー
5. 4 問合せ43
実習科目
CREAT VIEW 実習科目(科目番号、科目名、単位数) AS SELECT 科目 . * FROM 科目、実習課題 WHERE 科目 .科目番号=実習課題 .科目番号
44
5. 5 データの更新45
INSERT:行を追加
U1 科目番号 002 の科目の実習問題 03 として「シェル作成」を追加
科目番号 010 の科目履修者として学籍番号が‘ 00099’以下の学生を全員登録
INSERT INTO 実習問題VALUE (’002’、’ 03’、 N’ シェル作成’ )
INSERT INTO 履修(科目番号、学籍番号) SELECT ‘010’、学籍番号 FORM 学生 WHERE 学籍番号<=‘00099’
46
DELETE:行を削除 , UPDATE:列の値を更新
U 3 科目番号 005 の科目の実習課題をすべて削除
科目番号 010 の科目の単位数を 3単位に変更
DELETE FROM 実習問題WHERE 科目番号=‘ 005’
UPDATE 科目SET 単位数=3WHERE 科目番号=‘ 010’
47
課題
教科書100ページの演習問題 問題5.1 問題5.5 問題5.6
提出方法 A4 の紙に作成し提出
学籍番号,名前右上に記入表紙は不要
次回の講義時に提出11月27日(土)