อ่าน 12 นาที
ไวยากรณ์ SQL
ไวยากรณ์ ของ ภาษาโปรแกรม SQL ถูกกำหนดและดูแลรักษาโดย ISO/IEC SC 32 ซึ่งเป็นส่วนหนึ่งของ ISO/IEC 9075 มาตรฐานนี้ไม่สามารถใช้งานได้ฟรี แม้จะมีมาตรฐานนี้อยู่ แต่โค้ด SQL...
ไวยากรณ์ SQL
ไวยากรณ์ของภาษาโปรแกรมSQLถูกกำหนดและดูแลรักษาโดยISO/IEC SC 32ซึ่งเป็นส่วนหนึ่งของISO/IEC 9075 มาตรฐานนี้ไม่สามารถใช้งานได้ฟรี แม้จะมีมาตรฐานนี้อยู่ แต่โค้ด SQL ก็ไม่สามารถใช้งานร่วมกัน ได้อย่างสมบูรณ์ในระบบฐานข้อมูล ต่างๆ โดยไม่ต้องปรับแต่ง
องค์ประกอบทางภาษา
ภาษา SQL แบ่งออกเป็นองค์ประกอบย่อยหลายส่วน ได้แก่:
- คีย์เวิร์ดคือคำที่ถูกกำหนดความหมายไว้ในภาษา SQL โดยอาจเป็นคำสงวน (เช่น `in`
SELECT,COUNT`in` และYEAR`in`) หรือคำทั่วไป (เช่น `in`ASC, `in`DOMAINและKEY`in`) รายการคำสงวน ใน SQL - ตัวระบุคือชื่อที่ใช้เรียกวัตถุในฐานข้อมูล เช่นตารางคอลัมน์ และสคีมา ตัวระบุต้องไม่เท่ากับคำสงวน เว้นแต่จะเป็นตัวระบุที่คั่นด้วยเครื่องหมายอัญประกาศคู่ ตัวระบุที่คั่นด้วยเครื่องหมายอัญประกาศคู่หมายถึงตัวระบุที่อยู่ภายในเครื่องหมายอัญประกาศคู่ พวกมันสามารถมีอักขระที่ปกติแล้วไม่รองรับในตัวระบุ SQL และสามารถเหมือนกับคำสงวนได้ เช่น คอลัมน์ชื่อ จะ ถูก
YEARระบุเป็น"YEAR" - อนุประโยคซึ่งเป็นส่วนประกอบของข้อความและคำถาม (ในบางกรณี อนุประโยคเหล่านี้เป็นตัวเลือก) [ 1 ]
- นิพจน์ซึ่งสามารถสร้าง ค่า สเกลาร์หรือตารางที่ประกอบด้วยคอลัมน์และแถวของข้อมูล ได้
- เงื่อนไข (Predicates ) คือเงื่อนไขที่สามารถประเมินค่าได้เป็นตรรกะสามค่า (3VL) ของ SQL (จริง/เท็จ/ไม่ทราบ) หรือค่าความจริงแบบบูลีน และใช้เพื่อจำกัดผลกระทบของคำสั่งและแบบสอบถาม หรือเพื่อเปลี่ยนแปลงการไหลของโปรแกรม
- คำสั่งค้นหา (Queries)คือ คำสั่ง ที่ใช้ดึงข้อมูลตามเกณฑ์ที่กำหนด นี่เป็นองค์ประกอบสำคัญของSQL
- คำสั่งต่างๆซึ่งอาจส่งผลกระทบอย่างถาวรต่อโครงสร้างและข้อมูล หรืออาจควบคุมธุรกรรมการไหลของโปรแกรมการเชื่อมต่อเซสชันหรือการวินิจฉัยปัญหา
- คำสั่ง SQL ยังรวมถึง เครื่องหมาย เซมิโคลอน (";") เป็นตัวจบคำสั่งด้วย แม้ว่าจะไม่จำเป็นต้องใช้ในทุกแพลตฟอร์ม แต่ก็ถูกกำหนดให้เป็นส่วนมาตรฐานของไวยากรณ์ SQL
- โดยทั่วไปแล้ว ช่องว่างที่ไม่สำคัญจะถูกละเลยในคำสั่งและแบบสอบถาม SQL ทำให้การจัดรูปแบบโค้ด SQL อ่านง่ายขึ้น
ผู้ปฏิบัติงาน
| ผู้ปฏิบัติงาน | คำอธิบาย | ตัวอย่าง |
|---|---|---|
= | เท่ากับ | Author='Alcott' |
<> | ไม่เท่ากับ (หลายสำเนียงก็ยอมรับเช่นกัน!=) | Dept<>'Sales' |
> | มากกว่า | Hire_Date>'2012-01-31' |
< | น้อยกว่า | Bonus<50000.00 |
>= | มากกว่าหรือเท่ากับ | Dependents>=2 |
<= | น้อยกว่าหรือเท่ากับ | Rate<=0.05 |
[NOT]BETWEEN[SYMMETRIC] | ระหว่างช่วงที่ครอบคลุม ฟังก์ชัน SYMMETRIC จะกลับขอบเขตของช่วงหากขอบเขตแรกสูงกว่าขอบเขตที่สอง | CostBETWEEN100.00AND500.00 |
[NOT]LIKE[ESCAPE] | เริ่มต้นด้วยรูปแบบตัวอักษร | Full_NameLIKE'Will%' |
| ประกอบด้วยรูปแบบตัวอักษร | Full_NameLIKE'%Will%' | |
[NOT]IN | เท่ากับค่าใดค่าหนึ่งจากหลายค่าที่เป็นไปได้ | DeptCodeIN(101,103,209) |
IS[NOT]NULL | เปรียบเทียบกับค่าว่าง (ข้อมูลที่หายไป) | AddressISNOTNULL |
IS[NOT]TRUEหรือIS[NOT]FALSE | การทดสอบค่าความจริงแบบบูลีน | PaidVacationISTRUE |
ISNOTDISTINCTFROM | เท่ากับค่า หรือทั้งสองเป็นค่าว่าง (ข้อมูลที่หายไป) | DebtISNOTDISTINCTFROM-Receivables |
AS | ใช้สำหรับเปลี่ยนชื่อคอลัมน์เมื่อดูผลลัพธ์ | SELECTemployeeASdepartment1 |
บางครั้งมีการเสนอหรือนำตัวดำเนินการอื่นๆ มาใช้ เช่นตัวดำเนินการ Skyline (สำหรับค้นหาเฉพาะแถวที่ไม่ 'แย่กว่า' แถวอื่นๆ)
SQL มีcaseนิพจน์ที่ถูกนำมาใช้ในSQL-92ในรูปแบบทั่วไปที่สุด ซึ่งเรียกว่า "กรณีที่ค้นหา" (searched case) ในมาตรฐาน SQL:
CASE WHEN n > 0 THEN 'positive' WHEN n < 0 THEN 'negative' ELSE 'zero' ENDSQL จะทดสอบWHENเงื่อนไขตามลำดับที่ปรากฏในซอร์สโค้ด หากซอร์สโค้ดไม่ได้ระบุELSEเงื่อนไขใดๆ SQL จะใช้ค่าเริ่มต้นเป็น null ELSE NULLนอกจากนี้ยังสามารถใช้ไวยากรณ์แบบย่อที่เรียกว่า "simple case" ได้อีกด้วย
กรณีn เมื่อ1 แล้ว'หนึ่ง' เมื่อ2 แล้ว'สอง' มิฉะนั้น'ฉันนับสูงขนาดนั้นไม่ได้' จบไวยากรณ์นี้ใช้การเปรียบเทียบความเท่าเทียมกันโดยปริยาย โดยมีข้อควรระวังตามปกติสำหรับการเปรียบเทียบกับค่า NULL
มีคำย่อสองคำสำหรับสำนวน CASEพิเศษCOALESCEได้แก่ และNULLIF
นิพจน์ นี้COALESCEจะส่งคืนค่าของตัวถูกดำเนินการตัวแรกที่ไม่ใช่ค่าว่าง (NULL) โดยเริ่มจากซ้ายไปขวา หรือส่งคืนค่าว่าง (NULL) หากตัวถูกดำเนินการทั้งหมดเท่ากับค่าว่าง (NULL)
รวมตัว( x1 , x2 )เทียบเท่ากับ:
กรณีx1 ไม่เป็นค่าว่างแล้วx1 มิฉะนั้นx2นิพจน์ นี้NULLIFมีตัวถูกดำเนินการสองตัว และจะคืนค่า NULL หากตัวถูกดำเนินการทั้งสองมีค่าเดียวกัน มิฉะนั้นจะคืนค่าของตัวถูกดำเนินการตัวแรก
NULLIF ( x1 , x2 )เทียบเท่ากับ
กรณีx1 = x2 แล้วให้เป็นNULL มิฉะนั้นให้เป็นx1ความคิดเห็น
SQL มาตรฐานอนุญาตให้ใช้รูปแบบข้อความแสดงความคิดเห็น สองแบบ คือ-- comment`<comment>` ซึ่งจบด้วยอักขระขึ้นบรรทัดใหม่ ตัวแรก และ/* comment */`<comment>` ซึ่งสามารถครอบคลุมได้หลายบรรทัด
คำถาม
การดำเนินการที่พบบ่อยที่สุดใน SQL คือการสอบถาม ซึ่งใช้SELECTคำสั่ง ประกาศ ดึงข้อมูลจาก ตารางหรือนิพจน์SELECTตั้งแต่หนึ่งตารางขึ้นไปคำสั่งมาตรฐานไม่มีผลถาวรต่อฐานข้อมูล การใช้งานที่ไม่เป็นมาตรฐานบางอย่างอาจมีผลถาวร เช่นไวยากรณ์ที่มีให้ในฐานข้อมูลบางแห่ง[ 2 ]SELECTSELECTSELECT INTO
คำสั่งค้นหาช่วยให้ผู้ใช้สามารถอธิบายข้อมูลที่ต้องการได้ โดยปล่อยให้ระบบจัดการฐานข้อมูล (DBMS)ดำเนินการวางแผนปรับให้เหมาะสมและดำเนินการทางกายภาพที่จำเป็นเพื่อให้ได้ผลลัพธ์ตามที่ระบบเลือก
คำสั่งค้นหาประกอบด้วยรายการคอลัมน์ที่จะรวมไว้ในผลลัพธ์สุดท้าย โดยปกติจะอยู่ต่อจากSELECTคำหลักทันที เครื่องหมายดอกจัน (" *") หรือ " wildcard " สามารถใช้เพื่อระบุว่าคำสั่งค้นหาควรส่งคืนคอลัมน์ทั้งหมดของตารางที่ค้นหา คำสั่งSELECTSQL มีความซับซ้อนที่สุด โดยมีคำหลักและข้อความเสริมที่สามารถเลือกใช้ได้ ได้แก่:
- ข้อความ
FROMที่ระบุตารางที่จะดึงข้อมูล[ 3 ] : 400 ข้อความ นี้FROMสามารถมีJOINข้อความย่อยเพิ่มเติมเพื่อระบุถึงกฎสำหรับการเชื่อมต่อตารางได้ - ข้อความ
WHEREดังกล่าวมีเงื่อนไขซึ่งจำกัดจำนวนแถวที่ส่งคืนโดยการสืบค้นWHEREข้อความดังกล่าวจะกำจัดแถวทั้งหมดออกจากชุดผลลัพธ์หากเงื่อนไขไม่เป็นจริง[ 3 ] : 402 - เงื่อนไข นี้
GROUP BYจะคัดเลือกแถวที่มีค่าเหมือนกันมาไว้ในชุดแถวที่เล็กลงGROUP BYมักใช้ร่วมกับฟังก์ชันการรวมข้อมูลของ SQL หรือเพื่อกำจัดแถวที่ซ้ำกันออกจากชุดผลลัพธ์WHEREเงื่อนไขนี้จะถูกใช้ก่อนGROUP BYเงื่อนไขอื่น - ข้อความ
HAVINGดังกล่าวมีเงื่อนไขที่ใช้ในการกรองแถวที่ได้จากGROUP BYข้อความนั้น เนื่องจากเงื่อนไขนี้ทำงานกับผลลัพธ์ของGROUP BYข้อความ จึงสามารถใช้ฟังก์ชันการรวมข้อมูลในHAVINGเงื่อนไขได้ - เงื่อนไข นี้
ORDER BYระบุว่าควรใช้คอลัมน์ใดบ้างในการเรียงลำดับข้อมูลที่ได้ และเรียงลำดับในทิศทางใด (จากน้อยไปมากหรือจากมากไปน้อย) หากไม่มีORDER BYเงื่อนไขนี้ ลำดับของแถวที่ได้จากคำสั่ง SQL จะไม่แน่นอน - คำ
DISTINCTหลักจะกำจัดข้อมูลที่ซ้ำกัน[ 4 ] - เงื่อนไข นี้
OFFSETระบุจำนวนแถวที่จะข้ามก่อนเริ่มส่งคืนข้อมูล - เงื่อนไข นี้
FETCH FIRSTระบุจำนวนแถวที่จะส่งคืน ฐานข้อมูล SQL บางฐานอาจมีทางเลือกที่ไม่เป็นมาตรฐานเช่นLIMITหรือTOPROWNUM
เงื่อนไขของการสอบถามมีลำดับการดำเนินการที่เฉพาะเจาะจง[ 5 ]ซึ่งแสดงด้วยหมายเลขทางด้านขวามือ ดังนี้:
SELECT <columns> | 5. |
FROM <table> | 1. |
WHERE <predicate on rows> | 2. |
GROUP BY <columns> | 3. |
HAVING <predicate on groups> | 4. |
ORDER BY <columns> | 6. |
OFFSET | 7. |
FETCH FIRST | 8. |
ตัวอย่างคำSELECTสั่งค้นหาต่อไปนี้แสดงรายการหนังสือราคาแพง คำสั่งค้นหานี้ดึงข้อมูลทุกแถวจาก ตาราง Bookที่ คอลัมน์ ราคามีค่ามากกว่า 100.00 ผลลัพธ์จะถูกจัดเรียงตามลำดับจากน้อยไปมากตามชื่อเรื่องเครื่องหมายดอกจัน (*) ในรายการเลือกแสดงว่าควรรวมทุกคอลัมน์ของ ตาราง Bookไว้ในชุดผลลัพธ์
เลือก* จากBook ที่ราคา> 100.00 เรียงลำดับตามชื่อเรื่อง;ตัวอย่างด้านล่างแสดงวิธีการสืบค้นข้อมูลจากหลายตาราง การจัดกลุ่ม และการรวมข้อมูล โดยส่งคืนรายการหนังสือและจำนวนผู้เขียนที่เกี่ยวข้องกับหนังสือแต่ละเล่ม
SELECT Book.title AS Title , count ( * ) AS Authors FROM Book JOIN Book_author ON Book.isbn = Book_author.isbn GROUP BY Book.title ;ตัวอย่างผลลัพธ์อาจมีลักษณะดังต่อไปนี้:
ชื่อเรื่อง ผู้เขียน ---------------------- ------- ตัวอย่างและคู่มือ SQL ตอนที่ 4 ความสุขของการใช้ SQL 1 บทนำสู่ SQL 2 ข้อผิดพลาดของ SQL 1
ภายใต้เงื่อนไขที่ว่าisbnเป็นชื่อคอลัมน์ทั่วไปเพียงชื่อเดียวของทั้งสองตาราง และคอลัมน์ชื่อtitleมีอยู่เฉพาะใน ตาราง Book เท่านั้น เราสามารถเขียนคำสั่ง SQL ข้างต้นใหม่ได้ในรูปแบบต่อไปนี้:
SELECT title , count ( * ) AS Authors FROM Book NATURAL JOIN Book_author GROUP BY title ;อย่างไรก็ตาม ผู้ให้บริการหลายรายไม่สนับสนุนวิธีการนี้ หรือกำหนดให้ต้องใช้รูปแบบการตั้งชื่อคอลัมน์ที่เฉพาะเจาะจงเพื่อให้การเชื่อมต่อแบบธรรมชาติทำงานได้อย่างมีประสิทธิภาพ
SQL ประกอบด้วยตัวดำเนินการและฟังก์ชันสำหรับคำนวณค่าบนค่าที่จัดเก็บไว้ SQL อนุญาตให้ใช้นิพจน์ในรายการเลือกเพื่อแสดงข้อมูล ดังตัวอย่างต่อไปนี้ ซึ่งจะส่งคืนรายการหนังสือที่มีราคามากกว่า 100.00 โดยมี คอลัมน์ sales_tax เพิ่มเติม ซึ่งมีค่าภาษีขายที่คำนวณจาก 6% ของ ราคา
SELECT isbn , title , price , price * 0.06 AS sales_tax FROM Book WHERE price > 100.00 ORDER BY title ;แบบสอบถามย่อย
สามารถซ้อนคิวรีได้ โดยผลลัพธ์จากคิวรีหนึ่งสามารถนำไปใช้ในคิวรีอื่นได้ผ่านตัวดำเนินการเชิงสัมพันธ์หรือฟังก์ชันการรวม คิวรีที่ซ้อนกันนี้เรียกอีกอย่างว่าซับคิวรีแม้ว่าการเชื่อมตารางและการดำเนินการกับตารางอื่นๆ จะให้ประสิทธิภาพในการคำนวณที่เหนือกว่า (เช่น เร็วกว่า) ในหลายกรณี แต่การใช้ซับคิวรีจะสร้างลำดับชั้นในการดำเนินการซึ่งอาจมีประโยชน์หรือจำเป็น ในตัวอย่างต่อไปนี้ ฟังก์ชันการรวมAVGจะรับผลลัพธ์จากซับคิวรีเป็นอินพุต:
เลือกหมายเลขISBN , ชื่อเรื่อง, ราคาจากตาราง Book โดยที่ราคา< ( เลือกค่าเฉลี่ยของราคาจากตาราง Book ) เรียงลำดับตามชื่อเรื่อง;ซับเควรีสามารถใช้ค่าจากเควรีภายนอกได้ ซึ่งในกรณีนี้จะเรียกว่าซับเควรีแบบสัมพันธ์ (Correlated Subquery )
ตั้งแต่ปี 1999 มาตรฐาน SQL อนุญาตให้WITHใช้เงื่อนไขสำหรับซับควอรี หรือซับควอรีที่มีชื่อ ซึ่งโดยทั่วไปเรียกว่านิพจน์ตารางทั่วไป ( Common Table Expression หรือ CTE ) นอกจากนี้ CTE ยังสามารถเรียกซ้ำได้โดยการอ้างอิงถึงตัวเองกลไกที่เกิดขึ้นนี้ช่วยให้สามารถท่องไปในโครงสร้างต้นไม้หรือกราฟ (เมื่อแสดงเป็นความสัมพันธ์) และโดยทั่วไปแล้วสามารถคำนวณ แบบ fixpoint ได้
ตารางที่ได้มา
ตารางอนุพันธ์ (Derived Table)คือการใช้การอ้างอิงซับควอรีของ SQL ในส่วน FROM โดยพื้นฐานแล้ว ตารางอนุพันธ์ก็คือซับควอรีที่สามารถเลือกข้อมูลหรือทำการเชื่อมต่อ (join) ได้ ฟังก์ชันการทำงานของตารางอนุพันธ์ช่วยให้ผู้ใช้สามารถอ้างอิงซับควอรีเสมือนเป็นตารางได้ บางครั้งตารางอนุพันธ์ก็ถูกเรียกว่ามุมมองแบบอินไลน์ (inline view ) หรือซับซีเล็คต์ (subselect )
ในตัวอย่างต่อไปนี้ คำสั่ง SQL เกี่ยวข้องกับการเชื่อมต่อ (join) จากตาราง "Book" เริ่มต้นไปยังตารางที่ได้มา "sales" ตารางที่ได้มานี้จะบันทึกข้อมูลการขายหนังสือที่เกี่ยวข้องโดยใช้ ISBN ในการเชื่อมต่อกับตาราง "Book" ส่งผลให้ตารางที่ได้มานี้มีคอลัมน์เพิ่มเติม (จำนวนสินค้าที่ขายได้และบริษัทที่ขายหนังสือ)
SELECT b.isbn , b.title , b.price , sales.items_sold , sales.company_nm FROM Book b JOIN ( SELECT SUM ( Items_Sold ) Items_Sold , Company_Nm , ISBN FROM Book_Sales GROUP BY Company_Nm , ISBN ) ON sales.isbn = b.isbnตรรกะค่าว่างหรือตรรกะสามค่า (3VL)
แนวคิดของค่า Nullช่วยให้ SQL สามารถจัดการกับข้อมูลที่ขาดหายไปในแบบจำลองเชิงสัมพันธ์ได้ คำว่า Null NULLเป็นคำสงวนใน SQL ใช้เพื่อระบุเครื่องหมายพิเศษสำหรับค่า Null การเปรียบเทียบกับค่า Null เช่น ความเท่าเทียมกัน (=) ในส่วน WHERE จะให้ค่าความจริงเป็น Unknown ในคำสั่ง SELECT SQL จะส่งคืนเฉพาะผลลัพธ์ที่ส่วน WHERE ส่งคืนค่า True เท่านั้น กล่าวคือ จะไม่รวมผลลัพธ์ที่มีค่า False และไม่รวมผลลัพธ์ที่มีค่าเป็น Unknown ด้วย
นอกเหนือจาก True และ False แล้ว ค่า Unknown ที่ได้จากการเปรียบเทียบโดยตรงกับค่า Null ยังนำตรรกะสามค่าบาง ส่วน มาสู่ SQL ตารางความจริงที่ SQL ใช้สำหรับ AND, OR และ NOT สอดคล้องกับตรรกะสามค่าบางส่วนของ Kleene และ Lukasiewicz (ซึ่งแตกต่างกันในคำจำกัดความของการบ่งชี้ อย่างไรก็ตาม SQL ไม่ได้กำหนดการดำเนินการดังกล่าว) [ 6 ]
|
| ||||||||||||||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||
อย่างไรก็ตาม มีข้อโต้แย้งเกี่ยวกับการตีความความหมายของค่า Null ใน SQL เนื่องจากการจัดการค่า Null นอกเหนือจากการเปรียบเทียบโดยตรง ดังที่เห็นในตารางข้างต้น การเปรียบเทียบความเท่าเทียมกันโดยตรงระหว่างค่า Null สองค่าใน SQL (เช่นNULL = NULL) จะส่งคืนค่าความจริงเป็น Unknown ซึ่งสอดคล้องกับการตีความว่าค่า Null ไม่มีค่า (และไม่ได้เป็นสมาชิกของโดเมนข้อมูลใดๆ) แต่เป็นเพียงตัวแทนหรือ "เครื่องหมาย" สำหรับข้อมูลที่ขาดหายไป อย่างไรก็ตาม หลักการที่ว่าค่า Null สองค่าไม่เท่ากันนั้นถูกละเมิดอย่างมีประสิทธิภาพในข้อกำหนดของ SQL สำหรับ ตัวดำเนินการ ` UNIONand` และ `or` INTERSECTซึ่งระบุค่า Null ให้เหมือนกัน[ 7 ]ด้วยเหตุนี้การดำเนินการเซตเหล่านี้ใน SQLอาจสร้างผลลัพธ์ที่ไม่แสดงถึงข้อมูลที่แน่นอน ซึ่งแตกต่างจากการดำเนินการที่เกี่ยวข้องกับการเปรียบเทียบอย่างชัดเจนกับค่า Null (เช่น การดำเนินการในWHEREข้อความ `or` ที่กล่าวถึงข้างต้น) ในข้อเสนอของ Codd ในปี 1979 (ซึ่งโดยพื้นฐานแล้วได้รับการยอมรับโดย SQL92) ความไม่สอดคล้องกันทางความหมายนี้ได้รับการอธิบายโดยการโต้แย้งว่าการลบรายการซ้ำในการดำเนินการเซตเกิดขึ้น "ในระดับรายละเอียดที่ต่ำกว่าการทดสอบความเท่าเทียมกันในการประเมินการดำเนินการเรียกค้น" [ 6 ]อย่างไรก็ตาม ศาสตราจารย์ด้านวิทยาการคอมพิวเตอร์ Ron van der Meyden สรุปว่า "ความไม่สอดคล้องกันในมาตรฐาน SQL หมายความว่าไม่สามารถกำหนดความหมายเชิงตรรกะที่เข้าใจง่ายใด ๆ ให้กับการจัดการค่าว่างใน SQL ได้" [ 7 ]
นอกจากนี้ เนื่องจากตัวดำเนินการ SQL จะส่งคืนค่า Unknown เมื่อเปรียบเทียบสิ่งใดก็ตามกับ Null โดยตรง SQL จึงมีเงื่อนไขการเปรียบเทียบเฉพาะสำหรับ Null สองเงื่อนไข ได้แก่IS NULLและIS NOT NULLทดสอบว่าข้อมูลเป็น Null หรือไม่[ 8 ] SQL ไม่รองรับการกำหนดปริมาณแบบสากล อย่างชัดเจน และต้องคำนวณออกมาเป็นการกำหนดปริมาณแบบมีอยู่แบบ ปฏิเสธ [ 9 ] [ 10 ] [ 11 ]นอกจากนี้ยังมี<row value expression> IS DISTINCT FROM <row value expression>ตัวดำเนินการเปรียบเทียบแบบอินฟิกซ์ ซึ่งจะส่งคืนค่า TRUE เว้นแต่ตัวถูกดำเนินการทั้งสองจะเท่ากันหรือทั้งสองเป็น NULL ในทำนองเดียวกัน IS NOT DISTINCT FROM ถูกกำหนดเป็นNOT (<row value expression> IS DISTINCT FROM <row value expression>). SQL:1999ยังได้แนะนำBOOLEANชนิดข้อมูล ซึ่งตามมาตรฐานแล้วสามารถเก็บค่า Unknown ได้หากเป็นค่าที่อนุญาตให้เป็น NULL ในทางปฏิบัติ ระบบจำนวนหนึ่ง (เช่นPostgreSQL ) ใช้ BOOLEAN Unknown เป็น BOOLEAN NULL ซึ่งมาตรฐานระบุว่า NULL BOOLEAN และ UNKNOWN "สามารถใช้แทนกันได้เพื่อหมายถึงสิ่งเดียวกัน" [ 12 ] [ 13 ]
การจัดการข้อมูล
ภาษาจัดการข้อมูล (DML) เป็นส่วนย่อยของ SQL ที่ใช้ในการเพิ่ม อัปเดต และลบข้อมูล:
- คำสั่ง INSERTจะเพิ่มแถว (เดิมเรียกว่าทูเปิล ) ลงในตารางที่มีอยู่แล้ว เช่น:
INSERT INTO example ( column1 , column2 , column3 ) VALUES ( 'test' , 'N' , NULL );- คำสั่ง UPDATEจะแก้ไขชุดของแถวในตารางที่มีอยู่แล้ว เช่น:
ตัวอย่างการอัปเดตSET column1 = 'updated value' WHERE column2 = 'N' ;- คำสั่ง DELETEจะลบแถวที่มีอยู่แล้วออกจากตาราง เช่น:
ลบข้อมูลจากตารางexample โดยที่column2 เท่ากับ'N' ;- คำสั่ง MERGEใช้สำหรับรวมข้อมูลจากหลายตาราง โดยเป็นการรวม คำสั่ง INSERTและ UPDATE เข้าด้วยกัน คำสั่งนี้ถูกกำหนดไว้ในมาตรฐาน SQL:2003 ก่อนหน้านั้น ฐานข้อมูลบางแห่งมีฟังก์ชันการทำงานที่คล้ายกันโดยใช้ไวยากรณ์ที่แตกต่างกัน ซึ่งบางครั้งเรียกว่า " upsert "
MERGE INTO table_name USING table_reference ON ( condition ) WHEN MATCHED THEN UPDATE SET column1 = value1 [ , column2 = value2 ... ] WHEN NOT MATCHED THEN INSERT ( column1 [ , column2 ... ] ) VALUES ( value1 [ , value2 ... ] )การควบคุมธุรกรรม
หากมี การทำธุรกรรม การดำเนินการ DML จะถูกห่อหุ้มไว้ด้วย:
START TRANSACTION(หรือBEGIN WORKหรือ หรือBEGIN TRANSACTIONขึ้นอยู่กับภาษา SQL ที่ใช้) เป็นเครื่องหมายแสดงจุดเริ่มต้นของธุรกรรมในฐานข้อมูลซึ่งอาจเสร็จสมบูรณ์ทั้งหมดหรืออาจไม่เสร็จสมบูรณ์เลยก็ได้SAVE TRANSACTION(หรือSAVEPOINT) บันทึกสถานะของฐานข้อมูล ณ จุดปัจจุบันในธุรกรรม
สร้างตารางtbl_1 ( id int ); แทรกข้อมูลลงในtbl_1 ( id ) VALUES ( 1 ); แทรกข้อมูลลงในtbl_1 ( id ) VALUES ( 2 ); ยืนยันการเปลี่ยนแปลง; อัปเดตtbl_1 ตั้งค่าid เป็น200 เมื่อid เท่ากับ1 ; บันทึกจุดอัปเดตid_1upd ; อัปเดตtbl_1 ตั้งค่าid เป็น1000 เมื่อid เท่ากับ2 ; ย้อนกลับไปยังid_1upd ; เลือกid จากtbl_1 ;COMMITทำให้การเปลี่ยนแปลงข้อมูลทั้งหมดในธุรกรรมนั้นมีผลถาวรROLLBACKยกเลิกการเปลี่ยนแปลงข้อมูลทั้งหมดตั้งแต่ครั้งล่าสุดCOMMITหรือROLLBACKก่อนหน้า ทำให้ข้อมูลกลับสู่สภาพเดิมก่อนการเปลี่ยนแปลงเหล่านั้น เมื่อCOMMITคำสั่งเสร็จสมบูรณ์แล้ว การเปลี่ยนแปลงของธุรกรรมจะไม่สามารถย้อนกลับได้
COMMITและROLLBACKยุติธุรกรรมปัจจุบันและปลดล็อกข้อมูล ในกรณีที่ไม่มีSTART TRANSACTIONคำสั่งหรือคำสั่งที่คล้ายกัน ความหมายของ SQL จะขึ้นอยู่กับการใช้งาน ตัวอย่างต่อไปนี้แสดงธุรกรรมการโอนเงินแบบคลาสสิก โดยเงินจะถูกถอนออกจากบัญชีหนึ่งและเพิ่มเข้าไปในอีกบัญชีหนึ่ง หากการถอนหรือการเพิ่มเงินล้มเหลว ธุรกรรมทั้งหมดจะถูกยกเลิก
เริ่มทำรายการ; อัปเดตบัญชีตั้งค่าจำนวนเงินเป็นจำนวนเงิน- 200 สำหรับหมายเลขบัญชี ที่ เท่ากับ1234 ; อัปเดตบัญชีตั้งค่าจำนวนเงินเป็นจำนวนเงิน+ 200 สำหรับหมายเลขบัญชี ที่ เท่ากับ2345 ;ถ้าจำนวนข้อผิดพลาดเท่ากับ0 ให้ยืนยันการเปลี่ยนแปลงถ้าจำนวนข้อผิดพลาดน้อยกว่าหรือเท่ากับ0 ให้ยกเลิกการเปลี่ยนแปลงคำจำกัดความของข้อมูล
ภาษาการกำหนดโครงสร้างข้อมูล (DDL) จัดการโครงสร้างตารางและดัชนี องค์ประกอบพื้นฐานที่สุดของ DDL คือ คำสั่ง CREATE` table`, ALTER`table` RENAME, `table` DROPและTRUNCATE`table`:
CREATEสร้างอ็อบเจ็กต์ (เช่น ตาราง) ในฐานข้อมูล ตัวอย่างเช่น:
สร้างตารางตัวอย่าง( column1 INTEGER , column2 VARCHAR ( 50 ), column3 DATE NOT NULL , PRIMARY KEY ( column1 , column2 ) );ALTERปรับเปลี่ยนโครงสร้างของวัตถุที่มีอยู่แล้วในรูปแบบต่างๆ เช่น การเพิ่มคอลัมน์ลงในตารางที่มีอยู่ หรือการเพิ่มข้อจำกัด เป็นต้น
ALTER TABLE example ADD column4 INTEGER DEFAULT 25 NOT NULL ;TRUNCATEคำสั่งนี้จะลบข้อมูลทั้งหมดออกจากตารางอย่างรวดเร็ว โดยจะลบเฉพาะข้อมูลภายในตาราง ไม่ใช่ตัวตารางเอง โดยปกติแล้วจะมีการดำเนินการ COMMIT ตามมา ซึ่งหมายความว่าไม่สามารถย้อนกลับได้ (ข้อมูลจะไม่ถูกบันทึกในล็อกเพื่อย้อนกลับในภายหลัง ต่างจากคำสั่ง DELETE)
ตัวอย่างคำ สั่ง TRUNCATE TABLE ;DROPลบวัตถุในฐานข้อมูล ซึ่งโดยปกติแล้วจะไม่สามารถกู้คืนได้ กล่าวคือ ไม่สามารถย้อนกลับได้ เช่น:
ตัวอย่างคำสั่ง DROP TABLE ;ประเภทข้อมูล
แต่ละคอลัมน์ในตาราง SQL จะประกาศประเภทที่คอลัมน์นั้นอาจมีได้ ANSI SQL ประกอบด้วยประเภทข้อมูลต่อไปนี้[ 14 ]
สตริงอักขระและสตริงอักขระประจำชาติ
CHARACTER(n)(หรือ): สตริงที่มีความกว้างคงที่จำนวนnตัวอักษร เติมช่องว่างตามความจำเป็นCHAR(n)CHARACTER VARYING(n)(หรือ): สตริงที่มีความกว้างแปรผันได้ โดยมีขนาดสูงสุดnตัวอักษรVARCHAR(n)CHARACTER LARGE OBJECT(n[K|M|G|T])(หรือ): อักขระวัตถุขนาดใหญ่ที่มีขนาดสูงสุดn [K|M|G|T]อักขระCLOB(n[K|M|G|T])NATIONAL CHARACTER(n)(หรือ): สตริงความกว้างคงที่ที่รองรับชุดอักขระสากลNCHAR(n)NATIONAL CHARACTER VARYING(n)(หรือ): สตริง ที่มีความกว้างแปรผันได้NVARCHAR(n)NCHARNATIONAL CHARACTER LARGE OBJECT(n[K|M|G|T])(หรือ): อักขระประจำชาติ วัตถุขนาดใหญ่ที่มีขนาดสูงสุดn [K|M|G|T]อักขระNCLOB(n[K|M|G|T])
สำหรับ ชนิดข้อมูล CHARACTER LARGE OBJECTและNATIONAL CHARACTER LARGE OBJECTตัวคูณK(1024 ), M(1 048 576 ), G(1 073 741 824 ) และT(สามารถใช้หมายเลข 1 099 511 627 776 ได้ตามต้องการเมื่อระบุความยาว
ไบนารี
BINARY(n): สตริงไบนารีความยาวคงที่ ความยาวสูงสุดnBINARY VARYING(n)(หรือ): สตริงไบนารีที่มีความยาวแปรผันได้ ความยาวสูงสุดnVARBINARY(n)BINARY LARGE OBJECT(n[K|M|G|T])(หรือ): วัตถุขนาดใหญ่แบบไบนารีที่มีความยาวสูงสุดn [K|M|G|T ]BLOB(n[K|M|G|T])
สำหรับBINARY LARGE OBJECTชนิดข้อมูล ตัวคูณK(1024 ), M(1 048 576 ), G(1 073 741 824 ) และT(สามารถใช้หมายเลข 1 099 511 627 776 ได้ตามต้องการเมื่อระบุความยาว
บูลีน
BOOLEAN
ชนิดข้อมูล นี้BOOLEANสามารถจัดเก็บค่าTRUEและFALSEได้
เชิงตัวเลข
INTEGER(หรือINT)SMALLINTและBIGINTFLOAT,REALและDOUBLE PRECISIONNUMERIC(precision, scale)หรือDECIMAL(precision, scale)DECFLOAT(precision)
ตัวอย่างเช่น ตัวเลข 123.45 มีความแม่นยำ 5 และค่าสเกล 2 ความแม่นยำเป็นจำนวนเต็มบวกที่กำหนดจำนวนหลักสำคัญในฐานใดฐานหนึ่ง (ไบนารีหรือทศนิยม) ค่าสเกล เป็นจำนวนเต็มที่ไม่เป็นลบ ค่าสเกล 0 แสดงว่าตัวเลขนั้นเป็นจำนวนเต็ม สำหรับจำนวนทศนิยมที่มีค่าสเกล S ค่าตัวเลข ที่ แท้จริงคือค่าจำนวนเต็มของหลักสำคัญหารด้วย10S
SQL มีฟังก์ชันCEILINGสำหรับFLOORการปัดเศษตัวเลข (ฟังก์ชันที่นิยมใช้เฉพาะในแต่ละผู้ผลิต ได้แก่TRUNC(Informix, DB2, PostgreSQL, Oracle และ MySQL) และROUND(Informix, SQLite, Sybase, Oracle, PostgreSQL, Microsoft SQL Server และ Mimer SQL)
เวลา (วันที่และเวลา)
DATE: สำหรับค่าวันที่ (เช่น2011-05-03)TIME: สำหรับค่าเวลา (เช่น15:51:36)TIME WITH TIME ZONEเหมือนกันTIMEแต่เพิ่มรายละเอียดเกี่ยวกับเขตเวลาที่เกี่ยวข้องเข้าไปด้วยTIMESTAMP: นี่คือค่า aDATEและ aTIMEที่รวมกันเป็นค่าเดียว (เช่น2011-05-03 15:51:36.123456)TIMESTAMP WITH TIME ZONEเหมือนกันTIMESTAMPแต่เพิ่มรายละเอียดเกี่ยวกับเขตเวลาที่เกี่ยวข้องเข้าไปด้วย
ฟังก์ชัน SQL EXTRACTสามารถใช้สำหรับดึงข้อมูลฟิลด์เดียว (เช่น วินาที) จากค่าวันที่และเวลาหรือค่าช่วงเวลาได้ สามารถเรียกใช้เวลาปัจจุบันของระบบบนเซิร์ฟเวอร์ฐานข้อมูลได้โดยใช้ฟังก์ชันต่างๆ เช่นCURRENT_DATE`insert` , CURRENT_TIMESTAMP` insert` , ` insert` LOCALTIMEหรือ` insert` ( LOCALTIMESTAMPฟังก์ชันที่นิยมใช้เฉพาะของผู้จำหน่ายได้แก่TO_DATE` insert` , ...TO_TIMETO_TIMESTAMPYEARMONTHDAYHOURMINUTESECONDDAYOFYEARDAYOFMONTHDAYOFWEEK
ช่วงเวลา (วันที่และเวลา)
YEAR(precision)จำนวนปีYEAR(precision) TO MONTHจำนวนปีและเดือนMONTH(precision)จำนวนเดือนDAY(precision)จำนวนวันDAY(precision) TO HOURจำนวนวันและชั่วโมงDAY(precision) TO MINUTE: จำนวนวัน ชั่วโมง และนาทีDAY(precision) TO SECOND(scale)จำนวนวัน ชั่วโมง นาที และวินาทีHOUR(precision)จำนวนชั่วโมงHOUR(precision) TO MINUTEจำนวนชั่วโมงและนาทีHOUR(precision) TO SECOND(scale)จำนวนชั่วโมง นาที และวินาทีMINUTE(precision)จำนวนนาทีMINUTE(precision) TO SECOND(scale): จำนวนนาทีและวินาที
การควบคุมข้อมูล
ภาษาควบคุมข้อมูล (DCL) อนุญาตให้ผู้ใช้เข้าถึงและจัดการข้อมูล โดยมีคำสั่งหลักสองข้อดังนี้:
GRANTอนุญาตให้ผู้ใช้หนึ่งคนหรือมากกว่านั้นดำเนินการอย่างใดอย่างหนึ่งหรือหลายอย่างกับวัตถุได้REVOKEยกเลิกการให้ทุน ซึ่งอาจเป็นการให้ทุนเริ่มต้น
ตัวอย่าง:
GRANT SELECT , UPDATE ON example TO some_user , another_user ;REVOKE SELECT , UPDATE ON example FROM some_user , another_user ;ลิงก์ภายนอก
- "นิยามของไวยากรณ์ SQL", ISO_IEC_9075-2(E)_Foundation.bnf.xml ( XML รูปแบบ Backus–Naur ) , พอร์ทัลการบำรุงรักษามาตรฐาน ISO.
- "โปรแกรมจัดรูปแบบ SQL ออนไลน์" ( Online SQL Formatter Utility)ถูกเก็บถาวรจากต้นฉบับเมื่อวันที่ 18 กันยายน 2024.
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ไวยากรณ์ SQL
ไวยากรณ์ ของ ภาษาโปรแกรม SQL ถูกกำหนดและดูแลรักษาโดย ISO/IEC SC 32 ซึ่งเป็นส่วนหนึ่งของ ISO/IEC 9075 มาตรฐานนี้ไม่สามารถใช้งานได้ฟรี แม้จะมีมาตรฐานนี้อยู่ แต่โค้ด SQL...
องค์ประกอบทางภาษา
ภาษา SQL แบ่งออกเป็นองค์ประกอบย่อยหลายส่วน ได้แก่:
ผู้ปฏิบัติงาน
บางครั้งมีการเสนอหรือนำตัวดำเนินการอื่นๆ มาใช้ เช่น ตัวดำเนินการ Skyline (สำหรับค้นหาเฉพาะแถวที่ไม่ 'แย่กว่า' แถวอื่นๆ)
ความคิดเห็น
SQL มาตรฐานอนุญาตให้ใช้รูปแบบข้อความแสดง ความคิดเห็น สองแบบ คือ -- comment ` ` ซึ่งจบด้วยอักขระขึ้น บรรทัดใหม่ ตัวแรก และ /* comment */ ` ` ซึ่งสามารถครอบคลุมได้หลายบรรทัด