- 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 連携 |
|