SQL-onderscheid: beschrijving, voorbeelden, eigenschappen
Vaak bij gebruik van SQL voor ophaleninformatie uit de tabellen ontvangt de gebruiker overtollige gegevens, bestaande uit de aanwezigheid van absoluut identieke dubbele rijen. Om dit te voorkomen, gebruikt u het SQL-argument dat verschilt in de Select-component. Dit artikel bespreekt voorbeelden van het gebruik van dit argument, evenals situaties waarin het gebruik van het argument moet worden opgegeven.
Voordat we concrete voorbeelden bespreken, zullen we een paar noodzakelijke tabellen in de database maken.
Voorbereiding van tabellen
Stel je voor wat is opgeslagen in onze databaseachtergrondinformatie, gepresenteerd in twee tabellen. Dit zijn de Oboi-tabel (achtergrond) met de velden id (unieke id), type (achtergrondtype - papier, vinyl, enz.), Kleur (kleur), struct (structuur) en prijs (prijs). En de tafel Ostatki (overblijfselen) met de velden id_oboi (link naar een unieke identifier in de tabel Oboi) en tel (het aantal rollen in voorraad).
Vul de tabelgegevens in. Voeg 9 ingangen toe aan de tabel met achtergrond:
Oboi | ||||
id | type | kleur | struct | prijs |
1 | papier | veelkleurig | reliëf | 56,9 |
2 | Dubbele laag papier | beige | glad | 114,8 |
3 | vinyl | oranje | reliëf | 504 |
4 | Non-woven fleece handschoenen | beige | reliëf | 1020,9 |
5 | Dubbele laag papier | beige | glad | 150,6 |
6 | papier | veelkleurig | glad | 95,4 |
7 | vinyl | bruin | glad | 372 |
8 | Non-woven fleece handschoenen | wit | reliëf | 980,1 |
9 | doek | roze | glad | 1166,5 |
Er zijn ook negen ingangen in de tabel met saldi:
Ostatki | |
id_oboi | tellen |
1 | 8 |
2 | 12 |
3 | 24 |
4 | 9 |
5 | 16 |
6 | 7 |
7 | 24 |
8 | 32 |
9 | 11 |
We gaan verder met de beschrijving van het gebruik van onderscheid in SQL.
Plaats onderscheid in de Select-component
Het duidelijke argument moet onmiddellijk daarna worden geplaatstSelecteer trefwoord in query's. Het wordt onmiddellijk toegepast op alle kolommen die zijn opgegeven in de clausule Select, omdat het absoluut identieke rijen uitsluit van het uiteindelijke resultaat van de query. Het is dus voldoende om eenmaal "select distinct" op te geven bij het schrijven van een SQL-query. De uitzondering is het gebruik van verschillende interne verzamelfuncties, die iets later in overweging zullen worden genomen.
Houd er rekening mee dat de meeste DBMS's uw zoekopdracht van het formulier niet herkennen:
SELECTEER verschillende Ostatki.Count, aparte Oboi. * VAN Oboi BINNENIN JOIN Ostatki OP Oboi.id = Ostatki.id_oboi |
Hier wordt het argument verschillende keren gespecificeerd, of het wordt één keer gespecificeerd, maar vóór de tweede, derde of andere selecteerbare kolom. U ontvangt een fout met betrekking tot onnauwkeurigheden in de syntaxis.
Gebruik van onderscheidende standaardquery's
Uiteraard met de juiste structuurtabellen en hun vulling, binnen dezelfde tabel, situaties waarin absoluut identieke rijen worden tegengekomen zijn uitgesloten. Daarom is het uitvoeren van de zoekopdracht "Selecteer onderscheid *" met een selectie uit een tabel praktisch onpraktisch.
Stel je een situatie voor waarin we moeten weten welk soort achtergrond we hebben, onmiddellijk voor het gemak, we sorteren op type:
SELECTEER Oboi.type VAN Oboi-volgorde op type |
En we krijgen het resultaat:
type |
papier |
papier |
Dubbele laag papier |
Dubbele laag papier |
vinyl |
vinyl |
doek |
Non-woven fleece handschoenen |
Non-woven fleece handschoenen |
Zoals u kunt zien, bevat de tabel dubbele rijen. Als we toevoegen aan de Select distinct-clausule:
SELECTEER onderscheidbaar Oboi.type VAN Oboi-volgorde op type |
dan krijgen we het resultaat zonder herhalingen:
type |
papier |
Dubbele laag papier |
vinyl |
doek |
Non-woven fleece handschoenen |
Dus als de gegevens correct zijn ingevoerdde tafel, dan onmiddellijk na een oproep of verzoek van de klant, zullen we kunnen antwoorden dat er geen vloeibaar behang, glazen wandbekleding en acrylbehang in de winkel is. Aangezien het assortiment in winkels meestal niet beperkt is tot honderd wallpapers, zou het nogal arbeidsintensief zijn om de lijst met niet-unieke soorten te bekijken.
Verschillende interne aggregaatfuncties gebruiken
Het SQL-onderscheidende argument kan met elk argument worden gebruiktgeaggregeerde functie. Maar voor Min en Max zal de toepassing ervan geen effect hebben en bij het berekenen van de som of de gemiddelde waarde, is het zeldzaam om een situatie voor te stellen waarbij het niet nodig zou zijn om rekening te houden met herhalingen.
Stel dat we willen weten hoe vol ons magazijn is, en hiervoor sturen we een verzoek dat het totale aantal rollen in voorraad berekent:
SELECT-som (Ostatki.count) VAN Ostatki |
Het verzoek levert 143 op. Als we veranderen in:
SELECT-som (verschillende Ostatki.count) VAN Ostatki |
dan krijgen we slechts 119, omdat de behang onder artikelen 3 en 7 op voorraad zijn in dezelfde hoeveelheid. Het is echter duidelijk dat dit antwoord niet juist is.
Meestal wordt in SQL onderscheidend gebruikt met de functie Tellen. Dus, zonder enige moeite, kunnen we ontdekken hoeveel unieke soorten behang we allemaal hebben:
SELECT-aantal (verschillende Oboi.type) VAN Oboi |
En krijg het resultaat 5 - papier normaal entweelaags, vinyl, textiel en niet-geweven. Natuurlijk heeft iedereen een advertentie van het type gezien: "Alleen wij hebben meer dan 20 soorten verschillende achtergronden!", Wat betekent dat er in deze winkel niet een paar dozijn rollen zijn van alles, maar wel behangsels van de meest uiteenlopende moderne types.
Interessant is dat u in één verzoek kunt specificerenverschillende Count-functies zowel met als zonder het kenmerk distinct. Dat wil zeggen, dit is de enige situatie waarin Verschil in Select "e verschillende keren aanwezig kan zijn.
Wanneer het argument te verlaten
Het gebruik van het SQL-onderscheidende argument moet in een van de twee gevallen worden weggegooid:
- Je proeft vanaf de tafels en bent zelfverzekerduniciteit van waarden in elk. In dit geval is het gebruik van het argument onpraktisch, omdat het een extra belasting is voor de server of client (afhankelijk van het type database).
- Je bent bang om de benodigde gegevens te verliezen. We zullen het uitleggen.
Stel dat de baas je vraagt om een lijst met achtergronden weer te geven die je hebt, met slechts twee kolommen - type en kleur. Uit gewoonte, specificeer je een ander argument:
SELECTEER onderscheidende Oboi.type, Oboi.color VAN Oboi BESTELLING DOOR Oboi.type |
En - je verliest wat gegevens:
type | kleur |
papier | veelkleurig |
Dubbele laag papier | beige |
vinyl | bruin |
vinyl | oranje |
doek | roze |
Non-woven fleece handschoenen | beige |
Non-woven fleece handschoenen | wit |
Het kan de indruk wekken dat we slechts één type papierbehang hebben (regulier en dubbellaags), hoewel we zelfs in onze kleine tabel elk twee artikelen hebben (het resultaat is niet te onderscheiden):
type | kleur |
papier | veelkleurig |
papier | veelkleurig |
Dubbele laag papier | beige |
Dubbele laag papier | beige |
vinyl | bruin |
vinyl | oranje |
doek | roze |
Non-woven fleece handschoenen | wit |
Non-woven fleece handschoenen | beige |
Daarom moet u, net als bij het schrijven van een vraag, met het onderscheidende argument, voorzichtig en competent het probleem oplossen met het gebruik ervan, afhankelijk van de taak.
Alternatief voor onderscheid
Het tegenovergestelde van het afzonderlijke argument is het argumentAll. Wanneer toegepast, blijven dubbele regels behouden. Maar aangezien de DBMS standaard denkt dat het nodig is om alle waarden uit te voeren, is het argument Alles een specifieker dan een echt functioneel argument.