web-dev-qa-db-ja.com

なぜSQLが唯一のデータベースクエリ言語なのですか?

汎用プログラミングには、文字通り何百ものプログラミング言語があります。しかし、データベースを操作/クエリするために、SQLがほとんど唯一の使用言語であるのはなぜですか?

36
Manohar

Basileの回答に加えて、SQLはオブジェクト指向言語や手続き型言語とは思えない言語であることも認識してください。多くの点で、ANSI SQL標準は、プロトコルまたは セット理論述語論理関係代数

しかし、個別 [〜#〜] rdbms [〜#〜] の開発者がこれらの標準を実装する方法は、各個別の実装をほぼ分類できるように、さまざまな専用ソフトウェアによって大幅に異なります。独自の言語として。

たとえば、Oracle SQLは MySQL などとは異なるMicrosoft SQL Server SQLとはかなり異なります。さらに、各企業は独自の独自の従来のANSI SQL標準ステートメントに加えて、関数、データベースエンジン、および(場合によっては)手続き型言語。時には、自分の個人的な実装を支持して、標準を放棄することを選択する人さえいます。

SQLとリレーショナルモデルのこの結婚の歴史は、主にテクノロジーと言語が1970年代に E.F。によって並行して開発されたという事実によるものです。コッド 、ドナルドD.チェンバリン、レイモンドF.ボイス。あなたがそれについて読む機会があれば、トピックに関するウィキペディアのかなりまともな記事がいくつかあります。

39
DanK

最初のSQLは、主に relationalデータベース 用です。そして、それは複数の異形または方言を持っています。

したがって、非リレーショナルデータベースには他のクエリ言語があります。 NoSQL についてお読みください。たとえば MongoDB を調べます。 クエリ言語 を参照して、他のクエリ言語の一覧を掲載したWikiページもご覧ください。

21

SQLはそれ自体が「言語」ではなく、言語を作成するための標準です。参考として SQLタイムライン を参照してください。複数の関係者が、標準に基づいた特定のデータベースクエリ言語を実装しています。これは、標準が遵守される度合いが異なります。

その意味では、「SQL言語」などは存在しないため、SQLが唯一のデータベースクエリ言語であると言うのは誤りです。むしろ、Transact-SQL(Microsoft SQL Serverで使用される)、MySQL、PostgreSQL、Oracle SQLなどの複数の言語実装があります。これらは多くの点で似ていますが、特定のリレーショナルデータベースエンジンのドメイン向けに設計されています。

Basile Starynkevitch 正しく指摘されている のように、ほとんどの従来のプログラミング言語で使用できるAPIを介して実装できる「NoSQL」データベース言語も複数あります。

10
Phrancis

それだけがクエリ言語ではありません...クエリ言語にはさまざまな実装方法があります。基本的に、SQLは参照標準として使用されるか、内部的に他の言語がSQLに変換されます。

いくつかのクエリ言語がリストされています here

C#開発者は [〜#〜] linq [〜#〜] クエリ言語を頻繁に使用します。

4
mayur rathi

これは非常に良い質問ですが、より一般的には次のように質問できます。

なぜすべてのリレーショナルデータベースが非常によく似ているのですか?

AccessやFilemakerなどのGUIに付属する小さなバリアントと、やや特殊なシングルユーザーエンジンを除いて、リレーショナルデータベースはすべて、驚くべき数の特性を共有しています。

  • すでに質問の一部になっているように、それらはすべて同じ(古い欠陥のある)クエリ言語を使用しており、すべてに新しい機能が追加されています。これは両方の世界で最悪です。SQLから革新することを敢えてする人はいませんが、方言には互換性がありません。
  • データベーススキーマも常にこの言語(DDLを使用)を使用して定義されますが、データベースは現在のスキーマをその形式で返しません。むしろ、彼らは通常それを表形式のデータのさまざまな形で返します。多くの場合、その情報をDDLに戻すことができるクライアント側ユーティリティがあります。もちろん、これはプログラムで更新を比較するのが面倒です。奇妙ですが、それは彼らがすべてそれを行う方法です。
  • クエリのライブビューを提供することはできません:結果セットと変更のリアルタイムフィード。そのため、データベースアプリケーションは常にすべてを再クエリします。
  • それらはすべて制約の概念をサポートしますが、特に外部キーと一意のキーの形式では、呼び出しコードに違反が発生したときに違反した制約を理解するための十分な情報を呼び出しコードに提供しません。そのため、データベースを使用するソフトウェアでは、明示的な一意性と外部キーのチェックを行う必要があります。DRYの違反と問題)。
  • 彼らは、なぜクエリが遅いのかについての情報を提供するのが得意ではありません。そのため、データベースアプリケーションは、通常、何かが不安定または高価なことが発生した場合、説明なしでハングします。ノードの進行状況インジケーター(実行された場合のクエリのロックへのリンク付き)を含む実行プランのライブビューを取得できないのはなぜですか? [編集:SQL Serverに「ライブクエリ統計」が追加されました)
  • それらはすべて、共通のもののbツリーインデックスを持ち、地理的アプリケーション用の浮動小数点値に基づく別の2次元インデックスを持っています。ただし、浮動小数点のみ、2次元のみです。次に、通常、フルテキスト検索機能が追加されます。また、文字列列にあるxmlデータのインデックスサポートが複数あります。
  • 彼らはすべて英語の2つの単語の類似性を測定する方法を持っています。
  • それらはすべて集計を実行できますが、bツリーブランチノードに集計の部分値を保持して高速に実行することはできません。
  • 前のポイントの特別な例として、それらはどれも行カウントで行を効率的にシークできません。特に、ユーザーがスクロールしたデータのスライスを遅延ロードする一般的なスクロールグリッドは、リレーショナルデータベースサーバーではなく、多数の行に対して効率的ではありません。結果セットの先頭から最初に返された行まで、すべてのデータをスキャンする必要があります。沈みなさい。

要するに、それらはすべて、多くのデータストレージと処理タスクに信じられないほど素晴らしく、不可欠なものですが、驚くほど同じように、すべて混乱し、風変わりです。最初のものが書かれた後、誰もがそれをコピーしただけでなく、時間が経つにつれて人々は当時クールだった機能だけを追加し、それがすべてのプレーヤーにコピーされたことを見ることができます。

これは、非常に異なるパラダイムがあり、各パラダイム内に大幅に異なる構文さえあるプログラミングプラットフォームとは大きく異なります。新しいアイデアは古い言語にもハッキングされますが、多くの場合、人々は実際に新しい言語やプラットフォームを作成します。 Javaは1990年に一歩前進しました。NETは2002年に一歩前進しました。リレーショナルデータベースと同じくらい古い言語はC++であり、それはそれを示しています。リレーショナルデータベースでのみ、本当の選択肢はありませんが、それらを使用することです。

「NoSQL」データベースがあることは知っていますが、リレーショナルパラダイムは依然として非常に重要です。そこに多元主義がほとんどないのは悲しいです。

4
John