จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล
กฎที่ชุดผลลัพธ์ต้องปฏิบัติตามเพื่อรวมเข้าด้วยกัน และข้อผิดพลาดจากชนิดข้อมูลไม่ตรงกันที่พบบ่อย
จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
กฎความเข้ากันได้ที่ผู้สัมภาษณ์มักถาม
การดำเนินการเซตทุกชนิด (UNION, INTERSECT, EXCEPT) กำหนดให้ชุดผลลัพธ์ทั้งสองชุดต้อง เข้ากันได้สำหรับการดำเนินการเซต ผู้สัมภาษณ์ถามเรื่องนี้เพื่อดูว่าคุณทราบหรือไม่ว่าคิวรีเหล่านี้อาจล้มเหลวโดยไม่ทันสังเกตได้อย่างไร
มีกฎสองข้อที่กำหนดความเข้ากันได้ ได้แก่ จำนวนคอลัมน์ ต้องตรงกัน และ ชนิดข้อมูล ต้องเข้ากันได้ตามตำแหน่ง หากผิดข้อใดข้อหนึ่ง จะเกิดข้อผิดพลาดหรือได้ผลลัพธ์ที่คาดไม่ถึง
กฎข้อ 1: จำนวนคอลัมน์เท่ากัน
คิวรีทั้งสองต้องเลือกคืน จำนวนคอลัมน์เท่ากัน หากคิวรีแรกคืนค่ามาสามคอลัมน์ แต่คิวรีที่สองคืนมาสองคอลัมน์ ฐานข้อมูลจะปฏิเสธคำสั่งดังกล่าว
นี่เป็นข้อผิดพลาดจากการดำเนินการเซตที่พบบ่อยที่สุดในการสัมภาษณ์ โดยเฉพาะเมื่อมีคนแก้ไขแขนงหนึ่งแล้วลืมแก้อีกแขนง
SELECT id, name, city FROM a
UNION
SELECT id, name FROM b;
-- ERROR: each UNION query must have the same number of columnsกฎข้อ 2: ชนิดข้อมูลต้องเข้ากันได้ตามตำแหน่ง
คอลัมน์จะถูกจับคู่ ตามตำแหน่ง ไม่ใช่ตามชื่อ คอลัมน์แรกของคิวรีหนึ่งจะจับคู่กับคอลัมน์แรกของคิวรีสอง และดำเนินการเช่นนี้ต่อไป แต่ละคู่ต้องมีชนิดข้อมูลที่เข้ากันได้
โดยทั่วไป ความเข้ากันได้หมายถึงสามารถแปลงชนิดข้อมูลโดยปริยายได้ เช่น INT กับ BIGINT ใช้ร่วมกันได้ แต่โดยทั่วไป INT กับ DATE ใช้ร่วมกันไม่ได้
SELECT id, signup_date FROM a
UNION
SELECT id, signup_date FROM b;
-- positions: (int,date) vs (int,date) -> OKสิ่งสำคัญคือตำแหน่ง ไม่ใช่ชื่อ
จุดที่มักทำให้เข้าใจผิดคือ คอลัมน์สามารถมี ชื่อต่างกัน และยังนำมารวมกันได้ ตราบใดที่ตำแหน่งตรงกันและชนิดข้อมูลเข้ากันได้ ในทางกลับกัน ชื่อที่ตรงกันแต่เรียงผิดลำดับจะทำให้ข้อมูลเหลื่อมตำแหน่ง
อ่านการดำเนินการเซตโดยพิจารณาคอลัมน์ตามตำแหน่งเสมอ ผู้สัมภาษณ์มักสลับคอลัมน์เพื่อทดสอบความเข้าใจข้อนี้
SELECT name, id FROM a
UNION ALL
SELECT id, name FROM b;
-- name<->id swapped: types may clash or data lands in wrong columnชื่อคอลัมน์ของผลลัพธ์
ชุดผลลัพธ์จะใช้ ชื่อคอลัมน์จากคิวรีแรก ป้ายกำกับจากคิวรีที่สองจะถูกทิ้งไป หากต้องการควบคุมหัวตาราง ให้กำหนดชื่อแทนให้คอลัมน์ในแขนงแรก
ด้วยเหตุนี้ ORDER BY ที่อยู่ภายหลังจึงต้องอ้างอิงชื่อจากคิวรีแรก หรือใช้ลำดับที่ของคอลัมน์
SELECT id AS user_id, city AS location FROM a
UNION ALL
SELECT id, town FROM b;
-- output headers: user_id, locationการบังคับชนิดข้อมูลโดยปริยาย
เมื่อคอลัมน์สองคอลัมน์ที่จับคู่กันตามตำแหน่งมีชนิดข้อมูลต่างกันแต่เข้ากันได้ ระบบประมวลผลจะเลือกชนิดผลลัพธ์ที่กว้างพอจะรองรับทั้งสองชนิด การรวม INT กับ DECIMAL มักให้ผลลัพธ์เป็น DECIMAL
การกล่าวถึงการแปลงชนิดนี้ในการสัมภาษณ์แสดงให้เห็นความเข้าใจเชิงลึกว่า คอลัมน์จะไม่ทำให้เกิดข้อผิดพลาด แต่จะถูกยกระดับเป็นชนิดที่ครอบคลุมกว่า
SELECT amount FROM int_table -- INT
UNION ALL
SELECT amount FROM dec_table; -- DECIMAL
-- result column is DECIMALเติมคอลัมน์ที่ขาดหายด้วย NULL
เมื่อคิวรีสองรายการมีโครงสร้างต่างกันตามธรรมชาติ ให้จัดแนวด้วยการเพิ่มคอลัมน์ตัวยึดตำแหน่ง เทคนิคที่ใช้กันบ่อยคือเลือก NULL (โดยมักแปลงชนิดข้อมูลให้เหมาะสม) เพื่อเติมตำแหน่งที่อีกแขนงหนึ่งมีอยู่
การแปลงชนิดของ NULL จะช่วยป้องกันไม่ให้ระบบประมวลผลคาดเดาชนิดข้อมูลเอง และทำให้คอลัมน์เข้ากันได้
SELECT id, phone, CAST(NULL AS VARCHAR) AS email FROM a
UNION ALL
SELECT id, CAST(NULL AS VARCHAR), email FROM b;ตัวอย่างข้อผิดพลาดจากชนิดข้อมูลไม่ตรงกัน
ในกรณีนี้ คอลัมน์ที่สองเป็นวันที่ในแขนงหนึ่ง แต่เป็นข้อความในอีกแขนงหนึ่ง ระบบประมวลผลที่เคร่งครัดจะปฏิเสธกรณีนี้ ส่วนระบบที่ผ่อนปรนอาจแปลงชนิดข้อมูลอย่างคาดเดาไม่ได้ วิธีแก้ที่ปลอดภัยคือใช้ CAST อย่างชัดเจน เพื่อให้ทั้งสองฝั่งใช้ชนิดข้อมูลเดียวกัน
ในการสัมภาษณ์ ให้เสนอการแปลงชนิดข้อมูลอย่างชัดเจน แทนการพึ่งพาการแปลงโดยปริยาย
SELECT id, CAST(event_date AS VARCHAR) FROM a
UNION ALL
SELECT id, label FROM b;
-- both second columns now VARCHAR -> compatibleกฎเหล่านี้ใช้กับตัวดำเนินการเซตทั้งหมด
กฎเรื่องจำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูลนั้น เหมือนกันทุกประการ สำหรับ UNION, UNION ALL, INTERSECT และ EXCEPT ตัวดำเนินการทั้งหมดจะนำชุดผลลัพธ์มาวางต่อกันในแนวตั้ง และทั้งหมดต้องรับข้อมูลเข้าที่เข้ากันได้สำหรับการดำเนินการเซต
ดังนั้น รายการตรวจสอบทางความคิดเพียงชุดเดียวจึงใช้ได้กับการดำเนินการเซตทุกชนิด ได้แก่ นับจำนวนคอลัมน์ ตรวจสอบชนิดข้อมูลตามตำแหน่ง และควบคุมชื่อคอลัมน์จากคิวรีแรก
SELECT id, city FROM a
INTERSECT
SELECT id, city FROM b;
-- same compatibility rules as UNIONรายการตรวจสอบก่อนดำเนินการ
ก่อนรวมชุดผลลัพธ์ ให้ตรวจสอบว่า:
- ทุกแขนงมีจำนวนคอลัมน์เท่ากัน
- คู่คอลัมน์ตามตำแหน่งแต่ละคู่มีชนิดข้อมูลที่เข้ากันได้ (แปลงชนิดข้อมูลหากไม่แน่ใจ)
- คอลัมน์อยู่ในลำดับเชิงตรรกะเดียวกัน
- กำหนดชื่อแทนไว้ในคิวรีแรก เพื่อให้ชื่อผลลัพธ์อ่านง่าย
การพูดรายการตรวจสอบนี้ออกมาในการสัมภาษณ์จะช่วยป้องกันข้อผิดพลาดจากการจัดตำแหน่งที่ไม่ตรงกันโดยไม่ทันสังเกต
เชื่อมโยงแนวคิดทั้งหมด
ส่วนใหญ่แล้วสามารถหลีกเลี่ยงปัญหาความเข้ากันได้ได้ ข้อผิดพลาดจะเห็นได้ชัดเมื่อจำนวนคอลัมน์ต่างกัน แต่จะไม่เห็นได้ชัดเมื่อคอลัมน์ถูกสลับหรือตัวระบบแปลงชนิดข้อมูลอย่างไม่คาดคิด การอ่านคิวรีโดยพิจารณาคอลัมน์ตามตำแหน่ง และการแปลงชนิดข้อมูลอย่างตั้งใจ จะช่วยให้การดำเนินการเซตถูกต้อง
คำตอบที่มั่นใจควรระบุกฎทั้งสองข้อ กล่าวถึงการจับคู่ตามตำแหน่ง และระบุว่าชื่อผลลัพธ์มาจากคิวรีแรก
ตรวจสอบความเข้าใจอย่างรวดเร็ว
เอสคิวแอลตัดสินอย่างไรว่าคอลัมน์ของแขนง UNION สองแขนงใดจับคู่กัน
สรุปทบทวน
ประเด็นสำคัญ:
- ตัวดำเนินการเซตทั้งหมดต้องมี จำนวนคอลัมน์เท่ากัน ในทุกแขนง
- คอลัมน์จะถูกจับคู่ ตามตำแหน่ง และแต่ละคู่ต้องมีชนิดข้อมูลที่เข้ากันได้
- ชนิดข้อมูลที่เข้ากันได้อาจถูกแปลงเป็นชนิดข้อมูลร่วมที่กว้างกว่า
- ใช้
CAST(NULL AS type)เพื่อเติมโครงสร้างที่แตกต่างกันให้มีรูปแบบเดียวกัน - ชื่อผลลัพธ์มาจากคิวรี แรก
คำถามที่พบบ่อย
บทเรียน “จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล”
กฎที่ชุดผลลัพธ์ต้องปฏิบัติตามเพื่อรวมเข้าด้วยกัน และข้อผิดพลาดจากชนิดข้อมูลไม่ตรงกันที่พบบ่อย คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม
ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- UNION เทียบกับ UNION ALL
- จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล
- INTERSECT และ EXCEPT สำหรับการเปรียบเทียบ
- จำลองการดำเนินการกับชุดข้อมูลด้วยการเชื่อมตาราง