コンテンツにスキップ
Wikipedia

SQL

出典: フリー百科事典『ウィキペディア(Wikipedia)』
曖昧さ回避 この項目では、データベース言語について説明しています。マーケティング活動の文脈での利用については「潜在顧客#リードの品質認定」をご覧ください。
SQL
パラダイム 宣言型
登場時期 1974年
設計者 レイモンド・F・ボイス (英語版)
ドナルド・D・チェンバリン
最新リリース SQL:2023 / 2023年6月1日[1]
テンプレートを表示
SQLクエリ(UPDATE文)

SQL(Structured Query Language)(エスキューエル[2] [3] [ˈɛskjuːˈɛl]  ( 音声ファイル)、シークェル[2] [ˈskwəl]  ( 音声ファイル)、シーケル[4] )は、関係データベース管理システム (RDBMS) において、データの操作や定義を行うためのデータベース言語(問い合わせ言語)、ドメイン固有言語である。プログラミングにおいてデータベースへのアクセスのために、他のプログラミング言語と併用される。

SQLが使われるRDBは「エドガー・F・コッドによって考案された関係データベース関係モデルにおける演算体系である、関係代数関係論理(関係計算)に基づいている」と宣伝されていることが多い。しかし、SQLについては、そのコッド自身をはじめ他からも、関係代数と関係論理にきちんと準拠していないとして批判されてはいる(The Third Manifesto - クリス・デイトヒュー・ダーウェン)。

標準SQL規格

[編集 ]

SQL規格は1986年に統一標準規格が発表されるまでは、その統一標準規格が存在しない状況であった。そのため、各関係データベース管理システム (RDBMS) ベンダーごとにさまざまな拡張がなされてきた。

近年になってANSI、後にISOで言語仕様の標準化が行われており、制定された年ごとにSQL86、SQL89、SQL92、SQL:1999SQL:2003、SQL:2006、SQL:2008、SQL:2011、SQL:2016、SQL:2023などの規格があるが、対応の程度はベンダーごとにバラバラである。これは標準SQL策定に時間がかかりすぎたことにより、ビジネスの現状から早期の機能拡張が迫られたベンダーの都合と、独自構文を頻繁に利用していた利用者およびプログラマーに対し、互換性保持を保証する必要もあったためである。

そして1986年に統一標準規格が発表されて以来非常に多くの改正が行われた。制定年度順に代表的な規格を以下に挙げる。

通称 別称 説明 規格
1986年 SQL86 SQL87 ANSIによって発表された最初の規約。1987年にISOによって批准された。 ANSI X3.135-1986
ISO 9075:1987[注釈 1] JIS X 3005:1987
1989年 SQL89   マイナーバージョン。 ISO 9075:1989
ANSI X3.135-1989 [注釈 2] JIS X 3005:1990
1992年 SQL92 (英語版) SQL2 メジャーバージョン ISO/IEC 9075:1992
ANSI X3.135-1992[注釈 1] JIS X 3005:1995
1995年 SQL/CLI   コールレベルインターフェース (Call Level Interface)
業界標準になった ODBC API のインタフェースに相当する機能を国際標準化した規格
1996年 SQL/PSM   永続格納モジュール (Persistent Storage Module)
一般的にストアドプロシージャと呼ばれる機能を国際標準化した規格
1999年 SQL:1999 (英語版)
(SQL99)
SQL3 RDBMSのための完全な言語になることを目指した仕様[注釈 3] ISO/IEC 9075:1999

JIS X 3005-1:2002、JIS X 3005-2:2002

2003年 SQL:2003 (英語版)  

(See Eisenberg et al.: SQL:2003 Has Been Published.)

ISO/IEC 9075:2003
2008年 SQL:2008 (英語版)   ISO/IEC 9075-2:2008
JIS X 3005-1:2014
2011年 SQL:2011 (英語版)  
  • 時間データ(PERIOD FOR)(詳細については、時間データベース#履歴を参照)
  • ウィンドウ関数とFETCH句の機能強化
ISO/IEC 9075-2:2011
JIS X 3005-2:2015
2016年 SQL:2016 (英語版)  
  • 行パターンマッチング
  • 多態的テーブル関数
  • 文字列フィールドに格納されたJSONデータに対する操作
ISO/IEC 9075-2:2016
2019年 SQL:2019 (英語版)
  • パート 15、多次元配列 (MDarray 型と演算子)
ISO/IEC 9075-15:2019
2023年 SQL:2023 (英語版)
  • データ型 JSON (SQL/Foundation)
  • パート 16、プロパティ グラフ クエリ (SQL/PGQ)
ISO/IEC 9075-2:2023

SQLとオンライン処理

[編集 ]

SQLはその性質上、「宣言型」の言語である。

SQLとプログラミング言語

[編集 ]

プログラムから関係データベースを操作するための方法として、SQLが関係するものや関係しないものがあり、以下にそれらを述べる。

手続き型プログラミング言語、あるいは手続き型ではないプログラミング言語から関係データベースを操作するため、ソースコード中にSQLを埋め込み、プリプロセッサによってSQL部分を変換してデータベースアプリケーションを開発する方式がある。これを「埋め込みSQL」(Embedded SQL/ESQL) と呼び、後にANSIにより仕様が標準化された。

マイクロソフトは、C言語からAPIレベルで統一したソースコードを記述し、クライアント・サーバ型アプリケーションシステムの構築に有用である仕組み「Open Database Connectivity」(ODBC) を発表し、その有用性からANSIではODBC仕様を参考に「SQL/CLI」という仕様を標準化した。

LINQでは、プログラミング言語C#内において、文脈によって何らかの綴りをキーワードとして扱うという contextual keyword を活用し、言語内に言語の拡張のようにしてSQLライクな記述ができる。文字列ベースの埋め込みで発生するインジェクションに関係する問題や、プレースホルダの利用のようなわずらわしさが無いのが利点である。

SQLとバッチ処理

[編集 ]

埋め込みSQLやODBCの普及により、オンライントランザクション処理向きのSQLアクセス方法は確立されたが、バッチ処理性能向上の必要性が求められるようになった。

ある表(テーブル)の内容を編集して別の表に格納する大量データの更新処理などをデータベースエンジン内部で処理プログラムを実行し、入出力 (I/O) のほとんどをデータベース内部で完結することにより、クライアント側とのデータ通信によるオーバヘッドを削減することでバッチ処理性能を向上させるストアドプロシージャが考え出された。

ストアドプロシージャは、同じくデータベース内部に定義し、データベースに発生したイベントの内容に応じて任意の処理を実行する機能である「データベーストリガ」とともに、標準SQL仕様に採用され、SQL:1999 (SQL99) 規格の永続格納モジュール (SQL/PSM) として標準化された。

しかし、標準化される以前から各関係データベース管理システム (RDBMS) ベンダーがデータベースエンジン内部で制御文法を記述し実行できるように独自の拡張が行われていたため、ストアドプロシージャの処理ロジック記述文法はそれ以前に標準化されたSQL文法と比較して著しい非互換が認められるため、アプリケーションソフトウェア移植性・開発生産性・保守性を損なう場合がある。

標準SQLのSQL/PSMを採用したRDBMSを以下に挙げる。これらは概ね仕様に準拠しているが、仕様に定められていない部分や実装上の理由により細部には違いがある。

各RDBMSベンダーによる標準以外の独自のプロシージャには以下のようなものがある。これらには、独自追加された制御構文だけでなく、命令やデータ型の非互換も含むため注意が必要である。

SQLの対話的実行

[編集 ]

SQLを対話的に実行する場合、関係データベース管理システム (RDBMS) に付属するコマンドラインタイプのアクセスユーティリティを利用するのが一般的である。SQL文を記述したテキストファイルをスクリプトとして実行し、バッチ的に実行することが可能なものもあり、広く利用されている。RDBMSごとに、そのユーティリティ固有の命令を備えているものもあるため、データベースを扱うアプリケーションソフトウェア開発の初心者はその命令もデータベースエンジンが解釈するSQL文法のひとつであると間違って覚えてしまい、ODBCJDBCなどAPIからSQLを実行したときのエラーの原因が理解できずに混乱することもある。

ユーティリティ固有の文法で誤解しやすいものには、データベースでSQL文の文末に指定する文字である。全データベース共通では「;」、Oracle Database の ユーティリティであるSQL*Plusで、ストアドプロシージャの定義や無名PL/SQLブロックを発行するときに文末行に指定する「/」 や、Sybase/SQL Serverのisql/osqlではすべてのSQL文の文末行に指定する「GO」などがある。このなかでもっとも間違えやすいのが「;」である。これは、一般的なSQL教科書でも構文の終端文字として例が記載されているが、標準SQLの構文の終端文字ではない。

SQL文法

[編集 ]

コマンド種別

[編集 ]

データベース言語SQLの文法の種別は、以下の3つに大別される。

その他に、これらの命令の適用範囲を補完するための機能として、SQL文を実行時に解釈する「動的SQL」や、埋め込みSQLのための命令などが用意されている。 関係データベース管理システム (RDBMS) 以前のデータベース管理システム (DBMS) では、これらは必ずしも同一の言語ではなかった。データ定義言語は存在せずにすべて専用のコマンドにパラメタを指定して実行する実装も存在した。

コマンド文法

[編集 ]

データ定義言語

[編集 ]
→「データ定義言語」も参照
  • CREATE (データベースオブジェクト(表、インデックス、制約など)の定義)
  • DROP (データベースオブジェクトの削除)
  • ALTER (データベースオブジェクトの定義変更)

データ操作言語

[編集 ]
→「データ操作言語」も参照
  • INSERT INTO (行データもしくは表データの挿入)
  • UPDATE 〜 SET (表を更新)
  • DELETE FROM (表から特定行の削除)
  • SELECT 〜 FROM 〜 WHERE (表データの検索、結果集合の取り出し)
    • 後述する「動的SQL」でのSELECT文には、一度の実行で1行の結果を取得する「単一行SELECT文」と、カーソルにより複数行の結果を取得する「カーソルSELECT文」がある。

列名と値を、対で指定

INSERTINTO表名(列名1,列名2)VALUES(1,2)

表を構成するすべての列に値を格納する場合は、列名の記述を省略可能

INSERTINTO表名VALUES(1,2)

他表のデータを検索して格納

INSERTINTO表名1SELECT列名1,列名2FROM表名2

更新

UPDATE表名
SET列名2=2,列名3=3
WHERE列名1=1

削除

DELETEFROM表名
WHERE列名1=1

1行以上の検索

SELECT*
FROM表名
WHERE列名1BETWEEN1AND2
ORDERBY列名1

1行だけの検索

SELECT*
INTO受け取り変数
FROM表名
WHERE列名1=1

取得行数を指定した検索

SELECT*
FROM表名
LIMIT取得行数

データ制御言語

[編集 ]
→「データ制御言語」も参照
  • GRANT (特定のデータベース利用者に特定の作業を行う権限を与える)
  • REVOKE (特定のデータベース利用者からすでに与えた権限を剥奪する)
  • SET TRANSACTION (トランザクションモードの設定(並行トランザクションの分離レベル (ISOLATION MODE) など))
  • BEGIN (トランザクションの開始)
  • COMMIT (トランザクションの確定)
  • ROLLBACK (トランザクションの取り消し)
  • SAVEPOINT (任意にロールバック地点を設定する)
  • LOCK (表などの資源を占有する)

カーソル定義・操作

[編集 ]

カーソル」とは、SELECT文などによるデータベース検索による検索実行の結果を1行ずつ取得して処理するために、データベースサーバ側にある結果集合と行取得位置を示す概念をいう。 カーソルの定義とその操作は、主にアプリケーションプログラムなどの手続き型言語からのSQL実行において利用する。

  • DECLARE CURSOR (カーソル定義)
  • OPEN (カーソルのオープン)
  • FETCH (カーソルのポインタが指し示す位置の行データを取得し、ポインタを一行分進める。)
  • UPDATE (カーソルのポインタが指し示す位置の行データを更新する)
  • DELETE (カーソルのポインタが指し示す位置の行データを削除する)
  • CLOSE (カーソルのクローズ)
カーソル宣言例
[編集 ]
DECLARECR1CURSORFOR
SELECTCLMA,CLMB,CLMC
FROMTBL1
WHERECLMABETWEEN:V開始値AND:V終了値

(注記)V開始値、V終了値は、埋め込み変数あるいはホスト変数と呼ばれ、埋め込みSQLの場合は、プログラム中のBEGIN DECLARE SECTIONEND DECLARE SECTIONの間で宣言する。

カーソルのオープン例
[編集 ]
OPENCR1

(注記)カーソルのオープン前に、V開始値、V終了値には値を設定しておく。

行の取り出し例
[編集 ]
FETCHCR1INTO:V列A,:V列B,:V列C

検索条件に合致した行をすべて取り出すには、「データなし」になるまでFETCHを繰り返す。

(注記)V列A, :V列B, :V列C は、埋め込み変数あるいはホスト変数と呼ばれ、埋め込みSQLの場合は、プログラム中のBEGIN DECLARE SECTIONEND DECLARE SECTIONの間で宣言する。

取り出した行の更新例

UPDATETBL1
SETCLMB=CLMB+1,CLMC=:V列C更新値
WHERECURRENTOFCR1

FETCHで位置付けた行を更新するには、UPDATE文でWHERE CURRENT OF カーソル名を指定する。

(注記)V列C更新値は、埋め込み変数あるいはホスト変数と呼ばれ、埋め込みSQLの場合は、プログラム中のBEGIN DECLARE SECTIONEND DECLARE SECTIONの間で宣言する。

取り出した行の削除例

DELETEFROMTBL1
WHERECURRENTOFCR1

FETCHで位置付けた行を削除するには、DELETE文でWHERE CURRENT OF カーソル名を指定する。

カーソルのクローズ例

CLOSECR1

動的SQL

[編集 ]

動的SQLは、通常SQL文をRDBMSに対して送信の度にデータベースエンジンで実行可能な内部中間コードに翻訳する作業を事前に行うことによって、翻訳済みSQLコードを再度利用してSQL解析のオーバーヘッドを削減することと、SQL文をソースコードで固定せずにデータベースへのアクセス毎に構文を書き換えたい場合に、有用である。データ操作言語 (DML) ももちろん実行できるが、データ定義言語 (DDL) のようにデータベース製品の機能アップによって新しい命令が追加されるものは、プリプロセッサの対応作業が重荷になるため、ほとんどのデータベース製品ではDDL文は動的SQLにて実行することが一般的となっている。

  • PREPARE (文字列で与えたSQL文を解析・翻訳する)
  • EXECUTE (PREPAREで翻訳したSQL文を実行する)
パラメタなし
PREPARE PRESQL FROM 'DELETE FROM TBL1 WHERE CLMA=1'
 ↓
EXECUTE PRESQL
パラメタあり(1回のPREPAREで、EXECUTEの繰り返し実行が可能)
PREPARE PRESQL FROM 'DELETE FROM TBL1 WHERE CLMA=? AND CLMB=?'
 ↓
EXECUTE PRESQL USING :XCLMA,:XCLMB

埋め込みSQL

[編集 ]

もともとカーソルは、埋め込みSQLでホスト言語(母言語)から結果集合を取得するために、都合のよい方法として考えられたものである。データベースと通信するためのリソースの割り当て確保や解放、1行ごとにホスト言語のループ処理で取得するための命令 (FETCH) などがある。

  • ALLOCATE (DEALLOCATE) DESCRIPTOR (データベースとホスト言語(母言語)間での通信領域の確保と解放。)
  • WHENEVER (エラー発生時の振る舞いを定義)
  • SQLSTATE (SQL文実行後の状態が保存される領域)
EXECSQLINCLUDESQLCAEND-EXEC.
EXECSQLBEGINDECLARESECTIONEND-EXEC.
77XPARMPICX(3).
01XTBL1.
03XCLMAPICX(3).
03XCLMBPICX(10).
01XTBL2.
03XCLM1PICS9(5)COMP-3.
03XCLM2PICS9(9)COMP.
EXECSQLENDDECLARESECTIONEND-EXEC.
EXECSQL
DECLARECR1CURSORFOR
SELECTCLMA,CLMBFROMTBL1
WHERECLMA>=:XPARM
ORDERBYCLMA
END-EXEC.
EXECSQLWHENEVERSQLERRORGOTOERR--PROC END-EXEC.
*SQLの静的実行(カーソル操作例)
MOVE'ABC'TOXPARM.
EXECSQLOPENCR1END-EXEC.
PERFORMTESTBEFORE
UNTILSQLCODENOT=ZERO
EXECSQL
FETCHCR1INTO:XCLMA,:XCLMB
END-EXEC
IFSQLCODE=ZERO
データ検索時の処理
END-IF
END-PERFORM.
IFSQLCODE=100
EXECSQLCLOSECR1END-EXEC
END-EXEC.
*SQLの動的実行(?パラメタ使用)
EXECSQL
PREPAREPRESQLFROM
'INSERT INTO TBL2 (CLM1, CLM2) VALUES(?, ?)'
END-EXEC.
MOVEZEROTOXCLM2.
PERFORMTESTAFTER
VARYINGXCLM1FROM1BY1
UNTILXCLM1>=10
EXECSQL
EXECUTEPRESQLUSING:XCLM1,:XCLM2
END-EXEC
END-PERFORM.
GOBACK.
ERR--PROC.
例外処理

3値論理

[編集 ]

SQLで用いられる論理値は、コンピュータの世界でもっとも広く利用されている2値論理 (TRUE, FALSE) ではなく、3値論理 (TRUE, FALSE, UNKNOWN) となっている。 3値論理自体は古くから存在し、Fortran など数値計算においてはよく用いられる。

再帰

[編集 ]

Oracle 9i 以来 CONNECT BY 構文がサポートされるようになり、ネットワーク型のデータ構造の処理が軽くなった。すなわち、再帰的な処理を行うさいに、ホスト側が再帰的な処理を負担するとデータサーバーとのトラフィックが増大し、その間はコミットされるまで他のサーバがデータサーバーにアクセスできないという問題があった。それを解消するために「データサーバー内で再帰的な処理を行う」というアプローチが試みられた。とはいえ、「SQL で再帰を書く」というプログラマは珍しがられた。

主な SQL

[編集 ]

脚注

[編集 ]

注釈

[編集 ]
  1. ^ a b 標題はいずれも Database Language SQL
  2. ^ 標題はいずれも Database Language SQL with Integrity Enhancement
  3. ^ 非スカラー型とオブジェクト指向機能については、いくらか論議を呼ぶことになり、いまだ広く支持されていない。

出典

[編集 ]
  1. ^ 閲覧日: 2023年6月26日, 出版日: 2023年6月1日, 題名: SQL:2023 is out, 出典URL: https://peter.eisentraut.org/blog/2023/06/01/sql-2023-is-out
  2. ^ a b "SQL とは - コトバンク". 2014年6月14日閲覧。よりデジタル大辞泉、IT用語がわかる辞典を参照
  3. ^ "「SQL」の読み方論争に決着? 「しーくぇる」vs「えすきゅーえる」にPostgreSQLがケリ". 2024年4月13日閲覧。
  4. ^ "SQL とは - コトバンク". 2014年6月14日閲覧。よりDBM用語辞典を参照
  5. ^ SQL:2008 now an approved ISO International Standard - Sybase Blog - Glenn Paulley - Id Rather Play Golf

参考文献

[編集 ]

関連項目

[編集 ]
ウィキブックスにSQL 関連の解説書・教科書があります。
概念
オブジェクト
SQL
構成要素
データベース製品
関係データベース管理システムの比較
データベース接続クライアント
カテゴリ カテゴリ

AltStyle によって変換されたページ (->オリジナル) /