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


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.


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.


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

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 :)


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).


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.