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

สหภาพแรงงานคืออะไรใน MySQL?
ยูเนี่ยน คือ MySQL ตัวดำเนินการที่รวมผลลัพธ์จากคำสั่ง SELECT หลายคำสั่งเข้าด้วยกันเป็นชุดผลลัพธ์เดียว แถวที่ได้จากคำสั่งที่สองจะถูกวางไว้ด้านล่างแถวที่ได้จากคำสั่งแรก ทำให้ได้รายการแนวตั้งรายการเดียวแทนที่จะเป็นสองรายการแยกกัน
ข้อกำหนดเพียงอย่างเดียวที่จะทำให้วิธีนี้ได้ผลคือ จำนวนคอลัมน์ของคำสั่ง SELECT ทั้งหมดที่ต้องการนำมารวมกันจะต้องเท่ากัน
สมมติว่าเรามีตารางสองตารางดังต่อไปนี้
ทั้งสองตารางมีคอลัมน์ประเภทเดียวกันสองคอลัมน์ ดังนั้นจึงสามารถรวมกันได้ ตัวอย่างต่อไปนี้เป็นการรวมตารางทั้งสองนี้เข้าด้วยกัน
ทำไมต้องใช้ UNION?
สมมติว่ามีข้อบกพร่องในการออกแบบฐานข้อมูลของคุณ และคุณกำลังใช้ตารางสองตารางที่แตกต่างกันซึ่งมีจุดประสงค์เดียวกัน คุณต้องการรวมตารางทั้งสองนี้เข้าเป็นตารางเดียว โดยตัดข้อมูลที่ซ้ำกันออกไปping ไปยังตารางใหม่ คุณสามารถใช้คำสั่ง UNION ในกรณีดังกล่าวได้
นอกจากนี้ ตัวดำเนินการยังมีประโยชน์ในการทำงานรายงานประจำวันอีกด้วย:
- Archiข้อมูลสดและข้อมูลแบบเรียลไทม์: สามารถสร้างรายงานจากตารางปัจจุบันและตารางเก็บถาวรที่มีคอลัมน์เดียวกันได้ โดยไม่ต้องทำการรวมตารางทั้งสองเข้าด้วยกัน
- แหล่งข้อมูลหลายแหล่ง รายงานฉบับเดียว: สามารถแสดงรายการสมาชิกและภาพยนตร์ หรือยอดขายจากสองภูมิภาคไว้ในผลลัพธ์เดียว เพื่อให้ตรวจสอบได้รวดเร็ว
- การตรวจสอบการย้ายข้อมูล: สามารถนำข้อมูลจากตารางเก่าและตารางใหม่มาซ้อนกันและเปรียบเทียบกันได้ก่อนที่จะลบตารางเก่าทิ้ง
คำสั่ง UNION ไม่สามารถใช้แทนคำสั่ง JOIN ได้ UNION จะเพิ่มแถวซ้อนกัน ในขณะที่ JOIN จะเพิ่มคอลัมน์ซ้อนกัน และความแตกต่างนี้จะเป็นตัวกำหนดว่าควรใช้ตัวดำเนินการใดในงานนั้นๆ
MySQL ไวยากรณ์และกฎของ UNION
เมื่อเข้าใจวัตถุประสงค์แล้ว ให้พิจารณารูปแบบของคำสั่งและกฎที่ฐานข้อมูลบังคับใช้
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
มีกฎสามข้อที่ควบคุมสหภาพแรงงานทุกแห่ง:
- จำนวนคอลัมน์เท่ากัน แต่ละ คำสั่ง SELECT ต้องส่งคืนจำนวนคอลัมน์เท่ากัน มิฉะนั้น MySQL ทำให้เกิดข้อผิดพลาด 1222
- ประเภทข้อมูลที่เข้ากันได้จะต้องอยู่ในลำดับเดียวกัน คอลัมน์แรกของแบบสอบถามแรกจะตรงกับคอลัมน์แรกของแบบสอบถามที่สอง ดังนั้นตัวเลขควรตรงกับตัวเลข และข้อความควรตรงกับข้อความ
- ชื่อต่างๆ มาจากคำค้นหาแรก ส่วนหัวของชุดผลลัพธ์จะถูกนำมาจากคำสั่ง 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 |




