เขียน CTE แรกของคุณ
ไวยากรณ์ WITH พื้นฐาน และกรณีที่ CTE ช่วยให้อ่านง่ายกว่าคิวรีย่อย
เขียน CTE แรกของคุณ เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
CTE คืออะไรจริง ๆ
นิพจน์ตารางทั่วไป (CTE) คือชุดผลลัพธ์ชั่วคราวที่ตั้งชื่อและกำหนดด้วยคีย์เวิร์ด WITH ซึ่งมีอยู่เพียงตลอดระยะเวลาของคิวรีเดียว ผู้สัมภาษณ์ชอบถามเรื่อง CTE เพราะช่วยแสดงว่าคุณสามารถจัดโครงสร้างตรรกะให้ชัดเจนได้หรือไม่
ลองมอง CTE ว่าเป็นการตั้งชื่อให้ซับคิวรี เพื่อให้คุณอ้างอิงซับคิวรีนั้นเหมือนตารางในคำสั่งหลักที่ตามมา CTE ไม่ได้สร้างวัตถุถาวร และจะหายไปทันทีที่คิวรีทำงานเสร็จ
ไวยากรณ์ WITH พื้นฐาน
CTE ทุกตัวเริ่มต้นด้วย WITH ตามด้วยชื่อ คีย์เวิร์ด AS และคิวรีที่อยู่ในวงเล็บ หลังวงเล็บปิด ให้เขียนคำสั่งปกติที่ใช้ CTE ตามชื่อ
WITH cte_name AS ( ... )ใช้กำหนดบล็อก- คิวรีที่อยู่ถัดจากวงเล็บคือ คิวรีหลัก
- ชื่อ CTE ทำหน้าที่เหมือนตารางที่คุณใช้ SELECT จากได้
WITH recent_orders AS (
SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
)
SELECT *
FROM recent_orders;ทำไมไม่ใช้ซับคิวรีไปเลย
สามารถเขียนตรรกะเดียวกันเป็นซับคิวรีแบบฝังในส่วนคำสั่ง FROM ได้ แล้วเหตุใดผู้สัมภาษณ์จึงถามเรื่อง CTE
- อ่านง่าย: ขั้นตอนที่ตั้งชื่อจะอ่านจากบนลงล่างเหมือนสูตรการทำอาหาร
- นำกลับมาใช้ซ้ำ: คุณสามารถอ้างอิง CTE เดิมหลายครั้งแทนการเขียนซับคิวรีซ้ำ
- ตรวจแก้จุดบกพร่องได้ง่าย: คุณสามารถใช้ SELECT เฉพาะ CTE เพื่อตรวจสอบผลลัพธ์ได้
คำตอบที่เหมาะสมในการสัมภาษณ์มักเป็น: ใช้ CTE เมื่อทำให้คิวรีอ่านและดูแลรักษาได้ง่ายขึ้น
ตัวอย่างที่ทำตามได้: กรองแล้วจึงรวมค่า
สมมติคำถามคือ: ค้นหารายได้รวมจากคำสั่งซื้อที่ทำในปีนี้ CTE ช่วยแยกขั้นตอนการกรองออกมาก่อน แล้วจึงคำนวณค่ารวมจากผลลัพธ์ที่ตั้งชื่อไว้
คิวรีหลักมอง recent_orders ราวกับเป็นตารางจริง ทำให้การคำนวณค่ารวมสะอาดและเห็นได้ชัดเจน
WITH recent_orders AS (
SELECT amount
FROM orders
WHERE order_date >= '2024-01-01'
)
SELECT SUM(amount) AS total_revenue
FROM recent_orders;การตั้งชื่อคอลัมน์ผลลัพธ์
คุณสามารถเปลี่ยนชื่อคอลัมน์ที่ CTE เปิดให้ใช้งานได้ โดยระบุชื่อเหล่านั้นต่อจากชื่อ CTE วิธีนี้มีประโยชน์เมื่อคิวรีด้านในสร้างนิพจน์ขึ้นมา หรือเมื่อคุณต้องการชื่อที่ชัดเจนขึ้นในขั้นตอนถัดไป
หากระบุรายการคอลัมน์ รายการนั้นต้องมีจำนวนตรงกับจำนวนคอลัมน์ที่คิวรีด้านในคืนค่า มิฉะนั้นฐานข้อมูลจะแจ้งข้อผิดพลาด
WITH revenue (region, total) AS (
SELECT region, SUM(amount)
FROM orders
GROUP BY region
)
SELECT region, total
FROM revenue
ORDER BY total DESC;CTE คือคิวรีที่ตั้งชื่อไว้
แนวคิดหนึ่งที่สร้างความประทับใจในการสัมภาษณ์คือ CTE เทียบเท่ากับการนำคำนิยามของมันมาแทนที่แบบฝังในคิวรีในเชิงตรรกะ ฐานข้อมูลอาจเลือกฝังคิวรีไว้ภายในหรือสร้างผลลัพธ์ไว้ชั่วคราว แต่ในเชิงความหมาย ผลลัพธ์จะเหมือนกับการนำซับคิวรีมาแปะไว้
ดังนั้น สิ่งใดที่ใช้ได้ใน SELECT ปกติก็ใช้ได้ภายใน CTE เช่น การเชื่อมตาราง, GROUP BY, WHERE, ฟังก์ชันหน้าต่าง และอื่น ๆ
ตัวอย่างเชิงลึก: CTE กับการเชื่อมตาราง
CTE มีประโยชน์อย่างมากเมื่อต้องเตรียมรูปข้อมูลด้านหนึ่งของการเชื่อมตาราง ในที่นี้ เราคำนวณจำนวนคำสั่งซื้อแยกตามลูกค้าก่อน แล้วจึงเชื่อมกลับเข้ากับตารางลูกค้า เพื่อให้แถวของลูกค้าแต่ละรายมีจำนวนรวมของตนเอง
สังเกตว่าคิวรีหลักอ่านได้แทบเหมือนภาษาทั่วไป: จากตารางลูกค้า แล้วเชื่อมกับจำนวนคำสั่งซื้อของลูกค้า
WITH order_counts AS (
SELECT customer_id, COUNT(*) AS num_orders
FROM orders
GROUP BY customer_id
)
SELECT c.name, oc.num_orders
FROM customers c
JOIN order_counts oc
ON oc.customer_id = c.id;ตำแหน่งของ CTE ในคิวรี
บล็อก WITH ต้องอยู่ ก่อน คำสั่งที่ใช้บล็อกนั้น CTE จะมองเห็นได้เฉพาะคำสั่งเดียวที่อยู่ถัดจากนิยามของมันในทันที
- คุณไม่สามารถอ้างอิง CTE ในคิวรีถัดไปที่แยกเป็นอีกคำสั่งหนึ่งได้
- CTE ที่กำหนดให้กับ SELECT ไม่สามารถนำกลับมาใช้กับ SELECT อื่นที่ทำงานภายหลังได้
- ขอบเขตสิ้นสุดที่อัฒภาคซึ่งปิดท้ายคำสั่ง
CTE ใช้กับ INSERT, UPDATE, DELETE ได้
คำถามต่อยอดที่พบบ่อยคือ CTE ไม่ได้จำกัดอยู่แค่ SELECT ในฐานข้อมูลสมัยใหม่ส่วนใหญ่ คุณสามารถใช้ข้อกำหนด WITH ร่วมกับคำสั่งปรับเปลี่ยนข้อมูลได้เช่นกัน
วิธีนี้ช่วยให้คุณคำนวณชุดแถวเพียงครั้งเดียวแล้วดำเนินการกับชุดนั้น ซึ่งอ่านเข้าใจได้ชัดเจนกว่าการใช้ซับคิวรีซ้อนภายในส่วนคำสั่ง WHERE มาก
WITH stale AS (
SELECT id
FROM sessions
WHERE last_seen < NOW() - INTERVAL '30 days'
)
DELETE FROM sessions
WHERE id IN (SELECT id FROM stale);ข้อผิดพลาดที่ผู้เริ่มต้นมักทำ
ผู้สัมภาษณ์มักสังเกตข้อผิดพลาดเหล่านี้:
- ลืมเขียนคิวรีหลักต่อจาก CTE โดยบล็อก
WITHเพียงอย่างเดียวไม่ใช่คำสั่งที่สมบูรณ์ - ใส่อัฒภาคระหว่าง CTE กับคิวรีหลัก
- คาดหวังให้ CTE คงอยู่ข้ามหลายคำสั่ง
- ระบุรายการชื่อคอลัมน์เสริมไม่ตรงกับคอลัมน์ของคิวรีด้านใน
วิธีพูดถึง CTE ในการสัมภาษณ์
เมื่อถูกขอให้ปรับโครงสร้างซับคิวรีที่อ่านยาก ให้บอกแนวคิดของคุณออกมา: จะย้ายซับคิวรีสำหรับกรองนี้ไปไว้ใน CTE ที่ชื่อคำสั่งซื้อล่าสุด เพื่อให้การคำนวณค่ารวมอ่านได้ชัดเจน
การแสดงให้เห็นว่าคุณเลือกใช้ CTE เพื่อ ความชัดเจนและการนำกลับมาใช้ซ้ำ ไม่ใช่ใช้โดยไม่พิจารณา จะสื่อถึงวุฒิภาวะระดับกลาง ควรกล่าวด้วยว่า CTE ไม่ได้ทำให้คิวรีเร็วขึ้นโดยอัตโนมัติ คุณค่าหลักของ CTE คือการทำให้อ่านง่าย
ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับไวยากรณ์พื้นฐานและขอบเขตของ CTE
ทบทวน: CTE แรกของคุณ
คุณได้เรียนรู้ว่า CTE ใช้ WITH name AS ( ... ) เพื่อตั้งชื่อให้ชุดผลลัพธ์ชั่วคราว แล้วอ้างอิงชุดผลลัพธ์นั้นเหมือนตารางในคำสั่งถัดไป
- CTE ช่วยเพิ่มความอ่านง่าย การนำกลับมาใช้ซ้ำ และความง่ายต่อการแก้จุดบกพร่องเมื่อเทียบกับแบบสอบถามย่อยที่ฝังอยู่ในคำสั่ง
- ขอบเขตจำกัดอยู่ที่คำสั่งเดียว และ CTE จะหายไปหลังจากนั้น
- ใช้งานร่วมกับ SELECT รวมถึง INSERT/UPDATE/DELETE ได้
- ไม่ได้ช่วยเพิ่มประสิทธิภาพโดยอัตโนมัติ
ถัดไป: เชื่อม CTE หลายรายการเข้าด้วยกันเป็นกระบวนการหลายขั้นตอน
คำถามที่พบบ่อย
บทเรียน “เขียน CTE แรกของคุณ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เขียน CTE แรกของคุณ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เขียน CTE แรกของคุณ”
ไวยากรณ์ WITH พื้นฐาน และกรณีที่ CTE ช่วยให้อ่านง่ายกว่าคิวรีย่อย คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “เขียน CTE แรกของคุณ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เขียน CTE แรกของคุณ
- ต่อ CTE หลายรายการ
- CTE เทียบกับคิวรีย่อยเทียบกับตารางชั่วคราว
- ปรับโครงสร้างคิวรีซ้อนให้เป็น CTE