PREPARATION
受験対策

オススメ!OSS-DB情報

第3回 SQL と引用符

SQL では文字列リテラルを一重の引用符(')で囲みますが、では二重引用符(")はどのように使われるのでしょうか。
MySQL のように二重引用符で囲った文字列を文字列リテラルとして利用できる RDBMS もありますが、一般的には、二重引用符つきの文字列はテーブル名や列名などオブジェクト名として使われます。
オブジェクト名は、英数字のみで構成され、かつ大文字と小文字の区別がされないのが通常ですが、二重引用符を使うと、記号を含めたり、大文字と小文字を区別したりできます。例えば、
create table test-1(id integer);
はエラーになりますが、
create table "test-1"(id integer);
であれば、test-1 というテーブルを作ることができます。
さらに、
create table "Test-1"(val text);
とすると、上の test-1 とは異なる Test-1 というテーブルが作られます。
これらのテーブルを参照するときも、二重引用符をつける必要があり、
select * from "test-1";
のようにしなければなりません。
列名に二重引用符をつけて、記号を含めたときも同じです。
表名や列名に記号を使えるのは便利に思えるかもしれませんが、大文字と小文字が区別されるようになると、思わぬトラブルが発生する可能性があります。
例えば、「テーブルは存在するように思えるのに、select * from table_name; でテーブルが存在しないというエラーになった、調べてみたら、テーブル名が大文字小文字混在状態になっていた(create table "Table_Name" (...); といった SQL 文で作成されていた)」などという問題は意外と原因究明や解決が難しいものです。
従って、テーブルの作成時にテーブル名や列名には二重引用符は絶対に使用すべきでない、テーブル名や列名は大文字小文字を混在できず、記号を含めることもできない、くらいに考えておくのが良いでしょう。

二重引用符の最も現実的な利用法は列別名です。例えば、
create table emp (id integer, last_name varchar(10), first_name varchar(10));
で定義されたテーブルから、
select id, last_name || first_name from emp;
という検索を実行すると、2番目の列のヘッダが、?column? となります。これを
select id, last_name || first_name "Full Name" from emp;
とすれば、"full name"が列別名となり、ヘッダにも Full Name と表示されます。列別名には二重引用符が必須というわけではありませんが、
select id, last_name || first_name FullName from emp;
とすると、大文字がすべて小文字に変換されて列のヘッダは fullname となります。また、上の例のようにスペースなどの記号を入れるときには二重引用符が必須です。

解説:松田神一

応募者全員プレゼント!
オープンソース データベース標準教科書 -PostgreSQL-