/ / SQL-onderscheid: beschrijving, voorbeelden, eigenschappen

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.

sql onderscheiden

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.

sql selecteer onderscheid

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.

verschillend in sql

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:

  1. 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).
  2. 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.

afzonderlijke SQL description
We hopen dat je nu begrijpt wanneerpast onderscheidend (SQL) toe. De beschrijving heeft u volledige informatie gegeven over de wenselijkheid om dit argument te gebruiken bij het oplossen van verschillende problemen. Immers, zo bleek, zelfs zo'n eenvoudig argument in de toepassing verbergt de vrij tastbare kans dat sommige gegevens verloren gaan en dat er onnauwkeurige informatie wordt weergegeven.

Lees meer: