În SQL , operatorul UNION este folosit pentru a uni două seturi de rânduri returnate de interogări SQL. Ambele interogări trebuie să returneze același număr de coloane, iar coloanele cu același ordinal trebuie să aibă tipuri de date compatibile . Rezultatul primește structura (nume și tipuri de coloane) a primei interogări (stânga), adică operația nu este simetrică.
Când se combină mai multe interogări într-un rând, rezultatul este calculat secvenţial de la stânga la dreapta.
Acest operator a fost descris în primul standard SQL - SQL/89 [1] .
Operatorul este specificat între cereri. Într-o formă simplificată, arată astfel:
< interogare 1 > UNION [ ALL ] < interogare 2 > UNION [ ALL ] < interogare 3 > .....;În mod implicit, orice intrări duplicate sunt ascunse automat, cu excepția cazului în care se utilizează expresia UNION ALL.
Trebuie remarcat faptul că UNIONîn sine nu garantează ordinea rândurilor. Rândurile din a doua interogare pot apărea la început, la sfârșit sau chiar se pot amesteca cu liniile din prima interogare. În cazurile în care este necesară o anumită comandă, trebuie folosită o expresie ORDER BY.
Există două reguli principale care guvernează utilizarea operatorului UNION:
Tipurile de date ale coloanelor din care sunt preluate datele în interogările combinate nu trebuie să fie exact aceleași, dar trebuie să fie compatibile prin conversie implicită. Dacă tipurile de date diferă, atunci tipul de date rezultat este determinat pe baza regulilor de prioritate a tipurilor de date (pentru un anumit SGBD). Dacă tipurile se potrivesc, dar diferă ca precizie, scară sau lungime, rezultatul este determinat pe baza regulilor utilizate pentru combinarea expresiilor (pentru un anumit SGBD) [2] . Tipurile non-ANSI, cum ar fi DATA și BINARY, ar trebui să se potrivească în mod normal cu alte coloane de același tip non-standard [3] .
În Microsoft SQL Server , coloanele de tip de date XML trebuie să fie echivalente. Toate coloanele trebuie fie să aibă un tip definit în schema XML, fie să fie netipizate. Coloanele tastate trebuie să se refere la aceeași colecție de scheme XML [2] .
O altă constrângere de compatibilitate este de a interzice valorile nule (NULL) în orice coloană de îmbinare, iar aceste valori trebuie, de asemenea, să fie interzise pentru toate coloanele corespunzătoare din alte interogări de îmbinare, deoarece valorile nule (NULL) sunt interzise cu NOT NULL. constrângere. De asemenea, nu puteți folosi UNION în subinterogări și nu puteți utiliza funcții agregate în clauza SELECT a unei interogări într-o uniune (cu toate acestea, majoritatea SGBD-uri ignoră aceste restricții) [3] .
UNIONpoate fi foarte util în aplicațiile de depozitare a datelor unde tabelele sunt rareori perfect normalizate . Un exemplu simplu: există tabele în baza de date sales2005și sales2006, care au o structură identică, dar sunt separate de dragul performanței. O interogare de cuvinte UNIONvă permite să combinați rezultatele din ambele tabele.
De asemenea, este de remarcat faptul că UNION ALLfuncționează mai rapid decât doar UNION, deoarece în mod implicit, atunci când se folosește operatorul, UNIONse efectuează eliminarea suplimentară a duplicatelor, dar când se folosește UNION ALL, nu este [4] .
Sunt date două tabele:
persoană | Cantitate |
---|---|
Ivan | 1000 |
Alexei | 2000 |
Serghei | 5000 |
persoană | Cantitate |
---|---|
Ivan | 2000 |
Alexei | 2000 |
Petru | 35000 |
Când executați următoarea interogare:
( SELECT * FROM vânzări2005 ) UNION ( SELECT * FROM vânzări2006 );se obține un set de rezultate, dar ordinea rândurilor se poate schimba arbitrar deoarece expresia cheie ORDER BYnu a fost folosită:
persoană | Cantitate |
---|---|
Ivan | 1000 |
Alexei | 2000 |
Ivan | 2000 |
Serghei | 5000 |
Petru | 35000 |
Ca urmare, vor fi afișate două rânduri cu Ivan, deoarece aceste rânduri diferă în valorile din coloane. Dar, în același timp, există un singur rând cu Alexey în rezultat, deoarece valorile din coloane se potrivesc complet.
Aplicarea UNION ALLdă un rezultat diferit, deoarece duplicatele nu sunt ascunse. Executarea unei cereri:
( SELECT * FROM sales2005 ) UNION ALL ( SELECT * FROM sales2006 );va da următorul rezultat, afișat fără ordonare din cauza absenței expresiei ORDER BY:
persoană | Cantitate |
---|---|
Ivan | 1000 |
Ivan | 2000 |
Alexei | 2000 |
Alexei | 2000 |
Serghei | 5000 |
Petru | 35000 |
În mod similar, este posibil să se alăture două interogări diferite din același tabel (deși, în schimb, de regulă, parametrii necesari sunt combinați într-o singură interogare folosind cuvintele cheie AND și OR din clauza WHERE):
( SELECT person , amount FROM sales2005 WHERE suma = 1000 ) UNION ( SELECT person , amount FROM sales2005 WHERE persoana ca 'Sergey' );Rezultatul va fi:
persoană | Cantitate |
---|---|
Ivan | 1000 |
Serghei | 5000 |
Puteți , de UNIONasemenea, să creați îmbinări exterioare complete cu acesta (folosit uneori când nu există suport direct încorporat pentru îmbinările exterioare):
( SELECT * FROM angajat LEFT JOIN departament ON angajat . DepartmentID = departament . DepartmentID ) UNION ( SELECT * FROM angajat RIGHT JOIN departament ON angajat . DepartmentID = departament . DepartmentID );Dar, în același timp, trebuie amintit că acesta nu este încă același lucru cu operatorul JOIN.
Punctul 4 - legătură nefuncțională (începând cu 11.08.2012)
SQL | |
---|---|
Versiuni |
|
Cuvinte cheie | |
Articole similare | |
Părți ale ISO/IEC SQL |
|
Bază de date | |
---|---|
Concepte |
|
Obiecte |
|
Chei | |
SQL |
|
Componente |