ความแตกต่างระหว่างUNION
และUNION ALL
คืออะไร?
ความแตกต่างระหว่างUNION
และUNION ALL
คืออะไร?
คำตอบ:
UNION
ลบระเบียนที่ซ้ำกัน (ซึ่งคอลัมน์ทั้งหมดในผลลัพธ์เหมือนกัน) UNION ALL
ไม่
มีผลการปฏิบัติงานที่มีประสิทธิภาพเมื่อใช้UNION
แทนUNION ALL
เนื่องจากเซิร์ฟเวอร์ฐานข้อมูลต้องทำงานเพิ่มเติมเพื่อลบแถวที่ซ้ำกัน แต่โดยปกติแล้วคุณไม่ต้องการสำเนาที่ซ้ำกัน (โดยเฉพาะเมื่อพัฒนารายงาน)
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
ผลลัพธ์:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
ผลลัพธ์:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
ทั้ง UNION และ UNION ทั้งหมดเชื่อมต่อผลลัพธ์ของ SQL ที่ต่างกันสองตัว พวกเขาแตกต่างกันในวิธีที่พวกเขาจัดการรายการที่ซ้ำกัน
UNION ดำเนินการ DISTINCT บนชุดผลลัพธ์ขจัดแถวที่ซ้ำกัน
ยูเนี่ยนทั้งหมดไม่ได้ลบสิ่งที่ซ้ำกันดังนั้นจึงเร็วกว่ายูเนี่ยน
หมายเหตุ:ในขณะที่ใช้คำสั่งนี้คอลัมน์ที่เลือกทั้งหมดจะต้องเป็นชนิดข้อมูลเดียวกัน
ตัวอย่าง: ถ้าเรามีสองตาราง 1) พนักงานและ 2) ลูกค้า
UNION
ลบรายการที่ซ้ำกันในขณะที่UNION ALL
ไม่
เพื่อที่จะลบซ้ำชุดผลจะต้องมีการจัดเรียงและนี้อาจจะมีผลกระทบต่อประสิทธิภาพการทำงานของยูเนี่ยนขึ้นอยู่กับปริมาณของข้อมูลที่ถูกเรียงและการตั้งค่าของพารามิเตอร์ RDBMS ต่างๆ (สำหรับออราเคิลPGA_AGGREGATE_TARGET
ด้วยWORKAREA_SIZE_POLICY=AUTO
หรือSORT_AREA_SIZE
และSOR_AREA_RETAINED_SIZE
ถ้าWORKAREA_SIZE_POLICY=MANUAL
)
โดยทั่วไปการเรียงลำดับจะเร็วกว่าหากสามารถดำเนินการในหน่วยความจำได้ แต่จะใช้ข้อแม้เดียวกันเกี่ยวกับปริมาณของข้อมูล
แน่นอนถ้าคุณต้องการข้อมูลที่ส่งคืนโดยไม่ซ้ำกันคุณต้องใช้ UNION ขึ้นอยู่กับแหล่งที่มาของข้อมูลของคุณ
ฉันจะแสดงความคิดเห็นในโพสต์แรกเพื่อให้ความเห็น "มีประสิทธิภาพน้อยกว่า" ความคิดเห็น แต่มีชื่อเสียงไม่เพียงพอ (คะแนน) ที่จะทำ
ใน ORACLE: UNION ไม่สนับสนุนประเภทคอลัมน์ BLOB (หรือ CLOB) UNION ALL ทำ
ความแตกต่างพื้นฐานระหว่างยูเนี่ยนและยูเนี่ยนทั้งหมดคือการดำเนินการแบบยูเนี่ยนจะกำจัดแถวที่ซ้ำกันออกจากชุดผลลัพธ์ แต่การรวมกันจะส่งคืนแถวทั้งหมดหลังจากเข้าร่วม
จากhttp://zengin.wordpress.com/2007/07/31/union-vs-union-all/
คุณสามารถหลีกเลี่ยงการซ้ำซ้อนและยังทำงานได้เร็วกว่า UNION DISTINCT (ซึ่งเหมือนกับ UNION) โดยการเรียกใช้คิวรีดังนี้
SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X
สังเกตAND a!=X
ส่วนที่ นี่เร็วกว่ายูเนี่ยนแล้ว
UNION
- UNION
ยังลบรายการซ้ำที่ส่งคืนโดยแบบสอบถามย่อยในขณะที่วิธีการของคุณจะไม่
เพียงเพื่อเพิ่มสองเซ็นต์ของฉันในการสนทนาที่นี่: หนึ่งสามารถเข้าใจUNION
ผู้ประกอบการเป็นสหภาพบริสุทธิ์ที่มุ่งเน้น SET - เช่นชุด A = {2,4,6,8} ชุด B = {1,2,3,4 }, A UNION B = {1,2,3,4,6,8}
เมื่อต้องรับมือกับเซตคุณจะไม่ต้องการให้ตัวเลข 2 และ 4 ปรากฏสองครั้งเนื่องจากองค์ประกอบอาจเป็นหรือไม่อยู่ในเซต
อย่างไรก็ตามในโลกของ SQL คุณอาจต้องการดูองค์ประกอบทั้งหมดจากทั้งสองชุดพร้อมกันใน "bag" {2,4,6,8,1,2,3,4} หนึ่งชุด และเพื่อการนี้ข้อเสนอของ T-SQL UNION ALL
ผู้ประกอบการ
UNION ALL
ไม่ใช่ "เสนอ" โดย T-SQL UNION ALL
เป็นส่วนหนึ่งของมาตรฐาน ANSI SQL และไม่เฉพาะกับ MS SQL Server
ยูเนี่ยนคำสั่งที่ใช้ในการเลือกข้อมูลที่เกี่ยวข้องจากสองตารางเหมือนคำสั่ง อย่างไรก็ตามเมื่อใช้คำสั่งคอลัมน์ที่เลือกทั้งหมดจะต้องเป็นชนิดข้อมูลเดียวกัน ด้วยจะเลือกเฉพาะค่าที่แตกต่างUNION
JOIN
UNION
UNION
ยูเนี่ยนทั้งหมดคำสั่งจะมีค่าเท่ากับคำสั่งยกเว้นว่าเลือกค่าทั้งหมดUNION ALL
UNION
UNION ALL
ความแตกต่างระหว่างUnion
และUnion all
คือUnion all
จะไม่กำจัดแถวที่ซ้ำกัน แต่จะดึงแถวทั้งหมดออกจากตารางทั้งหมดที่ตรงกับแบบสอบถามของคุณและรวมเข้ากับตาราง
UNION
คำสั่งได้อย่างมีประสิทธิภาพไม่ได้SELECT DISTINCT
ในชุดผล หากคุณรู้ว่าบันทึกทั้งหมดที่ส่งคืนนั้นไม่ซ้ำจากสหภาพของคุณให้ใช้UNION ALL
แทนมันจะให้ผลลัพธ์ที่เร็วขึ้น
ไม่แน่ใจว่ามันสำคัญกับฐานข้อมูลใด
UNION
และUNION ALL
ควรทำงานกับเซิร์ฟเวอร์ SQL ทั้งหมด
คุณควรหลีกเลี่ยงสิ่งที่ไม่จำเป็นUNION
เพราะมันทำให้ประสิทธิภาพการทำงานลดลง ตามกฎของหัวแม่มือใช้UNION ALL
หากคุณไม่แน่ใจว่าจะใช้
ยูเนี่ยน - ส่งผลให้บันทึกที่แตกต่าง
ในขณะที่
ยูเนี่ยนทั้งหมด - ส่งผลให้บันทึกทั้งหมดรวมถึงรายการที่ซ้ำกัน
ทั้งสองเป็นการปิดกั้นโอเปอเรเตอร์และด้วยเหตุนี้ฉันชอบใช้ JOINS มากกว่าการปิดกั้นโอเปอเรเตอร์ (ยูเนี่ยน, การเชื่อมต่อ, ยูเนี่ยนทั้งหมด ฯลฯ ) ได้ทุกเมื่อ
เพื่อแสดงให้เห็นว่าเหตุใดการดำเนินการของ Union จึงมีประสิทธิภาพต่ำเมื่อเปรียบเทียบกับ Union การชำระเงินทั้งหมดเป็นตัวอย่าง
CREATE TABLE #T1 (data VARCHAR(10))
INSERT INTO #T1
SELECT 'abc'
UNION ALL
SELECT 'bcd'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'def'
UNION ALL
SELECT 'efg'
CREATE TABLE #T2 (data VARCHAR(10))
INSERT INTO #T2
SELECT 'abc'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'efg'
ต่อไปนี้เป็นผลลัพธ์ของการดำเนินการ UNION ALL และ UNION
คำสั่ง UNION เลือก DISTINCT ในชุดผลลัพธ์อย่างมีประสิทธิภาพ หากคุณรู้ว่าบันทึกทั้งหมดที่ส่งคืนนั้นไม่ซ้ำกันจากสหภาพของคุณให้ใช้ UNION ALL แทนมันจะให้ผลลัพธ์ที่รวดเร็วขึ้น
การใช้ผลลัพธ์ UNION ในการดำเนินการเรียงลำดับที่แตกต่างในแผนดำเนินการ หลักฐานเพื่อพิสูจน์คำแถลงนี้แสดงอยู่ด้านล่าง:
UNION
/ UNION ALL
)
union
ใช้การรวมกันของ join
s และ s ที่น่ารังเกียจจริงๆcase
แต่มันทำให้แบบสอบถามไม่สามารถอ่านและบำรุงรักษาได้และในประสบการณ์ของฉันมันก็แย่มากสำหรับประสิทธิภาพ เปรียบเทียบ: select foo.bar from foo union select fizz.buzz from fizz
กับselect case when foo.bar is null then fizz.buzz else foo.bar end from foo join fizz where foo.bar is null or fizz.buzz is null
ยูเนี่ยนจะใช้ในการเลือกค่าที่แตกต่างจากสองตารางซึ่งเป็นยูเนี่ยนทั้งหมดจะใช้ในการเลือกค่าทั้งหมดรวมถึงการทำซ้ำจากตาราง
()
แสดงเป็นครั้งที่สอง ที่จริงแล้วในความคิดที่สองเนื่องจากunion all
ผลลัพธ์ไม่ใช่ชุดคุณไม่ควรพยายามวาดโดยใช้แผนภาพ Venn!
(จาก Microsoft SQL Server Book Online)
ยูเนี่ยน [ทั้งหมด]
ระบุว่าจะให้รวมชุดผลลัพธ์หลายชุดและส่งคืนเป็นชุดผลลัพธ์เดียว
ทั้งหมด
รวมแถวทั้งหมดไว้ในผลลัพธ์ ซึ่งรวมถึงรายการที่ซ้ำกัน หากไม่ได้ระบุแถวที่ซ้ำกันจะถูกลบออก
UNION
จะใช้เวลานานเกินไปเนื่องจากมีการใช้การค้นหาแถวที่ซ้ำกันDISTINCT
ในผลลัพธ์
SELECT * FROM Table1
UNION
SELECT * FROM Table2
เทียบเท่ากับ:
SELECT DISTINCT * FROM (
SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2) DT
ผลข้างเคียงของการใช้
DISTINCT
กับผลลัพธ์คือการดำเนินการเรียงลำดับกับผลลัพธ์
UNION ALL
ผลการค้นหาจะแสดงเป็นพลคำสั่งเกี่ยวกับผล แต่UNION
ผลจะแสดงเป็นORDER BY 1, 2, 3, ..., n (n = column number of Tables)
ประยุกต์เกี่ยวกับผล คุณสามารถเห็นผลข้างเคียงนี้เมื่อคุณไม่มีแถวที่ซ้ำกัน
ฉันเพิ่มตัวอย่าง
ยูเนี่ยนมันมีการผสานกับความแตกต่าง -> ช้าลงเพราะมันต้องทำการเปรียบเทียบ (ในนักพัฒนา Oracle SQL ให้เลือกคิวรีกด F10 เพื่อดูการวิเคราะห์ต้นทุน)
ยูเนี่ยนทั้งหมดมันรวมเข้าด้วยกัน -> เร็วขึ้น
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
และ
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
UNION
ผสานเนื้อหาของตารางที่เข้ากันได้กับโครงสร้างสองตารางให้เป็นตารางที่รวมเข้าด้วยกัน
ความแตกต่างระหว่างUNION
และUNION ALL
คือการUNION will
ละเว้นระเบียนที่ซ้ำกันในขณะที่UNION ALL
จะรวมระเบียนที่ซ้ำกัน
Union
ชุดผลลัพธ์ถูกเรียงลำดับจากน้อยไปหามากในขณะที่UNION ALL
ชุดผลลัพธ์ไม่ถูกเรียงลำดับ
UNION
ดำเนินการDISTINCT
ตามชุดผลลัพธ์เพื่อกำจัดแถวที่ซ้ำกัน ในขณะที่UNION ALL
จะไม่ลบรายการที่ซ้ำกันดังนั้นจึงเร็วกว่าUNION
*
หมายเหตุ : ประสิทธิภาพการทำงานUNION ALL
โดยทั่วไปจะดีกว่าUNION
เนื่องจากUNION
ต้องการเซิร์ฟเวอร์เพื่อทำงานเพิ่มเติมในการลบรายการที่ซ้ำกัน ดังนั้นในกรณีที่มีความแน่นอนว่าจะไม่มีการทำซ้ำใด ๆ หรือการมีรายการที่ซ้ำกันไม่ใช่ปัญหาUNION ALL
แนะนำให้ใช้ด้วยเหตุผลด้านประสิทธิภาพ
ORDER BY
เรียงลำดับผลลัพธ์ บางทีคุณอาจมีผู้จำหน่าย SQL โดยเฉพาะอย่างยิ่งในใจ (ถึงแม้ว่าจะเรียงลำดับจากน้อยไปมาก ... ?) แต่คำถามนี้ไม่มีผู้ขาย = แท็กเฉพาะ
สมมติว่าคุณมีครูและนักเรียนสองโต๊ะ
ทั้งสองมี4 คอลัมน์ที่มีชื่อแตกต่างกันเช่นนี้
Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))
Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)
คุณสามารถใช้ UNION หรือ UNION ALL สำหรับสองตารางที่มีจำนวนคอลัมน์เท่ากัน แต่พวกเขามีชื่อหรือชนิดข้อมูลที่แตกต่างกัน
เมื่อคุณใช้UNION
การดำเนินการกับ 2 ตารางมันจะไม่สนใจรายการที่ซ้ำกันทั้งหมด (ค่าคอลัมน์ทั้งหมดของแถวในตารางจะเหมือนกันกับอีกตารางหนึ่ง) แบบนี้
SELECT * FROM Student
UNION
SELECT * FROM Teacher
ผลลัพธ์จะเป็น
เมื่อคุณใช้UNION ALL
การดำเนินการกับ 2 ตารางรายการนั้นจะส่งคืนรายการทั้งหมดด้วยซ้ำ (หากมีความแตกต่างระหว่างค่าคอลัมน์ใด ๆ ของแถวใน 2 ตาราง) แบบนี้
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
ประสิทธิภาพ:
เห็นได้ชัดว่ายูเนี่ยนประสิทธิภาพทั้งหมดจะดีกว่าที่ยูเนี่ยนในขณะที่พวกเขาทำงานเพิ่มเติมเพื่อลบค่าที่ซ้ำกัน คุณสามารถตรวจสอบได้จากExecution Estimated Timeโดยกดctrl + Lที่MSSQL
UNION
เพื่อสื่อความตั้งใจ (เช่นไม่มีการซ้ำซ้อน) เพราะUNION ALL
ไม่น่าจะให้ผลการดำเนินงานในชีวิตจริงในแง่ที่แน่นอน
ในคำง่าย ๆ ความแตกต่างระหว่าง UNION และ UNION ALL คือ UNION จะละเว้นระเบียนที่ซ้ำกันในขณะที่ UNION ทั้งหมดจะรวมระเบียนที่ซ้ำกัน
อีกสิ่งหนึ่งที่ฉันอยากจะเพิ่ม -
Union : - ชุดผลลัพธ์ถูกเรียงลำดับจากน้อยไปหามาก
รวมทั้งหมด : - ชุดผลลัพธ์ไม่ถูกเรียงลำดับ เอาต์พุตเคียวรีสองรายการเพิ่งถูกต่อท้าย
UNION
จะไม่เรียงลำดับผลลัพธ์ตามลำดับจากน้อยไปหามาก การเรียงลำดับใด ๆ ที่คุณเห็นในผลลัพธ์โดยไม่ใช้order by
นั้นเป็นเรื่องบังเอิญ DBMS มีอิสระที่จะใช้กลยุทธ์ใด ๆ ที่คิดว่ามีประสิทธิภาพในการลบข้อมูลที่ซ้ำกัน นี่อาจเป็นการเรียงลำดับ แต่อาจเป็นอัลกอริทึมการแฮชหรือสิ่งที่แตกต่างอย่างสิ้นเชิง - และกลยุทธ์จะเปลี่ยนตามจำนวนแถว A union
ที่ปรากฏเรียงด้วย 100 แถวอาจไม่เท่ากับ 100.000 แถว
ORDER BY
ประโยคที่เหมาะสม
ความแตกต่างระหว่าง Union Vs Union ทั้งหมดใน SQL
Union ใน SQL คืออะไร
ตัวดำเนินการ UNION ใช้เพื่อรวมชุดผลลัพธ์ของชุดข้อมูลสองชุดขึ้นไป
Each SELECT statement within UNION must have the same number of columns
The columns must also have similar data types
The columns in each SELECT statement must also be in the same order
สิ่งสำคัญ! ความแตกต่างระหว่าง Oracle และ Mysql: สมมุติว่า t1 t2 ไม่มีแถวที่ซ้ำกัน แต่มีแถวที่ซ้ำกัน ตัวอย่าง: t1 มียอดขายตั้งแต่ 2017 และ t2 จาก 2018
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION ALL
SELECT T2.YEAR, T2.PRODUCT FROM T2
ใน ORACLE UNION ALL ดึงข้อมูลแถวทั้งหมดจากทั้งสองตาราง เช่นเดียวกันจะเกิดขึ้นใน MySQL
อย่างไรก็ตาม:
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION
SELECT T2.YEAR, T2.PRODUCT FROM T2
ในORACLE UNION ดึงข้อมูลแถวทั้งหมดจากทั้งสองตารางเนื่องจากไม่มีค่าซ้ำกันระหว่าง t1 และ t2 ในอีกทางหนึ่งในMySQLชุดผลลัพธ์จะมีแถวที่น้อยลงเพราะจะมีแถวที่ซ้ำกันภายในตาราง t1 และอยู่ในตาราง t2 ด้วย!
UNION จะลบระเบียนที่ซ้ำกันในทางกลับกัน UNION ALL ไม่ได้ทำ แต่เราต้องตรวจสอบข้อมูลจำนวนมากที่จะถูกประมวลผลและคอลัมน์และประเภทข้อมูลจะต้องเหมือนกัน
เนื่องจากการรวมกันภายในใช้พฤติกรรม "ชัดเจน" เพื่อเลือกแถวดังนั้นจึงมีค่าใช้จ่ายมากขึ้นในแง่ของเวลาและประสิทธิภาพ ชอบ
select project_id from t_project
union
select project_id from t_project_contact
มันทำให้ฉันมีบันทึกปี 2020
ในทางกลับกัน
select project_id from t_project
union all
select project_id from t_project_contact
ให้แถวมากกว่า 17402
ทั้งสองมีความสำคัญเท่ากัน
หากไม่มีไม่ORDER BY
a UNION ALL
อาจนำแถวกลับมาในขณะที่ a UNION
จะทำให้คุณรอจนกว่าจะถึงจุดสิ้นสุดของแบบสอบถามก่อนที่จะให้ผลลัพธ์ทั้งหมดพร้อมกัน สิ่งนี้สามารถสร้างความแตกต่างในสถานการณ์การหมดเวลา - a UNION ALL
ทำให้การเชื่อมต่อยังคงอยู่เหมือนเดิม
ดังนั้นหากคุณมีปัญหาการหมดเวลาและไม่มีการเรียงลำดับและการซ้ำซ้อนไม่ใช่ปัญหาUNION ALL
อาจมีประโยชน์มากกว่า
UNION และ UNION ALL ใช้เพื่อรวมผลลัพธ์แบบสอบถามสองรายการขึ้นไป
คำสั่ง UNION เลือกข้อมูลที่แตกต่างและเกี่ยวข้องจากสองตารางซึ่งจะกำจัดแถวที่ซ้ำกัน
ในทางกลับกันคำสั่ง UNION ALL จะเลือกค่าทั้งหมดจากทั้งสองตารางซึ่งจะแสดงแถวทั้งหมด
เป็นนิสัยให้ใช้ UNION ALLเสมอ ใช้ยูเนี่ยนเฉพาะในกรณีพิเศษเมื่อคุณต้องการกำจัดรายการที่ซ้ำกันซึ่งอาจยุ่งมากและคุณสามารถอ่านทั้งหมดเกี่ยวกับความคิดเห็นอื่น ๆ ได้ที่นี่
UNION ALL
ยังทำงานกับชนิดข้อมูลเพิ่มเติมเช่นกัน ตัวอย่างเช่นเมื่อพยายามสหภาพประเภทข้อมูลเชิงพื้นที่ ตัวอย่างเช่น:
select a.SHAPE from tableA a
union
select b.SHAPE from tableB b
จะโยน
The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.
อย่างไรก็ตามunion all
จะไม่
ข้อแตกต่างคือ:
"UNION" ลบแถวที่ซ้ำกัน
"UNION ALL" ไม่ได้ลบแถวที่ซ้ำกัน