- SQLとは?
データベースの活用範囲は広く、非常に多くの人が利用します。しかし、すべての利用者がコンピュータの専門家とは限りません。DBMSは非常に高度な技術で構成されますが、それらをすべて熟知した上で利用することは不可能です。そこでより簡単にDBMSと対話的にやり取りできる言葉(ルール)が必要となります。この言葉として使われるのが「SQL」です。
(ネットワークデータベースにはNDLと呼ばれる言語がある)
- SQLの構成
- DDL(データ定義言語)
データベースの構造(スキーマ)を定義
| CREATE SCHEMA |
スキーマ定義 |
| CREATE TABLE |
テーブル定義 |
| CREATE VIEW |
ビュー定義 |
| GRANT(グラント) |
処理権限の設定 |
| REVOKE(リボーク) |
処理権限の解除 |
- DML(データ操作言語)
データの抽出、加工
| SELECT |
データの抽出 |
| INSERT |
データの挿入 |
| UPDATE |
データの更新 |
| DELETE |
データの削除 |
| DECLARE(デクレア) |
ホスト変数と
カーソル(CURSOR)の定義 |
- DCL(データ制御言語)
データ変更の確定、取消
| BEGIN |
トランザクション開始 |
| COMMIT |
トランザクションの確定 |
| ROLLBACK |
トランザクションの取消 |
| SAVEPOINT |
チェックポイント設定 |
| LOCK |
資源のロック |
- 組み込み型SQL(親言語方式)
COBOL、C、JAVA(親言語)のプログラムに記述
→SQLプリコンパイラ
(DBアクセス関数の呼び出し文に変換)
(例)
EXEC SQL DECLARE カーソル名 CURSOR FOR
SELECT 〜;
END-EXEC |
※SQLJ(Java):「#sql で始まり、;で終了する」※JDBCでも可能
http://www.atmarkit.co.jp/fnetwork/tokusyuu/01sql99/sql99_3b.html
DB(問合せ結果)→カーソル(変数)
プログラムではカーソルからレコードを1件ずつ処理
(カーソル操作)
| 1 |
DECLARE CURSOR |
カーソル宣言
DECLARE CR1 CURSOR FOR
SELECT * FROM TBL1
WHERE 検索条件 |
| 2 |
OPEN |
カーソル操作開始
OPEN CR1 |
| 3 |
FETCH |
レコード読込(※繰り返し処理)
FETCH CR1 INTO 受け取り変数 |
| UPDATE |
レコード更新
UPDATE TBL1
SET CLMB=値
WHERE CURRENT OF CR1 |
| DELETE |
レコード削除
DELETE FROM TBL1
WHERE CURRENT OF CR1 |
| 4 |
CLOSE CURSOR |
カーソル操作終了
CLOSE CR1 |
※SQL単独利用:独立言語方式
- SELECT文
データの抽出、集計
(書式)
SELECT 列名 FROM 表明 WHERE 条件
|
- 関係演算(射影、選択、結合)
(サンプルテーブル)
<学生>
| 学籍番号 |
氏名 |
学部コード |
成績 |
| 0001 |
太郎 |
11 |
80 |
| 0002 |
花子 |
21 |
65 |
| 0003 |
次郎 |
11 |
74 |
| 0004 |
三郎 |
21 |
83 |
|
<学部>
|
- 射影
SELECT 学部名 FROM 学部
- 選択
SELECT * FROM 学生 WHERE 成績 >= 80
| 学籍番号 |
氏名 |
学部コード |
成績 |
| 0001 |
太郎 |
11 |
80 |
| 0004 |
三郎 |
21 |
83 |
※「*」はすべての列を表す特殊記号
- 結合
SELECT 学生.氏名, 学部.学部名
FROM 学生,学部
WHERE 学生.学部コード = 学部.学部コード
※結合キー(学生.学部コード、学部.学部コード)
| 氏名 |
学部名 |
| 太郎 |
文 |
| 花子 |
教育 |
| 次郎 |
文 |
| 三郎 |
教育 |
※列名が重複する場合は表名は必須
- 条件指定
- 複数条件
論理演算子(AND,OR,NOT)
SELECT * FROM 学生
WHERE 学部コード = 11 AND 成績 >= 80
- ヌル
IS NULL(空値)※IS NOT NULL
- 範囲
BETWEEN 値1 AND 値2(値1から2の間)
- 指定値
IN(値1,2,3・・・・) (指定値内のどれか)
- 文字列条件
LIKE N’文字列%_’(指定文字列に一致)
文字列「’」で囲む、日本語は「N」を前に不可
ワイルドカード
- 重複行排除
SELECT DISTINCT 項目名
- 副問合せ
SELECT文の入れ子(WHERE句でSELECT)
(返却1行)
WHERE 項目名 =
( SELECT 項目名 FROM 表名 WHERE 条件)
(返却複数行)
WHERE 項目名 IN
( SELECT 項目名 FROM 表名 WHERE 条件)
(相関副問合せ)
副問合せの繰り返し(※親表レコードごと)
FROM 担当表 T
WHERE EXISTS
( SELECT 項目名 FROM 表名 G
WHERE T.項目=G.項目)
※T,Gは表の別名、EXISTSはレコードの有無
- 集計計算
関数による計算、グループ化
- 集合関数
SELECT 集合関数(項目名) FROM 表名
集合関数
| COUNT |
レコード(行)数 |
| SUM |
合計 |
| AVG |
平均 |
| MAX |
最大 |
| MIN |
最小 |
- グループ化
GROUP BY 項目名 (指定項目でグループ化)
※複数項目の指定可
※SELECT項目はGROUP指定項目に限定
- グループ化後の抽出条件
GROUP BY 項目名
HAVING 条件
※GROUP BYと組み合わせて利用
※条件項目はGROUP BY指定項目のみ
- 整列設定(ソート)
指定項目で昇、降順
ORDER BY 項目名 整列キー
※複数項目の指定可
※省略時はASC
(整列キー)
| ASC(Ascending) |
昇順 |
| DESC(Descending) |
降順 |
- データ操作(その他)
- INSERT文
レコードの追加
- 値指定
INSERT INTO 表名(項目名,・・・)
VALUES(値,・・・)
- 検索データ指定
INSERT INT 表名(項目名,・・・)
SELECT 項目名 FROM 表名
- UPDATE文
レコードの更新
UPDATE 表名 SET 項目名=値 WHERE 条件
※条件指定がない場合、すべてのレコードが更新
- DELETE文
レコードの削除
DELETE FROM 表名 WHERE 条件
※条件指定がない場合、すべてのレコードが削除
- CREATE文
- テーブル定義
テーブルの作成(実データを格納する枠組み)
CREATE TABLE 表名(
列名 列属性(サイズ) [列制約,]
[表制約])
| 列属性 |
データ型(CHAR,DECIMAL)
データサイズ(文字数、桁数) |
| 制約 |
主キー(PRIMARY KEY)、
|
| 外部キー(FOREIGN KEY,REFERENCES) |
| 非ヌル(NOT NULL)、 |
| 一意性(UNIQE) |
| 妥当値(CHECK) |
- ビュー定義
仮想表の作成(実データを持たない)
CREATE VIEW ビュー表名 AS SELECT文
- SQLの実行順序(ANSI)
FROM → WHERE → GROUP BY → |
HAVING → SELECT → ORDERE
|
|
- SQLバージョン
| SQL86(SQL87) |
COBOL、FORTRAN、PL/Iなど、
親言語(母言語、ホスト言語とも言う)への
埋込みSQL文仕様策定 |
| SQL89 |
マイナーバージョン
DDL仕様策定
制約および整合性機能を追加
C言語への埋込みSQL文仕様の追加 |
| SQL92(SQL2) |
メジャーバージョン
データ型の拡張、外部結合、DDL仕様追加 |
| SQL99(SQL3) |
オブジェクト指向
Javaを親言語とする埋め込みSQL規格(SQLJ) |
| SQL 2003 |
XML 連携 |
|