ความแตกต่างระหว่างคำพูดเดียวและสองครั้งใน SQL คืออะไร?


คำตอบ:


153

ใช้อัญประกาศเดี่ยวเพื่อระบุจุดเริ่มต้นและจุดสิ้นสุดของสตริงใน 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

19
ไม่ฉันหมายถึงชื่อคอลัมน์ แต่เกี่ยวข้องกับชื่อแทนด้วย ฉันแนะนำให้ใช้เครื่องหมายอัญประกาศคู่สำหรับชื่อแทนและชื่อที่มีอักขระผิดปกติเนื่องจากมาตรฐาน SQL-92 SELECT * FROM USERS 'Users'ไม่ทำงานใน SQL Server แต่SELECT * FROM USERS "Users"ทำงานได้
LukLed

122
ฉันมักจะทำผิดพลาดนี้จนกระทั่งฉันรู้กฎง่ายๆ: [S] ingle quote สำหรับ [S] trings, [D] ouble quote สำหรับสิ่งต่าง ๆ ใน [D] atabase
Spacedman

4
คุณควรใช้เครื่องหมายคำพูดคู่สำหรับตัวระบุ คำพูดเดียวกับมาตรฐาน
Erwin Brandstetter

6
SELECT PRODUCT.id 'product_id'จะไม่ทำงานใน Oracle เครื่องหมายคำพูดเดียวใช้สำหรับตัวอักษรเท่านั้น พวกเขาไม่สามารถใช้สำหรับตัวระบุใน (มาตรฐาน) SQL (แม้ว่าบาง DBMS เพียงแค่ละเว้นมาตรฐาน SQL เมื่อมันมาถึงตัวระบุที่ยกมา)
a_horse_with_no_name

80

กฎง่ายๆที่เราจำได้ว่าควรใช้ในกรณีใด:

  • [ S ] อัญประกาศเดี่ยวใช้สำหรับ [ S ] trings; [ D ] เครื่องหมายคำพูดคู่ใช้สำหรับ [ D ] ตัวระบุ atabase;

ใน MySQL และ MariaDB ที่` (backtick) สัญลักษณ์เป็นเช่นเดียวกับ"สัญลักษณ์. คุณสามารถใช้"เมื่อคุณSQL_MODEได้ANSI_QUOTESเปิดใช้งาน


4
ในการชี้แจง backtick (`) สามารถใช้เพื่อกำหนดขอบเขตตัวระบุว่าเปิดใช้งาน ANSI_QUOTES หรือไม่ แต่ถ้าเปิดใช้งาน ANSI_QUOTES อยู่" คุณไม่สามารถใช้เครื่องหมายอัญประกาศคู่เพื่ออ้างอิงสตริงตัวอักษรได้เนื่องจากจะตีความว่าเป็นตัวระบุ ( แหล่งที่มา ) (ทั้งหมดนี้จะถือว่าคุณกำลังพูดถึง MySQL, ใจ.)
แซม

ว้าว! บันทึกที่ยอดเยี่ยม!
Alex Yu

แต่คำพูด[ s ] ingle ก็มีไว้สำหรับ [ D ] เช่นกัน : - /
Bill Karwin

วันที่ตัวอักษรนับเป็นสตริงใน DBMS ส่วนใหญ่
Please_Dont_Bully_Me_SO_Lords

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 ใช้ backtick `สำหรับการอ้างอิงตัวระบุ (เพิ่งเสร็จ)
dar7yl

1
ตัวอย่าง: หากคุณต้องการตั้งชื่อคอลัมน์ Postgres "date" (ซึ่งสงวนไว้) คุณจะต้องใส่เครื่องหมายอัญประกาศเป็นสองเท่า
fny

9

ฉันใช้ตัวช่วยจำนี้:

  • คำพูดเดียวสำหรับสตริง (สิ่งหนึ่ง)
  • เครื่องหมายคำพูดคู่ใช้สำหรับชื่อตารางและชื่อคอลัมน์ (สองอย่าง)

มันไม่ถูกต้อง 100% ตามสเป็ค แต่ช่วยในการจำช่วย (มนุษย์)


1

ความแตกต่างอยู่ในการใช้งานของพวกเขา คำพูดเดียวส่วนใหญ่จะใช้ในการอ้างถึงสตริงใน WHERE, HAVING และในฟังก์ชัน SQL ในตัวเช่น CONCAT, STRPOS, POSITION เป็นต้น

เมื่อคุณต้องการใช้นามแฝงที่มีช่องว่างระหว่างนั้นคุณสามารถใช้อัญประกาศคู่เพื่ออ้างถึงนามแฝงนั้น

ตัวอย่างเช่น

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

นี่คือแบบสอบถามย่อยจากตารางคำสั่งซื้อที่มี account_id เป็นคีย์ต่างประเทศที่ฉันรวบรวมเพื่อทราบจำนวนการสั่งซื้อแต่ละบัญชี ที่นี่ฉันได้ตั้งชื่อสุ่มหนึ่งคอลัมน์เป็น "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.