SQLの単一引用符と二重引用符の違いは何ですか?


回答:


154

単一引用符は、SQLの文字列の開始と終了を示すために使用されます。二重引用符は通常SQLでは使用されませんが、データベースによって異なる場合があります。

一重引用符の使用に固執します。

とにかく、それが主な用途です。列のエイリアスには一重引用符を使用できます。アプリケーションコードで参照する列名を、データベースで実際に列が呼び出される名前とは異なるものにする必要があります。例:PRODUCT.idより読みやすくなるproduct_idため、次のいずれかを使用します。

  • SELECT PRODUCT.id AS product_id
  • SELECT PRODUCT.id 'product_id'

どちらもOracle、SQL Server、MySQLで機能しますが、シングルクォートアプローチを使用すると、TOAD IDEが問題を引き起こすようだと言う人もいます。

列のエイリアスにスペース文字が含まれている場合は、一重引用符を使用する必要があります(例:)product id。ただし、列のエイリアスを複数の単語にすることはお勧めできません。


31
通常、オブジェクト名には二重引用符が使用されます(列名「名」など)。これはSQL-92標準の一部です。
LukLed、2010年

19
いいえ、私は列名を意味しましたが、エイリアスも関係しています。SQL-92標準のため、エイリアスと異常な文字を含む名前には二重引用符を使用することをお勧めします。SELECT * FROM USERS 'Users'SQL Serverでは機能しませんが、SELECT * FROM USERS "Users"機能します。
LukLed、2010年

122
[S] tringsの単一引用符、[D] atabaseにあるものの[D] ouble引用
スペースマン

4
識別子には二重引用符を使用する必要があります。一重引用符は標準に反します。
Erwin Brandstetter 2012

6
SELECT PRODUCT.id 'product_id'ではないオラクルで働いています。単一引用符は文字リテラル専用です。それらは(標準)SQLの識別子には使用できません(一部のDBMSは引用符で囲まれた識別子に関してはSQL標準を無視するだけです)
a_horse_with_no_name 2014年

80

どの場合に何を使用するかを覚えておくための簡単なルール:

  • [ S ]単一引用符は[ S ] tringsのためのものです。[ D ] ouble引用は[ D ] atabase識別子用です。

MySQLとMariaDBでは、`(バッククォート)の記号が同じであるシンボル。あなたが使用することができ、」あなたがたときにSQL_MODEしているANSI_QUOTES有効。


4
明確にするために、ANSI_QUOTESが有効かどうかにかかわらず、バックティック( `)を使用して識別子を区切ることができますが、ANSI_QUOTESが有効な場合、「リテラル文字列は識別子として解釈されるため、二重引用符を使用してリテラル文字列を引用することはできません。」(ソース)。(これはすべて、あなたがMySQLについて話していることを前提としています。)
Sam

うわー!素晴らしいメモ!
Alex Yu

ただし、[ S ]単一引用符は[ D ] ateリテラルにも使用されます。:-/
ビルカーウィン

ほとんどのDBMSでは、日付リテラルは文字

64

単一引用符は、文字列定数または日付/時刻定数を区切ります。

二重引用符は、テーブル名や列名などの識別子を区切ります。これは通常、識別子が単純な識別子のルールに適合しない場合にのみ必要です。

以下も参照してください。

MySQLでANSI標準ごとに二重引用符を使用することができます。

SET GLOBAL SQL_MODE=ANSI_QUOTES

Microsoft SQL ServerでANSI標準ごとに二重引用符を使用するようにできます。

SET QUOTED_IDENTIFIER ON

36

ANSI SQLでは、二重引用符は、オブジェクト名(例:テーブル)を引用符で囲みます。これにより、他の方法では許可されない文字、または予約語と同じ文字を含めることができます(実際には避けてください)。

一重引用符は文字列用です。

ただし、MySQLは標準に気付かず(SQL_MODEが変更されていない限り)、それらを文字列に対して交換可能に使用できます。

さらに、SybaseとMicrosoftも識別子の引用に角括弧を使用しています。

したがって、それはベンダー固有です。

PostgresやIBMなどの他のデータベースは、実際にはansi標準に準拠しています:)


4
MySqlは、識別子の引用にバックティック `を使用します。(完了のため)
dar7yl 2010

1
例:Postgres列に「日付」(予約済み)と名前を付けたい場合は、二重引用符で囲む必要があります。
fny 2014

9

私はこのニーモニックを使用します:

  • 一重引用符は文字列用です(1つ)
  • 二重引用符はテーブル名と列名(2つ)を示します

これは仕様によると100%正確ではありませんが、このニーモニックは私(人間)を助けます。


1

違いはそれらの使用法にあります。一重引用符は、ほとんどの場合、WHERE、HAVING、およびCONCAT、STRPOS、POSITIONなどの一部の組み込みSQL関数で文字列を参照するために使用されます。

間にスペースがあるエイリアスを使用する場合は、二重引用符を使用してそのエイリアスを参照できます。

例えば

(select account_id,count(*) "count of" from orders group by 1)sub 

以下は、accounts_idを外部キーとして持つ注文テーブルのサブクエリで、各アカウントが行った注文の数を知るために集計しています。ここでは、目的のために「カウント」として任意のランダムな名前を1列に付けています。

次に、 "count of"が20より大きい行を表示する外部クエリを作成しましょう。

select "count of" from 
(select account_id,count(*) "count of" from orders group by 1)sub where "count of" >20;

同じケースを共通テーブル式にも適用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.