LIKE อักขระแทนที่ และการหลีกอักขระ
การจับคู่รูปแบบ เครื่องหมายเปอร์เซ็นต์เทียบกับขีดล่าง และการหลีกอักขระแทนที่เพื่อใช้เป็นอักขระตามตัว
LIKE อักขระแทนที่ และการหลีกอักขระ เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
การจับคู่รูปแบบภายใต้การซักถามในการสัมภาษณ์
LIKE ดูเรียบง่าย แต่ซ่อนกับดักสำคัญในการสัมภาษณ์ไว้สามข้อ ได้แก่ การสับสนระหว่าง % กับ _ การลืมว่าต้องใช้อักขระหลีกเมื่อเครื่องหมายเปอร์เซ็นต์หรือขีดล่างตามตัวอักษรปรากฏอยู่ในข้อมูล และความแตกต่างด้านการพิจารณาตัวพิมพ์เล็กใหญ่ที่ขึ้นอยู่กับฐานข้อมูล
บทเรียนนี้จะเจาะลึกอักขระตัวแทนทั้งสองแบบ ส่วนคำสั่ง ESCAPE และกฎระหว่างระบบฐานข้อมูลต่างชนิดที่ผู้สัมภาษณ์ใช้แยกนักพัฒนาระดับเริ่มต้นออกจากผู้ที่เคยนำฟีเจอร์ค้นหาจริงไปใช้งาน
อักขระตัวแทนสองแบบ
LIKE มีอักขระตัวแทนอยู่สองแบบพอดี:
%ตรงกับอักขระศูนย์ตัวขึ้นไป_ตรงกับอักขระหนึ่งตัวพอดี
ดังนั้น 'a%' จึงตรงกับทุกค่าที่ขึ้นต้นด้วย a ส่วน 'a_' จะตรงกับข้อความที่มีสองอักขระและขึ้นต้นด้วย a การสับสนระหว่างสองแบบนี้เป็นข้อผิดพลาดอันดับหนึ่งในการใช้ LIKE
SELECT *
FROM customers
WHERE name LIKE 'A%';
-- every name beginning with Aเครื่องหมายเปอร์เซ็นต์ได้ทุกตำแหน่ง
วาง % ในตำแหน่งต่าง ๆ เพื่อควบคุมว่าการจับคู่จะยึดกับส่วนใด:
'%son'ลงท้ายด้วย son (จอห์นสัน, เมสัน)'%mary%'มี mary อยู่ที่ใดก็ได้'J%n'ขึ้นต้นด้วย J และลงท้ายด้วย n
'%' เพียงอย่างเดียวจะตรงกับทุกแถวที่ไม่ใช่ NULL ค่า NULL ไม่เคยตรงกับรูปแบบ LIKE ใด ๆ รวมถึง '%' ด้วย
SELECT *
FROM customers
WHERE email LIKE '%@gmail.com';ขีดล่างสำหรับความยาวคงที่
_ ตรงกับอักขระใดก็ได้หนึ่งตัว จึงเหมาะสำหรับรหัสที่มีความกว้างคงที่ 'A__' จะตรงกับอักขระทั้งหมดสามตัวที่ขึ้นต้นด้วย A ไม่มากหรือน้อยกว่านั้น
ผู้สัมภาษณ์มักทดสอบเรื่องนี้ด้วยรหัสผลิตภัณฑ์หรือรหัสประเทศ ผู้สมัครที่เขียน 'A%' เมื่อถูกถามหารหัสสามอักขระที่ขึ้นต้นด้วย A จะผิดพลาดอย่างละเอียด เพราะจะได้ผลลัพธ์เป็น A ตามด้วยอะไรก็ได้
SELECT *
FROM products
WHERE sku LIKE 'A__';
-- A followed by exactly two more charactersเมื่อ % และ _ ปรากฏในข้อมูล
ถ้าต้องการค้นหาค่าที่มีเครื่องหมายเปอร์เซ็นต์จริง ๆ เช่น ป้ายส่วนลด 'ลด 50%' การเขียน LIKE '%50%%' จะไม่ทำงาน เพราะ % ตัวท้ายจะถูกมองเป็นอักขระตัวแทน ไม่ใช่เครื่องหมายตามตัวอักษร
คุณต้องระบุให้ระบบฐานข้อมูลทราบว่าอักขระที่กำหนดหนึ่งตัวเป็นอักขระจริง นั่นคือหน้าที่ของส่วนคำสั่ง ESCAPE
ส่วนคำสั่ง ESCAPE
ประกาศอักขระหลีกด้วย ESCAPE จากนั้นเติมอักขระหลีกไว้หน้าอักขระตัวแทนที่ต้องการให้เป็นอักขระจริง ในที่นี้ ! คืออักขระหลีก ดังนั้น !% จึงหมายถึงเครื่องหมายเปอร์เซ็นต์จริง
วิธีนี้จะค้นหาค่าที่มีข้อความจริง 50% อยู่ที่ใดก็ได้ อักขระหลีกเลือกเป็นตัวใดก็ได้ ควรเลือกตัวที่ไม่ปรากฏในข้อความค้นหาของคุณ
SELECT *
FROM promos
WHERE label LIKE '%50!%%' ESCAPE '!';
-- matches a literal '50%' anywhere in labelการใช้อักขระหลีกกับขีดล่างตามตัวอักษร
ขีดล่างมักซ่อนอยู่ในชื่อผู้ใช้และตัวระบุ และขีดล่าง _ ที่ไม่ได้ใช้อักขระหลีกจะจับคู่กับอักขระใดก็ได้อย่างเงียบ ๆ หากต้องการค้นหาอีเมลที่ขึ้นต้นด้วย 'a_b' ตามตัวอักษร คุณต้องใช้อักขระหลีกกับขีดล่าง
หากไม่ใช้อักขระหลีก 'a_b%' จะจับคู่กับ ‘axb’, ‘a9b’ และค่าอื่น ๆ ได้ด้วย ข้อผิดพลาดนี้ถูกนำขึ้นใช้งานจริงอยู่เสมอ เพราะคำสั่งที่ไม่ได้ใช้อักขระหลีกยังคงส่งคืนแถวที่ดูสมเหตุสมผล
SELECT *
FROM users
WHERE handle LIKE 'a!_b%' ESCAPE '!';
-- handle starting with the literal text a_bความไวต่อตัวพิมพ์เล็กใหญ่แตกต่างกันไปตามฐานข้อมูล
การที่ LIKE จะพิจารณาตัวพิมพ์เล็กใหญ่หรือไม่นั้นขึ้นอยู่กับระบบและการจัดเรียง:
- PostgreSQL:
LIKEพิจารณาตัวพิมพ์เล็กใหญ่ ใช้ILIKEหากไม่ต้องการพิจารณาความแตกต่างนี้ - MySQL: ขึ้นอยู่กับการจัดเรียงของคอลัมน์ และโดยมากจะไม่พิจารณาตัวพิมพ์เล็กใหญ่เป็นค่าเริ่มต้น
- เซิร์ฟเวอร์เอสคิวแอล: ขึ้นอยู่กับการตั้งค่าการจัดเรียง
แนวทางที่ใช้ได้ข้ามระบบและระบุชัดเจนคือทำให้ทั้งสองฝั่งเป็นตัวพิมพ์เล็ก
SELECT *
FROM customers
WHERE LOWER(name) LIKE 'a%';ต้นทุนด้านประสิทธิภาพที่ซ่อนอยู่
อักขระตัวแทนที่อยู่ต้นรูปแบบ เช่น '%son' ไม่สามารถใช้ดัชนีแบบบีทรีทั่วไปได้ เพราะดัชนีเรียงตามคำนำหน้าและคุณไม่ได้กำหนดจุดเริ่มต้นไว้ ระบบจึงต้องสแกนทุกแถว
'son%' (อักขระตัวแทนอยู่ท้ายรูปแบบและมีคำนำหน้าที่กำหนดจุดเริ่มต้น) สามารถใช้ดัชนีได้ ผู้สัมภาษณ์ชอบถามว่าเหตุใดการค้นหาด้วย LIKE จึงช้า โดยทั่วไปคำตอบคือมี % อยู่ต้นรูปแบบ
-- index-friendly (anchored prefix):
WHERE name LIKE 'Smi%'
-- forces a scan (leading wildcard):
WHERE name LIKE '%mith'นอกเหนือจาก LIKE
เมื่อ LIKE ไม่เพียงพอ ให้กล่าวถึงทางเลือกอื่นเพื่อแสดงความรู้ที่ลึกซึ้ง:
SIMILAR TOและนิพจน์ปกติแบบ POSIX (~,~*) ใน PostgreSQL สำหรับนิพจน์ปกติอย่างแท้จริง- ดัชนีสำหรับการค้นหาข้อความเต็มสำหรับคลังข้อความอิสระขนาดใหญ่
- ดัชนีไตรแกรม (พีจีไตรแกรม) เพื่อทำให้การค้นหาที่มีอักขระตัวแทนอยู่ต้นรูปแบบทำได้รวดเร็ว
การกล่าวถึงสิ่งเหล่านี้แสดงว่าคุณรู้ว่า LIKE เป็นเพียงระดับพื้นฐาน ไม่ใช่ขีดสูงสุดของการค้นหาข้อความ
การสร้างรูปแบบ LIKE จากข้อมูลนำเข้าของผู้ใช้อย่างปลอดภัย
ผู้สัมภาษณ์มักถามว่า คุณจะค้นหาคำที่ผู้ใช้พิมพ์ด้วย LIKE โดยไม่ทำให้เกิดปัญหาได้อย่างไร ควรกล่าวถึงความเสี่ยงสองประการ:
- การฉีดคำสั่ง — ผูกค่าเป็นพารามิเตอร์ และอย่านำข้อมูลนำเข้าดิบมาต่อเข้ากับสตริงคำสั่ง SQL โดยเด็ดขาด
- อักขระแทนที่ที่ไม่ได้หลีก — หากข้อมูลนำเข้ามี
%หรือ_อยู่เอง ให้หลีกอักขระเหล่านั้นเพื่อให้จับคู่ตามตัวอักษรจริง
ผูกพารามิเตอร์ก่อน แล้วจึงเพิ่มอักขระแทนที่ของคุณเองในคำสั่งสืบค้น
-- $1 is bound as a parameter; wildcards are added in SQL
SELECT *
FROM products
WHERE name LIKE '%' || replace(replace($1, '_', '\_'), '%', '\%') || '%' ESCAPE '\';ตรวจสอบความเข้าใจ
ทบทวนความแตกต่างระหว่างอักขระตัวแทนทั้งสองแบบ
สรุป
ประเด็นสำคัญ:
%ตรงกับอักขระศูนย์ตัวขึ้นไป ส่วน_ตรงกับอักขระหนึ่งตัวพอดี- หากต้องการจับคู่
%หรือ_ที่เป็นอักขระจริงในข้อมูล ให้ประกาศอักขระESCAPEและเติมอักขระหลีกไว้หน้าอักขระตัวแทน - ความไวต่อตัวพิมพ์เล็กใหญ่แตกต่างกันไปตามระบบ การใช้
LOWER()กับทั้งสองฝั่งเป็นวิธีแก้ที่ใช้ได้ข้ามระบบ (โพสต์เกรสมีILIKE) - อักขระตัวแทนที่อยู่ต้นรูปแบบบังคับให้สแกนข้อมูลทั้งหมด ส่วนคำนำหน้าที่กำหนดจุดเริ่มต้นสามารถใช้ดัชนีได้
ขีดล่าง _ ที่ไม่ได้ใช้อักขระหลีกเป็นข้อผิดพลาดที่เกิดขึ้นอย่างเงียบ ๆ เพราะยังคงส่งคืนแถวที่ดูสมเหตุสมผล
คำถามที่พบบ่อย
บทเรียน “LIKE อักขระแทนที่ และการหลีกอักขระ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “LIKE อักขระแทนที่ และการหลีกอักขระ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “LIKE อักขระแทนที่ และการหลีกอักขระ”
การจับคู่รูปแบบ เครื่องหมายเปอร์เซ็นต์เทียบกับขีดล่าง และการหลีกอักขระแทนที่เพื่อใช้เป็นอักขระตามตัว คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “LIKE อักขระแทนที่ และการหลีกอักขระ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม
ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ลำดับความสำคัญของ AND/OR และการใส่วงเล็บ
- BETWEEN, IN และขอบเขตแบบรวมปลาย
- LIKE อักขระแทนที่ และการหลีกอักขระ
- กรองด้วยค่าที่คำนวณแล้ว