GRDBMS と SQL 山口 実靖 httpwwwnskogakuinacjpct13140inet 概要 データベース 簡単単に覚えるだけ 情報系技術者の超重要スキル リレーション ID: 792888
Download The PPT/PDF document "インターネット技術特論" is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.
Slide1
インターネット技術特論
G:RDBMSとSQL山口 実靖
http://www.ns.kogakuin.ac.jp/~ct13140/inet/
Slide2概要
データベース簡単.単に覚えるだけ.情報系技術者の超重要スキルリレーション抽象的で理解しづらい. 大まかに分かれば良い.SQL講義の
範囲は難しくない.必ず理解すること!RDBMSとSQL-2
Slide3データベースRDBMS
Slide4Database
データベースとは,データの集まり.例えば,実験の測定値,社員表など.多くの場合,数値か文字列.RDBMSとSQL-
4
Slide5DBMS (Database Management System)
データベース管理システム.データベースを管理運用するためのシステム.多くの場合,ソフトウェアである.DBMSには数種類のモデルがある.リレーショナルデータモデル,ネットワークデータモデル階層型データモデル,オブジェクト指向,
XML現在,多くのDBMSがリレーショナルデータモデルのRDBMB (Relational Database Management System)である.本講義ではRDBMSのみ扱う.RDBMSとSQL-5
Slide6RDBMS
RDBMBRelational Database Management System日本語で「関係データベース(
管理システム)」Relational Data Model(関係データモデル)を採用したDMBS通常,SQLという言語を用いて運用する.現在,ほとんどのDBMSがRDBMSOracle, Microsoft SQL Server, DB2(IBM),PostgreSQL, MySQL, Firebird, SQLiteなどの実装がある.現在,超重要なアプリケーションの一つ.RDBMSとSQL-6
Slide7単語"Database"の曖昧性
「データとDBMS(DB管理システム)」をまとめて「データベース(DB)」と呼ぶこともある.DBMS(DB
管理システム)を「データベース」と呼ぶこともある.RDBMSの意味で使うこともある.RDBMSとSQL-7
Slide8データモデル
DBMSでは各種モデルによりデータを整理,管理する.この整理,管理のモデルがデータモデル.一般に,以下の3要素から成り立つデータやデータ間の関連を表現する構造記述データやデータ間に存在する一貫性制約の記述.データの検索,更新などのデータ操作言語
RDBMSとSQL-8
Slide9リレーショナルデータモデル
数学の集合論に基づく,データモデル.極めて簡潔に説明すると「表型」.全てのデータ,データ間の関連を「リレーションのタプル」で表現する.(後述)タプルは,値の組み合わせ.Codd(
コッド)博士が提案.チューリング賞.日本語では「関係データモデル」RDBMSとSQL-9
Slide10リレーション
Slide11リレーショナルデータモデル
会員番号
氏名住所所属
0
福田康夫
群馬県
...
部署
M
1
安倍晋三
山口県
...
部署
M
2
小泉純一郎
神奈川
県
...
部署
M
3
森喜朗
石川県
...
部署
M
4
小渕恵三
群馬
県
...
部署
O
データを表形式で管理する.
会員表
RDBMS
と
SQL-
11
Slide12リレーショナルデータモデル
会員番号
氏名住所所属
0
福田康夫
群馬県
...
部署
M
1
安倍晋三
山口県
...
部署
M
2
小泉純一郎
神奈川
県
...
部署
M
3
森喜朗
石川県
...
部署
M
4
小渕恵三
群馬
県
...
部署
O
表,リレーション,
TABLE
RDBMS
と
SQL-
12
Slide13リレーショナルデータモデル
会員番号
氏名住所所属
0
福田康夫
群馬県
...
部署
M
1
安倍晋三
山口県
...
部署
M
2
小泉純一郎
神奈川
県
...
部署
M
3
森喜朗
石川県
...
部署
M
4
小渕恵三
群馬
県
...
部署
O
行,ロー,
レコード,
タプル
RDBMS
と
SQL-
13
Slide14リレーショナルデータモデル
会員番号
氏名住所所属
0
福田康夫
群馬県
...
部署
M
1
安倍晋三
山口県
...
部署
M
2
小泉純一郎
神奈川
県
...
部署
M
3
森喜朗
石川県
...
部署
M
4
小渕恵三
群馬
県
...
部署
O
列,カラム,
フィールド
RDBMS
と
SQL-
14
Slide15リレーショナルデータモデル
会員番号
氏名住所所属
0
福田康夫
群馬県
...
部署
M
1
安倍晋三
山口県
...
部署
M
2
小泉純一郎
神奈川
県
...
部署
M
3
森喜朗
石川県
...
部署
M
4
小渕恵三
群馬
県
...
部署
O
列名,カラム名,
フィールド名
RDBMS
と
SQL-
15
Slide16リレーショナルデータモデル
会員番号
氏名住所所属
0
福田康夫
群馬県
...
部署
M
1
安倍晋三
山口県
...
部署
M
2
小泉純一郎
神奈川
県
...
部署
M
3
森喜朗
石川県
...
部署
M
4
小渕恵三
群馬
県
...
部署
O
行の値の変更,行の追加,行の削除などを繰り返して,
DBMS
を運用していく.
通常,列の
追加
/
削除は
行わない.
行の順は意味
を持たない
RDBMS
と
SQL-
16
Slide17キー key
Slide18スーパーキー
表内の行を特定できる列(の組)がスーパーキー.会員番号を定めると,行が一意に定まる. よって,会員番号はスーパーキー.
「会員番号」が「2」である行は,1行しかない.当然,会員番号は重複しないことが前提.「氏名」では, 同姓同名がいると 破綻する.RDBMSとSQL-18会員番号
氏名
住所
所属
0
福田康夫
群馬県
...
部署
M
1
安倍晋三
山口県
...
部署
M
2
小泉純一郎
神奈川
県
...
部署
M
3
森喜朗
石川県
...
部署
M
4
小渕恵三
群馬
県
...
部署
O
Slide19スーパーキー
スーパーキーは,複数の列で構成されていても良い. 「氏名,科目」を定めると行が特定される. よって,「氏名,科目」の組はスーパーキー
最悪でも,「全列の組」は
スーパー
キー
となる.
(
同一の行は存在しては
ならない.
)
RDBMS
と
SQL-
19
氏名
科目
福田康夫
英語
福田康夫
数学
安倍晋三
英語
安倍晋三
数学
小泉純一郎
英語
得点
A
B
C
D
E
Slide20候補キー
スーパーキーの中で,どれか1つでも欠けたら行の特定ができなくなるキーが候補キー.「氏名,科目,得点」を決めると行が特定できる → スーパーキー
「氏名,科目,得点」は,「どれか1個欠けると特定できない」か? → NO (得点は削除可能) ∴候補キー ではない.「氏名,科目」は候補キー.∵「行を特定可能」かつ「1個欠けると特定できない」RDBMSとSQL-20
氏名
科目
福田康夫
英語
福田康夫
数学
安倍晋三
英語
安倍晋三
数学
小泉純一郎
英語
得点
A
B
C
D
E
Slide21候補キー
候補キーは複数存在する場合もある.会員番号を定めると行が特定される. よって,会員番号は候補キー基礎年金番号を定めると行が特定される. よって,基礎年期番号も候補キー
RDBMSとSQL-21会員番号氏名住所
0
福田康夫
群馬県
...
1
安倍晋三
山口県
...
2
小泉純一郎
神奈川
県
...
3
森喜朗
石川県
...
4
小渕恵三
群馬
県
...
基礎年金番号
234
567
890
123
456
Slide22主キー
候補キーの中から,DBMS管理者が 主観的に選択した主たるキーが「主キー」.理論的価値は低いが,実運用上重要な意味を持つ下線を引くことが多い.
RDBMSとSQL-22会員番号氏名住所
0
福田康夫
群馬県
...
1
安倍晋三
山口県
...
2
小泉純一郎
神奈川
県
...
3
森喜朗
石川県
...
4
小渕恵三
群馬
県
...
基礎年金番号
234
567
890
123
456
Slide23正規形
Slide24第一正規形
1マスに複数の要素を入れてはならない.1個の要素が複数マスに跨ってはならない.そもそも,RDBMSに格納できない.
注意:この説明は過度に簡潔化されています.
そもそも「マス」などという表現は使ってはならない.
RDBMS
と
SQL-
24
Slide25第一正規形
会員番号
氏名趣味0
福田康夫
クラシック音楽鑑賞
2
小泉純一郎
歌舞伎鑑賞,
映画鑑賞
非正規形
会員
番号
氏名
趣味
0
福田康夫
クラシック音楽鑑賞
2
小泉純一郎
歌舞伎鑑賞
2
小泉純一郎
映画鑑賞
第一正規形
会員
番号
氏名
趣味
0
福田康夫
クラシック音楽鑑賞
2
小泉純一郎
歌舞伎鑑賞
2
映画鑑賞
RDBMS
と
SQL-
25
Slide26関数従属
ある列群の値が決まれば,別のある列群の値が一意に定まるとき「関数従属(する)」という.
氏名教科点数福田康夫
英語
50
福田康夫
数学
60
安倍晋三
英語
70
安倍晋三
数学
80
{
氏名
,
教科
}
が決まると,
{
点数,合否
}
は決まる.
よって,関数従属である.
{
氏名,教科
}→{
点数,合否
}
{
氏名
}
を決めても,
{
点数
}
は決まらない.
関数従属でない.
{
点数
}
が決まると,
{
合否
}
は決まる.
関数従属である.
合否
否
合
合
合
RDBMS
と
SQL-
26
Slide27完全従属
列群Aに列群Bが関数従属であり, 列群Aの真部分集合(Aの一部)
に 関数従属でないとき,「完全従属」という.会員番号氏名教科
点数
合否
0
福田康夫
英語
50
否
0
福田康夫
数学
60
合
1
安倍晋三
英語
70
合
1
安倍晋三
数学
80
合
{
会員番号
,
氏名
,
教科
}
→{
点数
,
合否
}
なので関数従属.
ところが,
{
会員番号
,
教科
}
→{
点数
,
合否
}
でもある.
実は,
{
氏名
}
は無くても良い.
よって,
{
点数
,
合否
}
は
{
会員番号
,
氏名
,
教科
}
に
完全従属でない.
RDBMS
と
SQL-
27
Slide28第二正規形
第一正規形である.候補キーでない列が候補キーに完全従属している.RDBMSとSQL-28
Slide29第二正規形でない例
userID
nameemail年
月
日
text
0
福田
fuku@k.go.jp
2007
9
26
首相になった
1
安倍
abe@k.go.jp
2007
7
29
選挙を行った
1
安倍
abe@k.go.jp
2006
9
26
首相になった
2
小泉
koi@k.go.jp
2005
8
8
解散した
{userID,
年
,
月
,
日
}
が候補キーかつ主キー.
{userID}→{name,email}
で,
name
や
email
が候補キーに完全従属でない.
表
"
日記
"
赤枠は主キー
RDBMS
と
SQL-
29
Slide30第二正規化の例
表
"日記"
user
ID
name
email
0
福田
fuku@k.go.jp
1
安倍
abe@k.go.jp
2
小泉
koi@k.go.jp
user
ID
年
月
日
text
0
2007
9
26
首相になった
1
2007
7
29
選挙を行った
1
2006
9
26
首相になった
2
2005
8
8
解散した
表
"
ユーザ表
"
先ほどの表を分解し,
非候補キーが全ての候補キーに完全従属.
これで,第二正規形
RDBMS
と
SQL-
30
Slide31第三正規形
第二正規形である.全ての非キー列は,どの候補キーにも推移的に従属しない.RDBMSとSQL-31
Slide32第三正規形でない例
第二正規形であるが, 所属→勤務地の関数従属が存在する.つまり,勤務地はuserID→所属 →勤務地 と 推移的に決定される.
userIDname所属
勤務地
0
福田
A
事業部
八王子
1
安倍
B
事業部
新宿
2
小泉
B
事業部
新宿
3
森
A
事業部
八王子
分解するべき
RDBMS
と
SQL-
32
Slide33第三正規形
user
IDname所属勤務地
0
福田
A
事業部
八王子
1
安倍
B
事業部
新宿
2
小泉
B
事業部
新宿
3
森
A
事業部
八王子
user
ID
name
所属
0
福田
A
事業部
1
安倍
B
事業部
2
小泉
B
事業部
3
森
A
事業部
所属
勤務地
A
事業部
八王子
B
事業部
新宿
RDBMS
と
SQL-
33
Slide34SQL
Slide35SQL
SQLは,RDBMSを操作するのに使用する言語の一つ.現在,本言語が主流.本稿ではSQLのみ扱う.厳密には,SQLは略語ではない.歴史的背景から
"Structured Query Language"の略とすることもある.構造化問い合わせ言語.言語仕様には,実装依存する箇所が多々ある.C言語にも方言はあるが,SQLほど酷くはない.RDBMSとSQL-35
Slide36SQLの超基本命令
表を作成する.CREATE TABLE 表名 (...);表に行を挿入する.
INSERT INTO 表名 VALUES (...);表の内容を確認する.SELECT * FROM 表名;表の行の値を変更する.UPDATE 表名 SET 列名=値[,列名=値] WHERE ..;表の行を削除すDELETE FROM 表名
WHERE ...;
RDBMS
と
SQL-
36
Slide37SQLの例
以下の様なデータベースを構築することを考える.
userIDnameemail0
Fukuda Yasuo
fukuda@kantei.go.jp
1
Abe Shinzo
abe@kantie.go.jp
2
Koizumi Junichiro
koizumi@kantie.go.jp
3
Mori Yoshiro
mori@kantie.go.jp
表
"user_tbl"
RDBMS
と
SQL-
37
Slide38SQLの例
各行(レコード)の列(フィールド)には「型」がある.
userIDnameemail
ユーザ
ID
を格納.
INTEGER
型とする.
ユーザ名を格納する.
最大
64
文字とする.
VARCHAR(64)
型
とする.
ユーザの
E-mail
アドレス
を格納する.
最大
64
文字とする.
VARCHAR(64)
型
とする.
RDBMS
と
SQL-
38
Slide39SQL (CREATE TABLE)
CREATE TABLE user_tbl ( userID integer, name varchar(64), email varchar(64));
RDBMSとSQL-39
Slide40空の表
"user_tbl"が作成される.確認方法は後述.
userIDnameemail
表
"user_tbl"
RDBMS
と
SQL-
40
Slide41SQL (INSERT INTO)
INSERT INTO user_tblVALUES ( 0, 'Fukuda Yasuo', 'fukuda@kantei.go.jp'
);これが,userIDになる.これが,nameになる.
これが,
email
になる.
RDBMS
と
SQL-
41
Slide42表
"user_tbl"に1行追加される.確認方法は後述.
userIDnameemail
0
Fukuda Yasuo
fukuda@kantei.go.jp
表
"user_tbl"
RDBMS
と
SQL-
42
Slide43SQL (INSERT INTO)
INSERT INTO user_tbl VALUES ( 1, 'Abe Shinzo', 'abe@kantie.go.jp'
);INSERT INTO user_tbl VALUES ( 2, 'Koizumi Junichiro', 'koizumi@kantie.go.jp');RDBMSとSQL-43
Slide44表
"user_tbl"に2行追加される.確認方法は後述.
表
"user_tbl"
userID
name
email
0
Fukuda Yasuo
fukuda@kantei.go.jp
1
Abe Shinzo
abe@kantie.go.jp
2
Koizumi Junichiro
koizumi@kantie.go.jp
RDBMS
と
SQL-
44
Slide45SQL (SELECT/FROM)
SELECT * FROM user_tbl;
userIDnameemail0
Fukuda Yasuo
fukuda@kantei.go.jp
1
Abe Shinzo
abe@kantie.go.jp
2
Koizumi Junichiro
koizumi@kantie.go.jp
結果
RDBMS
と
SQL-
45
Slide46SQL (SELECT/FROM)
name
emailFukuda Yasuofukuda@kantei.go.jp
Abe Shinzo
abe@kantie.go.jp
Koizumi Junichiro
koizumi@kantie.go.jp
結果
SELECT name, email FROM user_tbl;
RDBMS
と
SQL-
46
Slide47SQL (SELECT/FROM)
SELECT * FROM user_tbl WHERE userID=
2;結果userIDname
email
2
Koizumi Junichiro
koizumi@kantie.go.jp
SELECT
*
FROM…;
この部分では,
列の選択を行う.
SELECT * FROM …
WHERE userID=2
;
RDBMS
と
SQL-
47
この部分では,
行の選択を行う.
Slide48SQL (SELECT/FROM/WHERE)
SELECT * FROM user_tbl WHERE 1<=userID;
結果userIDname
email
1
Abe Shinzo
abe@kantie.go.jp
2
Koizumi Junichiro
koizumi@kantie.go.jp
RDBMS
と
SQL-
48
Slide49SQL (UPDATE)
UPDATE user_tbl SET email= 'root@fukuda.org' WHERE userID
=0;SELECT * FROM user_tbl;結果userIDname
email
0
Fukuda Yasuo
root@fukuda.org
1
Abe Shinzo
abe@kantie.go.jp
2
Koizumi Junichiro
koizumi@kantie.go.jp
RDBMS
と
SQL-
49
Slide50SQL (DELETE)
DELETE FROM user_tbl WHERE userID=0;SELECT * FROM user_tbl;
結果userIDname
email
1
Abe Shinzo
abe@kantie.go.jp
2
Koizumi Junichiro
koizumi@kantie.go.jp
RDBMS
と
SQL-
50
Slide51データ型
整数型 INTEGER型:整数値を格納. SMALLINT型,NUMERIC
型,DECIMAL型浮動小数点型 REAL型:単精度浮動小数点 DOUBLE PRECISION型:倍精度浮動小数点 FLOAT型RDBMSとSQL-51
Slide52データ型
文字列型 CHARACTER(n):n文字以内の文字列 VARCHAR(
n):n文字以内の文字列n文字より短い文字列を格納したとき,CHARACTER型の場合,不足分は空白で埋められn文字分容量が消費される.VARCHAR型の場合は,埋められない.VARCHAR型の使用の方が一般的と思われる.RDBMSとSQL-52
Slide53データ型
日付型 DATE型:日付を表す. TIME型:
時刻 TIMESTAMP:日付と時刻RDBMSとSQL-53
Slide54データ型
データ型はRDBMS実装に依存する部分が大きい.詳細は,実装ごとのマニュアルを読む必要がある.RDBMSとSQL-
54
Slide55NULL値
RDBMSのマスを空にすることができる(場合がある)空を「NULL」と呼ぶ.主キーやNOT NULL制約のついた列のマスは,
NULLにできない.注意:一般にRDBMSに「マス」という表現はない.RDBMSとSQL-55
Slide56算術演算子
使用例
意味+-*
/
%
a+b
a-b
a*b
a/b
a%b
a
と
b
の和
a
と
b
の差
a
と
b
の積
a
を
b
で割った商
a
と
b
で割った余り
RDBMS
と
SQL-
56
Slide57比較演算子
使用例
意味=<<=
>
>=
a=b
a<b
a<=b
a>b
a>=b
a
と
b
は等しい
a
は
b
より小さい
a
は
b
以下
aはbより
大きい
a
は
b
以上
<>
!=
a!=b
a
と
b
は等しくない
RDBMS
と
SQL-
57
Slide58論理演算子
使用例
意味ANDA and BA
かつ
B
10<=a and a<=20
a
が
10
以上 かつ
a
が
20
以下
OR
A or B
A
または
B
a<=10 or 20<=a
a
が
10
以下 または
a
が
20
以上
NOT
NOT A
A
でない
NOT (a = 100)
A
が
100
でない
RDBMS
と
SQL-
58
Slide59SELECTの応用
以下の様な表があるとする.
userIDnameemail0
Fukuda Yasuo
fukuda@kantei.go.jp
1
Abe Shinzo
abe@kantie.go.jp
2
Koizumi Junichiro
koizumi@kantie.go.jp
表
"user_tbl"
RDBMS
と
SQL-
59
Slide60SELECT
SELECT name FROM user_tbl;
nameFukuda YasuoAbe ShinzoKoizumi Junichiro
RDBMS
と
SQL-
60
Slide61SELECT/WHERE
SELECT * FROM user_tblWHERE userID = 2;
userIDnameemail2
Koizumi Junichiro
koizumi@kantie.go.jp
RDBMS
と
SQL-
61
Slide62SELECT/WHERE
SELECT * FROM user_tblWHERE userID < 2;
userIDnameemail0
Fukuda Yasuo
fukuda@kantei.go.jp
1
Abe Shinzo
abe@kantie.go.jp
RDBMS
と
SQL-
62
Slide63SELECT/WHERE
SELECT * FROM user_tblWHERE name = 'Koizumi Junichiro';
userIDnameemail2
Koizumi Junichiro
koizumi@kantie.go.jp
RDBMS
と
SQL-
63
Slide64SELECT/WHERE
SELECT * FROM user_tblWHERE 0<userID AND userID<2;
userIDnameemail1
Abe Shinzo
abe@kantie.go.jp
RDBMS
と
SQL-
64
Slide65SELECT/WHERE
SELECT * FROM user_tblWHERE userID BETWEEN 1 AND 2;
userIDnameemail1
Abe Shinzo
abe@kantie.go.jp
2
Koizumi Junichiro
koizumi@kantie.go.jp
userID
が「
1
以上
2
以下」
RDBMS
と
SQL-
65
Slide66SELECT/WHERE
SELECT * FROM user_tblWHERE userID IN (0,2);
userIDnameemail0
Fukuda Yasuo
fukuda@kantei.go.jp
2
Koizumi Junichiro
koizumi@kantie.go.jp
userID
が「
0
か
2
」
RDBMS
と
SQL-
66
Slide67SELECT/WHERE
SELECT * FROM user_tblWHERE userID NOT IN (0,2);
userIDnameemail1
Abe Shinzo
abe@kantie.go.jp
RDBMS
と
SQL-
67
Slide68SELECT/ORDER BY
SELECT * FROM user_tbl;
userIDnamescore0
Fukuda Yasuo
80
1
Abe Shinzo
70
2
Koizumi Junichiro
90
注意:この順は
保証されていない
表
"user_tbl"
RDBMS
と
SQL-
68
userID
name
score
0
Fukuda Yasuo
80
1
Abe Shinzo
70
2
Koizumi Junichiro
90
Slide69SELECT/ORDER BY
SELECT * FROM user_tbl ORDER BY score;
userIDnamescore0
Fukuda Yasuo
80
1
Abe Shinzo
70
2
Koizumi Junichiro
90
RDBMS
と
SQL-
69
userID
name
score
0
Fukuda Yasuo
80
1
Abe Shinzo
70
2
Koizumi Junichiro
90
Slide70SELECT/ORDER BY
SELECT * FROM user_tbl ORDER BY score DESC;
userIDnamescore0
Fukuda Yasuo
80
1
Abe Shinzo
70
2
Koizumi Junichiro
90
RDBMS
と
SQL-
70
userID
name
score
0
Fukuda Yasuo
80
1
Abe Shinzo
70
2
Koizumi Junichiro
90
Slide71SELECT/ORDER BY
SELECT * FROM user_tbl ORDER BY score ASC;
userIDnamescore0
Fukuda Yasuo
80
1
Abe Shinzo
70
2
Koizumi Junichiro
90
RDBMS
と
SQL-
71
userID
name
score
0
Fukuda Yasuo
80
1
Abe Shinzo
70
2
Koizumi Junichiro
90
Slide72SELECT/ORDER BY
SELECT * FROM user_tbl ORDER BY score, age;まず,"score"の順に並び替え,
それが同じ値だったら"age"で並び替える.RDBMSとSQL-72
Slide73LIKE演算子 と % と
_LIKE演算子 文字列を比較するのに使用する. 下記の,パターンマッチが使用可能.
% (パーセント) 任意の長さ(0文字以上)の,任意の文字にマッチする._ (アンダースコア) 1文字の任意の文字にマッチする.RDBMSとSQL-73
Slide74% と _ の例
ABC, AAC, AAB があるとき,「A_C」は,ABC と
AAC が該当.ABC は,「_がB」と考えれば該当.AAC は,「_がA」と考えれば該当.RDBMSとSQL-74
Slide75% と _ の例
ABC, AAC, AAB があるとき,「_A_」は,AAC と
AAB が該当.AAC は,「_と_が,AとC」と考えれば該当.AAB は,「_と_が,AとB」と考えれば該当.RDBMSとSQL-75
Slide76% と _ の例
ABC, AA, A, BAA があるとき,「A%」は,ABC, AA, A が該当.
ABC は,「%が,"BC"」と考えれば該当.AA は,「%が,"A"」と考えれば該当.A は,「%が,""」と考えれば該当.(0文字でもOK)BAA は,%をどのようにおいても該当しない.RDBMSとSQL-76
Slide77% と _ の例
ABC, AA, BAA, B があるとき,「%A%」は,ABC, AA, BAA
が該当.ABC は,「%と%が,""と"BC"」と考えれば該当.AA は,「%と%が,"A"と""」と考えれば該当. 「%と%が,""と"A"」と考えても該当.BAA は,「%と%が,"B"と"A"」と考えれば該当.
「
%
と
%
が,
"BA"
と
""
」と考えれば該当.
B
は,
%
をどのようにおいても該当しない.
RDBMS
と
SQL-
77
Slide78文字'%'を検索するとき
'%'をそのまま書くと,特殊な意味になってしまう.LIKE '100%'には,「100%
」ではなく「100から始まる任意の文字列」が該当してしまう.LIKE '100\%'とすれば「100%」の意味になる.LIKE '%\%'は,「~%」がマッチする.(%で終わる任意の文字列)RDBMSとSQL-78
Slide79LIKE演算子
SELECT * FROM user_tbl WHERE name LIKE '_B%';
userIDname0ABC
1
BBC
2
BBCC
3
BC
4
BAC
5
B
表
"user_tbl"
userID
name
0
ABC
1
BBC
2
BBCC
RDBMS
と
SQL-
79
Slide80関数
Slide81本講義で頻繁に用いる表の設計
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣
演説
民営化
表
"TODOtbl"
登録ユーザの表
各ユーザが入力した
TODO
データ
3
mori
email
fuku@kan.jp
abe@kan.jp
koi@kan.jp
mori@kan.jp
passwd
yasu
shin
jun
yoshi
3
4
2
3
解散
選挙
RDBMS
と
SQL-
81
Slide82SELECT と 関数
UPPER関数は,文字列を大文字に変換.LOWER関数は,文字列を小文字に変換.
nameFukuda YasuoAbe ShinzoKoizumi Junichiro
SELECT UPPER(name), name
FROM user_tbl;
UPPER(name)
FUKUDA YASUO
ABE SHINZO
KOIZUMI JUNICHIRO
name
Fukuda Yasuo
Abe Shinzo
Koizumi Junichiro
SECECT name
FROM user_tbl;
RDBMS
と
SQL-
82
Slide83SELECT と 関数
userID
namescore0
Fukuda Yasuo
80
1
Abe Shinzo
70
2
Koizumi Junichiro
90
SELECT SUM(score)
FROM user_tbl;
SUM(score)
240
SUM
関数は,合計を返す.
RDBMS
と
SQL-
83
Slide84SELECT と 関数
userID
namescore0
Fukuda Yasuo
80
1
Abe Shinzo
70
2
Koizumi Junichiro
90
SELECT AVG(score)
FROM user_tbl;
SUM(score)
80
AVG
関数は,平均を返す.
RDBMS
と
SQL-
84
Slide85SELECT と 関数
userID
namescore0
Fukuda Yasuo
80
1
Abe Shinzo
70
2
Koizumi Junichiro
90
SELECT COUNT(*)
FROM user_tbl;
COUNT(*)
3
COUNT
関数は,件数を返す.
RDBMS
と
SQL-
85
Slide86SELECT と 関数
userID
namescore0
Fukuda Yasuo
1
1
Abe Shinzo
1
2
Koizumi Junichiro
2
SELECT COUNT(ALL score)
FROM user_tbl;
COUNT(ALL score)
3
COUNT
関数は,件数を返す.
列名を指定しても良い.
RDBMS
と
SQL-
86
Slide87SELECT と 関数
userID
namescore0
Fukuda Yasuo
1
1
Abe Shinzo
1
2
Koizumi Junichiro
2
SELECT COUNT(DISTINCT score)
FROM user_tbl;
COUNT(DISTINCT score)
2
COUNT
関数は,件数を返す.
DISTINCT
を付けると
重複は
1
件として数える.
RDBMS
と
SQL-
87
Slide88SELECT と 関数
userID
namescore0
Fukuda Yasuo
1
1
Abe Shinzo
1
2
Koizumi Junichiro
2
SELECT COUNT(*)
FROM user_tbl WHERE score=1;
COUNT(DISTINCT score)
2
score=1
の件数を数える.
RDBMS
と
SQL-
88
Slide89SELECT と 関数
関数MAX()は,最大値を返す.関数MIN()は,最小値を返す.RDBMS
とSQL-89
Slide90練習
studentID
classscore0A
10
1
A
20
2
A
30
3
B
40
クラス
A
の学生
(3
人
)
の平均点を出す
SQL
文は?
4
B
50
5
B
60
表
"score_tbl"
RDBMS
と
SQL-
90
Slide91SQLのGROUP BY
Slide92GROUP BY
指定した列の値が同じなら,それらをまとめて1個のGROUPにすることが可能RDBMSとSQL-
92
Slide93GROUP BY の例
userID
classname0
M
fukuda
1
M
abe
2
M
koizumi
3
M
mori
4
O
obuchi
userID
class
name
0
M
fukuda
1
M
abe
2
M
koizumi
3
M
mori
4
O
obuchi
SELECT * FROM usertbl;
表
:usrtbl
RDBMS
と
SQL-
93
Slide94GROUP BY の例
userID
classname0
M
fukuda
1
M
abe
2
M
koizumi
3
M
mori
4
O
obuchi
SELECT class FROM usrtbl GROUP BY class;
表
:usrtbl
SELECT class FROM usrtbl;
class
M
M
M
M
O
RDBMS
と
SQL-
94
class
M
O
Slide95GROUP BY の例
userID
classname0
M
fukuda
1
M
abe
2
M
koizumi
3
M
mori
4
O
obuchi
class
M
O
SELECT class, count(class) FROM usrtbl GROUP BY class;
表
:usrtbl
count
4
1
RDBMS
と
SQL-
95
Slide96GROUP BY の例
userID
classname0
M
fukuda
1
M
abe
2
M
koizumi
3
M
mori
4
O
obuchi
SELECT * FROM usrtbl GROUP BY class;
表
:usrtbl
これは
ERROR!
userID
class
name
??
M
??
??
O
??
ここに表示すべき項目が,
定まらない!
fukuda? abe?
koizumi? mori?
RDBMS
と
SQL-
96
Slide97DISTINCT (GROUP BYと類似)
userID
classname0
M
fukuda
1
M
abe
2
M
koizumi
3
M
mori
4
O
obuchi
class
M
O
SELECT class FROM usrtbl GROUP BY class;
表
:usrtbl
SELECT class FROM usrtbl;
class
M
M
M
M
O
SELECT DISTINCT class FROM usrtbl;
RDBMS
と
SQL-
97
Slide98DISTINCTとGROUP BY
DISTINCTは単に重複データを削除するのみGROUP BYはグループ化し,その後集合関数を用いるのが一般的.
RDBMSとSQL-98
Slide99DISTINCTとGROUP BY
DISTINCT編
userIDclassname0
M
fukuda
1
M
abe
2
M
koizumi
3
M
mori
4
O
obuchi
表
:usrtbl
SELECT class FROM usrtbl;
class
M
M
M
M
O
SELECT DISTINCT class FROM usrtbl;
重複を削除
RDBMS
と
SQL-
99
class
M
O
Slide100DISTINCTとGROUP BY
GROUP BY編
userIDclassname0
M
fukuda
1
M
abe
2
M
koizumi
3
M
mori
4
O
obuchi
表
:usrtbl
userID
class
name
0
M
fukuda
1
abe
2
koizumi
3
mori
4
O
obuchi
"GROUP BY class"
によるグループ化
RDBMS
と
SQL-
100
Slide101DISTINCTとGROUP BY
GROUP BY編
表:usrtblをGROUP BY class
したもの
userID
class
name
0
M
fukuda
1
abe
2
koizumi
3
mori
4
O
obuchi
SELECT class FROM usrtbl GROUP BY class;
class
M
O
RDBMS
と
SQL-
101
Slide102DISTINCTとGROUP BY
GROUP BY編
表:usrtblをGROUP BY class
したもの
userID
class
name
0
M
fukuda
1
abe
2
koizumi
3
mori
4
O
obuchi
SELECT class, count(class) FROM usrtbl
GROUP BY class;
class
M
O
count
4
1
RDBMS
と
SQL-
102
Slide103GROUP BY
userID
classname0M
fukuda
1
M
abe
2
M
koizumi
3
M
mori
4
O
obuchi
表
:usrtbl
blood
A
B
A
O
A
SELECT class,blood FROM usrtbl
GROUP BY class, blood;
class
と
blood
が同じ
class
M
M
M
O
blood
A
B
O
A
←ここには
fukuda
と
koizumi
がある
←ここには
abe
がある
←ここには
mori
がある
←ここには
obuchi
がある
RDBMS
と
SQL-
103
Slide104GROUP BY
userID
classname0M
fukuda
1
M
abe
2
M
koizumi
3
M
mori
4
O
obuchi
表
:usrtbl
blood
A
B
A
O
A
SELECT class,blood,count(*)
FROM usrtbl GROUP BY class, blood;
class
と
blood
が同じ
class
M
M
M
O
blood
A
B
O
A
←
fukuda
と
koizumi
←
abe
←
mori
←
obuchi
count
2
1
1
1
RDBMS
と
SQL-
104
Slide105結合 JOIN
Slide106結合
2個の表を組み合わせて,別の表を作成する操作を「結合」という交差結合(CROSS JOIN)内部結合(INNER JOIN)左外部結合(LEFT OUTER JOIN)
右外部結合(RIGHT OUTER JOIN)全外部結合(FULL OUTER JOIN)RDBMSとSQL-106
Slide107交差結合
aID
012bID
表
"tblA"
表
"tblB"
0
1
4
tblB.bID
0
1
4
0
1
4
0
1
4
tblA.aID
0
0
0
1
1
1
2
2
2
CROSS JOIN
RDBMS
と
SQL-
107
Slide108内部結合
aID
012bID
表
"tblA"
表
"tblB"
0
1
4
tblB.bID
1
0
tblA.aID
0
1
INNER JOIN
ON
tblA.aID = tblB.bID
RDBMS
と
SQL-
108
Slide109左外部結合
aID
012bID
表
"tblA"
表
"tblB"
0
1
4
tblB.bID
1
0
tblA.aID
0
1
LEFT OUTER JOIN
ON
tblA.aID = tblB.bID
NULL
2
RDBMS
と
SQL-
109
Slide110右外部結合
aID
012
bID
表
"tblA"
表
"tblB"
0
1
4
tblB.bID
1
0
tblA.aID
0
1
RIGHT OUTER JOIN
ON
tblA.aID = tblB.bID
4
NULL
RDBMS
と
SQL-
110
Slide111全外部結合
aID
012bID
表
"tblA"
表
"tblB"
0
1
4
tblB.bID
1
0
tblA.aID
0
1
FULL
OUTER JOIN
ON
tblA.aID
=
tblB.bID
NULL
2
4
NULL
RDBMS
と
SQL-
111
Slide112交差結合 CROSS JOIN
表
"a"
id
0
1
2
表
"b"
name
fukuda
abe
id
0
0
1
name
fukuda
abe
1
2
2
fukuda
abe
fukuda
abe
CROSS JOIN
両表の
1
行ずつを組み合わせて
(
横に並べて
)
新しい表を作成.
全組み合わせ存在.
3
行
の
表と,
2
行
の
表を交差結合
すると,
3×2=6
行
に
なる.
RDBMS
と
SQL-
112
Slide113表a
と表bの交差結合を得るには,SELECT * FROM a CROSS JOIN b;SELECT * FROM a, b;交差結合
CROSS JOIN
表
"a"
id
0
1
2
表
"b"
name
fukuda
abe
id
0
0
1
name
fukuda
abe
1
2
2
fukuda
abe
fukuda
abe
CROSS JOIN
RDBMS
と
SQL-
113
id | name
----+--------
0 |
fukuda
0 |
abe
1 |
fukuda
1 |
abe
2 |
fukuda
2 |
abe
Slide114交差結合 CROSS JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
登録ユーザの表
各ユーザが入力した
TODO
データ
userID
0
0
0
1
1
1
2
2
2
name
fukuda
fukuda
fukuda
abe
abe
abe
koizumi
koizumi
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
0
1
2
0
0
2
組閣する
演説する
解散する
0
1
2
0
0
2
組閣する
演説する
解散する
CROSS JOIN
userID=1
と
userID=2
を
横に並べた行
.
あまり意味がない
RDBMS
と
SQL-
114
Slide115内部結合 INNER JOIN
交差結合のうち,条件にあうもののみを選択.
表"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
INNER JOIN on
usertbl.userID
= TODOtbl.userID
userID
0
0
2
name
fukuda
fukuda
koizumi
TODOID
0
1
userID
0
0
txt
組閣する
演説する
2
2
解散する
RDBMS
と
SQL-
115
Slide116内部結合 INNER JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
userID
0
0
0
1
1
1
2
2
2
name
fukuda
fukuda
fukuda
abe
abe
abe
koizumi
koizumi
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
0
1
2
0
0
2
組閣する
演説する
解散する
0
1
2
0
0
2
組閣する
演説する
解散する
INNER JOIN
on
usertbl.userID
=
TODOtbl.useriD
RDBMS
と
SQL-
116
Slide117内部結合 INNER JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
userID
0
0
2
name
fukuda
fukuda
koizumi
TODOID
0
1
userID
0
0
txt
組閣する
演説する
2
2
解散する
INNER JOIN
on
usertbl.userID
=
TODOtbl.userID
RDBMS
と
SQL-
117
Slide118内部結合 INNER JOIN
SELECT * FROM usertbl INNER JOIN TODOtbl on usertbl.userID = TODOtbl.userID;SELECT * FROM usertbl,
TODOtbl WHERE usertbl.userID = TODOtbl.userID;RDBMSとSQL-118
Slide119内部結合 INNER JOIN
SELECT対象の列を指定するには,表名を明記する.
SELECTTODOtbl.TODOID, TODOtbl.txt, usertbl.nameFROM TODOtbl INNER JOIN usertblON TODOtbl.userID = usertbl.userID;
name
fukuda
fukuda
koizumi
TODOID
0
1
2
txt
組閣する
演説する
解散する
RDBMS
と
SQL-
119
Slide120内部結合 INNER JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
SELECT * FROM usertbl INNER JOIN TODOtbl
on usertbl.userid = TODOtbl.userid;
userID | name | TODOID | userID | txt
--------+---------+--------+--------+--------
0 | fukuda | 0 | 0 |
組閣する
0 | fukuda | 1 | 0 |
演説する
2 | koizumi | 2 | 2 |
解散する
RDBMS
と
SQL-
120
Slide121外部結合
左外部結合,右外部結合,全外部結合とある.交差結合,内部結合と同様だが, 相手の表に対応するものが無い場合も表示される.対応するものが無い場合は,NULLで表示
RDBMSとSQL-121
Slide122左外部結合 LEFT OUTER JOIN
左外部結合は,(例え右の表に対応する行が無くても)
左の表の行は必ず表示される.右の表に対応する行が無い場合はNULLを表示SELECT * FROM tblA LEFT OUTER JOIN tblB on ...;左の表右の表RDBMSとSQL-
122
Slide123左外部結合 LEFT OUTER JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
SELECT * from usertbl LEFT OUTER JOIN TODOtbl
on usertbl.userID = TODOtbl.userid;
0
fukuda
1
abe
userID
name
0
1
0
0
組閣する
演説する
TODOID
userID
txt
該当なし
RDBMS
と
SQL-
123
2
koizumi
2
2
解散する
Slide124左外部結合 LEFT OUTER JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
SELECT * from usertbl LEFT OUTER JOIN TODOtbl
on usertbl.userID = TODOtbl.userid;
0
fukuda
1
abe
2
koizumi
userID
name
0
1
0
0
組閣する
演説する
TODOID
userID
txt
2
2
解散する
0
fukuda
NULL
NULL
NULL
RDBMS
と
SQL-
124
Slide125左外部結合 LEFT OUTER JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
SELECT * from TODOtbl LEFT OUTER JOIN usertbl
on TODOtbl.userID = usertbl.userid;
0
fukuda
2
koizumi
userID
name
0
1
0
0
組閣する
演説する
TODOID
userID
txt
2
2
解散する
0
fukuda
RDBMS
と
SQL-
125
Slide126左外部結合 LEFT OUTER JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
SELECT * FROM TODOtbl LEFT OUTER JOIN usertbl
on TODOtbl.userID = usertbl.userid;
0
fukuda
2
koizumi
userID
name
0
1
0
0
組閣する
演説する
TODOID
userID
txt
2
2
解散する
0
fukuda
RDBMS
と
SQL-
126
Slide127右外部結合 RIGHT OUTER JOIN
右外部結合は,(例え左の表に対応する行が無くても)
右の表の行は必ず表示される.左の表に対応する行が無い場合はNULLを表示SELECT * FROM tblA RIGHT OUTER JOIN tblB on ...;左の表右の表RDBMSとSQL-
127
Slide128右外部結合 RIGHT OUTER JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
SELECT * FROM usertbl RIGHT OUTER JOIN TODOtbl
on usertbl.userID = TODOtbl.userid;
0
fukuda
1
abe
2
koizumi
userID
name
0
1
0
0
組閣する
演説する
TODOID
userID
txt
2
2
解散する
RDBMS
と
SQL-
128
Slide129右外部結合 RIGHT OUTER JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
SELECT * FROM usertbl RIGHT OUTER JOIN TODOtbl
on usertbl.userID = TODOtbl.userid;
0
fukuda
1
abe
2
koizumi
userID
name
0
1
0
0
組閣する
演説する
TODOID
userID
txt
2
2
解散する
RDBMS
と
SQL-
129
Slide130右外部結合 RIGHT OUTER JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
SELECT * FROM TODOtbl RIGHT OUTER JOIN usertbl
on usertbl.userID = TODOtbl.userid;
0
fukuda
userID
name
0
1
0
0
組閣する
演説する
TODOID
userID
txt
1
abe
該当無し
RDBMS
と
SQL-
130
2
koizumi
2
2
解散する
Slide131右外部結合 RIGHT OUTER JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
SELECT * FROM TODOtbl RIGHT OUTER JOIN usertbl
on usertbl.userID = TODOtbl.userid;
0
fukuda
userID
name
0
1
0
0
組閣する
演説する
TODOID
userID
txt
1
abe
0
fukuda
NULL
NULL
NULL
2
koizumi
2
2
解散する
RDBMS
と
SQL-
131
Slide132全外部結合 FULL OUTER JOIN
全外部結合は,左外部結合と右外部結合の両方の要素が表示される.左の表に対応する行が無い場合は,左の表の列にNULLを表示右の表に対応する行が無い場合は,右の表の列にNULL
を表示RDBMSとSQL-132
Slide133全外部結合 FULL OUTER JOIN
表
"usertbl"
userID
0
1
2
name
fukuda
abe
koizumi
TODOID
0
1
2
userID
0
0
2
txt
組閣する
演説する
解散する
表
"TODOtbl"
SELECT * FROM usertbl FULL OUTER JOIN TODOtbl
on usertbl.userID = TODOtbl.userid;
3
4
公演する
RDBMS
と
SQL-
133
0
fukuda
1
abe
2
koizumi
userID
name
0
1
0
0
組閣する
演説する
TODOID
userID
txt
2
2
解散する
0
fukuda
NULL
NULL
NULL
3
4
公演する
NULL
NULL
Slide134関係代数
Slide135和両立
2個の表があり, 「両表の次数(列数)が等しい」かつ 「各列の意味が等しい」とき 「和両立」という.
名前福田安倍
小泉
連絡先
123-456
789-012
345-678
ユーザ名
小泉
森
電話番号
345-678
901-234
両表は
・列数が等しい
(
ともに
3
列
)
・各列の意味が等しい
ので,「和両立」である.
表
"
連絡表
"
表
"
ユーザ表
"
RDBMS
と
SQL-
135
Slide136和集合演算
和両立な表Rと表Sがあり,「和集合演算」とは以下の演算.それぞれの表の全行をあわせた表を作成する演算が「和集合演算」. ただし,重複する行は
1行にまとめる.集合論(RDBMS),では「同一の行が2回以上登場」することは許されない.実際は,RDBMSに全く同じ行を2個以上作成してもエラーにならないことが多い.「R∪S」と記述.論理和に近い感覚.RDBMSとSQL-136
Slide137和集合演算
名前
福田安倍小泉連絡先
123-456
789-012
345-678
ユーザ名
小泉
森
電話番号
345-678
901-234
表
"
連絡表
"
表
"
ユーザ表
"
名前
福田
安倍
小泉
連絡先
123-456
789-012
345-678
森
901-234
和集合演算
「小泉
,345-678
」が
2
回
登場することはない
RDBMS
と
SQL-
137
Slide138差集合演算
和両立な表Rと表Sがあり,「差集合演算」とは以下の演算.表Rから,「表Sに登場する行」を削除した表を作成するのが差集合演算.
「Sに登場するが,Rに登場しない行」は(削除対象が存在せず)削除されない.「R-S」と記述RDBMSとSQL-138
Slide139差集合演算
名前
福田安倍小泉連絡先
123-456
789-012
345-678
ユーザ名
小泉
森
電話番号
345-678
901-234
表
"
連絡表
"
表
"
ユーザ表
"
名前
福田
安倍
小泉
連絡先
123-456
789-012
345-678
差集合演算
←
"
連絡表
"
からこの行が削除された
森
901-234
←
この行は
"
連絡表
"
に無いので,
特に何も起きない.
RDBMS
と
SQL-
139
Slide140共通集合演算
和両立な表Rと表Sがあり,「共通集合演算」とは以下の演算.表Rと表Sの両方に登場する行で構成される表を作成するのが,共通集合演算.
「R∩S」と記述.論理積に近い感覚.RDBMSとSQL-140
Slide141共通集合演算
名前
福田安倍小泉連絡先
123-456
789-012
345-678
ユーザ名
小泉
森
電話番号
345-678
901-234
表
"
連絡表
"
表
"
ユーザ表
"
名前
小泉
連絡先
345-678
共通集合演算
RDBMS
と
SQL-
141
Slide142直積演算
前述の交差結合をおこなうこと.演算対象の表Rと表Sは和両立である必要はない.「R×S」と記述.
RDBMSとSQL-142
Slide143直積演算
名前
福田安倍小泉連絡先
123-456
789-012
345-678
商品名
牛乳
ジュース
価格
100
120
表
"
連絡表
"
表
"
商品表
"
直積集合演算
名前
福田
安倍
小泉
連絡先
123-456
789-012
345-678
福田
安倍
小泉
123-456
789-012
345-678
商品名
牛乳
ジュース
価格
100
120
牛乳
ジュース
100
120
牛乳
ジュース
100
120
RDBMS
と
SQL-
143
Slide144射影演算
表から特定の列を抜き出す演算SELECT ?? FROM ...;
ここで行っている.RDBMSとSQL-144
Slide145射影演算
名前
福田安倍小泉連絡先
123-456
789-012
345-678
表
"
連絡表
"
射影演算
名前
福田
安倍
小泉
RDBMS
と
SQL-
145
Slide146選択演算
表から特定の行を抜き出す演算SELECT * FROM WHERE ??;
ここで行っている.RDBMSとSQL-146
Slide147射影演算
名前
福田安倍小泉連絡先
123-456
789-012
345-678
表
"
連絡表
"
選択演算
名前
安倍
小泉
連絡先
789-012
345-678
RDBMS
と
SQL-
147
Slide148結合演算
「結合演算」とは, 表Rと表SがありR×S(直積)の中から
それぞれの属性値を用いて特定の行を選択したもの.演算対象の表Rと表Sは和両立である必要はない.前述のSQLの結合演算.RDBMSとSQL-148
Slide149商演算
表Rと表Sの商演算は,「R÷S」と記述. Rの列数>Sの列数であることが必要.
説明は,次スライドの例を用いて行う.代数的定義はR÷S={ t | t∈R ∧ (∀u∈S)((t , u)∈R) }RDBMSとSQL-149
Slide150商演算
ユーザ
福田安倍小泉趣味
A
B
A
趣味
A
B
表
"
ユーザ趣味表
"
表
"
趣味表
"
名前
福田
小泉
商演算
福田
B
安倍
C
小泉
B
小泉
C
表
"
ユーザ趣味表
"
から,
「趣味
A
」と「趣味
B
」を両方持つ
ユーザを捜してくること.
RDBMS
と
SQL-
150