Sự khác biệt giữa dấu ngoặc đơn và dấu ngoặc kép trong SQL là gì?


225

Sự khác biệt giữa dấu ngoặc đơn và dấu ngoặc kép trong SQL là gì?

Câu trả lời:


154

Dấu ngoặc đơn được sử dụng để chỉ ra sự bắt đầu và kết thúc của một chuỗi trong SQL. Dấu ngoặc kép thường không được sử dụng trong SQL, nhưng có thể thay đổi từ cơ sở dữ liệu đến cơ sở dữ liệu.

Dính vào việc sử dụng dấu ngoặc đơn.

Dù sao đó cũng là mục đích sử dụng chính. Bạn có thể sử dụng các trích dẫn đơn cho một bí danh cột - nơi bạn muốn tên cột bạn tham chiếu trong mã ứng dụng của mình là một cái gì đó khác với những gì cột thực sự được gọi trong cơ sở dữ liệu. Ví dụ: PRODUCT.idsẽ dễ đọc hơn product_id, vì vậy bạn sử dụng một trong các cách sau:

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

Hoặc là hoạt động trong Oracle, SQL Server, MySQL, nhưng tôi biết một số người đã nói rằng TOAD IDE dường như đưa ra một số đau buồn khi sử dụng phương pháp trích dẫn duy nhất.

Bạn phải sử dụng các trích dẫn đơn khi bí danh cột bao gồm một ký tự khoảng trắng, ví dụ product id, nhưng không nên thực hiện cho một bí danh cột nhiều hơn một từ.


31
Dấu ngoặc kép thường được sử dụng cho tên đối tượng (ví dụ tên cột "Tên"). Đó là một phần của tiêu chuẩn SQL-92.
LukLed

19
Không. Tôi có nghĩa là tên cột, nhưng nó cũng liên quan đến bí danh. Tôi khuyên bạn nên sử dụng dấu ngoặc kép cho các bí danh và tên có ký tự bất thường, vì tiêu chuẩn SQL-92. SELECT * FROM USERS 'Users'không hoạt động trong SQL Server, nhưng SELECT * FROM USERS "Users"không.
LukLed

122
Tôi luôn hiểu sai điều này cho đến khi tôi nhận ra một quy tắc đơn giản: [S] ingle quote for [S] trings, [D] ouble quote for Things in [D] atabase
Spacesman

4
Bạn nên sử dụng dấu ngoặc kép cho định danh. Báo giá đơn đi ngược lại với tiêu chuẩn.
Erwin Brandstetter

6
SELECT PRODUCT.id 'product_id'sẽ không hoạt động trong Oracle. Trích dẫn duy nhất chỉ dành cho chữ nhân vật. Chúng không thể được sử dụng cho các mã định danh trong SQL (tiêu chuẩn) (mặc dù một số DBMS chỉ bỏ qua tiêu chuẩn SQL khi nói đến các định danh được trích dẫn)
a_horse_with_no_name

80

Một quy tắc đơn giản để chúng ta nhớ sử dụng cái gì trong trường hợp này:

  • [ S ] trích dẫn ingle là cho [ S ] trings; [ D ] báo giá sự cố dành cho [ D ] tại định danh cơ sở dữ liệu;

Trong MySQL và MariaDB, biểu tượng ` (backtick) giống như " biểu tượng. Bạn có thể sử dụng " khi bạn SQL_MODEđã ANSI_QUOTESbật.


4
Để làm rõ, backtick (`) có thể được sử dụng để phân định định danh cho dù ANSI_QUOTES có được bật hay không, nhưng nếu ANSI_QUOTES được bật, thì" bạn không thể sử dụng dấu ngoặc kép để trích dẫn chuỗi ký tự, bởi vì nó được hiểu là định danh. " ( nguồn ). (Tất cả điều này giả định rằng bạn đang nói về MySQL, tâm trí.)
Sam

Ồ Ghi nhớ tuyệt vời!
Alex Yu

Nhưng [ S ] trích dẫn ingle cũng dành cho [ D ] ăn chữ. : - /
Bill Karwin

Ngày chữ được tính là Chuỗi trong hầu hết DBMS
Vui lòng_Dont_Bully_Me_SO_Lords

64

Dấu ngoặc đơn phân định một hằng chuỗi hoặc hằng số ngày / thời gian.

Dấu ngoặc kép phân định định danh cho ví dụ tên bảng hoặc tên cột. Điều này thường chỉ cần thiết khi số nhận dạng của bạn không phù hợp với quy tắc cho số nhận dạng đơn giản.

Xem thêm:

Bạn có thể khiến MySQL sử dụng dấu ngoặc kép theo tiêu chuẩn ANSI:

SET GLOBAL SQL_MODE=ANSI_QUOTES

Bạn có thể khiến Microsoft SQL Server sử dụng dấu ngoặc kép theo tiêu chuẩn ANSI:

SET QUOTED_IDENTIFIER ON

36

Trong ANSI SQL, trích dẫn kép trích dẫn tên đối tượng (ví dụ: bảng) cho phép chúng chứa các ký tự không được phép khác hoặc giống như các từ dành riêng (thực sự tránh điều này).

Dấu ngoặc đơn là cho chuỗi.

Tuy nhiên, MySQL không biết gì về tiêu chuẩn (trừ khi SQL_MODE của nó bị thay đổi) và cho phép chúng được sử dụng thay thế cho các chuỗi.

Hơn nữa, Sybase và Microsoft cũng sử dụng dấu ngoặc vuông để trích dẫn định danh.

Vì vậy, đó là một nhà cung cấp cụ thể một chút.

Các cơ sở dữ liệu khác như Postgres và IBM thực sự tuân thủ tiêu chuẩn ansi :)


4
MySql sử dụng backtick `để trích dẫn định danh. (chỉ để hoàn thành)
dar7yl

1
Ví dụ: Nếu bạn muốn đặt tên cho cột Postgres là "ngày" (được dành riêng), bạn sẽ cần phải trích dẫn nó.
fny

9

Tôi sử dụng tính năng ghi nhớ này:

  • Dấu ngoặc đơn là cho chuỗi (một điều)
  • Dấu ngoặc kép là cho tên bảng và tên cột (hai điều)

Điều này không đúng 100% theo thông số kỹ thuật, nhưng việc ghi nhớ này giúp tôi (con người).


1

Sự khác biệt nằm ở cách sử dụng của họ. Các trích dẫn đơn chủ yếu được sử dụng để chỉ một chuỗi trong WHERE, HAVING và cả trong một số hàm SQL tích hợp như CONCAT, STRPOS, VỊ TRÍ, v.v.

Khi bạn muốn sử dụng một bí danh có khoảng trắng ở giữa thì bạn có thể sử dụng dấu ngoặc kép để chỉ bí danh đó.

Ví dụ

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

Đây là một truy vấn con từ bảng đơn hàng có account_id là Khóa ngoại mà tôi đang tổng hợp để biết mỗi tài khoản được đặt bao nhiêu đơn hàng. Ở đây tôi đã đưa ra một cột bất kỳ tên ngẫu nhiên nào là "đếm" vì mục đích.

Bây giờ, hãy viết một truy vấn bên ngoài để hiển thị các hàng trong đó "số lượng" lớn hơn 20.

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

Bạn cũng có thể áp dụng trường hợp tương tự cho các biểu thức Bảng chung.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.