SQL distinct: descriere, exemple, proprietăți
Adesea, atunci când se utilizează SQL pentru eșantionareinformații din tabele, utilizatorul primește date redundante, constând în prezența unor linii duplicate absolut identice. Pentru a exclude această situație, utilizați argumentul distinct SQL din clauza Selectare. În acest articol, vom examina exemple de utilizare a acestui argument, precum și situații în care este mai bine să abandonăm argumentul.
Înainte de a începe să luăm în considerare exemple specifice, vom crea câteva tabele necesare în baza de date.
Pregătirea meselor
Imaginați-vă că am păstrat în baza noastră de dateinformații despre tapet, prezentate în două tabele. Acesta este tabelul Oboi (tapet) cu câmpul id (identificator unic), tipul (tipul tapetului - hârtie, vinil etc.), culoarea, structura și prețul. Și tabelul Ostatki (resturi) cu câmpurile id_oboi (referință la identificatorul unic din tabelul Oboi) și numărul (numărul de rulouri din depozit).
Completați tabelele cu date. În tabelul cu tapet adăugați 9 intrări:
oboi | ||||
id | tip | culoare | struct | preț |
1 | hârtie | multicolor | în relief | 56,9 |
2 | Hârtie pe două straturi | bej | neted | 114,8 |
3 | vinilin | portocaliu | în relief | 504 |
4 | Mănuși din lână nețesute | bej | în relief | 1020,9 |
5 | Hârtie pe două straturi | bej | neted | 150,6 |
6 | hârtie | multicolor | neted | 95,4 |
7 | vinilin | maro | neted | 372 |
8 | Mănuși din lână nețesute | alb | în relief | 980,1 |
9 | pânză | roz | neted | 1166,5 |
În tabelul cu restul sunt și nouă înregistrări:
Ostatki | |
id_oboi | conta |
1 | 8 |
2 | 12 |
3 | 24 |
4 | 9 |
5 | 16 |
6 | 7 |
7 | 24 |
8 | 32 |
9 | 11 |
Să începem prin descrierea modului de utilizare distinct în SQL.
Locul distinct în clauza Selectare
Argumentul distinct ar trebui plasat imediat dupăselectați cuvântul cheie din interogări. Se aplică imediat tuturor coloanelor specificate în clauza Select deoarece va exclude rânduri absolut identice din rezultatul interogării. Astfel, este suficient să specificați "selectați distinct" atunci când scrieți interogarea SQL. Singura excepție este utilizarea unor funcții distincte în interiorul funcțiilor agregate, pe care le vom lua în considerare mai târziu.
Trebuie reținut faptul că majoritatea DBMS nu vă recunoaște solicitarea în felul următor:
SELECT altki.Count diferit, distinct Oboi. * Din Oboi INNER JOIN Alteri pe Oboi.id = Ostatki.id_oboi |
Aici, argumentul este specificat de mai multe ori sau specificat o dată, dar înainte de a doua, a treia sau a altei coloane selectabile. Veți primi o eroare cu o trimitere la inexactități în sintaxă.
Folosind distincte în interogările standard
Evident, cu o structură bine structuratătabelele și umplerea acestora, într-o singură masă, situațiile sunt excluse atunci când se întâlnesc șiruri identice. Prin urmare, executarea interogării "Select distinct *" cu o selecție dintr-o tabelă este practic imposibilă.
Imaginați-vă o situație în care trebuie să aflăm ce tip de tapet avem, doar pentru comoditate, sortați după tip:
SELECT Oboi.type Din comanda Oboi după tip |
Și obținem rezultatul:
tip |
hârtie |
hârtie |
Hârtie pe două straturi |
Hârtie pe două straturi |
vinilin |
vinilin |
pânză |
Mănuși din lână nețesute |
Mănuși din lână nețesute |
După cum puteți vedea, în tabel există rânduri duplicate. Dacă adăugăm la clauza distinctă Selectare:
SELECT un tip distinct Oboi Din comanda Oboi după tip |
atunci obținem rezultatul fără a repeta:
tip |
hârtie |
Hârtie pe două straturi |
vinilin |
pânză |
Mănuși din lână nețesute |
Astfel, dacă datele au fost corect introdusemese la o dată la un apel sau cererea de cumpărători putem răspunde că lichidul tapet, fibra de sticla si tapet acrilic disponibile în magazin nu sunt. Având în vedere faptul că gama de magazine este, de obicei, nu se limitează la o sută de tapet, vizualiza lista tipurilor de non-unice ar fi destul de muncă intensivă.
Folosind funcții distincte în cadrul agregatelor
Argumentul distinct SQL poate fi folosit cu oriceagregate. Dar pentru Min și Max, utilizarea lui nu va avea nici un efect și atunci când se calculează suma sau valoarea medie, este rareori posibil să ne imaginăm o situație în care nu ar fi necesar să ținem seama de repetiții.
Să presupunem că vrem să știm cât de mult depozitul nostru este plin, iar pentru aceasta trimitem o cerere care calculează numărul total de rulouri din depozit:
SELECT suma (Alteki.count) Din Alteki |
Interogarea va returna un răspuns 143. Dacă ne schimbăm la:
SELECT suma (distincta suma de casă) Din Alteki |
atunci vom obține numai 119, deoarece tapetul de la articolele 3 și 7 este în stoc în aceeași cantitate. Cu toate acestea, este evident că acest răspuns este incorect.
Cel mai adesea, SQL este utilizat cu funcția Count. Deci, fără dificultate, putem afla câte tipuri unice de tapet avem în general:
SELECT numărul (distinct Oboi.type) Din Oboi |
Și obțineți rezultatul 5 - hârtie obișnuită șidouă straturi, vinil, țesătură și nețesute. Desigur, toată lumea a văzut o reclamă precum: "Numai noi avem mai mult de 20 de feluri de wallpapere diferite!", Ceea ce înseamnă că în acest magazin nu sunt câteva zecimi de roluri de tot, dar tapetul celor mai diverse tipuri moderne.
Interesant, într-o singură interogare, puteți specificamai multe funcții Count cu sau fără atributul distinct. Aceasta este singura situație în care distinct în Select nu poate fi prezentă de mai multe ori.
Când ar trebui să resping utilizarea unui argument
Utilizarea argumentului distinct SQL ar trebui să fie aruncată în unul din două moduri:
- Alegeți din tabele și sunteți siguriunicitatea valorilor din fiecare. În acest caz, utilizarea argumentului este inexactă, deoarece aceasta este o încărcare suplimentară pe server sau client (în funcție de tipul de DBMS).
- Ți-e frică să pierzi datele necesare. Vom explica.
Să presupunem că șeful vă cere să afișați o listă de tapet pe care o aveți, indicând doar două coloane - tipul și culoarea. În mod obișnuit, specificați argumentul distinct:
SELECTAȚI Oboi.type distinct, Oboi.color Din Oboi ORDER DE Oboi.type |
Și - pierdeți câteva date:
tip | culoare |
hârtie | multicolor |
Hârtie pe două straturi | bej |
vinilin | maro |
vinilin | portocaliu |
pânză | roz |
Mănuși din lână nețesute | bej |
Mănuși din lână nețesute | alb |
Se pare că avem doar un tip de tapet de hârtie (convențional și două straturi), deși chiar și în masa noastră mică au două articole (rezultatul fără distincție):
tip | culoare |
hârtie | multicolor |
hârtie | multicolor |
Hârtie pe două straturi | bej |
Hârtie pe două straturi | bej |
vinilin | maro |
vinilin | portocaliu |
pânză | roz |
Mănuși din lână nețesute | alb |
Mănuși din lână nețesute | bej |
Prin urmare, ca în scrierea oricărei interogări, cu argumentul distinct, trebuie să fim atenți și să rezolvăm corect problema cu aplicarea ei, în funcție de sarcina în mână.
Alternativ distinct
Opusul argumentului distinct este argumentulToate. Când îl utilizați, se salvează linii duplicate. Dar, în mod implicit, DBMS crede că este necesar să tipăriți toate valorile, argumentul All este mai mult un specificator decât un argument funcțional real.