SQL distinct: descriere, exemple, proprietăți
Adesea, atunci când se utilizează SQL pentru a prelua informații din tabele, utilizatorul primește date redundante, care constă în prezența unor rânduri dublate 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.
conținut
Î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ă avem în baza de date stocate informații despre tapet, prezentate în două tabele. Acest tabel oboi (tapet) cu câmpuri id (identificator unic), de tip (tip de tapet -. Hârtie, vinil, etc), culoare (culoare), struct (structură) și prețul (prețul). Și tabelul Ostatki (reziduuri) cu câmpuri id_oboi (o referire la identificatorul unic în tabelul Oboi) și numărul de (numărul de role în stoc).
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ă cuvântul cheie Select în 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
Este evident că, odată cu construirea corectă a structurii meselor și a umplerii acestora, într-o singură masă situațiile sunt excluse atunci când sunt întâlnite ș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, în cazul în care introduceți corect datele într-un tabel, apoi imediat după un apel telefonic sau o cerere de cumpărători putem răspunde că tapet lichid, fibra de sticla si tapet acrilic disponibile în magazin nu sunt. Având în vedere că sortarea în magazine nu este, de obicei, limitată la o sută de tapet, ar fi destul de solicitant pentru a scana lista de tipuri non-unice.
Folosind funcții distincte în cadrul agregatelor
SQL distinct poate fi folosit cu orice funcție agregată. 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 - de hârtie obișnuită și de două straturi, de vinil, țesături și nețesute. Cu siguranță văzut toate anunțurile, cum ar fi: „Doar avem peste 20 de tipuri diferite de tapet“, prin care se înțelege că acest magazin nu este doar câteva zeci de role și o varietate de tipuri de tapet moderne.
Interesant, într-o singură cerere, puteți specifica mai multe funcții Count cu sau fără atributul distinct. Asta este, aceasta este singura situație în care distinct în Select 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 siguri de unicitatea 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 |
Acesta poate da impresia că tapet de hârtie (convențională și dual-layer) am doar o singură minte, de fapt, chiar și în tabelul nostru mic de două articol (fără rezultat distincte):
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 argumentul Toate. 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. Sperăm că acum înțelegeți când se utilizează o distincție (SQL). Descrierea vă oferă informații complete despre oportunitatea aplicării acestui argument în rezolvarea diferitelor probleme. La urma urmei, după cum sa dovedit, chiar și un astfel de argument simplu în aplicația sa ascunde o probabilitate foarte palpabilă de a pierde unele date și de a deduce informațiile inexacte.
- Baza de date este un sistem complex
- Instrucțiunea Select (SQL)
- Imagine de fundal Flizeline: nu toate sunt dăunătoare
- Crearea unui interior elegant: tapet pentru o cărămidă
- Tapet pe bază nețesută: avantaje și caracteristici ale lipirii
- Cum de a alege un tapet competent?
- Tapet pentru baie - o soluție neașteptată
- Cum de a alege un tapet combinat pentru un dormitor
- Wallpaper pentru pictura in interior. Cum să alegi una potrivită și care sunt avantajele?
- Cum de a lipi tapet non-țesute: câteva sfaturi
- Cum se compun interogările SQL - exemple detaliate
- Care este diferența dintre tapetul de vinil și tapetul nețesut? Asemănări și diferențe fundamentale
- SQL unde: metode de aplicare și exemple
- Instrucțiunea SQL INNER JOIN: exemple, sintaxă și caracteristici
- Ștergerea duplicatelor MySQL
- Ce este o bază de date și unde se poate utiliza?
- Detalii despre cum să legați tabelele de acces
- Cum de a lipi tapet de vinil
- Care tapet pentru coridor?
- Care tapet pe bucătărie?
- Cum să lipiți tapet - câteva sfaturi practice