Sariți la conținutul principal

Operatori de mulțimi în SQL: un ghid cuprinzător

Stăpânește operatorii de mulțimi în SQL: UNION, UNION ALL, INTERSECT și EXCEPT. Învață regulile de sintaxă, vezi exemple practice și înțelege când să folosești fiecare operator.
Actualizat 2 iun. 2026  · 11 min. citire

Operațiile pe mulțimi stau la baza SQL și ne permit să combinăm, comparăm și filtrăm date din surse multiple. Aceste operații sunt indispensabile pentru sarcini care variază de la integrarea și curățarea datelor până la analize avansate și raportare.

În acest tutorial, vom învăța ce sunt operatorii de mulțimi, cum sunt folosiți în SQL, aplicațiile lor practice și altele! Dacă cauți o resursă completă pentru învățarea SQL, aruncă o privire la acest parcurs de competențe cu șapte cursuri: SQL Fundamentals.

Pentru cei grăbiți, să începem cu un răspuns foarte scurt despre ce sunt operațiile pe mulțimi în SQL.

Ce sunt operațiile pe mulțimi în SQL?

Operațiile pe mulțimi în SQL sunt tehnici pentru a combina sau compara rezultatele a două sau mai multe instrucțiuni SELECT. Acționează ca operațiile matematice pe mulțimi, permițându-ne să găsim reuniunea, intersecția sau diferența dintre rândurile returnate de interogările noastre. Acest lucru le face indispensabile când analizăm date din surse sau perspective multiple.

Iată o privire rapidă asupra operațiilor de bază pe mulțimi:

  • UNION: Unește toate rândurile unice din două sau mai multe instrucțiuni SELECT, eliminând duplicatele.

  • UNION ALL: Unește toate rândurile din două sau mai multe instrucțiuni SELECT, păstrând duplicatele.

  • INTERSECT: Returnează doar rândurile care apar în ambele instrucțiuni SELECT.

  • EXCEPT: Returnează rândurile din prima instrucțiune SELECT care nu apar în a doua.

Comparație cu operațiile din algebra relațională

Algebra relațională este un cadru teoretic ce oferă fundația pentru înțelegerea interogărilor de baze de date. Oferă operații abstracte precum proiecția, selecția și join-ul, ancorate în principii matematice și independente de sisteme specifice de baze de date. Gândește-te la ea ca la logica „din culise” care alimentează interacțiunile noastre cu baza de date.

Operatorii de mulțimi în SQL oferă o implementare practică a acestor concepte într-un mediu de bază de date. Ei ne permit să efectuăm direct pe seturile de rezultate operații precum reuniunea, intersecția și diferența.

În timp ce algebra relațională oferă o fundație formală pentru operațiile pe baze de date, operatorii de mulțimi în SQL oferă o interfață standardizată și ușor de folosit pentru sarcini de manipulare a datelor.

Înțelegerea relației dintre operatorii de mulțimi și operațiile din algebra relațională oferă perspective asupra fundamentelor teoretice ale SQL. Cunoașterea acestei legături te ajută să scrii interogări cu un model mental mai clar despre ce se întâmplă „sub capotă”.

Tipuri de operatori de mulțimi în SQL

Există trei operatori principali de mulțimi în SQL:

  • UNION

  • INTERSECT

  • EXCEPT (sau MINUS în unele dialecte)

Acești operatori corespund matematic conceptelor de reuniune, intersecție și diferență de mulțimi.

Reguli pentru folosirea operatorilor de mulțimi

Înainte de a combina interogări cu operatori de mulțimi, trebuie îndeplinite patru cerințe. Dacă ratezi oricare dintre ele, interogarea va returna eroare.

  • Același număr de coloane: Fiecare SELECT trebuie să returneze același număr de coloane. Dacă o interogare returnează trei și alta două, baza de date va arunca o eroare.

  • Tipuri de date compatibile: Coloanele corespunzătoare trebuie să aibă tipuri care se potrivesc. Nu poți combina o coloană VARCHAR cu nume cu un INTEGER ID în aceeași poziție.

  • Aceeași ordine a coloanelor: SQL mapează coloanele după poziție, nu după nume. Prima coloană din prima interogare se mapează la prima coloană din a doua, indiferent cum se numesc acele coloane.

  • ORDER BY doar la final: ORDER BY trebuie să apară o singură dată, la finalul întregii interogări combinate. Nu îl poți folosi în interiorul instrucțiunilor individuale SELECT.

Încă un detaliu: numele coloanelor din output vin din prima instrucțiune SELECT. Aliasurile din interogările ulterioare sunt ignorate, așa că adaugă aliasuri doar în prima interogare dacă ai nevoie de nume personalizate în rezultat.

Cum folosești operatorul UNION în SQL

Operatorul UNION combină rezultatele a două sau mai multe interogări SELECT într-un singur set de rezultate, eliminând implicit rândurile duplicate.

De exemplu, să presupunem că avem două tabele, employees și contractors, fiecare cu coloane similare precum contractors, department și salary. Pentru învățare, să luăm în considerare aceste două tabele de exemplu:

employees:

name

department

salary

Alice

Marketing

65000

Bob

Sales

70000

Carol

Engineering

80000

John

HR

55000

contractors:

name

department

salary

David

Marketing

60000

Eva

Sales

68000

Carol

Engineering

75000

Putem combina rezultatele din ambele tabele folosind următoarea comandă:

-- Using UNION to combine all employees and contractors
SELECT name, department, salary FROM employees
UNION
SELECT name, department, salary FROM contractors;

Această interogare selectează coloanele name, department și salary din tabelele employees și contractors și le combină într-un singur set de rezultate. Operatorul UNION elimină automat rândurile duplicate din rezultatul final.

name

department

salary

Alice

Marketing

65000

Bob

Sales

70000

Carol

Engineering

80000

John

HR

55000

David

Marketing

60000

Eva

Sales

68000

Observă că Carol, care apare în ambele tabele, este listată o singură dată în rezultat. Dacă am vrea să păstrăm ambele instanțe ale lui Carol (cu salariile ei diferite), am folosi UNION ALL.

UNION vs UNION ALL

Operatorul UNION nu elimină valorile NULL. Dacă o coloană conține valori NULL într-un set de rezultate și valori non-NULL în coloana corespunzătoare din alt set de rezultate, valorile NULL vor fi păstrate în setul final produs de operatorul UNION.

Dacă vrem să includem valorile NULL în setul de rezultate și să prevenim eliminarea lor de către operatorul UNION, putem folosi în schimb operatorul UNION ALL. Acest operator combină rezultatele mai multor interogări SELECT, incluzând toate rândurile din fiecare set de rezultate, indiferent dacă sunt duplicate sau conțin valori NULL.

Cum folosești operatorul INTERSECT în SQL

Operatorul INTERSECT returnează doar rândurile care apar în ambele seturi de rezultate. Gândește-te la el ca la găsirea persoanelor care aparțin ambelor grupuri.

Să folosim INTERSECT pentru a interoga tabelele de mai sus. Pentru exemplu, să interogăm doar coloanele name și department:

-- Using INTERSECT to find common employees
SELECT name, department FROM employees
INTERSECT
SELECT name, department FROM contractors;

Această interogare selectează coloanele name și department din ambele tabele, employees și contractors, și returnează doar rândurile care există în ambele tabele pe baza tuturor coloanelor selectate.

name

department

Carol

Engineering

Operatorul INTERSECT gestionează valorile NULL pe baza regulilor standard de comparare, considerând valorile NULL egale atunci când compară coloanele corespunzătoare. De asemenea, produce un set gol când lucrează cu seturi de rezultate goale.

Cu alte cuvinte, dacă o valoare NULL este prezentă într-un set de rezultate, iar coloana corespunzătoare din celălalt set conține o valoare non-NULL, rândurile nu sunt considerate egale – nu vor fi incluse în rezultatul intersecției.

În plus, dacă unul dintre seturile de rezultate furnizate operatorului INTERSECT este gol, rezultatul general este, de asemenea, gol. Nu există rânduri comune între un set gol și orice altceva.

Cum folosești operatorul UNION în SQL

Operatorul EXCEPT returnează rândurile din primul set de rezultate care nu se află în al doilea.

În Oracle Database, EXCEPT este scris ca MINUS; toate celelalte dialecte majore (PostgreSQL, SQL Server, MySQL 8.0.31+, SQLite) folosesc EXCEPT.

De exemplu, să zicem că executăm următoarea interogare:

-- Using EXCEPT to find employees who are not contractors
SELECT name, department, salary FROM employees
EXCEPT
SELECT name, department, salary FROM contractors;

Coloanele name, department și salary sunt selectate din tabelul employees și returnează doar rândurile care nu există în tabelul contractors.

name

department

salary

Alice

Marketing

65000

Bob

Sales

70000

John

HR

55000

Operatorul EXCEPT urmează, de asemenea, regulile standard de comparare pentru gestionarea valorilor NULL. Comportamentul său cu seturi de rezultate goale produce un set gol dacă primul set de rezultate este gol sau include toate rândurile din primul set dacă al doilea set de rezultate este gol.

Operatori de mulțimi în SQL: performanță și optimizare

Impactul operatorilor de mulțimi asupra performanței interogărilor în SQL poate varia în funcție de factori precum dimensiunea seturilor de date implicate, complexitatea interogărilor și sistemul de gestiune a bazelor de date (SGBD) utilizat.

Să detaliem factorii cheie și strategiile de optimizare.

Volumul de date și complexitatea interogării

Când lucrezi cu cantități mari de date, operatorii de mulțimi pot afecta semnificativ performanța, deoarece dimensiunea seturilor de rezultate care trebuie combinate, intersectate sau comparate crește timpul de procesare necesar pentru a efectua acea operație.

Interogările complexe care conțin multiple subinterogări, join-uri sau operatori de mulțimi pot introduce un overhead suplimentar și pot afecta performanța. Operațiile în lanț sau seturile de mulțimi imbricate pot agrava și mai mult consecințele asupra performanței.

Indexare și tehnici de optimizare

Indexarea corespunzătoare a coloanelor implicate în operațiile pe mulțimi poate îmbunătăți semnificativ performanța interogărilor. Indexurile ajută motorul bazei de date să localizeze rapid și să recupereze rândurile relevante, reducând necesitatea scanărilor complete de tabel și îmbunătățind timpii de execuție.

Pentru a îmbunătăți performanța interogărilor care implică operatori de mulțimi, administratorii și dezvoltatorii de baze de date pot aplica tehnici precum rescrierea interogărilor, analiza planului de execuție și optimizarea schemei. Tehnici precum caching-ul interogărilor și materialized views pot fi, de asemenea, folosite pentru a precomputa și stoca rezultatele interogărilor complexe, reducând astfel efortul computațional al operațiilor pe mulțimi.

Motorul de bază de date și resursele hardware

Performanța operațiilor pe mulțimi poate varia în funcție de motorul de bază de date și capacitățile sale de optimizare. Diferite SGBD-uri pot folosi strategii și algoritmi diferiți pentru procesarea operațiilor pe mulțimi, ceea ce poate duce la variații de performanță.

Disponibilitatea resurselor hardware precum CPU, memorie și I/O pe disc influențează, de asemenea, performanța interogărilor care implică operatori de mulțimi. Resurse hardware adecvate pot ajuta la atenuarea blocajelor de performanță și la asigurarea unei execuții eficiente a interogărilor.

Operatorii de mulțimi în practică

Operatorii de mulțimi nu sunt doar instrumente teoretice; au aplicații reale care pot influența semnificativ deciziile de business. Să parcurgem un exemplu simplificat despre cum o companie ar putea folosi operatorii de mulțimi pentru a-și segmenta baza de clienți pentru campanii de marketing țintite.

Scenariul

Imaginează-ți o companie care vinde atât online, cât și în magazine fizice. Are două seturi de date separate:

  1. Achiziții online: ID client, istoric de cumpărături, date demografice și locație pentru cumpărătorii online.
  2. Tranzacții în magazin: Informații similare pentru clienții care au cumpărat în persoană.

Folosind operatorii de mulțimi

Pentru a obține o imagine completă a tuturor clienților, compania ar folosi mai întâi UNION pentru a combina ambele seturi de date într-un singur tabel, eliminând duplicatele. Asta îi oferă o viziune unificată a întregii baze de clienți.

Apoi, ar putea folosi INTERSECT pentru a identifica clienții care au cumpărat atât online, cât și în magazin. Acest segment este deosebit de valoros deoarece este foarte implicat cu brandul pe mai multe canale.

Pentru a găsi oportunități de promovare cross-channel, compania ar putea folosi EXCEPT. De exemplu, SELECT * FROM online_purchases EXCEPT SELECT * FROM in_store_transactions ar găsi clienții care au cumpărat doar online, nu și în magazine. Compania ar putea apoi să țintească acești clienți cu promoții care să îi încurajeze să viziteze o locație fizică.

Dincolo de segmentare

Cu aceste segmente identificate, compania poate merge mai departe, rafinându-le pe baza unor factori suplimentari precum demografia sau istoricul achizițiilor. Această înțelegere granulară a clienților le permite să adapteze campaniile de marketing cu o precizie mai mare.

Operatori de mulțimi vs. JOIN-uri

Atât operatorii de mulțimi, cât și JOIN-urile SQL combină date din interogări multiple, dar funcționează diferit. Întrebarea de bază este dacă vrei să combini rânduri sau coloane.

Feature Set Operators JOINs
Combines Rows (stacks queries vertically) Columns (widens rows horizontally)
Requires Same column count and compatible data types A shared key column between tables
Use when Merging similar datasets, finding overlaps or differences between result sets Enriching a row with related data from another table
Duplicate handling UNION removes duplicates; UNION ALL keeps them Depends on join type and the data
Types UNION, UNION ALL, INTERSECT, EXCEPT/MINUS INNER, LEFT, RIGHT, FULL OUTER, CROSS

Limitări și aspecte de luat în considerare pentru operatorii de mulțimi

Când folosești operatori de mulțimi în SQL, este esențial să iei în considerare mai multe limitări și factori care pot afecta performanța interogărilor, acuratețea rezultatelor și ușurința de utilizare.

Compatibilitatea tipurilor de date și valorile NULL

Coloanele corespunzătoare din seturile de rezultate trebuie să aibă tipuri de date compatibile. Verifică faptul că aceleași coloane au tipuri de date compatibile înainte de a combina interogările. Nepotrivirile de tip provoacă erori ușor de scăpat din vedere.

Operatorii de mulțimi pot trata valorile NULL diferit în funcție de SGBD și de operatorul specific. Pentru a evita erorile, dezvoltatorii trebuie să înțeleagă cum sunt tratate valorile NULL.

Impactul asupra performanței și rândurile duplicate

Operațiile pe mulțimi pot afecta semnificativ performanța interogărilor, mai ales când se lucrează cu seturi de date mari sau complexe. Factori precum indexarea, optimizarea interogărilor și resursele hardware pot influența performanța. Tehnicile de optimizare și strategiile de tuning sunt esențiale pentru a reduce blocajele de performanță.

Implicit, operatorii de mulțimi elimină rândurile duplicate din setul de rezultate. Totuși, în unele cazuri poate fi necesară păstrarea lor. Este important să înțelegi comportamentul operatorilor de mulțimi în ceea ce privește rândurile duplicate și să folosești tehnicile potrivite pentru a le gestiona, dacă e nevoie.

Ordinea rezultatelor și constrângerile de memorie

Operatorii de mulțimi nu garantează ordinea rezultatelor în output-ul final. Pentru a sorta rezultatul combinat, adaugă o clauză ORDER BY la finalul întregii interogări, după ultimul SELECT.

Operațiile pe mulțimi pot consuma memorie și resurse semnificative, în special când se lucrează cu seturi de date mari. Trebuie luate în calcul constrângerile de memorie și limitările de resurse pentru a evita degradarea performanței sau instabilitatea sistemului.

Complexitate, mentenabilitate și compatibilitate cross-SGBD

Interogările complexe care implică mai mulți operatori de mulțimi, subinterogări și join-uri pot fi dificile de înțeles, întreținut și depanat. Pentru a îmbunătăți lizibilitatea și mentenabilitatea, interogările trebuie să fie concise, bine documentate și modulare.

Operatorii de mulțimi pot avea variații de sintaxă și comportament între diferite sisteme de gestiune a bazelor de date (SGBD-uri). Cunoașterea acestor diferențe este vitală când scrii interogări SQL pentru compatibilitate cross-platformă.

Gânduri finale

Operatorii de mulțimi rezolvă o problemă specifică: combinarea sau compararea seturilor de rezultate fără a ști dinainte care rânduri se suprapun.

Ei acoperă UNION, INTERSECT și EXCEPT: cei trei operatori pentru combinarea, compararea și scăderea seturilor de rezultate.

Dacă vrei să afli mai multe, consultă acest curs despre Joining Data in SQL.

Întrebări frecvente despre operatorii SQL

Care este diferența dintre UNION ALL și UNION?

UNION ALL include toate rândurile din ambele interogări, chiar dacă există duplicate. UNION elimină rândurile duplicate.

În ce diferă UNION de JOIN în SQL?

UNION combină rezultatele interogărilor vertical, adăugând rândurile dintr-o interogare la cealaltă. JOIN combină tabelele orizontal, potrivind rânduri pe baza unei coloane înrudite și creând un set de rezultate mai lat.

Există considerații de performanță la folosirea operațiilor pe mulțimi?

Operațiile pe mulțimi pot fi costisitoare computațional, mai ales când lucrezi cu seturi de date mari. Este important să optimizezi interogările individuale și să folosești indexuri acolo unde este posibil pentru a îmbunătăți performanța.

Care este diferența dintre EXCEPT și NOT IN?

EXCEPT și NOT IN pot produce rezultate similare, dar se comportă diferit cu valorile NULL. EXCEPT tratează valorile NULL ca egale atunci când compară rânduri, astfel încât două valori NULL în aceeași poziție a coloanei vor determina excluderea unui rând. NOT IN, însă, nu returnează niciun rând dacă subinterogarea conține orice valoare NULL, deoarece comparațiile cu NULL sunt nedefinite în SQL. Pentru seturi de date mari, EXCEPT poate fi, de asemenea, mai lizibil decât o subinterogare corelată NOT IN.

Pot folosi ORDER BY cu operatorii de mulțimi?

Da, dar o singură dată, la finalul întregii interogări. Nu poți folosi ORDER BY în interiorul instrucțiunilor SELECT individuale dintr-o operație pe mulțimi. Pentru a sorta rezultatul combinat, adaugă o singură clauză ORDER BY după ultimul SELECT.

Exemplu:

SELECT name FROM employees
UNION
SELECT name FROM contractors
ORDER BY name ASC;

MySQL suportă INTERSECT și EXCEPT?

MySQL a adăugat suport pentru INTERSECT și EXCEPT în versiunea 8.0.31. Dacă folosești o versiune mai veche, va trebui să le emulezi: folosește un INNER JOIN sau o subinterogare cu IN pentru a replica INTERSECT, și un LEFT JOIN ... WHERE IS NULL sau o subinterogare NOT IN pentru a replica EXCEPT. Oracle folosește MINUS în loc de EXCEPT.

Subiecte

Află mai multe despre SQL!

track

Inginer de date asociat în SQL

30 oră
Învață fundamentele ingineriei datelor: proiectarea bazelor de date și data warehousing, lucrând cu tehnologii precum PostgreSQL și Snowflake!
Vezi detaliiRight Arrow
Începeți cursul
Vezi mai multRight Arrow