SQLでは、文字列をシングルクォーテーションで囲んだ場合とダブルクォーテーションで囲んだ場合とでは、その意味が違います。今回は、この違いについて解説します。
目次
SQLの文字列リテラルの基本
プログラムのソースコードにおいて、数値や文字列を変数で使う場合、それに代入する数値や文字列のことをリテラルと言います。そして、それが文字列の場合、文字列リテラルと呼びます。なお、このような文字列リテラルはSQLでも使います。まずは、SQLにおける文字列リテラルの基本を解説します。
SQLにおける文字列の使い方
SQLとはStructured Query Language の略で、そのまま翻訳すると構造化問い合わせ言語という意味です。そして、SQLの特徴とは、複雑な処理でもプログラミング言語よりも単純な文法で記述できる点です。ただし、その分、SQLの文法を意識して書かないと、正しく動作しないSQLが出来上がってしまいます。
SQLで使われる文字列は、SELECTやINSERT、UPDATEなどの機能を提供するキーワードと、データベース名および、そのデータベースに登録された列名といった識別子、そして、データベースに登録する文字列、または、それと比較するための文字列に分けられます。
なお、この中で、データベースに登録する文字列、または、それと比較するための文字列は、シングルクォーテーションで囲みます。ダブルクォーテーションは意味が違うので注意してください。
SQLの文字列リテラルはシングルクォーテーションで囲む
先ほど説明したように、変数として使う文字列をSQLで記述するためには、シングルクォーテーションで囲みます。そして、具体的な書き方は次のとおりです。
SQLの文字列リテラルの書き方
シングルクォーテーション「,」で囲む
‘文字列’
文字列リテラルを使ったSQLの例 insert into table_one values( 'String' );
SQLが使えるデータベース管理ソフトで文字列リテラルを使う場合は、シングルクォーテーションで囲むのが正しい使い方です。なお、データベース管理ソフトの中には、SQLiteのようにダブルクォーテーションで囲んでも文字列リテラルとして扱うものもあります。
ダブルクォーテーションはデータベース管理ソフトで違う
プログラム言語では、文字列リテラルを使う場合、ダブルクォーテーションで囲む使い方が可能です。また、SQLliteなどのデータベース管理ソフトの中では、ダブルクォーテーションで囲んだ文字列リテラルが使えます。中には、SQLでもダブルクォーテーションが使えると考える方もいるかもしれません。
しかし、SQLにおけるダブルクォーテーションは、文字列リテラルの定義に使う識別子ではありません。SQLliteなど使えるデータベース管理ソフトもありますが、他に移植する際にエラーになるので、ダブルクォーテーションを文字列リテラルの定義には使わないようにしてください。
SQLのダブルクォーテーションの使い方
先ほど、ダブルクォーテーションは、文字列リテラルの定義には使えない、と解説しました。では、どのように使えば良いのでしょうか。先ほど、SQLの文法上、キーワード、データベース名や列名などの識別子、文字列リテラルの3種類の文字列を扱うと解説しました。通常ダブルクォーテーションは、この中のデータベース名や列名に使います。次から、SQLのダブルクォーテーションの使い方について解説します。
識別子は大文字が基本
SQLで使われるデータベース名や列名の識別子は、大文字と小文字を区別しません。また、識別子に使えるのは、文字と数字とアンダースコア、ドル記号に限られており、通常は、ハイフン「-」やプラス「+」などの記号が使えません。
そのため、下記のようにデータベース名を大文字で書いても、小文字で書いても同じデータベースが参照されます。
データベース名を大文字で書いた例 SELECT * FROM MY_TABLE; データベース名を小文字で書いた例 SELECT * FROM my_table;
この2つの例は同じ意味です。
識別子で小文字を使う場合はダブルクォーテーションで囲む
SQLのデータベース名や列名の識別子として、小文字が全く使えない訳ではありません。また、ハイフン「-」やプラス「+」などの記号を含む識別子をどうしても使いたいケースもあるでしょう。そのような場合に使うのでダブルクォーテーションです。
識別子をダブルクォーテーションで囲むことで、もし、小文字を使っている場合は、大文字に変換されません。また、ハイフン「-」やプラス「+」といった記号を含む文字列も利用できます。
ダブルクォーテーションで囲んだ識別子の例 select * from "MyTable-1";
テーブル名「MyTable」は、ダブルクォーテーションで囲んでいない場合は「MYTABLE」として扱われる。また、「-1」はそのままでは扱えない。しかし、ダブルクォーテーションで囲むことで、「MyTable-1」というテーブル名が扱えます。
文字列をダブルクォーテーションで囲んだらどうなるか
もし、SQLで文字列リテラルを使う場合、シングルクォーテーションで囲む必要があるOracleやPostgreSQLといったデータベース管理ソフトで、ダブルクォーテーションを使った場合、それは識別子として処理されます。そのため、insert文などでデータベースに文字列を入力するケースでダブルクォーテーションが使われていると、そのような識別子は無い、というエラーになります。
PostgreSQLで文字列リテラルをダブルクォーテーションで囲んだSQLの実行例 create table table_one( id int, name text ); insert into table_one values(1, "Suzuki"); insert into table_one values(2, "Tanaka"); insert into table_one values(3, "Yamamoto"); insert into table_one values(4, "Itou"); 実行結果 CREATE TABLE ERROR: 列"Suzuki"は存在しません 行 1: insert into table_one values(1, "Suzuki"); ^ ERROR: 列"Tanaka"は存在しません 行 1: insert into table_one values(2, "Tanaka"); ^ ERROR: 列"Yamamoto"は存在しません 行 1: insert into table_one values(3, "Yamamoto"); ^ ERROR: 列"Itou"は存在しません 行 1: insert into table_one values(4, "Itou");
SQLiteは文字列でもダブルクォーテーションが使える
これまで、文字列リテラルを使うにはシングルクォーテーションを使い、特殊な列を指定する場合にダブルクォーテーションが使えると解説しました。しかし、SQLiteは、文字列を記述すべき位置に限り、文字列リテラルの指定にダブルクォーテーションが使用できます。
そのためSQLiteでSQLを習った方は、文字列リテラルをダブルクォーテーションで指定できると誤解するかもしれません。しかし、OracleやMySQLなどの他のデータベース管理ソフトでは使えないので注意が必要です。
まとめ
プログラミングを経験した方の中には、文字列を定義するためにダブルクォーテーションを使うのに慣れている方がいるかもしれません。しかし、今回解説したようにSQLでは、文字列の指定にシングルクォーテーションを使うのが基本です。ダブルクォーテーションを使うと列名として扱われ、エラーとなるので注意しましょう。