SQL

SQL（Structured Query Language）（エスキューエルよりデジタル大辞泉、IT用語がわかる辞典を参照、シークェル、シーケルよりDBM用語辞典を参照）は、関係データベース管理システム (RDBMS) において、データの操作や定義を行うためのデータベース言語（問い合わせ言語）、ドメイン固有言語である。プログラミングにおいてデータベースへのアクセスのために、他のプログラミング言語と併用される。

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

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

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

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

年通称別称説明規格1986年SQL86SQL87ANSIによって発表された最初の規約。1987年にISOによって批准された。
データ操作言語 (DML) 仕様策定: COBOL、FORTRAN、PL/Iなど、親言語（母言語、ホスト言語とも言う）への埋込みSQL文仕様策定ANSI X3.135-1986ISO 9075:1987JIS X 3005:19871989年SQL89 マイナーバージョン。
データ定義言語 (DDL) 仕様策定 （CREATE TABLE文、CREATE VIEW文、GRANT文。ただし、DROP文、ALTER文、REVOKE文はなし）
制約および整合性機能を追加 （DEFAULT、UNIQUE制約、NOT NULL制約、PRIMARY KEY制約、CHECK制約、参照整合性制約）
C言語への埋込みSQL文仕様の追加ISO 9075:1989ANSI X3.135-1989 JIS X 3005:19901992年SQL2メジャーバージョン
直交性の改善 （表式）
データ型の拡張 （可変長文字列、ビット、文字集合、日付・時刻・時間間隔 (DATE、TIME、TIMESTAMP、INTERVAL)）
外部結合 (OUTER JOIN)
定義域 (DOMAIN)
表明 (ASSERTION)
一時表 （TEMPORARY TABLE: 永続化しないデータを格納）
DDL仕様追加 （DROP文、ALTER文）
動的SQL仕様
前方・後方スクロール可能なカーソルサポート
クライアント/サーバシステムのためのCONNECT/DISCONNECT文ISO/IEC 9075:1992ANSI X3.135-1992JIS X 3005:19951995年SQL/CLI コールレベルインターフェース (Call Level Interface)業界標準になった ODBC API のインタフェースに相当する機能を国際標準化した規格1996年SQL/PSM 永続格納モジュール (Persistent Storage Module)一般的にストアドプロシージャと呼ばれる機能を国際標準化した規格1999年(SQL99)SQL3RDBMSのための完全な言語になることを目指した仕様。
正規表現による値照合
共通表式(WITH句)
再帰クエリ
OLAP (ROLLUP、CUBE、GROUPING SETS)
ユニオン (UNION)・結合経由の更新
カーソル操作の機能強化 （トランザクション完了後のオープン状態保持）・ユーザ定義権限 (ROLE)・トランザクション管理の新機能 (SAVEPOINT)
SQL/PSM強化 （制御構文 （IF、WHILEなど） サポートなど）
SQLJ （Javaを親言語とする埋め込みSQL規格）
データベーストリガ
ユーザ定義関数 （ストアドファンクション）
非スカラー型の新しいデータ型: 真理値 (BOOLEAN) 型と配列 (ARRAY) 型、LOB (Large Object)、ユーザ定義型、構造型
上位表と下位表 （スーパーテーブルとサブテーブル）
オブジェクト指向の考え方を取り入れたオブジェクト関係データベース技術 (ORDB)。配列型やユーザ定義型、ユーザ定義関数と上位表/下位表仕様により実現されている。ISO/IEC 9075:1999
JIS X 3005-1:2002、JIS X 3005-2:20022003年 SQL/MM （マルチメディア: フレームワーク、全文検索、空間データ (Spatial)、静止画像）
SQL/MED （外部データ管理: 非関係データ （順編成ファイルや階層型データベースなど） や他社の関係データをSQLでアクセスするための規格）
SQL/OLB （オブジェクト言語バインディング: SQLJを標準化する。Javaプログラムに埋め込むSQL文）
XML関連の機能
ウィンドウ関数
順序（シーケンス）の標準化と識別キー列に対する値の自動生成を行う列仕様の導入 （ID型）
(See Eisenberg et al.: SQL:2003 Has Been Published.)ISO/IEC 9075:20032008年 INSTEAD OF トリガ
TRUNCATE TABLE ステートメント
配列型の集約と展開 (array_agg, unnest) SQL:2008 now an approved ISO International Standard - Sybase Blog - Glenn Paulley - Id Rather Play GolfISO/IEC 9075-2:2008JIS X 3005-1:20142011年 時間データ（PERIOD FOR）（詳細については、時間データベース#履歴を参照）
ウィンドウ関数とFETCH句の機能強化ISO/IEC 9075-2:2011JIS X 3005-2:20152016年 行パターンマッチング
多態的テーブル関数
文字列フィールドに格納されたJSONデータに対する操作ISO/IEC 9075-2:20162019年パート 15、多次元配列 (MDarray 型と演算子) ISO/IEC 9075-15:20192023年データ型 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を以下に挙げる。これらは概ね仕様に準拠しているが、仕様に定められていない部分や実装上の理由により細部には違いがある。

SQL/PSM (DB2, MySQL)

各RDBMSベンダーによる標準以外の独自のプロシージャには以下のようなものがある。これらには、独自追加された制御構文だけでなく、命令やデータ型の非互換も含むため注意が必要である。
PL/SQL (Oracle, DB2)
Transact-SQL (Adaptive Server Enterprise, Microsoft SQL Server)
PL/pgSQL (PostgreSQL)
PSQL (Firebird, InterBase)

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

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

 SQL文法 

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

 コマンド文法 

 データ定義言語 

 CREATE （データベースオブジェクト（表、インデックス、制約など）の定義）
 DROP   （データベースオブジェクトの削除）
 ALTER  （データベースオブジェクトの定義変更）

 データ操作言語 

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

列名と値を、対で指定
INSERT INTO 表名(列名1,列名2) VALUES(値1,値2)

表を構成するすべての列に値を格納する場合は、列名の記述を省略可能
INSERT INTO 表名 VALUES (値1, 値2)

他表のデータを検索して格納
INSERT INTO 表名1 SELECT 列名1, 列名2 FROM 表名2 〜

更新
UPDATE 表名
 SET 列名2=値2, 列名3=値3
 WHERE 列名1=値1

削除
DELETE FROM 表名
 WHERE 列名1=値1

1行以上の検索
SELECT *
 FROM 表名
 WHERE 列名1 BETWEEN 値1 AND 値2
 ORDER BY 列名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          （カーソルのクローズ）

 カーソル宣言例 
DECLARE CR1 CURSOR FOR
 SELECT CLMA, CLMB, CLMC
  FROM TBL1
  WHERE CLMA BETWEEN :V開始値 AND :V終了値
※V開始値、V終了値は、埋め込み変数あるいはホスト変数と呼ばれ、埋め込みSQLの場合は、プログラム中のBEGIN DECLARE SECTION〜END DECLARE SECTIONの間で宣言する。

 カーソルのオープン例 
OPEN CR1
※カーソルのオープン前に、V開始値、V終了値には値を設定しておく。

 行の取り出し例 
FETCH CR1 INTO :V列A, :V列B, :V列C
検索条件に合致した行をすべて取り出すには、「データなし」になるまでFETCHを繰り返す。

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

取り出した行の更新例
UPDATE TBL1
 SET CLMB=CLMB+1, CLMC=:V列C更新値
 WHERE CURRENT OF CR1
FETCHで位置付けた行を更新するには、UPDATE文でWHERE CURRENT OF カーソル名を指定する。

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

取り出した行の削除例
DELETE FROM TBL1
 WHERE CURRENT OF CR1
FETCHで位置付けた行を削除するには、DELETE文でWHERE CURRENT OF カーソル名を指定する。

カーソルのクローズ例
CLOSE CR1

 動的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文実行後の状態が保存される領域）

EXEC SQL INCLUDE SQLCA         END-EXEC.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
77  XPARM              PIC X(3).
01  XTBL1.
  03  XCLMA            PIC X(3).
  03  XCLMB            PIC X(10). 
01  XTBL2.
  03  XCLM1            PIC S9(5) COMP-3.
  03  XCLM2            PIC S9(9) COMP.
EXEC SQL END   DECLARE SECTION END-EXEC.

    EXEC SQL
     DECLARE CR1 CURSOR FOR
      SELECT CLMA, CLMB FROM TBL1
       WHERE CLMA>=:XPARM
       ORDER BY CLMA
    END-EXEC.

    EXEC SQL WHENEVER SQLERROR GO TO ERR--PROC END-EXEC.

*   SQLの静的実行（カーソル操作例）
    MOVE  'ABC'    TO  XPARM.
    EXEC SQL OPEN CR1          END-EXEC.
    PERFORM TEST BEFORE
     UNTIL SQLCODE NOT = ZERO 
      EXEC SQL
       FETCH CR1 INTO :XCLMA, :XCLMB 
      END-EXEC
      IF SQLCODE = ZERO
       データ検索時の処理
       END-IF
    END-PERFORM.
    IF SQLCODE = 100
     EXEC SQL CLOSE CR1          END-EXEC
    END-EXEC.
*   SQLの動的実行（？パラメタ使用）
    EXEC SQL
     PREPARE PRESQL FROM
      'INSERT INTO TBL2 (CLM1, CLM2) VALUES(?, ?)'
    END-EXEC.
    MOVE ZERO       TO  XCLM2.
    PERFORM TEST AFTER
     VARYING XCLM1 FROM 1 BY 1
     UNTIL XCLM1 >= 10
      EXEC SQL
       EXECUTE PRESQL USING :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 
MySQL（オープンソース、UNIX、Linux、Windows対応）
PostgreSQL（オープンソース、UNIX、Linux、Windows対応）
Ingres（オープンソース、UNIX、Linux、Windows、Mac OS対応）
SQLite（オープンソース（パブリックドメイン）、標準のC言語で実装されており再コンパイルであらゆる環境に対応）
Firebird（オープンソース、Linux、Windows、macOS 、Solaris、HP-UX対応）
Oracle Database（プロプライエタリ、UNIX、Linux、Windows対応）
Microsoft SQL Server（プロプライエタリ、Windows対応）
IBM DB2 (プロプライエタリ、AS/400、z/OS、UNIX、Linux、Windows対応）
IBM Informix Dynamic Server（プロプライエタリ、UNIX、Linux、Windows対応）
Sybase Adaptive Server Enterprise（プロプライエタリ、UNIX、Linux、Windows対応）
InterBase（プロプライエタリ、Linux、Windows、Solaris、macOS 対応）
SQL/DS (VSE, VM/CMS)

 脚注 

 注釈 

 出典 

 参考文献 
 SQL言語の開発と日本の貢献

 関連項目 

関係モデル
関係代数 (関係モデル)
関係論理
SQLインジェクション
ドメイン固有言語
整列法
クイックソート
バブルソート
並列演算処理

*
Category:問い合わせ言語