データベース
第 6 回 、第 7 回 SQL
鈴木幸市
前回の「トランザクション」の理解
度調査
かなりきちんと理解していることがわかりまし
た。
もっとも簡潔で的を得た回答
複数の処理を必要とする一連の作業を全体として一
つの処理として管理するため
トランザクションの原子性、一貫性に着目した
回答多数
複数トランザクションの並列実行に着目した回
答も多数
身の回りで「トランザクション」になりそうな
ものを考えてみると理解が深まると思います。
演習講評
ER 図以前に
日本語での説明不足、用語不適切
最初から 1 件しかあり得ないデータをモデ
ル化している
同じ性質をもったデータを「複数」集めてモ
デル化したのが「実体」
M:N なのに N:1 と誤解している例多数
説明不足の例
ユーザ
メールアド
レス
名前
サー バー
ユーザ
メールアド
レス
名前
1 1
おそらく「電子メール」のことだと思われる
すると、どちらかが送信者でどちらかが受信者
受信者は複数あるのが普通なのでは? ---> 1:N?
最初から 1 件しかないデータをモデ
ル化
上野動物園
住所
建物
サー バー
上野動物園にい
る動物
名前
種類
1 N
上野動物園は最初から一つしかない
「同じ性質のデータを複数集めた」ものが「実体」なので
、たとえば、これは「動物園」というふうにすれば実体に
なる。
前のページの例を 1:N にしてみる
動物園
名前
住所 建物
所有
檻
名前
広さ 場所
1 N
飼育
動物
名前
種類 特徴
N 1
ただし、一つの檻で飼育する動物は一種類のみとする
。
これが、モデル化を
M:N なのに1: N と誤解
学生
学籍番 号
名前
受講
講義
講義番 号
講義名
1 N
講義 1
講義 2
講義 3
講義 4
学生 A
学生 B
学生 C
学生 D
学生 E
実は M:N でした
前の例を 1:N で作ってみる
学生
学籍番 号
名前
受講
履修簿
講義番 号
学籍番 号
1 N 履修
講義
講義番 号
講義名
N 1
今日の内容
SQL の背景
SQL 以前
CODASYL 型の手続き型インタフェース
QUEL などの言語
SQL の歴史
SQL の特徴
SQL の分類
DDL, DML, DCL
各 SQL 文の働きと例
SQL の背景
SQL 以前はデータベースへの読み書きの手順をプロ
グラムとして記述していた
CODASYL など
データベースの内部構造の変更についていけない
データ量や特性が時間と共に変わると最適な読み書
き手順も変えないと困る
非手続き型のデータベース操作言語が必要となった
QUEL などの実験的な言語も提案された
SQL の歴史
1970 年代
IBMの SanJose 研究所の System R: SEQUEL 言語の提案
1978年バージョンアップして SQL 言語に
多くのデータベースシステムで採用されはじめた
1980 年代
ISO, JISによる標準化 (SQL87, SQL89)
1990 年代
ISO, JIS標準化 (SQL92, SQL99)
マルチメディア、サーバプログラミング言語などへの拡張
2000 年代
さらに標準化の努力継続
大規模な言語になってきた
C 言語よりも規模が大きいかもしれない
標準化されているが ...
すべての標準を実装している DBMS はない
標準以外の独自の機能はほとんど全部の DBMS が実装している
SQL の特徴
プログラムである
非手続き型である
データの読み書き手順をいちいち記述しない
ほしい結果だけを指定する→あとは言語処理系が面倒見てく
れる
通常のプログラム言語に埋め込んで使う
Embedded SQL
JDBC/ODBC
その他多くのプログラム言語で利用できる
端末から入力して同じことを実行できる
一種のコマンド
SQL のキーワードは大文字でも小文字でも OK
ここでは、キーワードは大文字で表示する
一つ一つの SQL を「文」と呼ぶ
SQL の分類
SQL は次のように分類できる
DDL ( Data Definition Language: データ定義言語 )
テーブルを作る ( CREATE TABLE)
テーブル定義を変更する (ALTER TABLE)
テーブルを消去する (DROP TABLE)
インデックスを作る /変更する /消去する
CREATE/ALTER/DROP INDEX
ビューを作る /変更する /消去する
CREATE/ALTER/DROP VIEW
等々
DML (Data Manipulation Language :データ操作言語 )
タプルを追加する (INSERT)
タプルを変更する (UPDATE)
タプルを消去する (DELETE)
タプルを読む (SELECT)
DCL (Data Control Language: データ操作言語 )
トランザクションの完了あるいは破棄の指示 (COMMIT/ABORT)
テーブルのロック
SQL の構文の詳しい解説は
Oracle のリファレンス
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/s erver.111/E05750-03/toc.htm
PostgreSQL のリファレンス
http://www.postgresql.jp/document/8.4/html/
データベースを使ってみたい場合
学内の Access を使う
トランザクション機能なし
SQL はサブセット
フリーな DBMS を使う
PostgreSQL
http://www.postgresql.jp/
MySQL
http://www.mysql.gr.jp/
Firebird
http://tech.firebird.gr.jp/firebird/
細かなことはともかく、、、
SQL を使うと、これまでの講義で説明して
きた
リレーショナルデータベース
でできることがすべてできる
今日の講義ではその例を示していく
前回までの講義内容との関連を確認してほし
い
例題のテーブル構造 (1)
「従業員」テーブル
社員 ID 、所属 ID 、職位 ID 、姓、姓ふりがな
、名、名ふりがな、生年月日、採用日付、給
与
「部署」テーブル
部署 ID 、部署名、責任者 ID
「職位」テーブル
職位 ID 、職位名
例題のテーブル構造 (2)
図で書くと次のようになる
社員 ID
所属 ID
職位 ID
姓
姓ふりがな
名
名ふりがな
生年月日
採用日付
給与
部署 ID
部署名
責任者 ID
職位 ID
職位名
従業員 部署
職位
主 キー
外部キー
(1) 外部キー
(2)
外部キー
(3)
テーブルを作る
CREATE TABLE 従業員 ( 社員 ID NUMERIC(8) PRIMARY KEY,
所属 ID NUMERIC(4) NOT NULL,
職位 ID NUMERIC(2) NOT NULL,
姓 VARCHAR(10) NOT NULL,
姓ふりがな VARCHAR(12) NOT NULL,
名 VARCHAR(10) NOT NULL,
名ふりがな VARCHAR(12) NOT NULL,
生年月日 DATE NOT NULL,
採用日付 DATE NOT NULL,
給与 NUMERIC(10) NOT NULL);
CREATE TABLE 部署 ( 部署 ID NUMERIC(4) PRIMARY KEY,
部署名 VARCHAR(12) NOT NULL,
責任者 ID NUMERIC(8) REFERENCES 従業員 ( 社員 ID));
CREATE TABLE 職位 ( 職位 ID NUMERIC(2) PRIMARY KEY,
職位名 VARCHAR(12) NOT NULL);
テーブルを作る 解説
CREATE TABLE 部署 ( 部署 ID NUMERIC(4) PRIMARY KEY,
部署名 VARCHAR(12) NOT NULL,
責任者 ID NUMERIC(8) REFERENCES 従業員 ( 社員 ID));
テーブルを
作る SQL
文を示す
テーブ ル名 カラム 名 カラムの データ型
カラムの属性を並
べる: 主キー
カラムの属性を並べ
る: NOT NULL 制
約
SQL の分類
SQL は次のように分類できる
DDL ( Data Definition Language: データ定義言語 )
テーブルを作る ( CREATE TABLE)
テーブル定義を変更する (ALTER TABLE)
テーブルを消去する (DROP TABLE)
インデックスを作る /変更する /消去する
CREATE/ALTER/DROP INDEX
ビューを作る /変更する /消去する
CREATE/ALTER/DROP VIEW
等々
DML (Data Manipulation Language :データ操作言語 )
行を追加する (INSERT)
行を変更する (UPDATE)
行を消去する (DELETE)
行を読む (SELECT)
DCL (Data Control Language: データ操作言語 )
トランザクションの完了あるいは破棄の指示 (COMMIT/ABORT)
テーブルのロック
まずは簡単な例:単純な SELECT 文
基本形
SLECT 読むカラム
FROM 読むテーブル
WHERE どのタプルを読むかの条件 ;
SELECT 句、 FROM 句、 WHERE 句などと呼ぶ
例
SELECT * FROM 従業員 ;
読むカラム: *は、すべてのカラムを読む。読む順
序はデータベースまかせ
読むテーブル: 「従業員」テーブル
条件: 書いていないので全部の行を読む
SELECT 文がすべての SQL の基本
「クエリ」 (query) と呼ぶこともある
Select 文の構造
SELECT カラム [, カラム , … , カラム ]
FROM テーブル名 [, テーブル名 , …]
WHERE 条件 ;
SELECT 文
であること
を示す
読むカラム名を並べる。
複数のカラムはカンマで区切る。
すべてのカラムを読む場合は * を指定
する
FROM 句
であること
を示す
読むテーブル名を並べる。
複数のテーブル名はカンマで区切る。
複数テーブルを指定すると「直積」を
作る。
WHERE 句と組み合わせて結合を指定
WHERE 句 する。
であること
を示す 読む行が満足すべき条件を指定する
SELECT, FROM, WHERE の考え方
SELECT の後のカラム名の並び
読むカラムの名前を示す
「射影」演算に相当する
カラム名があいまいなとき (FROM にあるテーブルで同じ
名前のカラムがあるとき )
テーブル名 .カラム名 のように、テーブル名とカラム名を「ピ
リオド」でつないで区別する
FROM の後のテーブルの並び
複数のテーブルの場合は、指定したテーブルで「直積」を作
り、その結果のテーブルから読む。
WHERE の後の条件
条件に合致した行だけを読む
「選択」演算に相当する
FROM に複数テーブルが指定してある場合
SELECT 文で読み出すカラムを指定する
例
SELECT 名 , 社員 ID
FROM 従業員 ;
読むカラム: 名前と社員 ID だけを読む。
読むテーブル: 「従業員」テーブル
条件: 書いていないので全部の行を読む
Where で読み出す行を制限する
例
SELECT 名 , 従業員 ID
FROM 従業員
WHERE 姓ふりがな = ' すずき ';
読むカラム: 名前と社員 ID だけを読む。
読むテーブル: 「従業員」テーブル
条件: 「姓ふりがな」カラムの値が「すずき」であ
る行だけを読む
もう少し複雑な条件にしてみる
例
SELECT 名 , 従業員 ID
FROM 従業員
WHERE 姓ふりがな = ' すずき '
AND 給与 > 300000;
読むカラム: 名前と社員 ID だけを読む。
読むテーブル: 「従業員」テーブル
条件: 「姓ふりがな」カラムの値がが「すずき」で、
かつ、給与が 300000 以上の行だけを読む
条件は、 AND, OR, かっこなどを使っていくらで
も複雑にできる。
複数のテーブルから結果を合成する:結
合 社員と所属部署名を出力する例
SELECT 名前 , 部署名
FROM 従業員 , 部署
WHERE 所属 ID = 部署 ID ;
読むカラム: 部署名と従業員名。
読むテーブル: 「従業員」テーブルと「部署」テーブル⇒直
積!
条件: 「従業員」の「所属 ID 」と「部署」の「部署 ID 」が同
じ行
これが「結合」になっていることに注意!!
社員 ID 所属 ID 職位 ID 姓 姓ふりがな 名 名ふりがな 生年月日 採用日付 給与
部署 ID 部署名 責任者 ID
職位 ID 職位名
従業員 部署
職位
文字列の部分一致: LIKE
例
SLECT 名前 , 従業員 ID
FROM 従業員
WHERE 姓ふりがな LIKE ' す %';
読むカラム: 名前と社員 ID だけを読む。
読むテーブル: 「従業員」テーブル
条件: 「姓ふりがな」が「す」ではじまる行だけを読む
LIKE の書き方
% 任意の長さの文字列
_ 任意の 1 文字
日本語の場合、「 1 文字」を「 2 バイト (2 文字 )」と扱うデー
タベースもあるので、注意。
Where 句で使う比較演算子の例
値同士を比較する
A=B : A と B が等しい
(例 ) 姓ふりがな = ' 鈴木 '
A <> B : A と B が等しくない
A > B, A>=B, A<B, A<=B
複数行と比較する:サブクエリ
A IN (SELECT …) : (SELECT …) で選択した中に A がある
(例 ) WHERE A IN (SELECT 姓ふりがな FROM 従業員 WHERE
…)
取り出した「姓ふりがな」のどれかに「 A 」が一致するような行だけを 選ぶ
NULL かどうかを調べる
IS NULL
(例 ) WHERE 住所 IS NULL
住所の登録がない行だけを選ぶ
IS NOT NULL
(例 ) WHERE 電話番号 IS NOT NULL
結果を並べ替える : ORDER BY
例
SELECT 名前 , 従業員 ID
FROM 従業員
WHERE 姓ふりがな LIKE ' す %'
ORDER BY 姓ふりがな , 名ふりがな ;
読むカラム: 名前と社員 ID だけを読む。
読むテーブル: 「従業員」テーブル
条件: 「姓ふりがな」が「す」ではじまる行だけを読む
並べ替え: 姓のふりがなの順。同じ姓のふりがなの場合に
は、さらに名前のふりがなで並べ替える。
この場合は、名前の読み順で並べかえる
ORDER BY の書き方
並べるのに使うカラム名を書く。
複数の場合にはカンマで区切る。
先に書いたカラムをつかってまず並べ替えを行う。値が同
じなら次のカラムを使って並べ替える。
集約演算 : 行数を数える
集約演算とは
複数の行の中の値を合計したり数えたりして一定の値を導き出す
例
SELECT COUNT(*)
FROM 従業員
WHERE 姓ふりがな LIKE ' す %';
読むカラム: 見つかった行数を読む。
読むテーブル: 「従業員」テーブル
条件: 「姓ふりがな」が「す」で始まる行だけを数える
COUNT(*)
行を数える関数。
SELECTに関数を書ことができる
複数の行の集計を行う関数を「集約関数」という。この演算が「集 約演算」
代わりに COUNT( 姓ふりがな )を使うと:値が何種類あるかを調べ
る
集約演算: 合計を数える、 SUM 関数
例
SELECT SUM( 給与 )
FROM 従業員
WHERE 姓ふりがな = ' す
ずき ';
読むカラム: 給与の合計を求める。
読むテーブル: 「従業員」テーブル
条件: 「姓ふりがな」が「すずき」の行だけの
合計を求める
集約演算: GROUP BY ⇒ 集約の仕方の
指定 例
SELECT SUM( 給与 )
FROM 従業員
WHERE 姓ふりがな = ' すずき '
GROUP BY 所属 ID;
読むカラム: 給与の合計を求める。
読むテーブル: 「従業員」テーブル
条件: 「姓ふりがな」が「すずき」の行だけの合計を
求める
集約の方法: 所属ごとの合計を求める
集約演算の単位を指定している!!
集約演算: ORDER BY とのあわせ技
例
SELECT SUM( 給与 )
FROM 従業員
WHERE 姓ふりがな = ' すずき '
GROUP BY 所属 ID
ORDER BY 所属 ID;
読むカラム: 給与の合計を求める。
読むテーブル: 「従業員」テーブル
条件: 「姓ふりがな」が「すずき」の行だけの合計を
求める
集約の方法: 所属ごとの合計を求める
並べ替え:所属の ID 順に並べ替える
SELECT, FROM, WHERE の考え方
SELECT の後のカラム名の並び
読むカラムの名前を示す
「射影」演算に相当する
カラム名があいまいなとき (FROM にあるテーブルで同じ
名前のカラムがあるとき )
テーブル名 .カラム名 のように、テーブル名とカラム名を「ピ
リオド」でつないで区別する
FROM の後のテーブルの並び
複数のテーブルの場合は、指定したテーブルで「直積」を作
り、その結果のテーブルから読む。
WHERE の後の条件
条件に合致した行だけを読む
「選択」演算に相当する
FROM に複数テーブルが指定してある場合
複数の SELECT の結果を合成することも
できる UNION : 前後の SQL の結果を足す
INTERSECT : 前の SQL の結果と後ろの
SQL の結果の共通部分を求める
EXCEPT :前後の SQL の結果の差を求め
る
SQL の分類
SQL は次のように分類できる
DDL ( Data Definition Language: データ定義言語 )
テーブルを作る ( CREATE TABLE)
テーブル定義を変更する (ALTER TABLE)
テーブルを消去する (DROP TABLE)
インデックスを作る /変更する /消去する
CREATE/ALTER/DROP INDEX
ビューを作る /変更する /消去する
CREATE/ALTER/DROP VIEW
等々
DML (Data Manipulation Language :データ操作言語 )
行を追加する (INSERT)
行を変更する (UPDATE)
行を消去する (DELETE)
行を読む (SELECT)
DCL (Data Control Language: データ操作言語 )
トランザクションの完了あるいは破棄の指示 (COMMIT/ABORT)
テーブルのロック
テーブルを作る: CREATE TABLE 文
一般形
CREATE TABLE テーブル名
(カラム名 型 , ....);
例
CREATE TABLE 部署
(部署名 VARCHAR(20),
部署 ID NUMERIC,
責任者 ID NUMERIC);
注意:標準では NUMERIC, Oracle の場合は NUMBR
SQL では、テーブルだけでなく、いろいろなものを
CREATE で作る
例
CREATE INDEX, CREATE SCHEMA, 等々
型のいろいろ
数値
INTEGER, NUMERIC など:固定小数点
Oracle では NUMERIC の代わりに NUMBER を使う
REAL, FLOAT, DOUBLE など:浮動小数点
文字列
CHAR(n)
固定の長さ n の文字列
VARCHAR(n), CHARACTER VARYING(n)
最大 n の長さの可変長文字列
日付
DATE
年月日
TIMESTAMP
年月日時分秒 ...
制約をつける (1) : UNIQUE と NOT
NULL 例
CREATE TABLE 部署
(部署名 VARCHAR(20) UNIQUE NOT NULL,
部署 ID NUMERIC UNIQUE NOT NULL,
責任者 ID NUMERIC NOT NULL);
部署名への制約: UNIQUE と NOT NULL
同じ名前の部署はない
名前のない部署はない
部署 ID への制約: UNIQUE と NOT NULL
すべての部署は ID で区別する
IDのない部署はない
責任者 ID への制約: NOT NULL のみ
責任者のない部署はない
一人の人が複数の部署の責任者を兼ねている場合がある
だから、 UNIQUE 制約はつかない
制約をつける (2) : REFERENCES
例
CREATE TABLE 従業員
( ... ,
所属 ID NUMERIC REFERENCES 部
署 ( 部署 ID),
...);
「所属 ID 」は「部署」の「部署 ID 」カラムを参照し
ている
「所属 ID 」カラムの値は、同じ値が「部署」テーブルの
「部署 ID 」カラムのどこかの行になければならない。
SQL の分類
SQL は次のように分類できる
DDL ( Data Definition Language: データ定義言語 )
テーブルを作る ( CREATE TABLE)
テーブル定義を変更する (ALTER TABLE)
テーブルを消去する (DROP TABLE)
インデックスを作る /変更する /消去する
CREATE/ALTER/DROP INDEX
ビューを作る /変更する /消去する
CREATE/ALTER/DROP VIEW
等々
DML (Data Manipulation Language :データ操作言語 )
行を追加する (INSERT)
行を変更する (UPDATE)
行を消去する (DELETE)
行を読む (SELECT)
DCL (Data Control Language: データ操作言語 )
トランザクションの完了あるいは破棄の指示 (COMMIT/ABORT)
テーブルのロック
テーブルを削除する : DROP TABLE
CREATE TABLE の逆
例
DROP TABLE 部署 ;
SQL では、 DROP でテーブル以外のもの
も削除できる。
例
DROP INDEX, DROP SCHEMA 等々
SQL の分類
SQL は次のように分類できる
DDL ( Data Definition Language: データ定義言語 )
テーブルを作る ( CREATE TABLE)
テーブル定義を変更する (ALTER TABLE)
テーブルを消去する (DROP TABLE)
インデックスを作る /変更する /消去する
CREATE/ALTER/DROP INDEX
ビューを作る /変更する /消去する
CREATE/ALTER/DROP VIEW
等々
DML (Data Manipulation Language :データ操作言語 )
行を追加する (INSERT)
行を変更する (UPDATE)
行を消去する (DELETE)
行を読む (SELECT)
DCL (Data Control Language: データ操作言語 )
トランザクションの完了あるいは破棄の指示 (COMMIT/ABORT)
テーブルのロック
テーブル定義の変更: ALTER TABLE
テーブルに次のような変更を加える
カラムを追加 /削除 /名前変更
制約を追加 /削除
例
ALTER TABLE 従業員
ADD COLUMN 住所
VARCHAR(50);
ALTER TABLE 従業員
ALTER COLUMN 住所
ADD NOT NULL;
ALTER TABLE 部署
DROP COLUMN 所在地 ;
ALTER TABLE 部署
SQL の分類
SQL は次のように分類できる
DDL ( Data Definition Language: データ定義言語 )
テーブルを作る ( CREATE TABLE)
テーブル定義を変更する (ALTER TABLE)
テーブルを消去する (DROP TABLE)
インデックスを作る /変更する /消去する
CREATE/ALTER/DROP INDEX
ビューを作る /変更する /消去する
CREATE/ALTER/DROP VIEW
等々
DML (Data Manipulation Language :データ操作言語 )
行を追加する (INSERT)
行を変更する (UPDATE)
行を消去する (DELETE)
行を読む (SELECT)
DCL (Data Control Language: データ操作言語 )
トランザクションの完了あるいは破棄の指示 (COMMIT/ABORT)
テーブルのロック
インデックスを作る: CREATE INDEX
基本形
CREATE INDEX インデックス名
ON テーブル名 (カラム名 );
インデックス名: 作るインデックスにつける名前
テーブル名: どのテーブルにインデックを作るか
カラム名: どのカラムの値を使ってインデックスを作るか
WHERE 句にインデックスを作ったカラム名が出てくると
、動作が早くなることが多い
複数のカラムを合成してインデックスを作ることもできる
例
CREATE INDEX 従業員 IDidx
ON 従業員 (従業員 ID) ;
テーブル同様 DROP コマンドでインデッ
クスを削除
例
DROP INDEX 従業員 IDidx;
SQL の分類
SQL は次のように分類できる
DDL ( Data Definition Language: データ定義言語 )
テーブルを作る ( CREATE TABLE)
テーブル定義を変更する (ALTER TABLE)
テーブルを消去する (DROP TABLE)
インデックスを作る /変更する /消去する
CREATE/ALTER/DROP INDEX
ビューを作る /変更する /消去する
CREATE/ALTER/DROP VIEW
等々
DML (Data Manipulation Language :データ操作言語 )
行を追加する (INSERT)
行を変更する (UPDATE)
行を消去する (DELETE)
行を読む (SELECT)
DCL (Data Control Language: データ操作言語 )
トランザクションの完了あるいは破棄の指示 (COMMIT/ABORT)
テーブルのロック
テーブルに行を追加する: INSERT
基本形
INSERT INTO テーブル名 [( カラム名 , ....)]
VALUES ( 値 , ....) [, ( 値 , …) …] ;
テーブル名: 行を追加するテーブル名
(カラム名 , ...): 値を入力する先のカラム名の並び
省略可能。この場合はシステムで定義されたカラムの順に値を 指定していく
SELECT * ....; で表示されるカラムの順序
VALUES ( 値 , ...) : 各カラムの値。
例
INSERT INTO 部署
VALUES (' 社長室 ', 1, 10);
INSERT INTO 部署 (部署名 , 部署 ID, 責任者 ID)
VALUES (' 社長室 ', 1, 10), (' 企画部 ', 2, 11);
複数の行の値を一度に入力できる
SQL の分類
SQL は次のように分類できる
DDL ( Data Definition Language: データ定義言語 )
テーブルを作る ( CREATE TABLE)
テーブル定義を変更する (ALTER TABLE)
テーブルを消去する (DROP TABLE)
インデックスを作る /変更する /消去する
CREATE/ALTER/DROP INDEX
ビューを作る /変更する /消去する
CREATE/ALTER/DROP VIEW
等々
DML (Data Manipulation Language :データ操作言語 )
行を追加する (INSERT)
行を変更する (UPDATE)
行を消去する (DELETE)
行を読む (SELECT)
DCL (Data Control Language: データ操作言語 )
トランザクションの完了あるいは破棄の指示 (COMMIT/ABORT)
テーブルのロック
行の消去: DELETE
基本形
DELETE FROM テーブル名
WHERE 条件;
テーブル名: 削除する行が入っているテーブル名
条件: この条件に一致した行が削除される
SELECT と同じ
WHERE 句がないと、すべての行が削除される
それでもテーブルは残っている
データがないファイルがあるのと同じ
削除する行を読み込まなくともよい
DROP と混同しないこと
SQL の分類
SQL は次のように分類できる
DDL ( Data Definition Language: データ定義言語 )
テーブルを作る ( CREATE TABLE)
テーブル定義を変更する (ALTER TABLE)
テーブルを消去する (DROP TABLE)
インデックスを作る /変更する /消去する
CREATE/ALTER/DROP INDEX
ビューを作る /変更する /消去する
CREATE/ALTER/DROP VIEW
等々
DML (Data Manipulation Language :データ操作言語 )
行を追加する (INSERT)
行を変更する (UPDATE)
行を消去する (DELETE)
行を読む (SELECT)
DCL (Data Control Language: データ操作言語 )
トランザクションの完了あるいは破棄の指示
行の変更: UPDATE
基本形
UPDATE テーブル名
SET カラム名 = 値 /式 [, カラム名 = 値 /式 … ]
WEHERE 条件 ;
テーブル名: 変更する行が入っているテーブル名
カラム名 = 値 /式 :値を変更するカラム名と設定する値
値は式でもいい
給与 = 給与 *2 とすると、その行の給与の値が 2 倍になる
条件: 条件を満たす行だけを変更する。 SELECT と同じ。
更新する行を読む必要がない
例
UPDATE 従業員 SET 給与 = 給与 *1.1;
全従業員の給与を 10% アップ
UPDATE 従業員 SET 住所 ='xxxx' WHERE 社員 ID=200;
社員番号 200 の社員の住所を変更
SQL の分類
SQL は次のように分類できる
DDL ( Data Definition Language: データ定義言語 )
テーブルを作る ( CREATE TABLE)
テーブル定義を変更する (ALTER TABLE)
テーブルを消去する (DROP TABLE)
インデックスを作る /変更する /消去する
CREATE/ALTER/DROP INDEX
ビューを作る /変更する /消去する
CREATE/ALTER/DROP VIEW
等々
DML (Data Manipulation Language :データ操作言語 )
行を追加する (INSERT)
行を変更する (UPDATE)
行を消去する (DELETE)
行を読む (SELECT)
DCL (Data Control Language: データ操作言語 )
トランザクションの完了あるいは破棄の指示
トランザクションの完了 /失敗
基本形
COMMIT;
トランザクションが成功したことをデータベースに教える
これで変更が確定される
ABORT;
ROLLBACK; でもよい
トランザクションが失敗したことをデータベースに教える
トランザクションで行った変更は破棄され、トランザク
ションの実行前の状態に戻る
トランザクションは自動的に開始される
データベースによっては、 BEGIN をデータベースに送ら
ないと SQL 文ごとに内部で自動的に COMMIT されるもの
もある
テーブルの作成や削除、変更もトランザクションとして扱
うことができるデータベースもある
CREATE TABLE などが ABORT で無効にできる
SQL の分類
SQL は次のように分類できる
DDL ( Data Definition Language: データ定義言語 )
テーブルを作る ( CREATE TABLE)
テーブル定義を変更する (ALTER TABLE)
テーブルを消去する (DROP TABLE)
インデックスを作る /変更する /消去する
CREATE/ALTER/DROP INDEX
ビューを作る /変更する /消去する
CREATE/ALTER/DROP VIEW
等々
DML (Data Manipulation Language :データ操作言語 )
行を追加する (INSERT)
行を変更する (UPDATE)
行を消去する (DELETE)
行を読む (SELECT)
DCL (Data Control Language: データ操作言語 )
トランザクションの完了あるいは破棄の指示
ビューの定義: ビューとは?
アプリケーションはテーブルの一部しか使わない
最初からテーブルの一部だけを見せる
カラム名などもアプリケーション専用にしてしまう
アプリケーションの追加変更などでテーブルの形が変
わってもアプリケーションは変更せずに済む
このような「仮想的な」表のことをビューと呼ぶ
テーブルと同じように扱うことができる
行の「変更」や「追加」「削除」には制限がつくこともある
ビューの定義: 基本形と例
基本形
CREATE VIEW ビュー名 ( カラム名 , ...)
AS select 文;
例
CREATE VIEW 社長室 ( 部署名 , 部署 ID, 責任者 )
AS SELECT 部署名 , 部署 ID, 責任者 ID
FROM 部署
WHERE 部署 ID=1;
効果
SELECT 責任者 ID FROM 部署 WHERE 部署 ID=1;
少し複雑な SEL: サブクエリ
WHERE 句の中に SELECT がある例
SELECT 従業員名 FROM 従業員
WHERE 所属 ID IN
(SELECT 部署 ID FROM 部署
WHERE 部署名 LIKE
'% 製造 %');
上記の意味:
読むカラム:従業員名
読むテーブル:従業員
条件:従業員の所属する部署の名前に「製造」が入ってい
ること
プログラム内部から SQL を使う
2 つのやり方がある
埋め込み SQL
プログラム言語を SQL で拡張する
API を使う
SQL を文字列としてデータベースに与える
JDBC, ODBC などいくつかの方法がある
埋め込み SQL
"EXEC SQL" で始まる文で拡張部を示す
拡張部では、 : で始まる単語で元のプログ
ラムの変数を参照できる
「カーソル」を使ってプログラム言語との
橋渡しをする
SQL では一度に複数の行を読むことができる
プログラム言語では一度に一行しか処理でき
ない
カーソルに SQL の結果をためて一行ずつプロ
グラム言語で処理する
埋め込み SQL の例
void foobar() { int i;
EXEC SQL BEGIN DECLARE SECTION; char empname[100];
char lastname[50]; char firstname[50];
EXEC SQL ND DECLARE SECTION;
EXEC SQL DECLARE execCursor CURSOR FOR SELECT 従業員名 , 姓ふりがな , 名ふりがな FROM 従業員
ODER BY 姓ふりがな , 名ふりがな; EXEC SQL OPEN execCursor;
while (1) {
EXEC SQL FETCH FROM execCursor
INTO :empname, :lastname, :firstname;
printf(" 従業員名ふりがな: %s%s, 従業員名 %s\n", lastname, firstname, empname);
if (NO_MORE_TUPLES) break; }EXEC SQL CLOSE execCursor;
埋め込み SQL で使うプロ グラム言語の変数宣言
カーソルの宣言
カーソルを開くとファイルのように一行ずつ
読める 一行ずつ読む