構造化照会言語( SQL ) ( / ˌ ɛ s ˌ k j u ˈ ɛ l / SQLと発音されます 。または/ ˈ s iː k w ə l /と発音されます)ⓘ "sequel") [ 4 ] [ 5 ]はリレーショナルデータベース管理システムにおいてデータを管理するために使用されるドメイン固有言語構造化データ、つまりエンティティと変数間の関係を組み込んだデータの処理に特に役立ちます。 [ 6 ]
1970年代に導入されたSQLは、ISAMやVSAMといった従来の読み書きAPIに比べて、主に2つの利点を提供しました。第一に、 1つのコマンドで多数のレコードにアクセスできるという概念を導入しました。第二に、インデックスの有無など、レコードへのアクセス方法を指定する必要がなくなりました。
元々は関係代数とタプル関係計算に基づいていたSQLは、多くの種類のステートメントで構成されており[ 7 ] 、これらは非公式にサブ言語として分類することができ、一般的にはデータクエリ言語(DQL)、データ定義言語(DDL)、データ制御言語(DCL)、データ操作言語(DML)などがあります[ 8 ] 。
SQLの適用範囲は、データクエリ、データ操作(挿入、更新、削除)、データ定義(スキーマの作成と変更)、およびデータアクセス制御を含みます。SQLは基本的に宣言型言語(第4世代言語)ですが、手続き型要素も含まれています。
SQL は、エドガー F. コッドのリレーショナル モデルを使用した最初の商用言語の 1 つです。このモデルは、彼の影響力のある 1970 年の論文「大規模共有データ バンクのためのリレーショナル データ モデル」で説明されています。[ 9 ]コッドが説明したリレーショナル モデル に完全に準拠しているわけではありませんが、SQL は最も広く使用されているデータベース 言語になりました。[ 10 ] [ 11 ]
SQLは1986年に米国規格協会(ANSI)の標準となり、1987年には国際標準化機構(ISO)の標準となった。 [ 12 ]それ以来、この標準はより多くの機能セットを含め、共通の拡張機能を組み込むために複数回改訂されてきた。標準が存在するにもかかわらず、実際に存在する実装で完全にそれに準拠しているものはほとんどなく、ほとんどのSQLコードは、異なるデータベースシステムに移植する前に少なくとも何らかの変更が必要となる。
SQLは、 1970年代初頭にエドガー・F・コッド[ 13 ]から関係モデルについて学んだ後、IBMのドナルド・D・チャンバーリンとレイモンド・F・ボイスによって最初に開発されました。 [ 14 ]このバージョンは、当初SEQUEL(Structured English Query Language)と呼ばれ、 IBMサンノゼ研究所のグループが1970年代に開発したIBMのオリジナルの準関係データベース管理システムであるSystem Rに格納されているデータを操作および取得するように設計されました。[ 14 ]
チェンバリンとボイスが最初に試みた関係データベース言語は SQUARE (Specifying Queries in A Relational Environment) でしたが、下付き文字/上付き文字表記のため使いづらいものでした。1973 年にサンノゼ研究所に移った後、彼らは SQUARE の後継の開発に着手しました。[ 13 ]元々の名称 SEQUEL は、Ingresのクエリ言語であるQUELをもじったものだと広く考えられていましたが、[ 15 ]後に「SEQUEL」が英国のHawker Siddeley Dynamics Engineering Limited 社の商標であったため、SQL (母音を削除) に変更されました。 [ 16 ] SQL という名称は後に Structured Query Language の頭文字となりました。[ 17 ]
IBMは、顧客のテストサイトでSQLをテストしてシステムの有用性と実用性を判断した後、System Rプロトタイプに基づいて商用製品の開発を開始しました。これには、System/38、SQL/DS、IBM Db2が含まれ、それぞれ1979年、1981年、1983年に市販されました。[ 18 ] IBMの支持により、業界はQUELなどの代替手段からSQLに移行しました。[ 19 ]
1970年代後半、リレーショナル・ソフトウェア社(現オラクル社)は、コッド、チェンバリン、ボイスらが提唱した概念の可能性に着目し、米国海軍、中央情報局(CIA)、その他の米国政府機関への販売を目指して、独自のSQLベースのリレーショナルデータベース管理システム(RDBMS)を開発した。1979年6月、リレーショナル・ソフトウェア社は、 VAXコンピュータ向けに、SQLの商用実装としては最初期の製品の一つであるOracle V2(バージョン2)を発表した。
1986 年までに、ANSIおよびISO標準化グループは、標準「データベース言語 SQL」言語定義を正式に採用しました。標準の新しいバージョンは、 1989 年、 1992年、1996 年、1999 年、2003 年、2006 年、2008 年、2011年、[ 13 ] 2016年、そして最近では2023 年に公開されました。[ 20 ]
SQL の実装はベンダー間で互換性がなく、必ずしも標準に完全に準拠しているとは限りません。特に、日付と時刻の構文、文字列の連結、NULL比較の大文字小文字の区別はベンダーによって異なります。PostgreSQL [ 21 ]とMimer SQL [ 22 ]は標準への準拠を目指していますが、PostgreSQL はすべてのケースで標準に準拠しているわけではありません。たとえば、PostgreSQL で引用符なしの名前を小文字に変換することは、引用符なしの名前を大文字に変換する必要があると規定しているSQL 標準[ 23 ]と互換性がありません。 [ 24 ]したがって、標準によれば、はではなくと同等であるべきです。FooFOOfoo
DATE一般的な SQL の実装では、通常、やTIMEデータ型などの標準 SQL の基本機能のサポートが省略されています。そのような最も明白な例であり、偶然にも最も人気のある商用および独自仕様の SQL DBMS は、Oracle ( は のDATEように動作しDATETIME、[ 25 ] [ 26 ]型がありませんTIME) [ 27 ]と MS SQL Server (2008 年以前のバージョン) です。その結果、SQL コードは、変更なしでデータベース システム間で移植できることはほとんどありません。
データベースシステム間の移植性が低い理由としては、以下のようなものが挙げられます。
SQLは1986年にANSIによってSQL-86 [ 29 ]として、また1987年にISOによって標準として採用されました。 [ 12 ]これはISO/IEC JTC 1、情報技術、サブコミッティSC 32、データ管理と交換によって維持されています。
1996年までは、米国国立標準技術研究所(NIST)のデータ管理標準プログラムがSQL DBMSのSQL標準への準拠を認証していました。現在では、ベンダーが自社製品の準拠を自己認証しています。[ 30 ]
元の標準では、「SQL」の公式の発音は頭字語/ ˌ ɛ s ˌ k juː ˈ ɛ l / ("ess cue el") であると宣言されていました。[ 10 ]それにもかかわらず、多くの英語圏のデータベース専門家(ドナルド・チェンバリン自身[ 31 ]を含む)は、言語のリリース前の開発名「SEQUEL」を反映して、頭字語のような発音/ ˈ s iː k w əl / ("sequel")を使用しています。 [ 32 ] [ 14 ] [ 16 ] [ 31 ] SQL 標準は、数多くの改訂を経てきました。
規格は一般的に、ISO/IEC 9075-n:yyyy Part n: title というパターンで表記されます。または、略してISO/IEC 9075と表記されます。関係者は、ISO [ 37 ] IEC または ANSIから規格文書を購入できます。古い草案は無料で入手できます。[ 38 ] [ 39 ]
ISO/IEC 9075は、ISO/IEC 13249: SQL マルチメディアおよびアプリケーション パッケージといくつかの技術レポートによって補完されています。
SQL言語は、以下のようないくつかの言語要素に細分化されます。
SQLは、リレーショナルデータベースに格納されたデータを照会するという特定の目的のために設計されています。SQLは、 CやBASICのような命令型プログラミング言語ではなく、セットベースの宣言型プログラミング言語です。ただし、標準SQLの拡張機能により、制御フロー構造などの手続き型プログラミング言語の機能が追加されています。
標準のSQL/PSM拡張機能と独自の SQL 拡張機能に加えて、多くの SQL プラットフォームでは、DBMS と他の言語との統合により、手続き型およびオブジェクト指向のプログラミングが可能です。SQL 標準では、SQL データベースでJavaコードをサポートするために、 SQL/JRT拡張機能 (Java プログラミング言語用の SQL ルーチンと型)が定義されています。Microsoft SQL Server 2005 は、SQLCLR (SQL Server 共通言語ランタイム)を使用して、データベースで管理対象の.NETアセンブリをホストしますが、以前のバージョンの SQL Server は、主に C で記述された管理対象外の拡張ストアド プロシージャに限定されていました。PostgreSQLでは、 Perl、Python、Tcl、JavaScript (PL/V8)、Cなど、さまざまな言語で関数を作成できます。[ 41 ]
SQLという言語の代替案と、リレーショナルモデルそのものの代替案は区別すべきである。以下に、SQL言語に代わるリレーショナルな代替案を示す。リレーショナルモデルの代替案については、ナビゲーションデータベースとNoSQLを参照のこと。
分散リレーショナルデータベースアーキテクチャ(DRDA)は、1988年から1994年にかけてIBMのワーキンググループによって設計されました。DRDAは、ネットワーク接続されたリレーショナルデータベースが連携してSQLリクエストを処理することを可能にします。[ 43 ] [ 44 ]
対話型ユーザーまたはプログラムは、ローカルRDBに対してSQL文を発行し、リモートRDBからデータテーブルとステータスインジケータを応答として受信できます。SQL文はコンパイルしてパッケージとしてリモートRDBに格納し、パッケージ名で呼び出すこともできます。これは、複雑で頻繁にクエリを発行するアプリケーションプログラムの効率的な動作にとって重要です。特に、アクセス対象のテーブルがリモートシステムに存在する場合に重要です。
DRDAのメッセージ、プロトコル、および構造コンポーネントは、分散データ管理アーキテクチャによって定義されます。DRDAによる分散SQL処理は、現代の分散SQLデータベースとは異なります。
SQLは、その理論的基盤である関係モデルとそのタプル計算からいくつかの点で逸脱している。関係モデルでは、テーブルはタプルの集合であるが、SQLでは、テーブルとクエリ結果は行のリストであり、同じ行が複数回出現する可能性があり、クエリでは行の順序を使用できる(例えば、LIMIT句内)。批判者たちは、SQLは厳密に元の基盤に戻る言語に置き換えるべきだと主張している。例えば、ヒュー・ダーウェンとCJ・デイトによる『第三マニフェスト』(2006年、ISBN 1000)を参照。 0-321-39942-0)
初期の仕様では、主キーなどの主要な機能はサポートされていませんでした。結果セットに名前を付けることはできず、サブクエリも定義されていませんでした。これらは1992年に追加されました。[ 13 ]
和型がないことは、SQLのユーザー定義型を完全に利用する上での障害となっていると指摘されている。例えば、JSONのサポートは2016年に新しい標準によって追加される必要があった。[ 45 ]
Nullの概念は議論の対象となっている。Null マーカーは値の欠如を示し、整数列の 0 やテキスト列の空文字列とは異なる。Null の概念はSQL の 3 値論理を強制するものであり、これは一般的な3 値論理の具体的な実装である。[ 13 ]
もう1つのよくある批判は、重複行を許容するため、 Pythonなどの言語との統合が困難になるという点です。Pythonのデータ型では、解析の面でもモジュール性の欠如の面でも、データを正確に表現することが難しい場合があります[ 13 ]。これは通常、テーブル内の行を一意に識別する1つ以上の列を持つ主キーまたは一意制約を宣言することで回避されます。
オブジェクトリレーショナルインピーダンスミスマッチと同様の意味で、宣言型SQL言語と、SQLが通常埋め込まれている手続き型言語との間にミスマッチが発生する。[ 46 ]
SQL標準では、3種類のデータ型が定義されています(SQL/Foundationの第4.1.1章)。
構築型はARRAY、、、(参照)、またはのいずれかです。ユーザー定義型は、MULTISETオブジェクト指向言語のクラスに相当し、独自のコンストラクタ、オブザーバ、ミューテータ、メソッド、継承、オーバーロード、オーバーライド、インターフェースなどを備えています。事前定義されたデータ型は、実装によって本質的にサポートされています。REFROW
CHAR)VARCHAR)CLOB)NCHAR)NCHAR VARYING)NCLOB)BINARY)VARBINARY)BLOB)NUMERIC、、、、)DECIMALSMALLINTINTEGERBIGINTFLOAT、、)REALDOUBLE PRECISIONDECFLOAT)DATE、、TIME)TIMESTAMPINTERVAL)誰かの弁護士が所有しているという手紙を受け取ったため、元の名前を SQL に変更しました。それを構造化クエリ言語の SQL に短縮し、製品は SQL/DS として知られるようになりました。
は標準規格への準拠を誇りとしています。そのSQL実装はANSI-SQL:2008規格に厳密に準拠しています。
各
値について、Oracleは次の情報を格納します: 世紀、年、月、日、時、分、秒
DATE日付時刻データ型は
...
DATE以下のSQL/DSおよびDB2データ型の列は、対応するOracleデータ型がないため定義しないでください。...
TIMESQL(正しくは「エスキューエル」と発音し、やや一般的な「シークエル」とは発音しない)...