情報科学III

平成22年度 情報科学III (理系コア科目・2年生)
SQL データベースアクセスのた
めの文法と MySQL
担当 岡村耕二
月曜日 2限
http://okaweb.ec.kyushu-u.ac.jp/lectures/jk3/
本資料の一部は、堀良彰准教授、天野浩文准教授、菅沼明准
1
教授等による以前の講義資料をもとにしています。
キーに関する補足
 ひとつのテーブルには,複数のキーが存在してもよい.
(キーが複数のカラムからなる,という意味ではなく,キーとなりう
るカラム集合が複数ある,ということ)
– その場合,キーのうちのひとつを主キー(primary key)と呼
ぶ.
 一部のカラムの値を決めただけではレコードが一意に決まらな
い場合でも,そのテーブルのすべてのカラムをまとめたものは,
必ずキーとなる.
 実世界では,「氏名」や「会社名」などは,必ずしもキーとはなら
ない.
– 同姓同名の人,同名の会社などはたくさん存在する.
– そのような場合,個人番号,会社番号といった,必ず一意に
なるカラムを別に定めることが多い.
2
リレーショナルデータベース言語SQLの基礎
(つづき)
3
SQLの機能の便宜的な分類(再)
 問い合わせ機能
SELECT 文という
– SELECT ~ FROM ~ WHERE
 データ操作機能
– INSERT 文
– UPDATE 文
– DELETE 文
今日やること:
 データ定義機能
文法の座学+MySQL での実習
– CREATE 文
– DROP 文
– ALTER 文
 その他
– ユーザ管理
– セッション管理
4
INSERT 文
 機能
– テーブルにレコードを挿入(追加)する.
 3種類の構文
– カラムの値を指定して1行(レコード)だけ挿入
INSERT [INTO] テーブル名
SET カラム=値[,カラム=値, ... ]
– 複数行も一度に挿入
INSERT [INTO] テーブル名
VALUES(値[, 値, ... ])[, (値[, 値, ... ]), ...]
– SELECT 文の結果を一度に挿入
5
UPDATE 文
 機能
– テーブル内のレコードの値を変更する.
 構文・意味に SELECT 文と類似性がある.
– WHERE 句がない場合は,テーブルのレコードをすべて変更
してしまう.
UPDATE テーブル名
SET カラム=値[,カラム=値, ... ]
[WHERE 条件式 ]
 UPDATE 文を実行する前に,同じ WHERE 句を持つ SELECT
文を実行して,どのようなレコードが影響を受けることになるの
か,確認すべき.
– UPDATE 文の実行時に「よろしいですか?」なんて聞いてく
れない.
6
DELETE 文
 機能
– テーブル内のレコードを削除する.
 構文・意味に SELECT 文・ UPDATE 文と類似性がある.
– WHERE 句がない場合は,テーブルのレコードをすべて削除
してしまう.
DELETE [FROM] テーブル名
[WHERE 条件式 ]
 DELETE 文を実行する前に,同じ WHERE 句を持つ SELECT
文を実行して,どのようなレコードが影響を受けることになるの
か,確認すべき.
– DELETE 文の実行時にも,「よろしいですか?」なんて聞い
てくれない.
7
CREATE 文
 機能
– データベースを新規作成する: CREATE DATABASE
• 「データベース」とは,テーブルの集まり(容れ物).
• データベースは複数あってもよいが,同時に使えるのは
一つだけ.
– テーブルを新規作成する: CREATE TABLE
 データベースの作成時
CREATE DATABASE データベース名
 テーブルの作成時
CREATE TABLE テーブル名
( カラム名 データ型 [NULL|NOT NULL] [カラムオプション],
...
)
このまとまりを「カラム定義」と呼ぶことにしよう.
8
CREATE TABLE の詳細(1)
 [NULL|NOT NULL]
– NULL
• NULL 値が入ってもよいことを表す.
• 省略したときはこちらが設定されているとみなされる.
– NOT NULL
• NULL 値が入ってはならないことを表す.
– NULL が指定されていないカラムは,キーとなりうる.
 主キーとしたいカラムが単一の場合には,カラムオプションのと
ころで PRIMARY KEY と指定する.
– NOT NULL を省略しても,それが指定されたのと同じことに
なる.
 主キーが複数のカラムからなる場合は,カラム定義の終わった
あとに,PRIMARY KEY 句を別途設ける.
9
CREATE TABLE の詳細(2)
 データ型の例(1)
– CHAR(n)
• 長さ n バイトの固定長文字列(n は最大で255).ただし,
後ろに空白があってもテーブルから取り出すときには削
除される.
– VARCHAR(n)
• 最大 n バイトの可変長文字(n は最大で255) .
– TEXT
• 最大65,535バイトの可変長文字列.
– INT
• 整数
– FLOAT
これ以降の説明は,DBMSによって,
• 浮動小数点数
大きな違いがある.ここで取り上げて
いるのは MySQL のもの.
10
CREATE TABLE の詳細(3)
 データ型の例(2)
– DATETIME
• 1000-01-01 00:00:00 から
9999-12-31 23:59:59 までの日付と時刻
• DATE,TIME,YEAR もある. ただし,YEAR の範囲は 1901~2155
であるが,不正な値をセットしようとすると 0000 にされる.
– ENUM('値1', '値2', ...)
• 列挙された値のいずれか1つ,空文字列,もしくは NULL しかとらな
いデータ型
– NOT NULL 指定した場合は,NULL を除く.
– SET ('値1', '値2', ...)
• 列挙された値の中から最大64個までの値を含む集合,空集合,また
は,NULL しかとらないデータ型
– NOT NULL 指定した場合は,NULL を除く.
11
CREATE TABLE の詳細(3)
 その他のカラムオプション
– DEFAULT 値
• INSERT 文で値が指定されずに挿入される場合にセット
される省略値を指定する.
12
DROP 文
 機能
– テーブルを削除する: DROP TABLE
– データベースを削除する: DROP DATABASE
DROP TABLE テーブル名
DROP DATABASE データベース名
13
ALTER 文(1)
 機能
– テーブルの設定を変更する: ALTER TABLE
• ALTER DATABASE は省略.
 ALTER TABLE 文で可能な主な変更の種類
– カラムの追加
– カラムの変更
– カラムの削除
14
ALTER 文(2)
 カラムの追加
スライド No.14 参照
ALTER TABLE テーブル名
ADD [COLUMN] カラム定義 [FIRST|AFTER 既存カラム]
[ADD ...]
 カラムの変更
カラムの挿入位置.省略時は末尾.
ALTER TABLE テーブル名
CHANGE [COLUMN] カラム名 カラム定義 [FIRST|AFTER 既存カラム]
[CHANGE ...]
 カラムの削除
ALTER TABLE テーブル名
DROP [COLUMN] カラム名
[DROP ...]
カラムのテーブル内での位置を移動させ
たいときに指定.省略時は元の位置.
「カラム定義」はカラム名から始まるので,
名前を変更しないときは,同じ名前が2度
繰り返されることになる.
15
ALTER 文に関する補足説明
 まだレコードが登録されていないなら,テーブルを変更するのも,
いったん削除してから登録し直すのも,そんなに変わらない.
– ただし,カラムの型を変更すると,他のカラムまで影響を受
けることもある.
• 例:MySQL では,CHAR 型のカラムが複数あるとき,どれ
かを VARCHAR 型に変更すると他のカラムもすべて
VARCHAR 型に合わされる,など.
 しかし,レコードが登録されてからの ALTER 文の実行には注
意が必要である.
16
データ定義文の例(1)
CREATE DATABASE te999999_greeting_cards;
CREATE TABLE address_book(
name varchar(32) not null primary key,
postal_code char(8),
address1 char(40),
address2 char(40),
phone char(13)
);
主キーが単一のカ
ラムからなる場合は,
そのカラムの定義の
中で PRIMARY
KEY と宣言する.
前のスライドまで,文の後ろにセミコロン(;)はなかった.実は,すべてのSQL 文の末尾に
セミコロン(;)を書く必要がある.
ただし,これは,SQL の文法と言うよりも,MySQLなど,対象となるDBMSの約束事であ
る.このため,書籍によっては,省略されていることもある.
17
データ定義文の例(2)
CREATE TABLE letters(
name varchar(32) not null,
l_year year not null,
sent enum('○', '×'),
primary key (name, l_year)
);
主キーが複数のカラムからなる場合
は,個々のカラム定義の中ではなく,
すべてのカラム定義が終わった後
に PRIMARY KEY 句を続ける.
長い文を入力する際に,セミコロンがくる前に改行した場合にどういう現象が起こる
かは,使用するDBMSによって異なるだろう.
MySQL の場合にどうなるかの説明は,次の節で.
18
データ操作文の例(1)
INSERT INTO address_book
SET name='安部晋三', postal_code='100-8968',
address1='東京都千代田区永田町1-6-1',
address2='首相官邸',
phone='03-xxxx-yyyy';
INSERT INTO address_book
VALUES('安部昭恵', '100-8968',
'東京都千代田区永田町1-6-1',
'総理大臣官邸','03-xxxx-yyyy'),
('麻生太郎', '100-0032',
'東京都港区六本木7丁目',
'衆議院議員宿舎', '03-aaaa-bbbb');
19
データ操作文の例(2)
前ページの上の INSERT 文が終了した後に以下の INSERT 文を実行しようとすると,
同じキー値を持ったレコードがすでにあるため,エラーになる.
INSERT INTO address_book
VALUES('安部晋三', '100-8968',
'山口県山口市...',
'安部晋三事務所','083-xxx-yyyy');
UPDATE 文の例
UPDATE address_book
SET address2='総理大臣官邸'
WHERE name='安部晋三';
20
リレーショナルデータベース管理システムMySQL
21
MySQL
 MySQL AB 社が公開しているオープンソースのDBMS
– http://www.mysql.com/
– 無償で利用可能
 最もポピュラーなDBMSの一つ
– 参考になる書籍がたくさん出版されている.
• 他に,PostgreSQL,Oracle, Microsoft SQL Server など
– もちろん,SQLの参考書もたくさんあるわけだが,方言が多
いので,今回の講義のために入手するのなら,MySQLを対
象としたものがよいだろう.
 日本語マニュアルも閲覧可能
– http://dev.mysql.com/doc/refman/4.1/ja/index.html
22
MySQL の対話的利用
 MySQL の利用法
– 対話的利用
• TTSSH などでサーバにログインしてから,そのサーバ上
で,MySQL クライアントと呼ばれるプログラムを起動する.
• 後は,このクライアントを経由して利用する.
• 今日の実習ではこちらを.
– プログラムの中からの利用
• PHP プログラム(webサーバ経由でも可)の中から,
MySQL にアクセスするための関数を呼び出す.
• こちらは次回以降に.
23
MySQL クライアントの起動(MySQL への接続)
 boosp 上での設定
– MySQL のユーザ名
• rupus のログイン名と同じ
• パスワードは,講義中に紙で配布する.
rupusの OS からのプロンプト
これは,将来よそ
で MySQL を使
うときには異なっ
ているかもしれな
い.
Linux ユーザ名と MySQL
ユーザ名が異なるときは
mysql –u username -p
[te999999@rupus ~]$ mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 150 to server version: 4.1.20
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
MySQL クライアントからのプロンプト
24
MySQL クライアントの終了(MySQL からの切断)
 quit コマンドを使用する.
– SQL 文を入力できるところで使えるわけだが,これはもちろ
ん SQL の文ではない.
– このようなコマンドを,MySQLコマンドと呼んでSQL文と区別
することにしよう.
MySQL クライアントからのプロンプト
mysql> ...
mysql> ...
mysql> quit;
Bye
[te999999@rupus ~]$
rupus の OS からのプロンプト
25
MySQLにおける対話型作業の典型的な手順
1.
サーバ rupus にログイン
2.
MySQLクライアントを起動(MySQLに接続)
[te999999@rupus ~] mysql -p
3.
(新規データベースの場合のみ)データベース作成
mysql-> CREATE DATABASE dbname;
4.
使用するデータベースの宣言
mysql-> use dbname;
5.
(新規テーブルの場合のみ)データ定義
mysql-> CREATE TABLE tablename
6.
データ操作
mysql-> SELECT/INSERT/UPDATE/DELETE etc.
7.
MySQL クライアントを終了(MySQLから切断)
mysql-> quit;
8.
サーバ rupus からログアウト
これらの手順を忘
れると,CREATE
TABLE 以下を正し
く入力しても無視さ
れてしまう.
26
その他の MySQL コマンド
 show コマンド
– データベースに関するさまざまな情報を表示させる.
• show databases;
• show tables;
use コマンドを実
行した後でないと
• show columns from テーブル名;
使えない.
 use コマンド
– これから利用するデータベースの名前を宣言する.
• use データベース名;
– これ以降,このデータベースの中に新しいテーブルを作っ
たり,既存のテーブルのデータを参照したりできるようになる.
27
MySQL クライアントとの対話(1)
 長い SQL 文が画面の1行に入りきれないときは
– そこでとりあえず改行してもよい.
– プロンプトの形が “->” に変わって,まだ文が終わっていな
いことを示してくれる.
• 終えるときには,セミコロン(;)または \g
mysql> CREATE TABLE address_book(
-> name varchar(32) not null primary key,
-> postal_code char(8),
-> address1 char(40),
-> address2 char(40),
-> phone char(13)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql>
28
MySQL クライアントとの対話(2)
 ただし,シングルクォート (' と ') で囲まれた途中で改行すると
…
– 文法的には間違っていないが,変なところに改行文字
(ASCIIコードの LF だが \n と表す)が入ってしまう.
mysql>
->
->
->
->
'>
->
->
mysql>
create table letters
(
name varchar(32) not null,
l_year year not null,
sent enum('○
',
'×')
);
ここでうっかり改行
してしまった.
すると,
'○\n' と入力した
ことになる.
29
注意
 注意:rupus の上の MySQL では:
– ユーザは,以下の形式の名前をしたデータベースしか作
成・使用できないように設定されている.
• 自分のMySQLユーザ名そのもの
例: te999999
– テーブル名にはそのような制約はない.
30