Formal Method Group IS-FMG, T,I,T, All Rights Reserved, 2008
データベース理論入門
November 13, 2008
担当:飯島淳一
参考 増永良文、「リレーショナルデータベース入門」、サイエンス社、2002.きょうのポイント
データベースと何か
実体-関連モデル(問題)
リレーショナルデータモデル(問題と小テスト)
関係代数(小テスト)
見える化(
visualization)
3ビジネス
情報
行為 (ビジネスにおける活動) 「もの」と「こと」 写像 情報システム 鏡像として 現実世界を把握 意思決定 早く、速く“Mieruka”is identifying problems and bringing them to the foreground.
http://www.toyota.co.jp/en/news/06/0101.html Formal Method Group IS-FMG, T,I,T, All Rights Reserved, 2008
データベースとは何か
DBMS
OS DB
データと情報
処理
(選択・加工)
データ
情報
関心・評価基準
意味付与
データベースとは
DBMS OS DB APLプログラム エンドユーザ ファイルとDBの違い ファイル:APLに付随したデータ群 データベース:APLと切り離したデータ群 データの一貫性 アクセス権限 機密保護データベースの歴史
1963年
IDS(Integrated Data Store)
1960年代 CODASYL(the Conference on Data
Systems Language)の活動
1971年
ネットワークデータモデルの提案
1970年代 E,F,Coddによるリレーショナルデータ
モデルの提案
1980年代 RDBシステムの実用化
階層データモデルの提案
1990年代 オブジェクト指向DBシステム
データモデル
概念モデル
実世界のデータ構造と制約の記述
1976年にPeter Chenによって提案された
実体-関連
(
ER)モデル
が代表的
対象を実体、関連、属性で記述
論理モデル
管理可能な表現
データモデル
9
リレーショナル(関係)型
9
ネットワーク型
9
ヒエラルキカル(階層)型
9
オブジェクト指向型
実世界 概念 モデル 論理 モデルFormal Method Group IS-FMG, T,I,T, All Rights Reserved, 2008
実体ー関連モデル
教員 学生 科目 教員名 職種 給与 学籍番号 学生名 住所 担当 履修 得点 科目名 単位数 1 M N N実体-関連モデル
実世界を
実体
(entity)と実体間の
関連
(relationship)
として認識することによって得られるモデル
「学生のA君」という具体的な実体ではなく、「学生」と
いう
実体型
(entity type)として、また「A君が情報シ
ステム基礎実験という授業を申告している」という具
体的な関連ではなく、「申告する」という
関連型
(relation type)として認識
各々はそれぞれを特徴付ける
属性
(attribute)を持つ
属性の中でその実体を唯一に識別できる属性集合
で極小なものを
主キー
と呼ぶ、
実体-関連(
ER)モデルの例
教員 学生 科目 教員名 職種 給与 学籍番号 学生名 住所 担当 履修 得点 科目名 単位数 1 M N N 多重度 1:1(一対一) 1:N(一対多) N:1(多対一) M:N(多対多問題
1
身の回りの実世界から、諸君が関心を持って
いる対象に注目することにより、2つの実体
(各実体の属性は、3つ程度)とその間の一つ
の関連(関連の属性は、1つ程度)を抽出し、
実体-関連モデルとして表現せよ。
Formal Method Group IS-FMG, T,I,T, All Rights Reserved, 2008
リレーショナルデータモデル
商品 納品 商品番号 商品名 定価 商品番号 顧客番号 納品数量 G1 テレビ 198,000 G1 C1 3 G2 洗濯機 59,800 G1 C2 10 G3 テレビ 98,000 G2 C2 5 G2 C3 10 G3 C3 2 顧客 顧客番号 顧客名 C1 A商店 C2 Bマート C3 C社リレーション
ドメイン
(domain):定義域、集合、一般にD
iで表記
直積
(Cartesian Product):D=D
1×・・・×D
n
リレーション
(関係)R:D
1,・・・,D
n上の関係とは、
直積D
1×・・・×D
nの部分集合(以降では有限集合に
ついて考える)
リレーションRの
タプル
(tuple):Rの要素
リレーションRの
濃度
(cardinality):Rの要素数
リレーションRの
次数
(degree):Rが定義されている
直積を構成するドメイン数
次数1 単項
次数n n項
リレーションはテーブル表示が可能
問題
2
D
1
={1,2}, D
2
={a,b,c}, D
3
=D
1
とするとき、この
上の3項関係Rの例を作れ。
Rの濃度は何か?
代表的なタプルをひとつあげよ?
属性名とリレーション名
データの解釈はリレーションの設計時に決定してい
る。
各列(カラム)のデータの属性を
属性名
と呼び、リ
レーションにも名前(
リレーション名
)をつける。
たとえば、D
1={x|xは人名},D
2=INTEGERとし、
R={(太郎,25),(一郎,30),(花子,26),(桃子,22)}と
するとき、Rの第1カラムの属性名は“名前”であり、第
2カラムの属性名は“年令”であると考えることができ
る。また、このリレーション名を“友人”と考えることが
できる。
リレーションR⊂D
1×・・・×D
nの属性名をA
1,…,A
nと
するとき、dom(A
i)=D
iで表す。
リレーションスキーマとインスタンス
具体的なテーブルの中身としてのタプルは、
変わりうるが、リレーション名や属性名は不変
と考えられる。
そこで、これらをまとめて、
リレーションス
キーマ
(relation schema)と呼び、ある時点で
の具体的なテーブルを
インスタンス
と呼ぶ。
たとえば、友人(名前,年齢)は2つの属性を持
つリレーションスキーマであり、先のRはその
インスタンスである。
ERモデルからRDBスキーマへの変換
実体型の変換
E(K,A
1
,…,A
m
)を実体型とする。ただし、Kは
主キーである。このとき、Eはリレーションス
キーマR
E
(K,A
1
,…,A
m
)に変換される。
関連型の変換
1対1関連型
1対多関連型
多対1関連型
多対多関連型
主キー
候補キー(candidate key):リレーションのタプルを識別できる属性(unique identifier))の組の中で、極小(minimal)となるもの。 候補キーの中で、空値(null value)を取らないものをひとつ選んで、それを主 キー(primary key)と呼ぶ。 リレーションスキーマでは、下線を引いて主キーを表す:R(・・・,Ak1,・・・,Ak2,・・・,Akm,・・・)
社員 社員番号 社員名 給与 所属 健保番号 0650 鈴木一郎 50 K55 80596 1508 浜崎アユ 40 K41 81403 0231 宇田ひかる 60 K41 80201 2034 鈴木一郎 40 K55 81998 社員(社員番号,社員名,給与,所属,健保番号) 例:リレーションスキーマと主キー
例:主キー
社員 社員番号 社員名 給与 所属 健保番号 0650 鈴木一郎 50 K55 80596 1508 浜崎アユ 40 K41 81403 0231 宇田ひかる 60 K41 80201 2034 鈴木一郎 40 K55 81998•社員名は候補キー?
•社員番号は候補キー?
社員(社員番号,社員名,給与,所属,健保番号)
外部キー
社員(社員番号、社員名、給与、所属)と部門(部門
番号、部門名、部門長)を考えるとき、社員の所属は、
必ず部門の主キーである部門番号の値として出現
するし、部門の部門長は必ず社員の主キーである社
員番号の値として出現する。
このとき、所属は部門の、部門長は社員の
外部キー
であると呼ぶ。
形式的には、2つのリレーションスキーマ
R(A
1,…,A
m), S(B
1,…,B
n)において、A
iがSの
外部
キー
であるとは、R,Sを各々R,Sの任意のインスタン
ス、tをRの任意のタプルとするとき、Sのあるタプルu
が存在して、u[B
1]=t[A
i]となっていることである。
1対1関連型
R(C1,…,Cp)を2つの実体型EL(K,A1,…,Am)とER(H,B1,…,Bn)の1対1関連型
とする。このとき、RはリレーションスキーマRR(K,H,C1,…,Cp)あるいは RR’(K,H,C1,…,Cp)に変換される。このとき、KあるいはHは各々EL,ERの主 キーと外部キーとなる。 EL K A1 A2 ER H B R C1 1 1 RR K H C1 RR’ K H C1
1対多関連型
R(C1,…,Cp)を2つの実体型EL(K,A1,…,Am)とER(H,B1,…,Bn)の1対多関連型
とする。このとき、RはリレーションスキーマRR(K,H,C1,…,Cp)に変換され、H は主キーとなる。 このとき、HはERの外部キーともなる。 EL K A1 A2 ER H B R C1 1 N RR K H C1
多対
1関連型
R(C1,…,Cp)を2つの実体型EL(K,A1,…,Am)とER(H,B1,…,Bn)の多対1関連型
とする。このとき、RはリレーションスキーマRR(K,H,C1,…,Cp)に変換され、K が主キーとなる。 このとき、KはELの外部キーともなる。 EL K A1 A2 ER H B R C1 N 1 RR K H C1
多対多関連型
R(C1,…,Cp)を2つの実体型EL(K,A1,…,Am)とER(H,B1,…,Bn)の多対多関連
型とする。このとき、RはリレーションスキーマRR(K,H,C1,…,Cp)に変換され、 {K,H}は主キーとなる。 このとき、HとKは各々EL,ERの外部キーとなる。 EL K A1 A2 ER H B R C1 M N RR K H C1
例:
ERからRDBスキーマへの変換
学生
学籍番号
学生名
住所
履修
学籍番号
科目名
得点
科目
科目名
単位数
学生 学籍番号 学生名 住所 科目 科目名 単位数 履修 得点 外部キー 外部キー M NFormal Method Group IS-FMG, T,I,T, All Rights Reserved, 2008
関係代数
リレーションスキーマのインスタンスは、リレーション、すなわ ち、数学的関係である。数学的関係は、集合の直積の部分集 合である。よって、集合演算などの代数演算が可能となる。関係データ操作言語の基本概念
データ操作言語(DML-Data Manipulation
Language)
ユーザの要求
RDBに質問(query)をして、結果を求める。
RDBを更新する。
28 RDB DML ユーザ関係代数
標準に用いられる4つの集合演算
和
(union)
差
(difference)
積(intersection):差で実現可能
直積
(product)
関係代数固有の4つの演算
射影
(projection)
選択
(selection)
結合(join) (自然結合) :直積と選択で実現可能
商(quotient):直積、射影、差で実現可能
29和
(union)
定義
R∪S={t | t∈R ∨ t∈S}
例
30 テニス部員∪サッカー部員 氏名 所属 連絡先 鈴木一郎 K55 5643-3192 浜崎アユ K41 5591-0585 別所幸治 K55 5274-5201 宇田ひかる K41 5989-3201差
(difference)
定義
R-S={t | t∈R ∧ t∈S}
例
テニス部員-サッカー部員 氏名 所属 連絡先 浜崎アユ K41 5591-0585 別所幸治 K55 5274-5201 31直積
(product)
R(A1,…,An),S(B1,…,Bm)に対し、RとSの直積を次のように定める: R×S={(r,s) | r∈R ∧ s∈S } 32 社員 社員番号 氏名 給与 所属 0650 鈴木一郎 50 K55 1508 浜崎アユ 40 K41 0231 宇田ひかる 60 K41 2034 別所幸治 40 K55 部門 部門番号 部門名 部門長 K55 データベース 0650 K41 ネットワーク 1508 社員×部門 社員。社員番号 社員。氏名 社員。給与 社員。所属 部門。部門番号 部門。部門名 部門。部門長 0650 鈴木一郎 50 K55 K55 データベース 0650 0650 鈴木一郎 50 K55 K41 ネットワーク 1508 1508 浜崎アユ 40 K41 K55 データベース 0650 1508 浜崎アユ 40 K41 K41 ネットワーク 1508 0231 宇田ひかる 60 K41 K55 データベース 0650 0231 宇田ひかる 60 K41 K41 ネットワーク 1508 2034 別所幸治 40 K55 K55 データベース 0650 2034 別所幸治 40 K55 K41 ネットワーク 1508射影
(projection)
R(A1,…,An)を関係とし、X= {Ai1,…,Aik} ⊂ {A1,…,An}とするとき、RのX上の 射影R[X]を次のように定める:
R[X]={u | u∈dom(Ai1)×・・・×dom(Aik)∧
(∃t)(t[Ai1]=u[Ai1]∧・・・∧t[Aik]=u[Aik])}
「関係の縦方向への切出し」 33 供給 供給元 部品 供給先 A11 P101 K55 A11 P102 K51 A11 P102 K41 A12 P102 K41 A12 P103 K51 A13 P101 K41 A13 P102 K51 A13 P103 K51 供給[供給元、部品] 供給元 部品 A11 P101 A11 P102 A12 P102 A12 P103 A13 P101 A13 P102 A13 P103
選択
(selection)
R(A1,…,An)を関係とするとき、属性AiとAjがθ-比較可能であるとは、
1. dom(Ai)=dom(Aj) (ドメインが一致)
2. 任意のタプルtに対して、 t[Ai]θt[Aj]の真偽が常に定まる。
θは具体的には、 >, ≧, =, ≦, <, =とする。
θ-選択演算の定義
R[AiθAj]={ t | t∈R∧t[Ai] θt[Aj]}
34 商品 商品番号 商品名 原価 売価 定価 G110 刺身 600 500 980 G120 豆腐 90 75 120 G130 卵 95 100 140 G140 コーヒー豆 700 860 860 G150 ケーキ 200 250 300 商品[原価>売価] 商品番号 商品名 原価 売価 定価 G110 刺身 600 500 980 G120 豆腐 90 75 120
1
1情報システム基礎実験
第5回
データベースの基礎
参考文献: http://www.rfs.jp/sitebuilder/sql/index.html (第4章SQL構文) 山田和夫 (著) 『基礎からのPHP』, ソフトバンククリエーティブ(2007) 2 会員番号 氏名 〒 住所 誕生日 KU3B005 前原 美紀 260-0855 千葉県千葉市中央区市場町1-1 1928/6/1 KU3B008 武田 陽子 910-0005 福井県福井市大手3-17-1 1945/8/18 KU3B006 古石 理絵 160-0023 東京都新宿区西新宿2-8-1 1957/1/12 KU3B007 下山 美歌子 231-0021 神奈川県横浜市中区日本大通1 1966/11/28 KU3B004 豊岡 可織 336-0011 埼玉県浦和市高砂3-15-1 1975/7/31 KU3B009 桝岡 由子 420-0853 静岡県静岡市追手町9―6 1976/6/29 KU3B001 井上 佑介 310-0011 茨城県水戸市三の丸1-5-38 1941/5/30 KU3B003 小田 学 371-0026 群馬県前橋市大手町1-1-1 1961/1/31 KU3B010 室内 昌明 460-0001 愛知県名古屋市中区三の丸3-1-2 1963/8/29 KU3B002 大槻 隆男 320-0027 栃木県宇都宮市塙田1-1-20 1972/2/4フィールド(列,性質,プロパティ)
レコード (行)
テーブル (表)
用語の説明:テーブル,レコード,フィールド
リレーショナルデータモデルのタブルに対応する リレーショナルデータモデルのインスタンスに対応する リレーショナルデータモデルのドメインタブルに対応する 3用語の説明(SQL,DBMS,ライブラリ)
• DBMS(DataBase Management System) はデータベー
スを管理し、データに対するアクセス要求に応えるソフトウェ
アで,mySQLも一種のDBMSである。
• SQL(Structured Query Language)はデータベースと会
話するための言語だと理解すればよい。SQLを使って,
DBMS(テータベース管理システム)に対し,こんなことを伝
えることができる:
– データを格納すべき表の定義
– 複数の表を関連づけるための規約や制約
– データベースに必要な機密保護の宣言
– 表に対するデータの登録・修正・削除
– 表中のデータを検索
4DBMSの仕組み
a 3 a 2 a 1 a 3 a 2 a 1 Table 2 Table 3 Table 1 データベースB a 3 a 2 a 1 a 3 a 2 a 1 Table 2 Table 1 データベースADataBase Management System
SQL(Structured Query Language)で会話し, データの検索,登録,修正 などを行う
2
5PHPとmySQLの連携
phpプログラム a 3 a 2 a 1 a2 a3 a 1 Table 2 Table 3 Table 1 データベースB a 3 a 2 a 1 a 3 a 2 a 1 Table 2 Table 1 データベースA mySQLで管理されているデータベース ① 私はlocalhostにいる matsui というユーザです。 私のパスワードは hideki です。 接続させてください。 $my_con = mysql_connect($hostname,$yourname,$password) ② 接続OKです。 ③ データベースAに接続させてください。 mysql_select_db($db_name,$my_con); ④ 命令○○を実行してください。 mysql_query($query); ⑤ どうもありがとう。仕事が完了しまし たので,接続を切って下さい。 mysql_close($my_con) ⑥ 接続を切りました。 6重要なSQL文
データベース操作:CREATE DATABASE (データベースの作成),
DROP DATABASE (データベースの削除),USE
(データベースを指定),
テーブル操作:
CREATE TABLE
(テーブルの作成),DROP TABLE (テーブ
ルの削除) ,
データ操作:
INSERT
(行の挿入),
UPDATE
(行の更新) ,
DELETE
(行の削除)
データ検索、集約:
SELECT
(行の抽出),
FROM
,
WHERE
,
ORDER BY
,
GROUP BY,JOIN
SQLの例
SELECT
フィールド名
FROM
テーブル名
WHERE
条件文
(指定したテーブルの中から,条件文を満たすレコードを抽出し,指定した
フィールドを表示する)
7USE文で利用するデータベースを宣言
データベースの操作する前に、まず、DBMSに、これからどのデータベース
を利用するかを伝える必要がある。 今後のグループワークを含め、情報シ
ステム基礎実験で使うのは 「iskiso」 というデータベースですので、最初
に、下記SQL文を実行する必要がある。
USE iskiso;
※ このスライドでは、分かりやすいように、 SQL文予約語は全て大文字で表示 していますが、 通常SQL文の予約語の大文字/小文字は区別されません。 USE iskiso を実行しても、use iskiso を実行しても、結果が変わりません。8
CREATE TABLE文:テーブルを作る
CREATE TABLE <テーブル名>
(
<カラム名> <型> <オプション>,
<カラム名> <型> <オプション>,
…
)
MySQLでは、カラム名(列の名前)として、半角英数 字及び_ が使えます。(DBMSによっては、日本語が 使える場合もある) MySQLでよく使うデータ型は: VARCHAR:可変長文字 INT:32bitの整数型 DATETIME :日時 型は、ソートするときの順番に影 響します。例えば、IDというカラム の型をINTと指定すると、ID=2の 行がID=12の行の前にくるが、型 を VARCHARと指定すると、 12が2の前にきます MySQLでは、以下のオプションを指定できる: PRIMARY KEY: このカラムは主キーである NOT NULL: 値が空であってはならない AUTO_INCREMENT : 自動的な連番とする3
9
CREATE TABLEの例
CREATE TABLE IF main_customer (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(32),
age INT,
gender INT,
prefecture VARCHAR(20),
telephone varchar(32),
company varchar(64)
)
main_customer id INT(11) name VARCHAR(32) age INT(11) gender INT(11) prefecture VARCHAR(20) telephone VARCHAR(32) company VARCHAR(64) main_customer id INT(11) name VARCHAR(32) age INT(11) gender INT(11) prefecture VARCHAR(20) telephone VARCHAR(32) company VARCHAR(64)id name age gender prefecture telephone company 1 木村尚志 53 1 東京都 03-5324-0000 (有)山田電算 2 田中仙市 27 1 千葉県 043-1234-0000(株)テラソフト 3 鈴木良美 31 2 千葉県 043-1234-0000(株)テラソフト 4 吉田盛朗 25 1 埼玉県 048-1234-0000個人事業主 ... 10
INSERT文:行の挿入
例INSERT INTO main_customer (name, age, gender, prefecture, telephone, company) VALUES (
'木村尚志',53,'1','東京都','03-5324-0000','(有)山田電算');
INSERT INTO main_customer (name, age, gender, prefecture, telephone, company) VALUES (
'田中仙市',27,'1','千葉県','043-1234-0000','(株)テラソフト');
INSERT INTO main_customer (name, age, gender, prefecture, telephone, company) VALUES (
'鈴木良美',31,'2','千葉県','043-1234-0000','(株)テラソフト');
INSERT INTO main_customer (name, age, gender, prefecture, telephone, company) VALUES (
'吉田盛朗',25,'1','埼玉県','048-1234-0000','個人事業主'); id name age gender prefecture telephone company 1 木村尚志 53 1 東京都 03-5324-0000 (有)山田電算 2 田中仙市 27 1 千葉県 043-1234-0000(株)テラソフト 3 鈴木良美 31 2 千葉県 043-1234-0000(株)テラソフト 4 吉田盛朗 25 1 埼玉県 048-1234-0000個人事業主
INSER INTO <テーブル名> ( <カラム名> ) VALUES ( <値> )
11
SELECT文:データの抽出
全顧客の氏名、年齢を抽出する例:
SELECT name, age FROM main_customer;
SELECT <カラム名>,
<カラム名>, … FROM <テーブル名>[WHERE節]
[GROUP BY
節] [HAVING
節] [ORDER BY
節]
WHERE節でデータを絞り込み
ORDER BY節で並べ替える
20歳以上で30未満の顧客の氏名、年齢を抽出し、 氏名の昇順、年齢の降順で出力する例:
SELECT name, age FROM main_customer WHERE age >= 20 AND age < 30 ORDER BY name ASC, age DESC;
実行すると、2件のデータ が抽出される 田中仙市 27 吉田盛朗 25 関係代数の「選択(selection)に対応する」 12
MySQLを使ってみる
4
13[注意] このページは使わない
(誤ってパスワードを変更する恐れがある)
• ハッスルサーバーにログ
インし、左メニューの
[MySQL]をクリックすると
左記画面が出ます。
• これは
「パスワード変更画
面」
です。「ログイン画面」
ではありません。
• 誤ってパスワードを変更
する恐れがあるので、
こ
のページを使わない
でく
ださい。
14MySQL演習での注意事項
• 他人のデータを誤って変更することがないよう、下記命名ルール
に従って、テーブル名をつけて下さい。
– 二人一組で演習する際、自分のチーム番号をテーブル名の先頭につけ
てください(例:チーム1が使うテーブルなら、名前を 1test, 1kaikei など
にする)。
– グループワークでMySQLを使う際、0に続くグループの番号をテーブル名
の先頭につけてください。 (例: 4班「挽きたて微糖」のテーブルなら、名
前を 04test, 04kaikei などにする)
• SQL文を実行するとき、細心の注意を払って、テーブル名をよく
確認しましょう。
• グループワークの際、データが壊れてもすぐ復旧できるよう、
バックアップをしっかりやりましょう。
15演習の準備
• TeraPadを起動し、ファイル memo.txt を作って ください。これから実行するSQLはこのファイルの 中で編集します。今後、グループワークでSQLを 実行する場合も、必ず、テキストファイルとして編 集し、実行したSQL文をファイルの中で保存してく ださい。(そうすれば、データが壊れた場合、迅速 に復旧できます。) • utf-8 がガジェットの標準的な文字コードです。こ れから作るデータの文字コードを全てutf-8にしま しょう。そのために、「文字/改行コード指定保 存」の操作をし、文字コードをUTF-8に変更してく ださい。 • サーバ上のMySQLを操作するためのWebペー ジのURLは以下です。ブラウザを起動し、この ページにアクセスし、ブックマークしておく (念の ために、演習時に常にもってくる「備忘録」にも、 このURLをメモしてください。)https://www.hustle.ne.jp/phpmyadmin/
16MySQL操作画面(phpMyAdmin)へ
のログイン手順
1.
一番上の[言語欄]を「日本語-Japanese (utf-8)」に変更する
2.
[サーバの選択]欄を 「mysql3.naid.jp 」に変更する
3.
ホワイトボードに書かれているID、パスワードを入力する
4.
[実行する] をクリック
※phpMyAdminにログイン後 30分以上操作がないと 自動的にphpMyAdminから ログアウトされる。その場合、 再度ログインしてから使ってください。5
17 ログインできたら、SQLアイコンをクリックし、SQLタブ で、USE iskiso; を入力し、実行してください。 18CREATE TABLE文を使ってみる
下記SQL文を入力し、性別を管理するテーブル「gender」を作ろう。(TeraPadで SQL文を編集し、コピー・ペーストを使って、phpMyAdminで実行してください。) ※genderの前に、二人一組演習のチーム番号をつけてください。 例: チーム1の場合、テーブル名は 1genderCREATE TABLE 1gender (
id INT PRIMARY KEY, name VARCHAR(32) ) チーム番号 gender gender id INT(11) name VARCHAR(32) id INT(11) name VARCHAR(32) main_customer id INT(11) name VARCHAR(32) age INT(11) gender INT(11) prefecture VARCHAR(20) telephone VARCHAR(32) company VARCHAR(64) main_customer id INT(11) name VARCHAR(32) age INT(11) gender INT(11) prefecture VARCHAR(20) telephone VARCHAR(32) company VARCHAR(64) gender = id 19
CREATE TABLE文の実行画面
20CREATE TABLE文実行結果画面
SQLが正常に実行したかどう かが表示される。6
21SQL文が正常に実行されなかった場合
エラーのときは、MySQLからのメッセージをよく読み、理解したうえで、 SQL文を見直し、[戻る] を使って前の画面に戻り、修正したSQL文 を再度実行する。 22下記INSERT文を実行してみよう
(テーブル名は各自のものに変えてください)
INSERT INTO 1gender (id,name) VALUES (1, '男性');
INSERT INTO 1gender (id,name) VALUES (2, '女性');
チーム番号 23
INSERT文の実行結果
INSERT 文、DELETE文、UPDATE文を実行 すると、変更された行数も結果として表示される。 24SELECT文を使ってみよう
20歳以上で30未満の顧客の氏名、年齢を抽出し、氏名の昇順、年齢の降順で出力する SQL文を実行してみてください。SELECT name, age FROM main_customer
WHERE age >= 20 AND age < 30
ORDER BY name ASC, age DESC;
phpMyAdminでは、データベースか ら先に出力された行が下に表示さ れるので、指定した順番の逆のよう にみえる。
7
25GUIを使う
SQL文実行結果画面で、データベースの構造をGUIで確認することもできる。 左メニュにあるテーブル名をクリックしてみよう。 GUI画面で、[表示]タブを使うと、テーブルの中身のデータを見れる。また、構造タブ を使うと、カラムの一覧を見れる。 26PHPとmySQLの連結
データベースにアクセスする
PHPプログラムを作ってみよう
27解説:ログイン
$conn = mysql_connect("mysql3.naid.jp","iskiso","w93f311")
or die ('DB Connection Error= '. mysql_error());
mysql_query("SET NAMES 'urf-8'", $conn);
これは、phpMyAdminでのログイン操作に相 当する部分。 ログインが成功すると、 $conn を使って、 データベース操作を行える。 28
解説:データベース操作
mysql_select_db("iskiso", $conn);
これは、phpMyAdminで USE iskiso; 文を実 行するのに相当する部分。
$sql = "SELECT * FROM main_customer";
$rs = mysql_query($sql, $conn);
これは、phpMyAdminでクエリーを実行する のに相当する部分。 実行した結果が$rs に代入される 1 木村尚志 53 1 東京都 03-5324-0000 (有)山田電算 2 田中仙市 27 1 千葉県 043-1234-0000(株)テラソフト 3 鈴木良美 31 2 千葉県 043-1234-0000(株)テラソフト 4 吉田盛朗 25 1 埼玉県 048-1234-0000個人事業主誤:
urf-8
正:
utf-8
8
29
解説:結果表示
echo "<TABLE border=1>";
while ($row = mysql_fetch_assoc($rs))
{
echo "<TR>";
foreach ($row as $key => $val)
{
echo "<TD>$key=<b>$val</b></TD>";
}
echo "</TR>";
}
echo "</TABLE>";
これは、$rs に代入されたデータ をHTML形式で表示する部分。 1 木村尚志 53 1 東京都 03-5324-0000 (有)山田電算 2 田中仙市 27 1 千葉県 043-1234-0000(株)テラソフト 3 鈴木良美 31 2 千葉県 043-1234-0000(株)テラソフト 4 吉田盛朗 25 1 埼玉県 048-1234-0000個人事業主 <TABLE border=1> <TBODY> <TR> <TD>id=<B>1</B></TD> <TD>name=<B>木村尚志</B></TD> <TD>age=<B>53</B></TD> <TD>gender=<B>1</B></TD> <TD>prefecture=<B>東京都</B></TD> <TD>telephone=<B>03-5324-0000</B></TD> <TD>company=<B>(有)山田電算</B></TD></TR> ... </TBODY></TABLE> 30 <HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <TITLE>MySQL</TITLE></HEAD>
<BODY> <?php
$conn = mysql_connect("mysql3.naid.jp","iskiso","w93f311") or die ('DB Connection Error= '. mysql_error());
mysql_query("SET NAMES 'urf-8'", $conn); mysql_select_db("iskiso", $conn); $sql = "SELECT * FROM main_customer"; $rs = mysql_query($sql, $conn); echo "<TABLE border=1>"; while ($row = mysql_fetch_assoc($rs)) {
echo "<TR>";
foreach ($row as $key => $val) { echo "<TD>$key=<b>$val</b></TD>"; } echo "</TR>"; } echo "</TABLE>"; mysql_close($conn); ?> </BODY> </HTML>