MySQL บทช่วยสอนการใช้ไวด์การ์ด: ชอบ, ไม่ชอบ, หลีก, ( % ), ( _ )
สิ่งที่เป็น MySQL ไวด์การ์ด?
MySQL สัญลักษณ์แทน เป็นอักขระที่ช่วยค้นหาข้อมูลที่ตรงตามเกณฑ์ที่ซับซ้อน ไวล์ดการ์ดจะใช้ร่วมกับตัวดำเนินการเปรียบเทียบ LIKE หรือตัวดำเนินการเปรียบเทียบ NOT LIKE
เหตุใดจึงต้องใช้ WildCards ?
หากคุณคุ้นเคยกับการใช้ SQL คุณอาจคิดว่าคุณสามารถค้นหาข้อมูลที่ซับซ้อนได้โดยใช้คำสั่ง SELECT และ WHERE แล้วทำไมจึงต้องใช้ Wildcards ล่ะ
ก่อนที่เราจะตอบคำถามนั้น มาดูตัวอย่างกันก่อน สมมติว่าแผนกการตลาดของคลังวิดีโอ Myflix ดำเนินการส่งเสริมการขายในเมืองเท็กซัส และต้องการรับคำติชมเกี่ยวกับจำนวนสมาชิก
ที่ลงทะเบียนจากเท็กซัส คุณสามารถใช้คำสั่ง SELECT ต่อไปนี้ร่วมกับคำสั่ง WHERE เพื่อรับข้อมูลที่ต้องการ
SELECT * FROM members WHERE postal_address = 'Austin , TX' OR postal_address = Dallas , TX OR postal_address = Iola,TX OR postal_adress = Houston ,TX';
ดังที่คุณเห็นจากข้อความค้นหาข้างต้น “WHERE ข้อ” กลายเป็นเรื่องซับซ้อน อย่างไรก็ตาม การใช้ไวด์การ์ดจะทำให้การค้นหาง่ายขึ้น เนื่องจากเราสามารถใช้สิ่งที่เรียบง่าย เช่น สคริปต์ที่แสดงด้านล่าง
SELECT * FROM members WHERE postal_address like '% TX';
กล่าวโดยสรุป ไวด์การ์ดช่วยให้เราสามารถพัฒนาเครื่องมือค้นหาที่มีประสิทธิภาพลงในแอปพลิเคชันที่ขับเคลื่อนด้วยข้อมูลของเรา
ประเภทของไวด์การ์ด
% เปอร์เซ็นต์
% อักขระเปอร์เซ็นต์ที่ใช้ในการระบุรูปแบบของ อักขระศูนย์ (0) หรือมากกว่า. มีโครงสร้างพื้นฐานดังต่อไปนี้
SELECT statements... WHERE fieldname LIKE 'xxx%';
ที่นี่
- "คำสั่ง SELECT…” คือคำสั่ง SQL SELECT มาตรฐาน
- “WHERE” คือคำสำคัญที่ใช้กรองข้อมูล
- “LIKE” คือตัวดำเนินการเปรียบเทียบที่ใช้ร่วมกับไวด์การ์ด
- 'xxx' คือรูปแบบเริ่มต้นที่ระบุ เช่น อักขระเดี่ยวหรือมากกว่า และ "%" จะจับคู่อักขระจำนวนเท่าใดก็ได้โดยเริ่มจากศูนย์ (0)
เพื่อให้เข้าใจข้อความข้างต้นได้อย่างเต็มที่ เรามาดูตัวอย่างที่ใช้งานได้จริงกัน
สมมติว่าเราต้องการให้ภาพยนตร์ทั้งหมดที่มีคำว่า "code" เป็นส่วนหนึ่งของชื่อเรื่อง เราจะใช้เปอร์เซ็นต์ตัวแทนเพื่อทำการจับคู่รูปแบบทั้งสองด้านของคำว่า "code" ด้านล่างนี้คือคำสั่ง SQL ที่สามารถใช้เพื่อบรรลุผลลัพธ์ที่ต้องการ
SELECT * FROM movies WHERE title LIKE '%code%';
ดำเนินการสคริปต์ข้างต้นใน MySQL ปรับแต่ง เทียบกับ myflixdb ให้ผลลัพธ์ตามที่แสดงด้านล่าง
| movie_id | title | director | year_released | category_id |
|---|---|---|---|---|
| 4 | Code Name Black | Edgar Jimz | 2010 | NULL |
| 7 | Davinci Code | NULL | NULL | 6 |
โปรดสังเกตว่าแม้ว่าคำสำคัญในการค้นหา "code" จะปรากฏที่จุดเริ่มต้นหรือจุดสิ้นสุดของชื่อ คำนั้นก็ยังคงส่งคืนในชุดผลลัพธ์ของเรา เนื่องจากโค้ดของเรามีอักขระจำนวนเท่าใดก็ได้ในตอนต้น จากนั้นจะตรงกับรูปแบบ "โค้ด" ตามด้วยอักขระจำนวนเท่าใดก็ได้ในตอนท้าย
ตอนนี้เรามาแก้ไขสคริปต์ด้านบนเพื่อรวมเปอร์เซ็นต์ไวด์การ์ดที่จุดเริ่มต้นของเกณฑ์การค้นหาเท่านั้น
SELECT * FROM movies WHERE title LIKE '%code';
ดำเนินการสคริปต์ข้างต้นใน MySQL โต๊ะทำงานเทียบกับ myflixdb ให้ผลลัพธ์ตามที่แสดงด้านล่าง
| movie_id | title | director | year_released | category_id |
|---|---|---|---|---|
| 7 | Davinci Code | NULL | NULL | 6 |
โปรดสังเกตว่ามีเพียงระเบียนเดียวเท่านั้นที่ถูกส่งคืนจากฐานข้อมูล เนื่องจากโค้ดของเราตรงกับอักขระจำนวนเท่าใดก็ได้ที่จุดเริ่มต้นของชื่อภาพยนตร์ และรับเฉพาะบันทึกที่ลงท้ายด้วยรูปแบบ "โค้ด" เท่านั้น
ตอนนี้ให้เลื่อนไวล์ดการ์ดเปอร์เซ็นต์ไปที่จุดสิ้นสุดของรูปแบบที่ระบุเพื่อให้ตรงกัน สคริปต์ที่แก้ไขจะแสดงด้านล่าง
SELECT * FROM movies WHERE title LIKE 'code%';
| movie_id | title | director | year_released | category_id |
|---|---|---|---|---|
| 4 | Code Name Black | Edgar Jimz | 2010 | NULL |
สังเกตว่ามีเพียงระเบียนเดียวเท่านั้นที่ถูกส่งคืนจากฐานข้อมูล เนื่องจากรหัสของเราตรงกับชื่อทั้งหมดที่ขึ้นต้นด้วยรูปแบบ “รหัส” ตามด้วยอักขระจำนวนเท่าใดก็ได้
_ ขีดเส้นใต้ไวด์การ์ด
มีการใช้ไวด์การ์ดขีดล่างเพื่อ ตรงกับอักขระหนึ่งตัว- สมมติว่าเราต้องการค้นหาภาพยนตร์ทั้งหมดที่ออกฉายในปี 200x โดยที่ x คืออักขระหนึ่งตัวที่สามารถมีค่าเท่าใดก็ได้ เราจะใช้ไวด์การ์ดขีดล่างเพื่อบรรลุเป้าหมายนั้น สคริปต์ด้านล่างเลือกภาพยนตร์ทั้งหมดที่เข้าฉายในปี “200x”
SELECT * FROM movies WHERE year_released LIKE '200_';
ดำเนินการสคริปต์ข้างต้นใน MySQL โต๊ะทำงานเทียบกับ myflixdb ให้ผลลัพธ์ตามที่แสดงด้านล่าง
| movie_id | title | director | year_released | category_id |
|---|---|---|---|---|
| 2 | Forgetting Sarah Marshal | Nicholas Stoller | 2008 | 2 |
| 9 | Honey mooners | Jhon Shultz | 2005 | 8 |
โปรดสังเกตว่าเฉพาะภาพยนตร์ที่มีตัวละครใดๆ ก็ตามในปีที่ออกฉาย 200 เรื่องเท่านั้นที่ถูกส่งคืนในชุดผลลัพธ์ของเรา เนื่องจากสัญลักษณ์ตัวแทนขีดล่างตรงกับรูปแบบ 200 ตามด้วยอักขระตัวเดียว
ไม่ชอบ
ตัวดำเนินการเชิงตรรกะ NOT สามารถใช้ร่วมกับไวด์การ์ดเพื่อส่งคืนแถวที่ไม่ตรงกับรูปแบบที่ระบุ
สมมติว่าเราต้องการดูภาพยนตร์ที่ไม่ได้ออกฉายในปี 200x เราจะใช้ตัวดำเนินการตรรกะ NOT ร่วมกับไวล์ดการ์ดขีดล่างเพื่อรับผลลัพธ์ ด้านล่างนี้คือสคริปต์ที่ใช้ดำเนินการดังกล่าว
SELECT * FROM movies WHERE year_released NOT LIKE '200_';
| movie_id | title | director | year_released | category_id |
|---|---|---|---|---|
| 1 | Pirates of the Caribean 4 | Rob Marshall | 2011 | 1 |
| 4 | Code Name Black | Edgar Jimz | 2010 | NULL |
| 8 | Underworld-Awakeninh | Michahel Eal | 2012 | 6 |
โปรดทราบว่าผลลัพธ์ที่ได้จะแสดงเฉพาะภาพยนตร์ที่ไม่ได้เริ่มต้นด้วย 200 ในปีที่ออกฉายเท่านั้น เนื่องจากเราใช้ตัวดำเนินการตรรกะ NOT ในการค้นหารูปแบบไวด์การ์ด
หนีคำสำคัญ
คีย์เวิร์ด ESCAPE ใช้เพื่อ อักขระจับคู่รูปแบบการหลีก เช่น เปอร์เซ็นต์ (%) และขีดล่าง (_) หากเป็นส่วนหนึ่งของข้อมูล
สมมติว่าเราต้องการตรวจสอบสตริง “67%” ที่เราสามารถใช้ได้
LIKE '67#%%' ESCAPE '#';
หากเราต้องการค้นหาภาพยนตร์เรื่อง “67% Guilty” เราสามารถใช้สคริปต์ที่แสดงด้านล่างเพื่อค้นหา
SELECT * FROM movies WHERE title LIKE '67#%%' ESCAPE '#';
สังเกตว่ามีคู่ “%%” ในส่วนคำสั่ง LIKE อันแรกเป็นสีแดง “%” ถือเป็นส่วนหนึ่งของสตริงที่จะค้นหา อีกอันหนึ่งใช้เพื่อจับคู่อักขระจำนวนเท่าใดก็ได้ที่ตามมา
ข้อความค้นหาเดียวกันนี้จะใช้งานได้หากเราใช้สิ่งที่ต้องการ
SELECT * FROM movies WHERE title LIKE '67=%%' ESCAPE '=';
สรุป
- เครื่องมืออันทรงพลัง Like & Wildcards ที่ช่วยค้นหาข้อมูลที่ตรงกับรูปแบบที่ซับซ้อน
- มีไวด์การ์ดจำนวนหนึ่งที่ประกอบด้วยเปอร์เซ็นต์ ขีดล่าง และรายการชาร์ท (ไม่รองรับโดย MySQL ) ท่ามกลางคนอื่น ๆ
- เปอร์เซ็นต์ไวด์การ์ดใช้เพื่อจับคู่อักขระจำนวนเท่าใดก็ได้โดยเริ่มจากศูนย์ (0) และอื่นๆ
- ไวด์การ์ดขีดล่างใช้เพื่อจับคู่อักขระหนึ่งตัวเท่านั้น
