少なくとも2つの上位のDB製品(Oracle、SQL Server、Informix、Sybase、DB2、Teradataなど)で拡張可能なSQLを使用して作業した人は、DBベンダーのSQL方言が互いにどのように異なるかを知っていますか。私はOracleの出身なので、特に興味があります。
start with .. connect by
頭に浮かぶ)select x, y from a, b where...
)おそらく、問題は、これらの機能がansi標準によって規制されているかどうか、およびどの程度規制されているかということになります。
実際には、あるデータベースで実行されるSQL DMLステートメントを取得して別のデータベースで実行できるかどうか(および方法)を示す「経験則」があるかどうかを知りたいのです。
[〜#〜] ansi [〜#〜] は、任意の基準を作成する民間の非営利団体です。そのため、実際には何も規制しません。多くのデータベース企業がSQLのANSI規格に準拠しているのは、認められた規格に従うことが企業の利益になる場合が多いためです。もちろん、各企業が自社の製品を差別化しようとしているので、標準を超える追加の機能を開発します。
w3schools から:
SQLはANSI(American National Standards Institute)標準ですが、SQL言語にはさまざまなバージョンがあります。
ただし、ANSI標準に準拠するために、これらはすべて、少なくとも主要なコマンド(SELECT、UPDATE、DELETE、INSERT、WHEREなど)を同様の方法でサポートしています。
注:ほとんどのSQLデータベースプログラムには、SQL標準に加えて独自の拡張機能もあります。
SQL方言間の違いは、リストしたより専門的な領域では大きすぎて、問題を「経験則」に単純化できません。これらの状況では、おそらく各データベースのステートメント全体を変換する必要があります。これを行うことにより、各データベースが提供できる特別な機能を利用して、各ステートメントを各プラットフォーム用に最適化できます。 SQLを最小公分母(ANSI)に書き込むと、移行が簡略化されますが、パフォーマンスは低下します。
SQL方言リファレンス は、SQLバリアントのいくつかの有用な比較を提供します。詳細については、次のように切り替えている特定の方言を検索することをお勧めします。
differences between mysql and Oracle sql
いつか私はあなたが言及するすべてのデータベースを扱ってきました。残念ながら、最も単純なSELECT、INSERT、UPDATE、DELETE以外の構文では、構文が独自のフレーバーに逸脱するのにそれほど時間がかかりません。いくつかのカテゴリに到達すると、ベンダー固有のものをすぐに取得することをお勧めします。 SQLをあるプラットフォームから別のプラットフォームに「移植」する必要が常にありました。数年前に戻りましたが、SQLサーバーとTeradata SQLが、いくつかの結合を含むUPDATEでさえ、どれほど異なっていたかに驚きました。
各ベンダーは通常、標準構文の最小コアに準拠しています。 SQL-92は一般に最も準拠する標準です。次に、その上に機能を追加します。 SQL3は、構文標準に手続き型機能を追加します。この標準への適合性ははるかに低いです。ベンダーはしばしば特定の適合性について主張します。標準への準拠は、「少なくとも」この機能を提供することを意味します。それらは、機能の量を提供することができるため、その標準を超える構文を提供できます。各データベースベンダーは、データベース構造の実装方法に固有の機能も追加しています。これは、各データベースベンダーが競合他社に対してエッジを提供しようとする方法です。マイナーな構文の違いは、より普遍的な機能では一般的ですが、多くの人々が提供またはサポートする追加機能に基づいてデータベースベンダーを決定するため、これはベンダー間で大きく異なるか存在しない主要な機能になる可能性があります。
議論のためにそこに投げるだけでも、おそらくそれもコメントになる可能性があります。これが、現在のEntityFrameworkやLINQなどのさまざまなフレームワークの使用を好む人が多い理由です。この場合、クエリの基盤となるすべての抽象化はアプリケーションレイヤーに委任され、データレイヤーは単なるフラットストレージです。
データベースは単なる記憶媒体であるため、これはNoSQL群衆に別の利点をもたらすことに注意してください。
一部のデータベースベンダーは、ANSI SQL標準への準拠に関する詳細情報を提供しています。 Teradataの場合、ANSI標準の各要素と、各関数やデータ型などの詳細項目ごとにSQL標準が具体的にリストされています。Teradataコンプライアンスに関する一般的なアサーションは見ていませんが、2つのドキュメントを検索しました"SQL:2"。これは、最近のANSI準拠を取得します。これらは、ANSI SQL:2011に準拠していますが、トリガー、ストアドプロシージャ、16進リテラルはSQL:2008に準拠しています。
悪魔は詳細にあります。データベースがどのレベルでもANSI SQLに準拠しているかどうかを判断するには、悪魔が必要です。また、SQL-92の古い標準(別名SQL2)に適合するには十分ではありません。ベンダーが新しい標準に優れたサポートを提供している場合、それはデータベースの品質について多くを語っていませんか?
データベースを比較するための情報に適した場所は、Kline、KlineおよびHuntによる「SQL In a Nutshell」の第2版または第3版であり、O'Reillyによって公開されています。さまざまなデータベース機能をSQL:2003と比較するいくつかのテーブルがあります。 Teradataはリストに含まれていませんが、少なくともSQL:2003に準拠しているため、リストを使用してデータベースの機能を比較できます。
O'Reillyの本のリストを見ると、SQL:2003標準をサポートしていないOracleの機能を見つけることができます。もちろん、その本は古くなっているので、それらの事実を検証するためにOracleのドキュメントをチェックする必要があります。次に、OracleからSQL:2003への比較は、OracleからTeradataへの大きな変換プロジェクトで役立ちます。