MySQL UNION – บทช่วยสอนที่สมบูรณ์

⚡ สรุปอย่างชาญฉลาด

MySQL คำสั่ง UNION จะรวมผลลัพธ์จากคำสั่ง SELECT สองคำสั่งขึ้นไปเข้าด้วยกันเป็นชุดผลลัพธ์เดียว คำอธิบายนี้จะกล่าวถึงกฎของคอลัมน์ที่ทำให้คำสั่ง UNION มีความถูกต้อง ความแตกต่างระหว่าง UNION DISTINCT และ UNION ALL และตัวอย่างการใช้งานกับฐานข้อมูล myflixdb

  • 🔗 วัตถุประสงค์หลัก: คำสั่ง UNION จะเรียงแถวที่ได้จากคำสั่ง SELECT หลายคำสั่งเข้าด้วยกันเป็นชุดผลลัพธ์เดียว โดยเรียงคำสั่งหนึ่งอยู่ด้านล่างอีกคำสั่งหนึ่ง
  • 📐 กฎคอลัมน์: คำสั่ง SELECT ทุกคำสั่งจะต้องส่งคืนจำนวนคอลัมน์เท่ากัน ในลำดับเดียวกัน และมีชนิดข้อมูลที่เข้ากันได้
  • 🧹 ยูเนียน ดิสทินท์: ระบบจะลบแถวที่ซ้ำกันออก และแสดงเฉพาะแถวที่ไม่ซ้ำกันเท่านั้น ซึ่งเป็นลักษณะการทำงาน MySQL ใช้งานตามค่าเริ่มต้น
  • 📚 รวมพลังกันทั้งหมด: ระบบจะส่งคืนทุกแถว รวมทั้งแถวที่ซ้ำกัน ซึ่งทำให้การทำงานเร็วขึ้นเนื่องจากไม่จำเป็นต้องทำการลบแถวที่ซ้ำกันออก
  • 🏷️ ชื่อคอลัมน์: ชุดผลลัพธ์จะใช้ชื่อคอลัมน์จากคำสั่ง SELECT แรก ดังนั้นชื่อแทนจึงควรอยู่ในคำสั่งนั้น
  • 🛠️ การใช้งานทั่วไป: การรวมตารางสองตารางที่มีข้อมูลประเภทเดียวกัน โดยไม่อนุญาตให้มีแถวซ้ำกันในผลลัพธ์ที่รวมกัน

MySQL ยูเนี่ยน OperaTor

สหภาพแรงงานคืออะไรใน MySQL?

ยูเนี่ยน คือ MySQL ตัวดำเนินการที่รวมผลลัพธ์จากคำสั่ง SELECT หลายคำสั่งเข้าด้วยกันเป็นชุดผลลัพธ์เดียว แถวที่ได้จากคำสั่งที่สองจะถูกวางไว้ด้านล่างแถวที่ได้จากคำสั่งแรก ทำให้ได้รายการแนวตั้งรายการเดียวแทนที่จะเป็นสองรายการแยกกัน

ข้อกำหนดเพียงอย่างเดียวที่จะทำให้วิธีนี้ได้ผลคือ จำนวนคอลัมน์ของคำสั่ง SELECT ทั้งหมดที่ต้องการนำมารวมกันจะต้องเท่ากัน

สมมติว่าเรามีตารางสองตารางดังต่อไปนี้

MySQL ยูเนี่ยนMySQL ยูเนี่ยน

ทั้งสองตารางมีคอลัมน์ประเภทเดียวกันสองคอลัมน์ ดังนั้นจึงสามารถรวมกันได้ ตัวอย่างต่อไปนี้เป็นการรวมตารางทั้งสองนี้เข้าด้วยกัน

ทำไมต้องใช้ UNION?

สมมติว่ามีข้อบกพร่องในการออกแบบฐานข้อมูลของคุณ และคุณกำลังใช้ตารางสองตารางที่แตกต่างกันซึ่งมีจุดประสงค์เดียวกัน คุณต้องการรวมตารางทั้งสองนี้เข้าเป็นตารางเดียว โดยตัดข้อมูลที่ซ้ำกันออกไปping ไปยังตารางใหม่ คุณสามารถใช้คำสั่ง UNION ในกรณีดังกล่าวได้

นอกจากนี้ ตัวดำเนินการยังมีประโยชน์ในการทำงานรายงานประจำวันอีกด้วย:

  • Archiข้อมูลสดและข้อมูลแบบเรียลไทม์: สามารถสร้างรายงานจากตารางปัจจุบันและตารางเก็บถาวรที่มีคอลัมน์เดียวกันได้ โดยไม่ต้องทำการรวมตารางทั้งสองเข้าด้วยกัน
  • แหล่งข้อมูลหลายแหล่ง รายงานฉบับเดียว: สามารถแสดงรายการสมาชิกและภาพยนตร์ หรือยอดขายจากสองภูมิภาคไว้ในผลลัพธ์เดียว เพื่อให้ตรวจสอบได้รวดเร็ว
  • การตรวจสอบการย้ายข้อมูล: สามารถนำข้อมูลจากตารางเก่าและตารางใหม่มาซ้อนกันและเปรียบเทียบกันได้ก่อนที่จะลบตารางเก่าทิ้ง

คำสั่ง UNION ไม่สามารถใช้แทนคำสั่ง JOIN ได้ UNION จะเพิ่มแถวซ้อนกัน ในขณะที่ JOIN จะเพิ่มคอลัมน์ซ้อนกัน และความแตกต่างนี้จะเป็นตัวกำหนดว่าควรใช้ตัวดำเนินการใดในงานนั้นๆ

MySQL ไวยากรณ์และกฎของ UNION

เมื่อเข้าใจวัตถุประสงค์แล้ว ให้พิจารณารูปแบบของคำสั่งและกฎที่ฐานข้อมูลบังคับใช้

SELECT column1, column2 FROM `table1`
UNION [DISTINCT | ALL]
SELECT column1, column2 FROM `table2`;

มีกฎสามข้อที่ควบคุมสหภาพแรงงานทุกแห่ง:

  1. จำนวนคอลัมน์เท่ากัน แต่ละ คำสั่ง SELECT ต้องส่งคืนจำนวนคอลัมน์เท่ากัน มิฉะนั้น MySQL ทำให้เกิดข้อผิดพลาด 1222
  2. ประเภทข้อมูลที่เข้ากันได้จะต้องอยู่ในลำดับเดียวกัน คอลัมน์แรกของแบบสอบถามแรกจะตรงกับคอลัมน์แรกของแบบสอบถามที่สอง ดังนั้นตัวเลขควรตรงกับตัวเลข และข้อความควรตรงกับข้อความ
  3. ชื่อต่างๆ มาจากคำค้นหาแรก ส่วนหัวของชุดผลลัพธ์จะถูกนำมาจากคำสั่ง SELECT แรก ซึ่งเป็นเหตุผลว่าทำไมชื่อเรียกแทนใดๆ จึงต้องอยู่ตรงนั้น

An ORDER BY หรือ LIMIT เงื่อนไขที่วางไว้ตอนท้ายจะใช้กับผลลัพธ์โดยรวม ไม่ใช่เฉพาะส่วนใดส่วนหนึ่ง และต้องอ้างอิงถึงชื่อคอลัมน์ที่ได้จากคำสั่ง SELECT แรก

UNION DISTINCT เทียบกับ UNION ALL

เมื่อมีกฎเกณฑ์เหล่านี้แล้ว การตัดสินใจที่เหลืออยู่คือว่าควรคงแถวที่ซ้ำกันไว้หรือไม่

การรวมตารางโดยใช้ DISTINCT

ต่อไปนี้เราจะสร้างคำสั่ง UNION เพื่อรวมทั้งสองตารางโดยใช้ DISTINCT

SELECT column1, column2 FROM `table1`
UNION DISTINCT
SELECT column1, column2 FROM `table2`;

ที่นี่แถวที่ซ้ำกันจะถูกลบออกและส่งคืนเฉพาะแถวที่ไม่ซ้ำเท่านั้น

ยูเนี่ยนที่แตกต่าง

หมายเหตุ MySQL ใช้ส่วนคำสั่ง DISTINCT เป็นค่าเริ่มต้นเมื่อดำเนินการค้นหา UNION หากไม่มีการระบุสิ่งใด

การรวมตารางโดยใช้ ALL

ต่อไปนี้เราจะสร้างคำสั่ง UNION เพื่อรวมทั้งสองตารางโดยใช้ ALL

SELECT `column1`, `column2` FROM `table1`
UNION ALL
SELECT `column1`, `column2` FROM `table2`;

ในที่นี้จะรวมแถวที่ซ้ำกันไว้ด้วย เนื่องจากเราใช้คำสั่ง ALL

ยูเนี่ยน-ทั้งหมด

ภาพทั้งสองภาพแสดงให้เห็นถึงความแตกต่างได้อย่างชัดเจน และตารางด้านล่างนี้ได้สรุปความแตกต่างนั้นไว้แล้ว

จุดเปรียบเทียบ ความแตกต่างของสหภาพ ยูเนี่ยนทั้งหมด
แถวซ้ำกัน ลบออกจากผลลัพธ์ เก็บไว้ในผลลัพธ์
พฤติกรรมเริ่มต้น ใช่ ใช้ได้เมื่อไม่ได้ระบุอะไรไว้ ไม่ ต้องเขียนคำว่า ALL ลงไปด้วย
ความเร็ว กระบวนการนี้ช้ากว่า และจำเป็นต้องมีการตรวจสอบการซ้ำซ้อน ทำงานได้เร็วขึ้น โดยจะส่งคืนข้อมูลตามลำดับการอ่าน
เหมาะสำหรับใช้เมื่อ รายการที่รวมกันจะต้องมีแถวที่ไม่ซ้ำกัน ทุกแถวมีความสำคัญ มิฉะนั้นจะไม่สามารถมีข้อมูลซ้ำกันได้

💡 เคล็ดลับ: หากทั้งสองสาขาไม่สามารถสร้างแถวที่ซ้ำกันได้ ให้เลือก UNION ALL ฐานข้อมูลจะข้ามขั้นตอนการเรียงลำดับและการเปรียบเทียบที่ DISTINCT ต้องการ ซึ่งช่วยประหยัดทรัพยากรได้อย่างเห็นได้ชัดสำหรับตารางขนาดใหญ่

ตัวอย่างการใช้งานจริง MySQL ม้านั่งทำงานของช่างเครื่อง

ตัวอย่างที่ผ่านมาใช้ตารางตัวอย่าง ตอนนี้เราจะรันคำสั่งเดียวกันกับฐานข้อมูล myflixdb จริง ซึ่งทั้งสองตารางมีข้อมูลที่แตกต่างกันอย่างมาก

ใน myFlixDB ของเรา เรามาผสานรวมสิ่งต่างๆ เข้าด้วยกัน membership_number และ full_names คอลัมน์จากตารางสมาชิกที่มี movie_id และ title คอลัมน์จากตารางภาพยนตร์ การค้นหาทั้งสองแบบให้ผลลัพธ์เป็นสองคอลัมน์ ดังนั้นการรวมจึงถูกต้อง

เราสามารถใช้คำสั่งค้นหาต่อไปนี้ได้

SELECT `membership_number`, `full_names` FROM `members`
UNION
SELECT `movie_id`, `title` FROM `movies`;

ดำเนินการสคริปต์ข้างต้นใน MySQL ปรับแต่ง เมื่อใช้คำสั่ง SELECT กับฐานข้อมูล myflixdb จะได้ผลลัพธ์ดังที่แสดงด้านล่าง สังเกตว่าหัวข้อมาจากคำสั่ง SELECT แรก แม้ว่าแถวด้านล่างจะเป็นข้อมูลภาพยนตร์ก็ตาม

membership_number full_names
1 Janet Jones
2 Janet Smith Jones
3 Robert Phil
4 Gloria Williams
5 Leonard Hofstadter
6 Sheldon Cooper
7 Rajesh Koothrappali
8 Leslie Winkle
9 Howard Wolowitz
16 67% Guilty
6 Angels and Demons
4 Code Name Black
5 Daddy's Little Girls
7 Davinci Code
2 Forgetting Sarah Marshal
9 Honey mooners
19 movie 3
1 Pirates of the Caribean 4
18 sample movie
17 The Great Dictator
3 X-Men

คำถามที่พบบ่อย

คำสั่ง UNION จะเรียงแถวของผลลัพธ์จากคำสั่งค้นหาหนึ่งไว้ด้านล่างอีกคำสั่งหนึ่ง ทำให้ผลลัพธ์สูงขึ้นเรื่อยๆ สมัคร คำสั่ง UNION จะจับคู่แถวที่คล้ายคลึงกันและวางคอลัมน์ไว้เคียงข้างกัน ทำให้ผลลัพธ์กว้างขึ้น ใช้ UNION สำหรับแถวที่คล้ายกัน และ JOIN สำหรับตารางที่เกี่ยวข้องกัน

วางเพียงอันเดียว สั่งโดย คำสั่ง LIMIT ที่อยู่หลังคำสั่ง SELECT สุดท้าย จะเรียงลำดับผลลัพธ์ที่รวมกันและต้องใช้ชื่อคอลัมน์ที่ได้จากคำสั่ง SELECT แรก คำสั่ง LIMIT ที่วางไว้ตรงนั้นก็ทำงานในลักษณะเดียวกัน

ข้อผิดพลาด 1222 จะปรากฏขึ้นเมื่อผลลัพธ์ของคำสั่ง SELECT มีจำนวนคอลัมน์ไม่เท่ากัน ให้ลองนับจำนวนคอลัมน์ในแต่ละสาขา แล้วเพิ่มค่าคงที่หรือค่า NULL ลงในสาขาที่มีจำนวนคอลัมน์น้อยกว่า เพื่อให้ผลลัพธ์ของทั้งสองสาขาเรียงลำดับตรงกัน

ใช่แล้ว ตัวช่วยแปลงข้อความเป็น SQL รวมถึงตัวช่วยที่ติดตั้งมากับระบบด้วย MySQL ม้านั่งทำงานของช่างเครื่องสร้างคำสั่ง UNION จากคำขอธรรมดา ตรวจสอบลำดับคอลัมน์ด้วยตนเอง เนื่องจากโมเดลอาจจัดเรียงคอลัมน์ที่ดูคล้ายกันให้ตรงกัน

ผู้ช่วยอาจแนะนำให้ใช้ UNION ALL เมื่อไม่สามารถมีข้อมูลซ้ำซ้อนได้ ซึ่งเป็นวิธีที่ช่วยเพิ่มความเร็วในการประมวลผล อย่างไรก็ตาม การตัดสินใจยังคงขึ้นอยู่กับข้อมูล ดังนั้นควรตรวจสอบให้แน่ใจว่าสาขาต่างๆ ไม่ทับซ้อนกันอย่างแท้จริงก่อนที่จะลบขั้นตอนการกำจัดข้อมูลซ้ำซ้อนออกไป

สรุปโพสต์นี้ด้วย: