บทความนี้มีจุดมุ่งหมายเพื่อการเรียนรู้คำสั่ง SELECT ในฐานข้อมูล MySQL อย่างรวดเร็วและแม่นยำ
ไวยากรณ์พื้นฐานของคำสั่ง SELECT ใน MySQL คือ:
ต่อไปนี้เป็นส่วนที่ยกมา:
เลือก [STRAIGHT_JOIN] [SQL_SMALL_RESULT]
[SQL_BIG_RESULT] [HIGH_PRIORITY]
[แตกต่าง|แยกแยะ|ทั้งหมด]
เลือก_รายการ
[เข้าสู่ {OUTFILE|DUMPFILE} 'file_name' Export_options]
[จาก table_references [WHERE Where_definition]
[จัดกลุ่มตาม col_name,...] [มีwhere_definition]
[เรียงตาม {unsighed_integer|col_name|formura} [ASC|DESC],...]
[จำกัด [ออฟเซ็ต] แถว] [PROCEDURE Procedure_name]]
ดังที่เห็นได้จากไวยากรณ์พื้นฐานนี้ คำสั่ง SELECT ที่ง่ายที่สุดคือ SELECT select_list จริงๆ แล้ว เมื่อใช้คำสั่ง SELECT ที่ง่ายที่สุดนี้ คุณยังสามารถใช้คำสั่งนี้เพื่อดำเนินการใดๆ ที่ MySQL สนับสนุนได้อีกด้วย ตัวอย่าง: SELECT 1+1 มันจะคืนค่า 2 ประการที่สอง คุณสามารถใช้มันเพื่อกำหนดค่าให้กับตัวแปรได้ ใน PHP โดยใช้ฟังก์ชันนี้ของคำสั่ง SELECT คุณสามารถใช้ฟังก์ชัน MySQL เพื่อทำงานต่างๆ ได้อย่างอิสระ โปรแกรม PHP ดำเนินการและกำหนดค่าให้กับตัวแปร ในหลายกรณี คุณจะพบว่า MySQL มีฟังก์ชันที่ทรงพลังมากกว่า PHP มากมาย
STRAIGHT_JOIN, SQL_SMALL_RESULT, SQL_BIG_RESULT และ HIGH_PRIORITY เป็นส่วนขยาย MySQL สำหรับ ANSI SQL92 หากเครื่องมือเพิ่มประสิทธิภาพรวมตารางในลำดับที่ไม่เหมาะสม การใช้ STRAIGHT_JOIN จะช่วยเพิ่มความเร็วในการค้นหาได้
SQL_SMALL_RESULT และ SQL_BIG_RESULT เป็นชุดของคำหลักที่เกี่ยวข้อง ต้องใช้กับ GROUP BY, DISTINCT หรือ DISTINCTROW SQL_SMALL_RESULT บอกเครื่องมือเพิ่มประสิทธิภาพว่าผลลัพธ์จะมีขนาดเล็กมาก โดยกำหนดให้ MySQL ใช้ตารางชั่วคราวเพื่อจัดเก็บตารางสุดท้ายแทนที่จะใช้การเรียงลำดับ ในทางกลับกัน SQL_BIG_RESULT จะบอกเครื่องมือเพิ่มประสิทธิภาพว่าผลลัพธ์จะมีขนาดเล็กมาก โดยกำหนดให้ MySQL ใช้การเรียงลำดับแทน ทำโต๊ะชั่วคราว
HIGH_PRIORITY จะให้ความสำคัญกับ SELECT มากกว่าคำสั่งที่อัปเดตตาราง ทำให้สามารถดำเนินการค้นหาที่มีลำดับความสำคัญและรวดเร็ว
การใช้คำหลักสี่คำข้างต้นค่อนข้างคลุมเครือจริงๆ โชคดี ในกรณีส่วนใหญ่ เราสามารถเลือกที่จะไม่ใช้คำหลักสี่คำเหล่านี้ใน MySQL ได้
DISTINCT และ DISTINCTROW มอบการกรองขั้นพื้นฐานแต่มีประโยชน์ที่สุดสำหรับชุดผลลัพธ์ที่ส่งคืนโดยคิวรี นั่นคือชุดผลลัพธ์จะมีเฉพาะแถวที่แตกต่างกันเท่านั้น สิ่งที่ควรสังเกตที่นี่คือสำหรับคำหลัก DISTINCT และ DISTINCTROW ค่า Null จะเท่ากัน ไม่ว่าจะมีค่า NULL กี่ค่า ก็เลือกเพียงค่าเดียวเท่านั้น การใช้ ALL นั้นไม่จำเป็น ไม่มีผลกระทบต่อการสร้างชุดผลลัพธ์
ลงใน {OUTFILE|DUMPFILE} 'file_name' Export_options เขียนชุดผลลัพธ์ลงในไฟล์ ไฟล์ถูกสร้างขึ้นบนโฮสต์เซิร์ฟเวอร์ และไม่มีอยู่แล้ว ไวยากรณ์ของส่วนส่งออกตัวเลือกของคำสั่งเหมือนกับที่ใช้ในคำสั่งย่อย FIELDS และ LINES ของคำสั่ง LOAD DATAINFILE เราจะกล่าวถึงรายละเอียดในบทความ MySQL Advanced_LOAD DATA ความแตกต่างระหว่างคีย์เวิร์ด OUTFILE และ DUMPFILE คือ มีการเขียนเพียงบรรทัดเดียวลงในไฟล์ โดยไม่มีคอลัมน์หรือบรรทัดลงท้าย
รายการที่เลือก: สามารถประกอบด้วยเนื้อหาต่อไปนี้ตั้งแต่หนึ่งรายการขึ้นไป:
1. "*" หมายถึงคอลัมน์ทั้งหมดที่จัดเรียงตามลำดับการสร้างตาราง
2. รายการชื่อคอลัมน์ที่จัดเรียงตามลำดับที่ผู้ใช้ต้องการ
3. คุณสามารถใช้นามแฝงเพื่อแทนที่ชื่อคอลัมน์ได้ในรูปแบบต่อไปนี้: ชื่อคอลัมน์เป็น column_heading
4. นิพจน์ (ชื่อคอลัมน์ ค่าคงที่ ฟังก์ชัน หรือการรวมกันของชื่อคอลัมน์ ค่าคงที่ และฟังก์ชันที่เชื่อมโยงกับตัวดำเนินการทางคณิตศาสตร์หรือระดับบิต)
5. ฟังก์ชันภายในหรือฟังก์ชันรวม
6. การรวมกันของรายการข้างต้น
FROM: กำหนดตารางที่จะใช้ในคำสั่ง SELECT โดยทั่วไปรายการนี้จำเป็น ยกเว้นว่า select_list ไม่มีชื่อคอลัมน์ (เช่น เฉพาะค่าคงที่ นิพจน์ทางคณิตศาสตร์ ฯลฯ) หากมีหลายตารางในรายการตาราง ให้คั่นด้วยเครื่องหมายจุลภาค ลำดับของตารางที่อยู่ต่อจากคีย์เวิร์ด FROM จะไม่ส่งผลต่อผลลัพธ์
ชื่อตารางสามารถกำหนดนามแฝงที่เกี่ยวข้องได้เพื่อทำให้นิพจน์ชัดเจน ไวยากรณ์ที่นี่คือ tbl_name [AS] alias_name ตัวอย่างเช่น:
เลือก t1.name,t2.salary จากพนักงานเป็น t1,info เป็น t2 โดยที่ t1.name=t2.name เหมือนกับเลือก t1.name,t2.salary จากพนักงาน t1,info t2 โดยที่ t1.name= t2.name เทียบเท่าโดยสิ้นเชิง
การอ้างอิงอื่นๆ ทั้งหมดไปยังตาราง เช่น โดยที่ส่วนคำสั่งและการมีส่วนคำสั่ง ต้องใช้นามแฝง และนามแฝงไม่สามารถขึ้นต้นด้วยตัวเลขได้
โดยที่คำสั่งย่อยกำหนดเงื่อนไขการค้นหา และวิธีการสมัครในคำสั่งแทรก อัปเดต และลบจะเหมือนกับวิธีการสมัครในคำสั่งที่เลือกทุกประการ คำค้นหาตามคำสำคัญที่ หากผู้ใช้ต้องการใช้เงื่อนไขการค้นหาหลายเงื่อนไขในคำสั่งเดียว ก็สามารถเชื่อมต่อได้โดยและหรือหรือ ไวยากรณ์พื้นฐานของเงื่อนไขการค้นหาคือ [not] expression comparison_operator expression; [not] expression [not] like “match_string”; [not] expression is [not] null; ] column_name join_operator column_name; [ไม่ใช่] boolean_expression
และ: ใช้เพื่อเชื่อมต่อสองเงื่อนไขและส่งกลับผลลัพธ์เมื่อทั้งสองเงื่อนไขเป็นจริง เมื่อใช้ตัวดำเนินการทางลอจิคัลหลายตัวในคำสั่งเดียวกัน ตัวดำเนินการ และ จะมีความสำคัญเหนือกว่าเสมอ เว้นแต่ผู้ใช้จะใช้วงเล็บเพื่อเปลี่ยนลำดับการดำเนินการ
หรือ: ใช้เพื่อเชื่อมต่อสองเงื่อนไขและส่งกลับผลลัพธ์เมื่อเงื่อนไขใดเงื่อนไขหนึ่งเป็นจริง เมื่อใช้ตัวดำเนินการเชิงตรรกะหลายตัวในคำสั่งเดียวกัน ตัวดำเนินการ หรือโดยปกติจะดำเนินการตามตัวดำเนินการ และ แน่นอนว่าผู้ใช้สามารถใช้วงเล็บเพื่อเปลี่ยนลำดับการดำเนินการได้
ระหว่าง: คำสำคัญที่ใช้ระบุขีดจำกัดล่างของช่วง และตามด้วยค่าของขีดจำกัดบนของช่วง ช่วงที่ @val ระหว่าง x และ y รวมค่าแรกและค่าสุดท้าย ถ้าค่าแรกที่ระบุหลังระหว่างมีค่ามากกว่าค่าที่สอง คิวรีจะไม่ส่งกลับแถวใดๆ
column_name: ชื่อคอลัมน์ที่ใช้ในการเปรียบเทียบ เมื่อเกิดความคลุมเครือ โปรดระบุชื่อตารางที่มีคอลัมน์อยู่
comparison_operator: ตัวดำเนินการเปรียบเทียบ ดูตารางด้านล่าง:
ต่อไปนี้เป็นส่วนของใบเสนอราคา:
ความหมายสัญลักษณ์
= เท่ากับ
> มากกว่า
< น้อยกว่า
>= มากกว่าหรือเท่ากับ
<= น้อยกว่าหรือเท่ากับ
!= ไม่เท่ากับ
<> ไม่เท่ากับ
เมื่อเปรียบเทียบข้อมูลประเภทอักขระและ varchar "<" หมายถึงใกล้กับส่วนหัวของตัวอักษรมากขึ้น และ ">" หมายถึงใกล้กับส่วนท้ายของตัวอักษรมากขึ้น โดยทั่วไป ตัวอักษรตัวพิมพ์เล็กจะมีค่ามากกว่าตัวอักษรตัวพิมพ์ใหญ่ และตัวอักษรตัวพิมพ์ใหญ่จะมีค่ามากกว่าตัวเลข แต่อาจขึ้นอยู่กับลำดับการเปรียบเทียบของระบบปฏิบัติการบนเซิร์ฟเวอร์
ช่องว่างต่อท้ายจะถูกละเว้นเมื่อทำการเปรียบเทียบ ตัวอย่างเช่น "เดิร์ก" เท่ากับ "เดิร์ก"
เมื่อเปรียบเทียบวันที่ "<" หมายถึงเร็วกว่า และ ">" หมายถึงช้ากว่า
เมื่อใช้ตัวดำเนินการเปรียบเทียบเพื่อเปรียบเทียบข้อมูลอักขระและข้อมูลวันที่และเวลา ข้อมูลทั้งหมดจะต้องอยู่ในเครื่องหมายคำพูด
expression: อาจเป็นชื่อคอลัมน์ ค่าคงที่ ฟังก์ชัน หรือการรวมกันของชื่อคอลัมน์หรือค่าคงที่ และฟังก์ชันที่เชื่อมต่อกับตัวดำเนินการทางคณิตศาสตร์หรือตัวดำเนินการระดับบิต ตัวดำเนินการทางคณิตศาสตร์จะแสดงอยู่ในตารางต่อไปนี้:
นี่คือตัวอย่างที่ยกมา:
ความหมายสัญลักษณ์
+ เครื่องหมายบวก
- เครื่องหมายลบ
* เครื่องหมายคูณ
/ เครื่องหมายการหาร
เป็นโมฆะ: ใช้เมื่อค้นหาค่า NULL
like: คำหลัก คุณสามารถใช้ like สำหรับ char, varchar และ datetime (ไม่รวมวินาทีและมิลลิวินาที) ใน MySQL สามารถใช้ like สำหรับนิพจน์ตัวเลขได้เช่นกัน
เมื่อผู้ใช้ค้นหาข้อมูล datetime วิธีที่ดีที่สุดคือใช้คำสำคัญ เช่น เนื่องจากบันทึก datetime ที่สมบูรณ์ประกอบด้วยองค์ประกอบวันที่ที่หลากหลาย ตัวอย่างเช่น ผู้ใช้เพิ่มค่า "9:20" ให้กับคอลัมน์ arrival_time แต่ไม่พบในส่วนคำสั่งที่ arrival_time="9:20" เนื่องจาก MySQL แปลงข้อมูลที่ป้อนเป็น "Jan 1,1900 9:20AM" . อย่างไรก็ตาม ประโยคที่ arrival_time เช่น "%9:20%" สามารถค้นหาได้
boolean_expression: นิพจน์ที่ส่งคืนค่า "true" หรือ "false"
match_string: สตริงที่ประกอบด้วยอักขระและไวด์การ์ด ซึ่งอยู่ในเครื่องหมายคำพูดเดี่ยวหรือเครื่องหมายคำพูดคู่ เป็นรูปแบบที่ตรงกัน สัญลักษณ์แทนจะแสดงอยู่ในตารางต่อไปนี้:
ต่อไปนี้เป็นส่วนที่ยกมา:
ความหมายสัญลักษณ์
% สตริงที่มีอักขระตั้งแต่ 0 ตัวขึ้นไป
_ อักขระเดี่ยวใดๆ
ไม่: ปฏิเสธการแสดงออกเชิงตรรกะหรือคำหลักใด ๆ
เช่น like, null, between เป็นต้น
กลุ่มโดยและมีส่วนคำสั่งที่ใช้ในคำสั่งเลือก
เป็นไปได้ที่จะแบ่งตารางออกเป็นกลุ่มและส่งกลับกลุ่มที่ตรงกับเงื่อนไขส่วนคำสั่งที่มี
ไวยากรณ์: จุดเริ่มต้นของคำสั่ง select
จัดกลุ่มตาม [ทั้งหมด] integrated_free_expression [,aggregate_free_expression]*
[มีเงื่อนไขการค้นหา]
ส่วนท้ายของคำสั่ง select
: ระบุกลุ่มที่จะแบ่งตาราง หากฟังก์ชันรวมรวมอยู่ในรายการตารางที่เลือก ค่ารวมจะถูกคำนวณสำหรับแต่ละกลุ่ม ผลลัพธ์ของผลรวมเหล่านี้จะแสดงในคอลัมน์ใหม่แทนที่จะเป็นแถวใหม่ ผู้ใช้สามารถอ้างอิงคอลัมน์ผลรวมใหม่เหล่านี้ได้ในส่วนคำสั่งมี สามารถใช้ฟังก์ชันการรวม เช่น avg, count, max, min และ sum ใน select_list ก่อนจัดกลุ่มตาม ตารางสามารถจัดกลุ่มตามการรวมกันของคอลัมน์ใดก็ได้
ทั้งหมด: ส่วนขยาย Transact-SQL ที่รวมกลุ่มทั้งหมดในผลลัพธ์ แม้กระทั่งกลุ่มที่ถูกแยกออกตามคำสั่งย่อยก็ตาม ถ้าใช้ have clause พร้อมๆ กัน ความหมายของ all จะถูกลบล้างไป
integrated_free_expression: นิพจน์ที่ไม่มีฟังก์ชันการรวม ส่วนขยาย Transact-SQL อนุญาตให้จัดกลุ่มตามนิพจน์โดยไม่มีฟังก์ชันรวมในขณะที่จัดกลุ่มตามชื่อคอลัมน์
มี: กำหนดเงื่อนไขสำหรับกลุ่มตามข้อ คล้ายกับที่ซึ่งกำหนดเงื่อนไขสำหรับคำสั่ง select เงื่อนไขการค้นหาสำหรับการมีสามารถรวมนิพจน์ฟังก์ชันรวมได้ นอกจากนั้นเกณฑ์การค้นหาจะเหมือนกับเกณฑ์การค้นหา
เรียงลำดับตาม: จัดเรียงผลลัพธ์ตามคอลัมน์ เอาต์พุตของคอลัมน์โดยการเลือกสามารถอ้างอิงได้ด้วยชื่อคอลัมน์ นามแฝงของคอลัมน์ หรือตำแหน่งคอลัมน์ ตัวอย่างเช่น: เลือก id เป็น myid, ตั้งชื่อเป็น myname จากกลุ่ม mytable ด้วย id, เลือก id เป็น myid, ตั้งชื่อเป็น myname จากกลุ่ม mytable ด้วย myid, เลือก id เป็น myid, ตั้งชื่อเป็น myname จากกลุ่ม mytable ด้วย 1 ทั้งสามประโยคนี้ครบถ้วนสมบูรณ์ เทียบเท่าของ แน่นอนว่าเราไม่เห็นด้วยกับการใช้งานครั้งที่ 3 ซึ่งจะส่งผลเสียต่อความสามารถในการอ่านโปรแกรม หากต้องการเรียงลำดับจากมากไปน้อย ให้เพิ่มคำสำคัญ DESC ตามลำดับส่วนคำสั่งก่อนชื่อคอลัมน์ที่คุณต้องการเรียงลำดับ ค่าเริ่มต้นคือการเรียงลำดับจากน้อยไปหามาก แต่คุณสามารถระบุได้อย่างชัดเจนโดยใช้คำสำคัญ ASC
ส่วนคำสั่งจำกัด: ใช้เพื่อจำกัดจำนวนแถวที่ส่งคืนโดยคำสั่ง select ขีดจำกัดจะใช้พารามิเตอร์ตัวเลข 1 หรือ 2 ตัว หากกำหนดพารามิเตอร์ไว้ 2 ตัว พารามิเตอร์ตัวแรกจะระบุออฟเซ็ตของแถวแรกที่จะส่งคืน และตัวที่สองจะระบุจำนวนแถวสูงสุดที่จะส่งคืน ออฟเซ็ตของแถวเริ่มต้นคือ 0 (ไม่ใช่ 1) หากมีการกำหนดอาร์กิวเมนต์ จะระบุจำนวนแถวสูงสุดที่ส่งคืนที่ออฟเซ็ต 0 กล่าวอีกนัยหนึ่ง ขีดจำกัด 5 และขีดจำกัด 0,5 นั้นเทียบเท่ากันโดยสิ้นเชิง
สำหรับความหมายของคีย์เวิร์ดของโพรซีเดอร์นั้น ฉันไม่ค่อยชัดเจนนัก ดูเหมือนว่าจะรองรับโพรซีเดอร์ที่เก็บไว้ และตัว MySQL เองก็ไม่รองรับโพรซีเดอร์ที่เก็บไว้สำหรับความต้องการในการขยายในอนาคต