อะไรคือความแตกต่างระหว่าง UNION และ UNION ALL?


คำตอบ:


1734

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)

179
ความหมายของสิ่งนี้คือสหภาพนั้นมีประสิทธิภาพน้อยกว่าเนื่องจากต้องสแกนผลลัพธ์สำหรับการทำซ้ำ
Matthew Watson

19
ยูเนี่ยนทั้งหมดจะเป็นนักแสดงมากขึ้นโดยเฉพาะอย่างยิ่งเนื่องจากการขาดการเรียงลำดับที่ชัดเจน การปฏิบัติทั่วไปของฉันคือการใช้ยูเนี่ยนทั้งหมดยกเว้นว่าฉันต้องการทำซ้ำโดยเฉพาะ
Adam Caviness

6
เพิ่งสังเกตเห็นว่ามีจำนวนมากที่มีความคิดเห็นที่ดี / คำตอบที่นี่ดังนั้นผมเปิดธงวิกิพีเดียและเพิ่มหมายเหตุเกี่ยวกับประสิทธิภาพการทำงาน ...
จิมฮาร์ท

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

23
@ AdamCaviness ความคิดเห็นของคุณไม่สมเหตุสมผลนัก
kojow7

285

ทั้ง UNION และ UNION ทั้งหมดเชื่อมต่อผลลัพธ์ของ SQL ที่ต่างกันสองตัว พวกเขาแตกต่างกันในวิธีที่พวกเขาจัดการรายการที่ซ้ำกัน

  • UNION ดำเนินการ DISTINCT บนชุดผลลัพธ์ขจัดแถวที่ซ้ำกัน

  • ยูเนี่ยนทั้งหมดไม่ได้ลบสิ่งที่ซ้ำกันดังนั้นจึงเร็วกว่ายูเนี่ยน

หมายเหตุ:ในขณะที่ใช้คำสั่งนี้คอลัมน์ที่เลือกทั้งหมดจะต้องเป็นชนิดข้อมูลเดียวกัน

ตัวอย่าง: ถ้าเรามีสองตาราง 1) พนักงานและ 2) ลูกค้า

  1. ข้อมูลตารางพนักงาน:

ป้อนคำอธิบายรูปภาพที่นี่

  1. ข้อมูลตารางลูกค้า:

ป้อนคำอธิบายรูปภาพที่นี่

  1. ตัวอย่างยูเนี่ยน (มันจะลบบันทึกที่ซ้ำกันทั้งหมด):

ป้อนคำอธิบายรูปภาพที่นี่

  1. ตัวอย่างยูเนี่ยนทั้งหมด (มันเป็นเพียงการเชื่อมโยงระเบียนไม่กำจัดรายการที่ซ้ำกันดังนั้นจึงเร็วกว่า UNION):

ป้อนคำอธิบายรูปภาพที่นี่


3
"คอลัมน์ที่เลือกทั้งหมดจะต้องเป็นประเภทข้อมูลเดียวกัน" - จริงๆแล้วสิ่งต่าง ๆ นั้นไม่เข้มงวดนัก (ไม่ใช่สิ่งที่ดีจากมุมมองโมเดลเชิงสัมพันธ์!) มาตรฐาน SQL บอกว่าตัวบอกคอลัมน์ที่เกี่ยวข้องนั้นต้องเหมือนกันยกเว้นในชื่อ
oneday

47

UNIONลบรายการที่ซ้ำกันในขณะที่UNION ALLไม่

เพื่อที่จะลบซ้ำชุดผลจะต้องมีการจัดเรียงและนี้อาจจะมีผลกระทบต่อประสิทธิภาพการทำงานของยูเนี่ยนขึ้นอยู่กับปริมาณของข้อมูลที่ถูกเรียงและการตั้งค่าของพารามิเตอร์ RDBMS ต่างๆ (สำหรับออราเคิลPGA_AGGREGATE_TARGETด้วยWORKAREA_SIZE_POLICY=AUTOหรือSORT_AREA_SIZEและSOR_AREA_RETAINED_SIZEถ้าWORKAREA_SIZE_POLICY=MANUAL)

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

แน่นอนถ้าคุณต้องการข้อมูลที่ส่งคืนโดยไม่ซ้ำกันคุณต้องใช้ UNION ขึ้นอยู่กับแหล่งที่มาของข้อมูลของคุณ

ฉันจะแสดงความคิดเห็นในโพสต์แรกเพื่อให้ความเห็น "มีประสิทธิภาพน้อยกว่า" ความคิดเห็น แต่มีชื่อเสียงไม่เพียงพอ (คะแนน) ที่จะทำ


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

2
จะจัดเรียงผลลัพธ์ที่ชัดเจน "โดยนัย" เนื่องจากการลบรายการที่ซ้ำกันออกจะเร็วกว่าในชุดที่จัดเรียง นี่ไม่ได้หมายความว่าชุดผลลัพธ์ที่ส่งคืนจะถูกจัดเรียงในลักษณะนั้นจริง ๆ แต่ในกรณีส่วนใหญ่จะแตกต่างกัน (และดังนั้น UNION) จะเรียงลำดับชุดผลลัพธ์ภายใน
DevilSuichiro


21

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

จากhttp://zengin.wordpress.com/2007/07/31/union-vs-union-all/


13

คุณสามารถหลีกเลี่ยงการซ้ำซ้อนและยังทำงานได้เร็วกว่า UNION DISTINCT (ซึ่งเหมือนกับ UNION) โดยการเรียกใช้คิวรีดังนี้

SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X

สังเกตAND a!=Xส่วนที่ นี่เร็วกว่ายูเนี่ยนแล้ว


4
สิ่งนี้จะละเว้นแถวและดังนั้นจึงไม่สามารถสร้างผลลัพธ์ที่คาดหวังได้ถ้า a มีค่า NULL นอกจากนี้มันยังไม่ส่งกลับผลลัพธ์เดียวกับUNION- UNIONยังลบรายการซ้ำที่ส่งคืนโดยแบบสอบถามย่อยในขณะที่วิธีการของคุณจะไม่
Frank Schmitt

@ FrankSchmitt - ขอบคุณสำหรับคำตอบนี้ บิตเกี่ยวกับแบบสอบถามย่อยนี้เป็นสิ่งที่ฉันอยากรู้!
Doradus

11

เพียงเพื่อเพิ่มสองเซ็นต์ของฉันในการสนทนาที่นี่: หนึ่งสามารถเข้าใจ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ผู้ประกอบการ


2
Nitpick: UNION ALLไม่ใช่ "เสนอ" โดย T-SQL UNION ALLเป็นส่วนหนึ่งของมาตรฐาน ANSI SQL และไม่เฉพาะกับ MS SQL Server
Frank Schmitt

1
ความคิดเห็น 'Nitpick' อาจหมายความว่าคุณไม่สามารถใช้ "Union All" ใน TSQL แต่คุณสามารถทำได้ แน่นอนความคิดเห็นไม่ได้พูดอย่างนั้น แต่มีคนอ่านมันอาจอนุมานมัน
JosephDoggie

10

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

ยูเนี่ยนทั้งหมดคำสั่งจะมีค่าเท่ากับคำสั่งยกเว้นว่าเลือกค่าทั้งหมด
UNION ALLUNIONUNION ALL

ความแตกต่างระหว่างUnionและUnion allคือUnion allจะไม่กำจัดแถวที่ซ้ำกัน แต่จะดึงแถวทั้งหมดออกจากตารางทั้งหมดที่ตรงกับแบบสอบถามของคุณและรวมเข้ากับตาราง

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


8

ไม่แน่ใจว่ามันสำคัญกับฐานข้อมูลใด

UNIONและUNION ALLควรทำงานกับเซิร์ฟเวอร์ SQL ทั้งหมด

คุณควรหลีกเลี่ยงสิ่งที่ไม่จำเป็นUNIONเพราะมันทำให้ประสิทธิภาพการทำงานลดลง ตามกฎของหัวแม่มือใช้UNION ALLหากคุณไม่แน่ใจว่าจะใช้


ไม่มีแท็ก SQL Server สำหรับคำถามนี้ ฉันคิดว่าตัวเลือกที่ให้ผลตอบแทนซ้ำกันเพียงเพราะปกติดีที่สุดคือคำแนะนำที่ผิด
oneday

1
@oneday เมื่อฉันเดาว่า OP ใช้วลี "SQL Servers" เป็นคำพ้องสำหรับ RDBMSs ทั้งหมด (เช่น MySQL, PostGreSQL, Oracle, SQL Server) ถ้อยคำนั้นช่างโชคร้าย (และแน่นอนฉันอาจเข้าใจผิด)
Frank Schmitt

@FrankSchmitt: ไม่มีผลิตภัณฑ์ใด ๆ ที่คุณอยู่ในรายการเป็น RDBMSs อย่างแท้จริง :)
oneday

1
@oneday เมื่อไหร่ที่ต้องอธิบายรายละเอียด? อย่างน้อยen.wikipedia.org/wiki/Relational_database_management_systemดูเหมือนว่าจะเห็นด้วยกับฉัน - กล่าวถึง Microsoft SQL Server, Oracle Database และ MySQL อย่างชัดเจน หรือคุณกำลังพูดถึงความแตกต่างระหว่าง Oracle กับ Oracle Database เช่น?
Frank Schmitt

8

ยูเนี่ยน - ส่งผลให้บันทึกที่แตกต่าง

ในขณะที่

ยูเนี่ยนทั้งหมด - ส่งผลให้บันทึกทั้งหมดรวมถึงรายการที่ซ้ำกัน

ทั้งสองเป็นการปิดกั้นโอเปอเรเตอร์และด้วยเหตุนี้ฉันชอบใช้ 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 ในการดำเนินการเรียงลำดับที่แตกต่างในแผนดำเนินการ หลักฐานเพื่อพิสูจน์คำแถลงนี้แสดงอยู่ด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่


3
ทุกอย่างในคำตอบนี้ได้รับการพูดไปแล้วมีความสับสนเกินกว่าจะมีประโยชน์ (แนะนำให้รวมกับสหภาพเมื่อพวกเขาทำสิ่งต่าง ๆ ให้ "บล็อก" เป็นเหตุผลโดยไม่อธิบายว่าคุณหมายถึงอะไรหรือเซิร์ฟเวอร์ฐานข้อมูลใดที่ใช้) มีความเข้าใจผิดสูง (เปอร์เซ็นต์ของคุณในภาพหน้าจอของคุณไม่สามารถใช้ได้กับการใช้งานจริงUNION/ UNION ALL)

ตัวดำเนินการบล็อกเป็นตัวดำเนินการที่รู้จักกันดีใน TSQL ทุกอย่างที่ผู้ประกอบการปิดกั้นสามารถทำได้โดยการเข้าร่วม แต่ไม่ใช่ในทางกลับกัน การเรียงลำดับที่แตกต่างจะวนเป็นวงกลมในภาพเพื่อแสดงว่าทำไมการรวมกันทั้งหมดจึงทำงานได้ดีกว่าการรวมกันและเพื่อแสดงให้เห็นอย่างชัดเจนว่ามันอยู่ตรงไหนในแผนปฏิบัติการ อย่าลังเลที่จะเพิ่มข้อมูลลงในตาราง T1 และ T2 เพื่อเล่นกับเปอร์เซ็นต์!
DBA

ในทางเทคนิคคุณสามารถสร้างผลลัพธ์ของการunionใช้การรวมกันของ joins และ 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
Devin Lamothe

@DBA คำตอบของคุณเกี่ยวข้องกับผู้ใช้ MS SQL Server เท่านั้น OP ไม่เคยกล่าวถึง RDBMS ที่พวกเขากำลังใช้ - พวกเขาอาจใช้ MySQL, PostgreSQL, Oracle, SQLite, ...
Frank Schmitt

6

ยูเนี่ยนจะใช้ในการเลือกค่าที่แตกต่างจากสองตารางซึ่งเป็นยูเนี่ยนทั้งหมดจะใช้ในการเลือกค่าทั้งหมดรวมถึงการทำซ้ำจากตาราง


6

เป็นการดีที่จะเข้าใจด้วย Venn diagramm

นี่คือลิงค์ไปยังแหล่งที่มา มีคำอธิบายที่ดี

ป้อนคำอธิบายรูปภาพที่นี่


5
ภาพที่สองของคุณแสดงให้เห็นว่าทั้งสองมีความพิเศษร่วมกันเมื่อพวกเขาไม่ได้ รูปภาพควรแสดงแบบเดียวกันกับภาพแรก แต่ด้วย 'เครื่องหมายจุดตัด' ()แสดงเป็นครั้งที่สอง ที่จริงแล้วในความคิดที่สองเนื่องจากunion allผลลัพธ์ไม่ใช่ชุดคุณไม่ควรพยายามวาดโดยใช้แผนภาพ Venn!
oneday

5

(จาก 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)ประยุกต์เกี่ยวกับผล คุณสามารถเห็นผลข้างเคียงนี้เมื่อคุณไม่มีแถวที่ซ้ำกัน


5

ฉันเพิ่มตัวอย่าง

ยูเนี่ยนมันมีการผสานกับความแตกต่าง -> ช้าลงเพราะมันต้องทำการเปรียบเทียบ (ในนักพัฒนา 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;

2

UNION ผสานเนื้อหาของตารางที่เข้ากันได้กับโครงสร้างสองตารางให้เป็นตารางที่รวมเข้าด้วยกัน

  • ความแตกต่าง:

ความแตกต่างระหว่างUNIONและUNION ALLคือการUNION willละเว้นระเบียนที่ซ้ำกันในขณะที่UNION ALLจะรวมระเบียนที่ซ้ำกัน

Unionชุดผลลัพธ์ถูกเรียงลำดับจากน้อยไปหามากในขณะที่UNION ALLชุดผลลัพธ์ไม่ถูกเรียงลำดับ

UNIONดำเนินการDISTINCTตามชุดผลลัพธ์เพื่อกำจัดแถวที่ซ้ำกัน ในขณะที่UNION ALLจะไม่ลบรายการที่ซ้ำกันดังนั้นจึงเร็วกว่าUNION*

หมายเหตุ : ประสิทธิภาพการทำงานUNION ALLโดยทั่วไปจะดีกว่าUNIONเนื่องจากUNIONต้องการเซิร์ฟเวอร์เพื่อทำงานเพิ่มเติมในการลบรายการที่ซ้ำกัน ดังนั้นในกรณีที่มีความแน่นอนว่าจะไม่มีการทำซ้ำใด ๆ หรือการมีรายการที่ซ้ำกันไม่ใช่ปัญหาUNION ALLแนะนำให้ใช้ด้วยเหตุผลด้านประสิทธิภาพ


1
"ชุดผลลัพธ์ของสหภาพถูกเรียงลำดับจากน้อยไปหามาก" - หากไม่มีจะไม่มีการORDER BYเรียงลำดับผลลัพธ์ บางทีคุณอาจมีผู้จำหน่าย SQL โดยเฉพาะอย่างยิ่งในใจ (ถึงแม้ว่าจะเรียงลำดับจากน้อยไปมาก ... ?) แต่คำถามนี้ไม่มีผู้ขาย = แท็กเฉพาะ
oneday

"ผสานเนื้อหาของสองตารางที่เข้ากันได้กับโครงสร้าง" - ฉันคิดว่าคุณได้กล่าวถึงส่วนนี้เป็นอย่างดี :)
onedaywhen

2

สมมติว่าคุณมีครูและนักเรียนสองโต๊ะ

ทั้งสองมี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ไม่น่าจะให้ผลการดำเนินงานในชีวิตจริงในแง่ที่แน่นอน
oneday

2

ในคำง่าย ๆ ความแตกต่างระหว่าง UNION และ UNION ALL คือ UNION จะละเว้นระเบียนที่ซ้ำกันในขณะที่ UNION ทั้งหมดจะรวมระเบียนที่ซ้ำกัน


1

อีกสิ่งหนึ่งที่ฉันอยากจะเพิ่ม -

Union : - ชุดผลลัพธ์ถูกเรียงลำดับจากน้อยไปหามาก

รวมทั้งหมด : - ชุดผลลัพธ์ไม่ถูกเรียงลำดับ เอาต์พุตเคียวรีสองรายการเพิ่งถูกต่อท้าย


จริง! ยูเนี่ยนอาจเปลี่ยนลำดับของผลลัพธ์ย่อยสองรายการ
gracchus

6
นี่เป็นสิ่งที่ผิด A UNIONจะไม่เรียงลำดับผลลัพธ์ตามลำดับจากน้อยไปหามาก การเรียงลำดับใด ๆ ที่คุณเห็นในผลลัพธ์โดยไม่ใช้order byนั้นเป็นเรื่องบังเอิญ DBMS มีอิสระที่จะใช้กลยุทธ์ใด ๆ ที่คิดว่ามีประสิทธิภาพในการลบข้อมูลที่ซ้ำกัน นี่อาจเป็นการเรียงลำดับ แต่อาจเป็นอัลกอริทึมการแฮชหรือสิ่งที่แตกต่างอย่างสิ้นเชิง - และกลยุทธ์จะเปลี่ยนตามจำนวนแถว A unionที่ปรากฏเรียงด้วย 100 แถวอาจไม่เท่ากับ 100.000 แถว
a_horse_with_no_name

2
โดยไม่มีส่วนคำสั่ง ORDER BY บนเคียวรี RDBMS มีอิสระที่จะส่งคืนแถวในลำดับใดก็ได้ การสังเกตว่าชุดผลลัพธ์จากการดำเนินการของ UNION จะถูกส่งคืน "ตามลำดับจากน้อยไปหามาก" เป็นผลพลอยได้จากการดำเนินการ "เรียงลำดับเฉพาะ" ที่ดำเนินการโดยฐานข้อมูล ไม่รับประกันพฤติกรรมที่สังเกตได้ ดังนั้นอย่าพึ่งพามัน ถ้าข้อมูลจำเพาะคือส่งคืนแถวตามลำดับเฉพาะให้เพิ่มORDER BYประโยคที่เหมาะสม
spencer7593

1

ความแตกต่างระหว่าง 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

ยูเนี่ยน Vs ยูเนี่ยนทั้งหมดด้วยตัวอย่าง


1

สิ่งสำคัญ! ความแตกต่างระหว่าง 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 ด้วย!


0

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

ทั้งสองมีความสำคัญเท่ากัน


0

หากไม่มีไม่ORDER BYa UNION ALLอาจนำแถวกลับมาในขณะที่ a UNIONจะทำให้คุณรอจนกว่าจะถึงจุดสิ้นสุดของแบบสอบถามก่อนที่จะให้ผลลัพธ์ทั้งหมดพร้อมกัน สิ่งนี้สามารถสร้างความแตกต่างในสถานการณ์การหมดเวลา - a UNION ALLทำให้การเชื่อมต่อยังคงอยู่เหมือนเดิม

ดังนั้นหากคุณมีปัญหาการหมดเวลาและไม่มีการเรียงลำดับและการซ้ำซ้อนไม่ใช่ปัญหาUNION ALLอาจมีประโยชน์มากกว่า


แต่ผลลัพธ์แรกของคุณอาจเป็นหนึ่งแถวซ้ำหลายครั้ง: มีประโยชน์อย่างไร!
oneday

0

UNION และ UNION ALL ใช้เพื่อรวมผลลัพธ์แบบสอบถามสองรายการขึ้นไป

คำสั่ง UNION เลือกข้อมูลที่แตกต่างและเกี่ยวข้องจากสองตารางซึ่งจะกำจัดแถวที่ซ้ำกัน

ในทางกลับกันคำสั่ง UNION ALL จะเลือกค่าทั้งหมดจากทั้งสองตารางซึ่งจะแสดงแถวทั้งหมด


0

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


0

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จะไม่


-1

ข้อแตกต่างคือ:

"UNION" ลบแถวที่ซ้ำกัน

"UNION ALL" ไม่ได้ลบแถวที่ซ้ำกัน


13
สิ่งนี้จะเพิ่มคุณค่าใด ๆ เมื่อเทียบกับคำตอบที่ยอมรับได้อย่างไร
Nick

@Nick มันเป็นคำตอบที่สั้นกว่า
Mostafa Vatanpour

ตัวย่ออาจเป็นข้อได้เปรียบถ้าคุณต้องอ่านส่วนสำคัญของคำตอบที่ยอมรับเพื่อรับข้อมูลนี้ แต่ในกรณีนี้คำตอบที่ได้รับการยอมรับจะมีข้อมูลทั้งหมดนี้ในประโยคแรกหลังจากนั้นจะทำการอภิปรายถึงความหมายของความแตกต่างในรายละเอียด
dmckee --- ผู้ดูแลอดีตลูกแมว
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.