Jaka jest różnica między pojedynczymi i podwójnymi cudzysłowami w SQL?

224

Jaka jest różnica między pojedynczymi i podwójnymi cudzysłowami w SQL?

Vineet
źródło

Odpowiedzi:

153

Pojedyncze cudzysłowy są używane do wskazania początku i końca łańcucha w SQL. Podwójne cudzysłowy na ogół nie są używane w SQL, ale mogą się różnić w zależności od bazy danych.

Trzymaj się pojedynczych cudzysłowów.

To i tak jest podstawowe zastosowanie. Możesz użyć pojedynczych cudzysłowów dla aliasu kolumny - tam, gdzie chcesz, aby nazwa kolumny, do której się odwołujesz w kodzie aplikacji, była czymś innym niż nazwa kolumny w bazie danych. Na przykład: PRODUCT.idbyłby bardziej czytelny jako product_id, więc używasz jednego z następujących:

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

Oba działają w Oracle, SQL Server, MySQL… ale wiem, że niektórzy powiedzieli, że TOAD IDE wydaje się nieco żal przy stosowaniu metody pojedynczych cudzysłowów.

Musisz użyć pojedynczych cudzysłowów, gdy alias kolumny zawiera znak spacji, np. product id, Ale nie jest zalecane, aby alias kolumny był więcej niż jednym słowem.

Kucyki OMG
źródło
31
Podwójne cudzysłowy są zwykle używane do oznaczania nazw obiektów (np. Nazwa kolumny „Imię”). Jest to część standardu SQL-92.
LukLed
19
Nie. Miałem na myśli nazwy kolumn, ale dotyczy to także aliasów. Radziłbym używać podwójnych cudzysłowów dla aliasów i nazw z nietypowymi znakami, ze względu na standard SQL-92. SELECT * FROM USERS 'Users'nie działa w SQL Server, ale SELECT * FROM USERS "Users"działa.
LukLed
122
Zawsze się mylę, dopóki nie zrozumiałem prostej zasady: [S] ingle quote for [S] trings, [D] ouble quote for Things in the [D] atabase
Spacedman
4
W przypadku identyfikatorów należy używać podwójnych cudzysłowów. Pojedyncze cytaty idą w parze ze standardem.
Erwin Brandstetter
6
SELECT PRODUCT.id 'product_id'nie będzie działać w Oracle. Pojedyncze cudzysłowy dotyczą tylko literałów znakowych. Nie można ich używać do identyfikatorów w (standardowym) SQL (chociaż niektóre DBMS po prostu ignorują standard SQL, jeśli chodzi o identyfikatory cytowane)
a_horse_w_na_name
80

Prosta reguła dla nas, aby pamiętać, czego użyć w takim przypadku:

  • [ S ] ingle cytaty dotyczą [ S ] trings; [ D ] podwójne cudzysłowy dotyczą [ D ] identyfikatorów atabazy;

W MySQL i MariaDB The ` (lewy apostrof) symbol jest taka sama jak symbol. Można użyć kiedy wasz SQL_MODEzostał ANSI_QUOTESwłączony.

Please_Dont_Bully_Me_SO_Lords
źródło
4
Aby to wyjaśnić, można użyć znaku wstecznego (`) do rozgraniczenia identyfikatorów, czy ANSI_QUOTES jest włączony, ale jeśli ANSI_QUOTES jest włączony, wówczas„ nie można używać podwójnych cudzysłowów do cytowania literałów, ponieważ jest on interpretowany jako identyfikator ”. ( źródło ). (To wszystko zakłada, że ​​mówisz o MySQL, umyśle.)
Sam
Łał! Doskonała notatka!
Alex Yu
Ale [ S ] ingle cytaty dotyczą także literałów [ D ]. : - /
Bill Karwin
Literały daty są liczone jako ciągi
znaków
64

Pojedyncze cudzysłowy ograniczają stałą ciągu lub stałą daty / godziny.

Podwójne cudzysłowy ograniczają identyfikatory np. Nazw tabel lub nazw kolumn. Jest to na ogół konieczne tylko wtedy, gdy twój identyfikator nie pasuje do reguł dla prostych identyfikatorów.

Zobacz też:

Możesz zmusić MySQL do stosowania podwójnych cudzysłowów zgodnie ze standardem ANSI:

SET GLOBAL SQL_MODE=ANSI_QUOTES

Możesz zmusić Microsoft SQL Server do używania podwójnych cudzysłowów zgodnie ze standardem ANSI:

SET QUOTED_IDENTIFIER ON
Bill Karwin
źródło
36

W ANSI SQL podwójne cudzysłowy podają nazwy obiektów (np. Tabele), co pozwala im zawierać znaki niedozwolone w inny sposób lub być takie same jak słowa zastrzeżone (naprawdę tego unikaj).

Pojedyncze cudzysłowy dotyczą ciągów znaków.

Jednak MySQL jest nieświadomy tego standardu (chyba że jego SQL_MODE zostanie zmieniony) i pozwala na stosowanie ich zamiennie dla łańcuchów.

Ponadto Sybase i Microsoft również używają nawiasów kwadratowych do cytowania identyfikatorów.

Więc jest to trochę specyficzne dla dostawcy.

Inne bazy danych, takie jak Postgres i IBM, są zgodne ze standardem ansi :)

MarkR
źródło
4
MySql używa wstecznego `do cytowania identyfikatora. (tylko na zakończenie)
dar7yl
1
Przykład: jeśli chcesz nazwać kolumnę Postgres „datą” (która jest zarezerwowana), musisz ją dwukrotnie zacytować.
fny
9

Używam tego mnemonicznego:

  • Pojedyncze cudzysłowy dotyczą ciągów znaków (jedna rzecz)
  • Podwójne cudzysłowy dotyczą nazw tabel i nazw kolumn (dwie rzeczy)

To nie jest w 100% poprawne zgodnie ze specyfikacją, ale ten mnemonik pomaga mi (człowiekowi).

guettli
źródło
1

Różnica polega na ich użyciu. Pojedyncze cudzysłowy są najczęściej używane do odsyłania ciągu w GDZIE, POSIADANIE, a także w niektórych wbudowanych funkcjach SQL, takich jak CONCAT, STRPOS, POSITION itp.

Jeśli chcesz użyć aliasu z odstępem pomiędzy nimi, możesz użyć podwójnych cudzysłowów w celu odniesienia się do tego aliasu.

Na przykład

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

Oto podzapytanie z tabeli zamówień posiadające account_id jako klucz obcy, który agreguję, aby wiedzieć, ile zamówień zostało złożonych na każdym koncie. Tutaj nadałem jednej kolumnie dowolną nazwę jako „liczbę” ze względu na cel.

Teraz napiszmy zapytanie zewnętrzne, aby wyświetlić wiersze, w których „liczba” jest większa niż 20.

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

Możesz zastosować tę samą sprawę także do wyrażeń Common Table.

Ayushh Srivastava
źródło