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

จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล

กฎที่ชุดผลลัพธ์ต้องปฏิบัติตามเพื่อรวมเข้าด้วยกัน และข้อผิดพลาดจากชนิดข้อมูลไม่ตรงกันที่พบบ่อย

จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding 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) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล”

กฎที่ชุดผลลัพธ์ต้องปฏิบัติตามเพื่อรวมเข้าด้วยกัน และข้อผิดพลาดจากชนิดข้อมูลไม่ตรงกันที่พบบ่อย คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม

ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. UNION เทียบกับ UNION ALL
  2. จำนวนคอลัมน์และความเข้ากันได้ของชนิดข้อมูล
  3. INTERSECT และ EXCEPT สำหรับการเปรียบเทียบ
  4. จำลองการดำเนินการกับชุดข้อมูลด้วยการเชื่อมตาราง
← กลับไปที่ Coding Interview Prep