SQL tydelig: beskrivelse, eksempler, egenskaper
Ofte når du bruker SQL for prøvetakinginformasjon fra tabellene mottar brukeren overflødige data, som består av tilstedeværelsen av helt identiske dupliserte linjer. For å utelukke denne situasjonen, bruk SQL-distinkt argumentet i Select-klausulen. I denne artikkelen vil vi vurdere eksempler på å bruke dette argumentet, samt situasjoner der det er bedre å forlate argumentet.
Før vi begynner å vurdere spesifikke eksempler, vil vi opprette et par nødvendige tabeller i databasen.
Forbereder tabeller
Tenk deg at vi har lagret i vår databaseinformasjon om bakgrunnen, presentert i to tabeller. Dette er Oboi-tabellen (bakgrunnsbilde) med feltene id (unik identifikator), type (type tapet - papir, vinyl, etc.), farge, struktur og pris. Og Ostatki-bordet (rester) med feltene id_oboi (referanse til den unike identifikatoren i Oboi-tabellen) og telle (antall ruller i lageret).
Fyll inn tabellene med data. I bordet med tapet legg til 9 oppføringer:
Oboi | ||||
id | typen | farge | struct | pris |
1 | papir | flerfarget | pregede | 56,9 |
2 | Dobbellags papir | beige | glatt | 114,8 |
3 | vinyl | Orange | pregede | 504 |
4 | Ikke-vevde fleecehansker | beige | pregede | 1020,9 |
5 | Dobbellags papir | beige | glatt | 150,6 |
6 | papir | flerfarget | glatt | 95,4 |
7 | vinyl | brun | glatt | 372 |
8 | Ikke-vevde fleecehansker | hvit | pregede | 980,1 |
9 | klut | rosa | glatt | 1166,5 |
I tabellen med remainders er det også ni poster:
Ostatki | |
id_oboi | telle |
1 | 8 |
2 | 12 |
3 | 24 |
4 | 9 |
5 | 16 |
6 | 7 |
7 | 24 |
8 | 32 |
9 | 11 |
La oss begynne med å beskrive hvordan du bruker distinkt i SQL.
Legg merke til i Select-klausulen
Det distinkte argumentet bør plasseres umiddelbart etterVelg søkeordet i spørringene. Den brukes umiddelbart til alle kolonnene som er angitt i Select-klausulen, fordi den ekskluderer helt identiske rader fra resultatet av spørringen. Dermed er det tilstrekkelig å spesifisere "velg distinkte" når du skriver SQL-spørringen. Det eneste unntaket er bruk av forskjellig inne i aggregatfunksjonene, som vi vil vurdere litt senere.
Det skal huskes at de fleste DBMSer ikke gjenkjenner spørringen av skjemaet:
VELG utmerket Ostatki.Count, tydelig Oboi. * FRA Oboi INNER KJØP Ostatki ON Oboi.id = Ostatki.id_oboi |
Her angis argumentet flere ganger, eller det er angitt en gang, men før den andre, tredje eller andre valgbare kolonne. Du får en feil med henvisning til unøyaktigheter i syntaksen.
Brukes tydelig i vanlige spørsmål
Tydeligvis med riktig strukturTabeller og fylling, inne i samme tabell, er situasjoner der helt identiske rader oppstår, utelukket. Derfor er utførelsen av spørringen "Select distinct *" med et utvalg fra ett bord praktisk talt upraktisk.
Tenk deg en situasjon der vi må finne ut hvilken type tapet vi har, umiddelbart etter bekvemmelighet, sorterer vi etter type:
VELG Oboi.type FRA Oboi rekkefølge etter type |
Og vi får resultatet:
typen |
papir |
papir |
Dobbellags papir |
Dobbellags papir |
vinyl |
vinyl |
klut |
Ikke-vevde fleecehansker |
Ikke-vevde fleecehansker |
Som du kan se inneholder tabellen dupliserte rader. Hvis vi legger til Select distinkt-klausulen:
VELG utmerket Oboi.type FRA Oboi rekkefølge etter type |
så får vi resultatet uten gjentakelser:
typen |
papir |
Dobbellags papir |
vinyl |
klut |
Ikke-vevde fleecehansker |
Dermed, hvis dataene ble riktig inngåttbordet, så umiddelbart etter en samtale eller kundeforespørsel, vil vi kunne svare på at det ikke er væske tapeter, glassveggbelegg og akryl tapet i butikken. Med tanke på at sortimentet i butikkene vanligvis ikke er begrenset til hundre bakgrunnsbilder, ville det være ganske arbeidskrevende å se gjennom listen over ikke-unike typer.
Bruke forskjellige innvendige aggregatfunksjoner
SQL-tydelig argument kan brukes med noenaggregatfunksjon. Men for Min og Max vil søknaden ikke ha noen effekt, og når man beregner summen eller gjennomsnittsverdien, er det sjelden å tenke seg en situasjon når det ikke ville være nødvendig å ta hensyn til gjentakelser.
Anta at vi vil vite hvor fullt vårt lager er, og for dette sender vi en forespørsel som beregner totalt antall ruller på lager:
SELECT sum (Ostatki.count) FRA Ostatki |
Forespørselen vil returnere 143. Hvis vi bytter til:
SELECT sum (tydelig Ostatki.count) FRA Ostatki |
da får vi bare 119, fordi tapetet under artiklene 3 og 7 er på lager i samme mengde. Det er imidlertid åpenbart at dette svaret er feil.
Oftest i SQL, er distinkt brukt med Count-funksjonen. Så uten vanskeligheter kan vi finne ut hvor mange unike typer tapeter vi alle har:
SELECT telle (tydelig Oboi.type) FRA Oboi |
Og få resultatet 5 - papir normalt ogto-lags, vinyl, stoff og ikke-vevd. Sikkert har alle sett en annonse av typen: "Bare vi har mer enn 20 typer forskjellige bakgrunnsbilder!", Som betyr at i denne butikken er det ikke et par dusin ruller av alt, men bakgrunnsbilder av de mest varierte moderne typene.
Interessant, i en forespørsel kan du spesifisereflere teller funker både med og uten den forskjellige attributten. Det vil si, dette er den eneste situasjonen hvor forskjellige i Select "e kan være tilstede flere ganger.
Når skal forlate argumentet
Bruken av SQL-tydelig argument bør kasseres i ett av to tilfeller:
- Du er prøvetaking fra bordene og er selvsikkerunikt verdier i hver. I dette tilfellet er bruken av argumentet upraktisk, fordi det er en ekstra belastning på serveren eller klienten (avhengig av typen av database).
- Du er redd for å miste de nødvendige dataene. Vi vil forklare.
Anta at sjefen ber deg om å vise en liste over bakgrunnsbilder du har, og viser kun to kolonner - type og farge. Uten vaner spesifiserer du et tydelig argument:
VELG markert Oboi.type, Oboi.color FRA Oboi BESTILL BY Oboi.type |
Og - du mister noen data:
typen | farge |
papir | flerfarget |
Dobbellags papir | beige |
vinyl | brun |
vinyl | Orange |
klut | rosa |
Ikke-vevde fleecehansker | beige |
Ikke-vevde fleecehansker | hvit |
Det kan gi inntrykk av at vi bare har en type papirbakgrunn (vanlig og dobbeltlags), selv om det faktisk er i vårt lille bord to artikler hver (resultatet er ikke klart):
typen | farge |
papir | flerfarget |
papir | flerfarget |
Dobbellags papir | beige |
Dobbellags papir | beige |
vinyl | brun |
vinyl | Orange |
klut | rosa |
Ikke-vevde fleecehansker | hvit |
Ikke-vevde fleecehansker | beige |
Derfor, som med skrivingen av et søk, med det tydelige argumentet, må du være forsiktig og løse kompetent løse problemet ved bruk av dette, avhengig av oppgaven.
Alternativ til distinkt
Det motsatte av det distinkte argumentet er argumentetAll. Når det brukes, blir dupliserte linjer bevaret. Men siden DBMS mener som standard at det er nødvendig å skrive ut alle verdier, er argumentet All en spesifier snarere enn et ekte funksjonelt argument.