プログラミングでは「”(ダブルクォーテーション)」や「’(シングルクォーテーション)」を使うことが多々ありますが、皆さんはこの違いについて答えることが出来ますか?
SQLでは明確な違いがあるものの、MySQLから学習に入った方の中には恐らく違いが判らない方もいらっしゃると思います(理由は後述します)。
そこで今回は、二つのクォーテーションの違いについての具体的な説明も踏まえて解説してみたいと思います。
MySQLから別のSQLにシフトして学習される方は特に、この標準SQLの仕様をしっかりと学んでみてください。
クォーテーションの違いについて
先ほども触れましたが、クォーテーションには「シングルクォーテーション」と「ダブルクォーテーション」の二つが存在します。
ほぼ全てのDBMS(Database Management System)では統一された仕様があり明確な違いがありますが、MySQLなど一部のSQLでは独自の仕様となっています。
標準SQLの仕様では次のように定義されています。
- ”(シングルクォーテーション):文字列定数として扱う
- “”(ダブルクォーテーション):カラム名として扱う
ではMySQLではどのようになっているかと言うと、次のように定義されています。
- ”(シングルクォーテーション):文字列定数として扱う
- “”(ダブルクォーテーション):文字列定数として扱う
- “(バッククォート):カラム名として扱う
MySQLは世界中で最も普及しているデータベースの一つですが、ここまで発展した理由としてルール付けが柔軟と言うこともその要因の一つに挙がります。
ただ逆に、その柔軟なルール付けがあだとなる事もあります。
今回のクォーテーションについての違いなども厳格にルール付けされていない為、初めて学習する方がMySQLから入ってしまうとクォーテーションの理解度が曖昧なままとなる可能性があるため注意しましょう。
SQLでの使い分け
それではシングルクォーテーションとダブルクォーテーションの具体的な使い分けについて見ていきましょう。
基本的にシングルクォーテーションで括る
まずシングルクォーテーションの基本的な使い方ですが、先ほども解説した通り文字列に使用します。
数字には使いません。
例を挙げてみましょう。
次のコードを見てください。
// 数値として認識させる SELECT 123 + 456; GO SUM ----------- 579 // 文字列として認識させる SELECT '123 + 456'; GO STRING --------- 123 + 456
これは簡単なテストコードですが、一つ目の「SELECT 123 + 456;」はシングルクォーテーションで括っていない為、数字として認識されていることがわかります。
一方で二つ目のコードは、123 + 456 をシングルクォーテーションで括っているため、文字列として認識されていることがわかります。
ダブルクォーテーションは基本的には特殊環境下で使用する
ダブルクォーテーションはちょっと特殊な使い方となります。
予約語などテーブルやカラム名には使えないものが存在しますが、そういった予約語などを”どうしても使いたい”場合に使用します。
この時、Oracle、PostgreSQLではダブルクォーテーション、SQL Serverではスクエアブラケット([])で括ることでエラーを回避することが出来ます。
下のコードを見てください。
// スクエアブラケット無し CREATE TABLE DATABASE( DATABASE_ID INT IDENTITY(1,1), DATABASE_Name VARCHAR(50) ); SELECT * FROM DATABASE; GO メッセージ 156、レベル 15、状態 1、サーバー DESKTOP-T3J7G2K\SQLEXPRESS、行 1 キーワード 'DATABASE' 付近に不適切な構文があります。 メッセージ 156、レベル 15、状態 1、サーバー DESKTOP-T3J7G2K\SQLEXPRESS、行 5 キーワード 'DATABASE' 付近に不適切な構文があります。 // スクエアブラケット有り CREATE TABLE [DATABASE]( DATABASE_ID INT IDENTITY(1,1), DATABASE_Name VARCHAR(50) ); SELECT * FROM [DATABASE]; GO DATABASE_ID DATABASE_Name ----------- -------------------- (0 行処理されました)
一つ目のコードはスクエアブラケット無しの状態でテーブルを作成しようとしていますがエラーメッセージが表示され登録されていないことが確認できます。
二つ目のコードはテーブル名をスクエアブラケットで括っているため、予約語であるはずの「DATABASE」という名前でもテーブル登録が出来ています。
クォーテーションをエスケープする方法
次はクォーテーションを使う上で「文字列として使いたい場合」についての解説です。
例えば「Today’s NEWS」というワードにはシングルクォーテーションが含まれていますが、これをそのまま文字列としてクォーテーションで括ってもエラーとなります。
次のコードで確認してみましょう。
// コマンドプロンプトで直打ちした場合 1> SELECT 'Today's NEWS'; 2~ GO 3~ // SSMS(SQL Server Management Studio)を使用した場合 SELECT 'Today's NEWS'; メッセージ 102、レベル 15、状態 1、行 1 'NEWS' 付近に不適切な構文があります。 メッセージ 105、レベル 15、状態 1、行 1 文字列 '; ' の後で引用符が閉じていません。
まずコマンドプロンプトで直打ちをした場合にはクエリ実行をしようとしても実行できません。
これはシングルクォーテーションを閉じていないと認識されるため、GOが反応しない為に起きる現象です。
次にSSMS(SQL Server Management Studio)を使用してクエリを実行した場合ですが、これもエラーメッセージが返ってきていることが確認できます。
ではどうすれば良いでしょうか?
こういった場合には次のように、文字列にしたいクォーテーションを2連続で使用します。
1> SELECT 'Today''s NEWS'; 2> GO ------------ Today's NEWS (1 行処理されました)
今度は文字列としてきちんと認識されていることが確認できます。
別々のクォーテーションで括る
先ほどのエスケープする方法についての派生となりますが、別々のクォーテーションを同時に使う場合についての補足説明となります。
例えば、ダブルクォーテーション内でシングルクォーテーションを使う、または逆にシングルクォーテーション内でダブルクォーテーションを使う場合には2重にする必要はありません。
次のコードを見てください。
// シングルクォーテーションで括ってある中でダブルクォーテーションを使う場合 1> SELECT 'This man''s name is "Ben"'; 2> GO ------------------------ This man's name is "Ben" (1 行処理されました) // ダブルクォーテーションで括ってある中でシングルクォーテーションを使う場合 1> SELECT "This man's name is 'Ben'"; 2> GO ------------------------ This man's name is 'Ben' (1 行処理されました)
どちらも別のクォーテーションを使用する場合には2重にする必要なくきちんと実行できていることが確認できます。
まとめ
いかがでしたか?
今回はクォーテーションについての具体例を踏まえた解説をしてみましたが、きちんと理解できていましたか?
DBMSの中にはこういった違いを持ったものも多く、新たに別のDBMSを使用する場合にはこういった知識がないと思わぬエラーに戸惑うことがあるかもしれません。
この記事でしっかりと知識を身に着けて、正しい使い方が出来るよう心がけてみてください。