DB2では、列にORDERという名前を付けて、次のようなSQLを記述できます。
SELECT ORDER FROM tblWHATEVER ORDER BY ORDER
列名の前後に特殊文字を配置する必要もありません。これは私が入り込まない苦痛を引き起こしていますが、私の質問は、なぜデータベースがオブジェクト名にSQLキーワードの使用を許可するのかということです。確かに、これを許可しない方が理にかなっていますか?
キーワードを識別子として使用してはならないという意見には、おおむね同意します。最新のコンピューティング言語のほとんどには 20 個または 30 個のキーワードがあり、その場合、識別子としての使用を一時停止することは完全に合理的です。残念ながら、SQL は古い COBOL 言語学派 (「コンピューティング言語は可能な限り英語に似ている必要があります」) から来ています。したがって、SQL (COBOL など) には数百のキーワードがあります。
予約語を識別子として許可する必要があるかどうかについて SQL 標準が何かを述べているかどうかは思い出せませんが、広範な (過剰な!) 語彙を考えると、いくつかの SQL 実装で許可されていることは当然のことです。
そうは言っても、キーワードを識別子として使用することは、SQL の引用符で囲まれた識別子の概念全体の半分ほどばかげているわけではありません (これらは DB2 固有ではありません)。大文字と小文字を区別する識別子を許可することは 1 つのことですが、引用符で囲まれた識別子は、スペース、分音記号、および一部の実装 (DB2 を含む) では、制御文字を含むあらゆる種類のナンセンスを許可します! たとえば、次のことを試してください。
CREATE TABLE "私の Table" ( A INTEGER NOT NULL );
はい、これは識別子の途中に改行があり、最後に e-acute があります... (これは、データベースのメタデータにどのエンコーディングが使用されているか、したがって非 Unicode データベースが許可されるかどうかについて興味深い推測につながります、たとえば、日本語の列名を含むテーブル定義)。
多くのSQLパーサー(特に私が使用しているDB2 / z)は、字句解析と意味解析を完全に分離することがある通常のパーサーよりも賢いです(この分離はほとんどの場合良いことです)。
SQLパーサーは、コンテキストに基づいて、キーワードが有効であるか、識別子として扱われるべきかを判断できます。
したがって、ORDER、GROUP、またはDATEという列を取得できます(これは特に一般的な列です)。
キーワードcolorで識別子をブランド化するとき、構文カラーリングエディタのいくつかで私を苛立たせます。それらのパーサーは、DB2のものほど「スマート」ではありません。
興味深いことに、SQLServerのフィールド名としてキーワードを使用することもできます。唯一の違いは、フィールドの名前に括弧を使用する必要があるということです
だからあなたは次のようなことをすることができます
create table [order](
id int,
[order] varchar(50) )
その後 :)
select
[order]
from
[order]
order by [order]
これはもちろん少し極端な例ですが、少なくとも括弧を使用すると、[order]はキーワードではないことがわかります。
すでにキーワードで予約されている名前を使用している人を目にする理由は、列名、またはテーブルの名前とデータ表示の間に直接マッピングがある場合です。あなたはそれを怠惰または便利であると呼ぶことができます。
オブジェクト名は...名前だからです。すべてのデータベースシステムでは、引用符で囲まれた名前を使用して、問題が発生するのを防ぐことができます。
問題が発生した場合、障害はオブジェクト名を名前として許可する方法ではなく、実装に問題があるか、コードライブラリに問題があり、すべてを自動的に引用しないか、必要に応じて名前を引用させることができません。