UNION เทียบกับ UNION ALL
ความแตกต่างด้านการลบข้อมูลซ้ำและประสิทธิภาพ รวมถึงเหตุผลที่โดยทั่วไปควรใช้ UNION ALL
UNION เทียบกับ UNION ALL เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดผู้สัมภาษณ์จึงถามเกี่ยวกับ UNION
การดำเนินการกับเซตจะนำชุดผลลัพธ์หนึ่งมาต่อด้านล่างอีกชุดในแนวตั้ง UNION และ UNION ALL เป็นตัวดำเนินการกับเซตกลุ่มแรกที่ผู้สัมภาษณ์มักเลือกถาม เพราะความแตกต่างระหว่างสองแบบนี้อธิบายได้ด้วยคำตอบเพียงบรรทัดเดียว และเผยให้เห็นว่าคุณเข้าใจต้นทุนหรือไม่
คำถามมักใช้ถ้อยคำว่า: "UNION กับ UNION ALL แตกต่างกันอย่างไร และควรใช้แบบใด" คำตอบที่ดีควรกล่าวถึงการกำจัดรายการซ้ำ การเรียงลำดับ และประสิทธิภาพให้ครบในคำตอบเดียว
UNION ทำอะไร
UNION รวมแถวจากคำสั่งสองชุดเป็นชุดผลลัพธ์เดียว แล้วลบแถวซ้ำออก แถวสองแถวจะถือว่าซ้ำกันก็ต่อเมื่อทุกคอลัมน์มีค่าเหมือนกัน
การลบแถวซ้ำทำให้ระบบต้องเรียงลำดับหรือสร้างแฮชให้กับแถวที่รวมกันทั้งหมด ซึ่งเป็นงานที่มีต้นทุนจริง UNION จึงคืนเซตในความหมายทางคณิตศาสตร์ คือไม่มีรายการซ้ำ
SELECT city FROM customers
UNION
SELECT city FROM suppliers;UNION ALL ทำอะไร
UNION ALL นำชุดผลลัพธ์สองชุดมาต่อกันและเก็บแถวไว้ทุกแถว รวมถึงแถวซ้ำด้วย วิธีนี้ไม่กำจัดรายการซ้ำ จึงไม่ต้องเรียงลำดับหรือสร้างแฮชเพื่อจุดประสงค์ดังกล่าว
เพราะข้ามขั้นตอนกำจัดรายการซ้ำ UNION ALL จึงมักเร็วกว่าอย่างมาก และเป็นตัวเลือกที่ถูกต้องเมื่อคุณรู้ว่าแถวไม่ซ้อนทับกัน หรือเมื่อต้องการเก็บแถวซ้ำไว้จริง ๆ
SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers;ความแตกต่างด้านประสิทธิภาพ
ประเด็นสำคัญในการสัมภาษณ์คือ UNION ALL มีต้นทุนต่ำกว่า เพราะไม่เคยกำจัดรายการซ้ำ ส่วน UNION ต้องเปรียบเทียบแถวที่รวมกันเพื่อเอารายการซ้ำออก
UNION= UNION ALL + ขั้นตอน DISTINCT โดยปริยาย- สำหรับชุดผลลัพธ์ขนาดใหญ่ ขั้นตอน DISTINCT อาจเป็นต้นทุนหลักของคำสั่ง
หากไม่จำเป็นต้องลบแถวซ้ำ การเลือกใช้ UNION จะสิ้นเปลือง CPU และหน่วยความจำ
ตัวอย่างที่ทำให้ดูพร้อมแถวซ้ำ
สมมติว่าคำสั่งทั้งสองชุดอาจคืนแถว 'Paris' ด้วย UNION คุณจะได้ Paris เพียงหนึ่งรายการ แต่ด้วย UNION ALL คุณจะได้ Paris สองครั้ง
ผู้สัมภาษณ์ชอบให้คุณคาดการณ์จำนวนแถว จงนึกถึงการนำผลลัพธ์มาต่อกันแบบดิบก่อน แล้วถามว่าตัวดำเนินการลบรายการซ้ำออกหรือไม่
-- customers.city: Paris, Lyon
-- suppliers.city: Paris, Nice
-- UNION -> Paris, Lyon, Nice (3 rows)
-- UNION ALL -> Paris, Lyon, Paris, Nice (4 rows)แถวซ้ำพิจารณาจากทุกคอลัมน์
ข้อผิดพลาดที่พบบ่อยคือ แถวสองแถวจะซ้ำกันก็ต่อเมื่อทุกคอลัมน์ที่เลือกมีค่าเท่ากัน หากเพิ่มคอลัมน์ที่มีค่าต่างกัน แถวนั้นจะไม่ถือว่าซ้ำกันอีกต่อไป ดังนั้น UNION จะเก็บทั้งสองแถวไว้
นี่เป็นเหตุผลที่ SELECT id, city มักคืนแถวมากกว่า SELECT city เมื่อใช้ UNION แม้จะมาจากตารางเดียวกัน
SELECT id, city FROM customers
UNION
SELECT id, city FROM suppliers;
-- ids differ -> few or no duplicates removedการเรียงลำดับผลลัพธ์ที่รวมกัน
คุณไม่สามารถใส่ ORDER BY ในแขนงย่อยแต่ละส่วนได้ เพราะมันใช้กับผลลัพธ์ที่รวมกันทั้งหมด และต้องปรากฏเพียงครั้งเดียวที่ท้ายสุด
ผู้สัมภาษณ์อาจถามว่า ORDER BY ต้องวางไว้ที่ใด คำตอบคือวาง ORDER BY หนึ่งครั้งหลังคำสั่งสุดท้าย โดยอ้างอิงคอลัมน์ผลลัพธ์ด้วยชื่อหรือตำแหน่ง
SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers
ORDER BY city;ชื่อคอลัมน์มาจากคิวรีแรก
เมื่ออ้างอิงคอลัมน์ใน ORDER BY สุดท้าย ให้ใช้ชื่อ (หรือชื่อแทน) จาก SELECT แรก ชื่อคอลัมน์ของคิวรีที่สองจะไม่ถูกนำไปใช้เป็นป้ายกำกับผลลัพธ์
เรื่องนี้สำคัญเมื่อแต่ละแขนงตั้งชื่อคอลัมน์ต่างกัน ให้กำหนดชื่อแทนให้แขนงแรกเพื่อควบคุมหัวผลลัพธ์
SELECT city AS location FROM customers
UNION ALL
SELECT town FROM suppliers
ORDER BY location;กรณีที่ควรเลือกใช้ UNION
ใช้ UNION เฉพาะเมื่อมีโอกาสเกิดแถวซ้ำกันจริง ๆ และต้องการให้แต่ละแถวที่ไม่ซ้ำปรากฏเพียงครั้งเดียว ตัวอย่างเช่น การรวมรายชื่อผู้ติดต่อสองชุดที่บุคคลเดียวกันอาจอยู่ในทั้งสองชุด หรือการสร้างรายการค่าที่ไม่ซ้ำจากหลายแหล่งโดยกำจัดรายการซ้ำ
หากรับรองได้ว่าแหล่งข้อมูลไม่ทับซ้อนกัน UNION ALL จะให้ผลลัพธ์เดียวกันได้เร็วกว่า
SELECT email FROM web_signups
UNION
SELECT email FROM store_signups;
-- one row per distinct email across bothกรณีที่ควรเลือกใช้ UNION ALL
ใช้ UNION ALL เมื่อไม่สามารถเกิดแถวซ้ำได้ เมื่อแถวซ้ำมีความหมาย หรือเมื่อจะนำผลลัพธ์ไปคำนวณรวมภายหลัง รูปแบบที่พบได้บ่อยคือการนำตารางพาร์ทิชันรายเดือนที่ไม่มีแถวร่วมกันมาวางต่อกัน
เคล็ดลับสำหรับการสัมภาษณ์: ระบุว่า UNION ALL เป็นค่าเริ่มต้น และจะเลือกใช้ UNION ก็ต่อเมื่อจำเป็นต้องกำจัดรายการซ้ำจริง ๆ
SELECT * FROM sales_2023
UNION ALL
SELECT * FROM sales_2024;นำแนวคิดทั้งหมดมาใช้ร่วมกัน
คำตอบในการสัมภาษณ์ที่เรียบเรียงไว้อย่างดีอาจเป็นดังนี้: "UNION จะลบแถวซ้ำ ซึ่งทำให้ต้องเรียงลำดับหรือใช้แฮช ส่วน UNION ALL จะเก็บทุกแถวไว้และทำงานเร็วกว่า ทั้งสองแบบต้องมีจำนวนคอลัมน์ตรงกันและมีชนิดข้อมูลที่เข้ากันได้ และ ORDER BY ใด ๆ ต้องอยู่เพียงครั้งเดียวที่ท้ายสุด โดยปกติจะเลือกใช้ UNION ALL เว้นแต่จำเป็นต้องกำจัดรายการซ้ำ"
ประโยคเดียวนี้แสดงให้เห็นทั้งความถูกต้องและความเข้าใจด้านประสิทธิภาพ
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับความแตกต่างระหว่าง UNION กับ UNION ALL
สรุปทบทวน
ประเด็นสำคัญ:
UNION= รวมและลบแถวซ้ำ (มีDISTINCTโดยปริยาย จึงมีต้นทุนเพิ่ม)UNION ALL= รวมและเก็บทุกแถวไว้ ทำงานเร็วกว่า และเป็นค่าเริ่มต้นที่เหมาะสม- แถวซ้ำจะเกิดขึ้นได้ก็ต่อเมื่อ ทุกคอลัมน์ ตรงกัน
- ใช้
ORDER BYเพียงครั้งเดียวที่ท้ายสุด และอ้างอิงชื่อคอลัมน์จากคิวรีแรก
เลือกใช้ UNION ALL เป็นค่าเริ่มต้น และเลือกใช้ UNION ก็ต่อเมื่อจำเป็นต้องกำจัดรายการซ้ำอย่างแท้จริง
คำถามที่พบบ่อย
บทเรียน “UNION เทียบกับ UNION ALL” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “UNION เทียบกับ UNION ALL” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “UNION เทียบกับ UNION ALL”
ความแตกต่างด้านการลบข้อมูลซ้ำและประสิทธิภาพ รวมถึงเหตุผลที่โดยทั่วไปควรใช้ UNION ALL คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “UNION เทียบกับ UNION ALL” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- UNION เทียบกับ UNION ALL
- จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล
- INTERSECT และ EXCEPT สำหรับการเปรียบเทียบ
- จำลองการดำเนินการกับชุดข้อมูลด้วยการเชื่อมตาราง