0Pricing
SQL Interview Prep · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ลำดับความสำคัญของ AND/OR และการใส่วงเล็บ
  2. BETWEEN, IN และขอบเขตแบบรวมปลาย
  3. LIKE อักขระแทนที่ และการหลีกอักขระ
  4. กรองด้วยค่าที่คำนวณแล้ว
← กลับไปที่ SQL Interview Prep