Navicatブログ

普遍的なSQL構文の探求 Sep 12, 2024 by Robert Gravelle

1990年代半ば、サン・マイクロシステムズは、「一度書けば、どこでも実行できる」言語を発表しました。もちろん、その言語はJavaでした。そして、今日まで最も人気のあるプログラミング言語の一つとして生き続けていますが、彼らのスローガンは少し楽観的だったようです。Java言語の展開は、SQLのそれと強い類似性を示しています。これもまた、データベース間やオペレーティングシステム間で、ほとんどまたはまったく変更せずに移植することができます。少なくとも、それが理想です。現実世界では、プロダクションレベルのコードは、新しい環境で動作するために、何らかの調整が必要になることが多いです。このブログでは、SQL構文が異なるデータベースベンダー間で違いが発生するいくつかの理由の要点を述べます。

ANSI SQL仕様

ANSI(American National Standards Institute)は、リレーショナルデータベースと対話するために使用される基本的な構文規則とコマンドのセットを定義しています。しかし、HTML、CSS、ECMAScriptのブラウザ実装と同様に、SQLのほとんどのデータベース実装は未完成かつ、もしくは不完全です。ANSI SQLは適合度のレベルに柔軟性を持たせているため、ベンダーは完全な仕様を実装する厳格な要件はありません。しかし、基本的な最低レベルでも、すべてのベンダーは少なくとも、ちょっとは異なっています。

さらに、すべてのベンダーが何らかの形でサポートしている非標準の拡張があります。インデックスのような単純なものでさえ、非標準です。ANSI SQL仕様はインデックスについて何も言及していないため、各ベンダーのインデックス実装は標準の補足となります。これにより、ベンダーは自分のブランドに適していると考えられる構文を自由に考案することが可能になります。その結果、SQLのさまざまな方言が生じ、それらは基本的に同じですが、いくつかの違いがあります。

汎用的なSQLを書く

すべてのデータベースタイプで動作するSQLコードが必要な場合は、SELECT、WHERE、GROUP BY、ORDER BYなどの標準SQL文を使用する必要があります。集計関数であるSUM()、AVG()、MIN()、MAX()も、SQL Server、MySQL、PostgreSQL、SQLite、Oracleなどの一般的なデータベースタイプすべてで理解されます。以下は、どのデータベースでも動作するはずのクエリです。

Select    
    c.customer_id,
    c.customer_name,
    SUM(p.amount) AS total_sales
FROM customers AS c
    LEFT JOIN purchases AS p
    ON c.customers_id = p.customer_id
WHERE
    c.customer_location = 'Canada'
GROUP BY
    c.customer_name ASC;

SQLの学習

データベース管理や開発を始めたばかりの場合は、できるだけ多くのデータベースタイプに適用できるSQLに集中すべきです。また、MySQLのような、ANSI SQLに高度に準拠し、人気のあるデータベースを使用すべきです。MySQLは過去数十年間、常に最も人気のあるデータベースであり続けています。また、MySQLは準拠性が高いため、学習ツールとしても優れています。MySQLに関する記事も多く、ほとんどのSQLサンプルはMySQLで開発および実行されています。Microsoft SQL Serverはこれに次いで人気があります。しかし、T-SQLと呼ばれるMicrosoft独自のSQL方言を使用しています。他のプラットフォームと最も異なるSQLであるため、SQL Serverは理想的な入門データベースとは言えません。PostgreSQLやSQLiteは、どちらも非常に人気があり、ANSIに準拠しているため、おそらくより良い選択肢です。SQLiteは、サイズが小さく移植性が高いため、初心者にとって特に魅力的です。

以下は、データベース間で見られる可能性のある違いのほんの一例です。

ケース感度について

WHERE name = 'Rob' Or WHERE name = 'rob' の節を考えてみましょう。

MySQL PostgreSQL SQLite SQL Server
同等に扱われる 同等に扱われない 同等に扱われない 同等に扱われない

引用符の使い方

データベースによっては、シングルクォートしかサポートしていないものもあれば、シングルクォートとダブルクォートの両方をサポートしているものもあります。

MySQL PostgreSQL SQLite SQL Server
両方をサポートしている シングルクォートのみサポートしている 両方をサポートしている シングルクォートのみサポートしている

列とテーブルのエイリアス

MySQL、PostgreSQL、SQLiteはすべて、「AS」キーワードを使用してエイリアスを示します。つまり、SELECT SUM(score) AS avg_scoreのように記述します。一方、SQL Serverは等号を使用します。つまり。SELECT SUM(score) = avg_scoreのように記述します。

日付/時刻関数

各データベースは、独自の日付および時刻関数を実装しています。

MySQL PostgreSQL SQLite SQL Server
CURDATE() CURTIME() EXTRACT() CURRENT_DATE() CURRENT_TIME() EXTRACT() DATE('now') strftime() GETDATE() DATEPART()

Navicat Premium:万能ツール

Navicat Premium類のデータベースを操作するための最適なツールです。複数のデータベースに同時に接続できるだけでなく、コードスニペット機能により、好みのデータベースタイプに対するクエリの作成がこれまで以上に簡単になります。コードスニペット機能を使用すると、SQLエディタで作業しているときに、再利用可能なコードをSQLステートメントに挿入できます。一般的な制御フローステートメントや関数の組み込みスニペットのコレクションにアクセスできるだけでなく、独自の定義もできます。

code_snippets (119K)

Windows、macOS、Linuxのオペレーティングシステムでご利用いただけるNavicat 17は、ご自身でダウンロードし、14日間無償でお試しできます

ブログのアーカイブ
シェア