Wanneer sql-syntaxis. SQL Waar: toepassingen en voorbeelden

Implementaties van de SQL-taal kunnen impliciete typeconversie uitvoeren. Dus bijvoorbeeld in T-SQL bij het vergelijken of combineren van waarden van typen kleineint En int, gegevenstype kleineint worden impliciet naar type gegoten int. Meer over expliciete en impliciete typeconversie in MS SQL Server leest u in BOL.

Voorbeeld. Geef de gemiddelde prijs weer van pc-notitieblokken met de voorafgaande tekst "gemiddelde prijs = ".
Er wordt geprobeerd een verzoek te voltooien


Het resultaat is dat we krijgen wat we nodig hadden:

geeft het resultaat 1926. In principe is alles correct, omdat Het resultaat was dat we kregen waar we om vroegen: EEN JAAR. Het rekenkundig gemiddelde zal echter ongeveer 1926,2381 zijn. Hierbij moet worden opgemerkt dat aggregatiefuncties (met uitzondering van de function GRAAF, die altijd een geheel getal retourneert) het gegevenstype van de verwerkte waarden overnemen. Omdat het gelanceerde veld een geheel getal is, hebben we de gemiddelde waarde verkregen, waarbij het fractionele deel is weggegooid (merk op dat dit niet is afgerond).
Wat als we geïnteresseerd zijn in het resultaat met een bepaalde nauwkeurigheid, bijvoorbeeld tot op twee decimalen? Een expressie toepassen VORM aan de gemiddelde waarde levert om de hierboven genoemde reden niets op. Echt,
Het resultaat is 1926.238095. Niet weer hetzelfde. De reden hiervoor is dat er bij het berekenen van het gemiddelde een impliciete typeconversie is uitgevoerd. Laten we nog een stap zetten:

Die. We gebruikten een impliciete conversie van het integer-argument naar een exact numeriek type (EXACT NUMERIC), vermenigvuldigden het met een reële eenheid, en pasten vervolgens een expliciete cast toe op het type resultaat van de aggregatiefunctie.

Soortgelijke typeconversies kunnen worden uitgevoerd met behulp van de functie OVERZETTEN:


Hier converteren we de stringweergave van datum naar type datumtijd en voer vervolgens de omgekeerde conversie uit om het resultaat van de opmaak te demonstreren. Omdat het stijlargument niet is opgegeven, wordt de standaardwaarde (0 of 100) gebruikt. Als resultaat krijgen we

Lijst met alle mogelijke argumentwaarden stijl te vinden in BOL.

CASE-verklaring

Stel dat u een lijst met alle pc-modellen wilt weergeven, met vermelding van hun prijzen. Als het model bovendien niet in de uitverkoop is (niet in de RS-tabel), geef dan in plaats van de prijs de tekst weer: "Niet op voorraad."
Een lijst met alle pc-modellen met prijzen kunt u opvragen via de aanvraag:

SELECTEER DISTINCT product.model, prijs VANAF product LINKS JOIN pc c
AAN product.model=c.model
WAAR product.type = "pc";

In de resultatenset wordt de ontbrekende prijs vervangen door een NULL-waarde:
model prijs
1121 850
1232 350
1232 400
1232 600
1233 600
1233 950
1233 980
1260 350
2111 NUL
2112 NUL

Om NULL-waarden te vervangen door de gewenste tekst, kunt u de operator gebruiken GEVAL:
Exploitant GEVAL retourneert, afhankelijk van de opgegeven voorwaarden, een van de vele mogelijke waarden. In ons voorbeeld is de voorwaarde dat er wordt gecontroleerd op NULL. Als aan deze voorwaarde is voldaan, wordt de tekst "Niet op voorraad" geretourneerd, anders ( ANDERS) retourneert de prijswaarde. Er is hier één fundamenteel punt. Sinds het resultaat van de operator SELECTEER altijd een tabel is, moeten alle waarden van elke kolom van hetzelfde gegevenstype zijn (onder voorbehoud van impliciete typecasting). Daarom kunnen we geen symbolische constante samen met de prijs uitvoeren (numeriek type). Dit is de reden waarom er een typeconversie wordt toegepast op het prijsveld om de waarden ervan om te zetten in een symbolische weergave. Als resultaat krijgen we
model prijs
1121 850
1232 350
1232 400
1232 600
1233 600
1233 950
1233 980
1260 350
2111 Niet beschikbaar
2112 Niet beschikbaar

Exploitant GEVAL kan worden gebruikt in een van de twee syntactische notatievormen:

1e vorm
GEVAL<проверяемое выражение>
WANNEER<сравниваемое выражение 1>
DAN<возвращаемое значение 1>

WANNEER<сравниваемое выражение N>
DAN<возвращаемое значение N>
EINDE

2e formulier
GEVAL
WANNEER<предикат 1>
DAN<возвращаемое значение 1>

WANNEER<предикат N>
DAN<возвращаемое значение N>
EINDE

Alle aanbiedingen WANNEER moet dezelfde syntactische vorm hebben, d.w.z. Je kunt de eerste en tweede vorm niet combineren. WANNEER Bij gebruik van de eerste syntactische vorm, de condition tevreden zodra de waarde expressie wordt getest WANNEER wordt gelijk aan de waarde van de uitdrukking die in de zin is opgegeven WANNEER. Bij gebruik van de tweede syntactische vorm, de voorwaarde zodra tevreden predikaat GEVAL evalueert naar WAAR. Als aan de voorwaarde is voldaan, de exploitant retourneert de waarde die is opgegeven in de overeenkomstige clausule WANNEER DAN ANDERS. ANDERS Als geen van de voorwaarden Als aan de voorwaarde is voldaan, de exploitant mislukt, wordt de in de clausule opgegeven waarde gebruikt
. GEVAL.
Bij afwezigheid , wordt een NULL-waarde geretourneerd. Als aan meerdere voorwaarden wordt voldaan, wordt de waarde van de zin geretourneerd de eerste van hen. GEVAL:

In het bovenstaande voorbeeld werd de tweede vorm van de operator gebruikt

Merk op dat om te controleren op NULL, de standaard een kortere vorm van de operator biedt: , wordt een NULL-waarde geretourneerd. Als aan meerdere voorwaarden wordt voldaan, wordt de waarde van de zin geretourneerd COALESCE

. Deze operator heeft een willekeurig aantal parameters en retourneert de eerste niet-NULL-waarde. Voor twee parameters is de operator COALESCE(A, B) equivalent aan de volgende operator GEVAL GEVAL WANNEER A NIET NUL IS, DAN EEN ANDERS BOCHT De oplossing voor het bovenstaande voorbeeld met behulp van de operator kan als volgt worden herschreven:

De eerste syntactische vorm van de operator gebruiken
kan in het volgende worden aangetoond
voorbeeld
ANDERS "Gemiddelde prijs" EINDE reactie
VANAF pc BESTEL OP prijs;

Als gevolg van het uitvoeren van het verzoek krijgen we

model prijs opmerking
1232 350 Goedkoopste
1260 350 Goedkoopste
1232 400 Gemiddelde prijs
1233 400 Gemiddelde prijs
1233 600 Gemiddelde prijs
1121 850 Gemiddelde prijs
1233 950 Gemiddelde prijs
1233 980 De duurste

In de meeste gevallen hoeft u niet alle records op te halen, maar alleen de records die aan bepaalde criteria voldoen. Filter daarom het monster erin SQL er is een speciale operator WAAR.

1. Eenvoudig filteren met de WHERE-operator.

Laten we bijvoorbeeld records uit onze tabel selecteren die alleen betrekking hebben op een specifiek product. Om dit te doen, zullen we een extra selectieparameter specificeren die de waarde per kolom filtert Product.

Voorbeeldquery voor het selecteren van tekstwaarden:

SELECTEER * VAN Sumproduct WAAR Product = "Fietsen"

Zoals u kunt zien, staat de selectievoorwaarde tussen enkele aanhalingstekens, wat verplicht is bij het filteren van tekstwaarden. Bij het filteren van numerieke waarden zijn aanhalingstekens niet nodig.

Voorbeeldquery voor het selecteren van numerieke waarden:

SELECTEER > 40000 BESTEL DOOR Hoeveelheid

In dit voorbeeld hebben we records geselecteerd waarin de verkoopopbrengst meer dan bedroeg $ 40 duizend en bovendien werden alle records in oplopende volgorde per veld gesorteerd Hoeveelheid

In de onderstaande tabel vindt u de lijst met ondersteunde voorwaardelijke instructies SQL:

2. Filteren op waardebereik ( TUSSEN).

Om gegevens te selecteren die binnen een bepaald bereik liggen, wordt de operator gebruikt TUSSEN. De volgende query selecteert alle waarden variërend van 1000 $ V 2000 $ inclusief, in het veld Hoeveelheid.

SELECTEER * VAN Sumproduct WAAR Bedrag TUSSEN 1000 EN 2000

De sorteervolgorde is afhankelijk van de volgorde van de velden in het verzoek. Dat wil zeggen dat in ons geval de gegevens eerst per kolom worden gesorteerd Hoeveelheid, en dan door Stad.

3. Selectie van lege records ( IS NUL).

IN SQL er is een speciale operator voor het selecteren van lege records (genaamd NUL). Een blanco invoer is elke cel in een tabel waarin geen tekens zijn ingevoerd. Indien ingevoerd in een cel 0 of ruimte, dan wordt het veld als gevuld beschouwd.

SELECTEER * VAN Sumproduct WAAR Bedrag IS NUL

In het bovenstaande voorbeeld hebben we bewust twee waarden in het veld verwijderd Hoeveelheid om het werk van de operator te demonstreren NUL.

4. Geavanceerde filtering ( EN, OF).

Taal SQL is niet beperkt tot het filteren op één voorwaarde voor uw eigen doeleinden; u kunt vrij complexe structuren gebruiken om tegelijkertijd gegevens te selecteren op basis van vele criteria; Voor dit doel in SQL er zijn extra operators die de mogelijkheden van de operator uitbreiden WAAR. Dergelijke exploitanten zijn: EN, OF, IN, NIET. Hier zijn enkele voorbeelden van hoe deze operators werken.

SELECTEER * VAN Sumproduct WAAR Bedrag > 40000 EN Stad = "Toronto"

SELECTEER * VAN Sumproduct WAAR Maand= "April"OF Maand= "Maart"

Laten we de operatoren combineren EN En OF. Om dit te doen, zullen we een selectie maken van fietsen ( Fietsen ) en schaatsen ( Schaatsen ), die in maart werden verkocht (Maart ).

SELECTEER * VAN Sumproduct WAAR Product= "Fietsen"OF Product= "Schaatsen" EN Maand= "Maart"

We zien dat onze steekproef veel waarden bevatte (behalve maart ( Maart), ook januari ( Januari), Februari ( Februari) en april ( april)). Wat is de reden? En het feit is dat SQL heeft prioriteiten voor de uitvoering van opdrachten. Dat wil zeggen: de exploitant EN heeft een hogere prioriteit dan de operator OF, dus eerst werden de records met schaatsen geselecteerd die in maart waren verkocht, en daarna alle records met betrekking tot fietsen.

Om de juiste selectie te krijgen, moeten we dus de prioriteiten voor de uitvoering van de opdrachten wijzigen. Hiervoor gebruiken wij beugels, zoals in de wiskunde. Vervolgens worden eerst de operatoren tussen haakjes verwerkt, en daarna alle andere.

SELECTEER * VAN Sumproduct WAAR (Product= "Fietsen"OF Product= "Schaatsen") EN Maand= "Maart"

5. Geavanceerde filtering ( IN-operator).

SELECTEER * VAN Sumproduct WAAR IDIN (4, 12, 58, 67)

Exploitant IN vervult dezelfde functie als OF heeft echter een aantal voordelen:

  • Bij het werken met lange lijsten kan een clausule met IN gemakkelijker te lezen;
  • Er worden minder operators gebruikt, wat de verwerking van verzoeken versnelt;
  • Het belangrijkste voordeel IN is dat er een extra structuur kan worden gebruikt in het ontwerp SELECTEER, Wat
  • biedt geweldige mogelijkheden voor het maken van complexe subquery's.

6. Geavanceerde filtering ( NIET exploitant).

SELECTEER * VAN Sumproduct WAAR NIET StadIN ("Toronto", "Montréal")

Trefwoord NIET Hiermee kunt u onnodige waarden uit het monster verwijderen. Een ander uniek kenmerk is dat het vóór de naam van de kolom wordt geplaatst die bij het filteren betrokken is, en niet erna.

Het is moeilijk om de syntaxis voor de SQL Server WHERE-clausule uit te leggen, dus laten we eens naar enkele voorbeelden kijken.

We beginnen met te kijken hoe we de WHERE-clausule kunnen gebruiken met slechts één voorwaarde.

SELECTEER * VAN werknemers WAAR voornaam = "Jane";

In dit voorbeeld van de WHERE-clausule van SQL Server hebben we de WHERE-clausule gebruikt om onze resultaten uit de medewerkers tafel. De bovenstaande SELECT-instructie retourneert alle rijen uit de medewerkers tafel waar de voornaam is "Jan". Omdat de * wordt gebruikt in de SELECT, zijn alle velden uit de medewerkers tabel zou verschijnen in de resultatenset.

Voorbeeld: gebruik van AND-voorwaarde

Laten we eens kijken hoe we de WHERE-clausule kunnen gebruiken met de AND-voorwaarde.

SELECTEER * VAN werknemers WAAR achternaam = "Anderson" AND werknemer_id >= 3000;

In dit voorbeeld van de WHERE-clausule van SQL Server wordt de WHERE-clausule gebruikt om meerdere voorwaarden te definiëren. In dit geval gebruikt deze SELECT-instructie de AND-voorwaarde om alles terug te geven medewerkers die hebben een achternaam van "Anderson" en de medewerker_id groter is dan of gelijk is aan 3000.

Voorbeeld - OR-voorwaarde gebruiken

Laten we eens kijken hoe we de WHERE-clausule kunnen gebruiken met de OR-voorwaarde.

SELECT werknemer_id, achternaam, voornaam VAN werknemers WAAR achternaam = "Johnson" OF voornaam = "Danielle";

In dit voorbeeld van de WHERE-clausule van SQL Server wordt de WHERE-clausule gebruikt om meerdere voorwaarden te definiëren, maar in plaats van de AND-voorwaarde te gebruiken, wordt de OR-voorwaarde gebruikt. In dit geval retourneert deze SELECT-instructie alles medewerker_id, achternaam, En voornaam waarden uit de medewerkers tafel waar de achternaam is "Johnson" of de voornaam is "Daniëlle".

Voorbeeld - AND & OR-voorwaarden combineren

Laten we eens kijken hoe we de WHERE-clausule kunnen gebruiken wanneer we de AND & OR-voorwaarden combineren in één SQL-instructie.

SELECTEER * VAN werknemers WAAR (staat = "Californië" EN achternaam = "Smith") OF (werknemer_id = 82);

Dit voorbeeld van de SQL Server WHERE-clausule gebruikt de WHERE-clausule om meerdere voorwaarden te definiëren, maar combineert de AND-voorwaarde en de OR-voorwaarde . Dit voorbeeld zou alles retourneren medewerkers die verblijft in de staat van "Californië" en wiens achternaam is "Smith", evenals alle werknemers van wie medewerker_id is gelijk aan 82.

De haakjes bepalen de volgorde waarin de EN- en OF-voorwaarden worden geëvalueerd. Net zoals je hebt geleerd in de volgorde van de bewerkingen in de wiskundeles!

Voorbeeld - Tabellen samenvoegen

Laten we eens kijken hoe we de WHERE-clausule kunnen gebruiken wanneer we meerdere tabellen samenvoegen.

SELECT werknemers.employee_id, contacts.last_name VAN werknemers INNER JOIN contacten OP werknemers.employee_id = contacten.contact_id WAAR werknemers.first_name = "Sarah";

Dit voorbeeld van de SQL Server WHERE-clausule gebruikt de WHERE-clausule om meerdere tabellen samen te voegen in één SELECT-instructie. Deze SELECT-instructie retourneert alle rijen waarin de voornaam in de medewerkers tabel is "Sarah". En de medewerker s en contacten tafels zijn samengevoegd op de medewerker_id van de medewerkers tafel en de contact_id van de contacten tafel.

In dit artikel zal ik u vertellen over de voorwaardelijke operator CASE, zonder welke de gegevensverwerking in een aantal taken zou veranderen in stapels stukjes code, en hoe u deze kunt gebruiken in SQL-query's.

Hoe goed u uw database ook ontwerpt, er zullen altijd problemen zijn waarbij voorwaardelijke uitspraken onmisbaar zijn. Ontvang bijvoorbeeld in plaats van grote aantallen een verbale beschrijving, of voeg, afhankelijk van de aanwezigheid (afwezigheid) van gegevens, extra tekens toe aan de regel, of, als complexer voorbeeld, wijs, afhankelijk van verschillende nuances, een record toe aan een of meer een andere groep. Er zijn veel situaties.

In principe heeft een bepaalde operator minstens twee formulieren in verschillende databases. De eerste optie lijkt op een gewone overstap vanuit elke programmeertaal. De tweede is afhankelijk van logische expressies.

Voor de doeleinden van dit artikel zal ik echter de tweede optie overwegen, omdat deze geen problemen heeft met situaties als CASE WHEN NULL (null in de database is geen specifieke waarde, dus deze kan niet worden gebruikt in een switch-achtige instructie ). Bovendien komen taken in het dagelijks leven meestal specifiek voor de tweede optie voor: berekening via logische uitdrukkingen. Daarom is het beter om meteen te leren en het te blijven gebruiken.

Meestal wordt het als volgt beschreven (de syntaxis kan variëren, afhankelijk van de database):

CASE WHEN bool_expression1 THEN waarde1 ..... WHEN bool_expressionN THEN waardeN ELSE waardeElse END

bool_expressionX is een Booleaanse voorwaarde

waardeX is de waarde die zal worden vervangen als aan de overeenkomstige logische voorwaarde wordt voldaan

valueElse is de waarde die wordt vervangen als er niet eerder aan een voorwaarde is voldaan.

Na deze kleine informatie gaan we verder met oefenen.

Opmerking: Het is trouwens de moeite waard om te weten dat deze operator meestal niet alleen in geselecteerde velden kan worden gebruikt, maar ook op elke plaats waar velden kunnen worden gebruikt. Bijvoorbeeld bij het samenvoegen van tabellen of zelfs filteren (hebben) bij het groeperen (groeperen op).

Voorwaardelijke verklaring CASE...WHEN...THEN

Om de voorwaardelijke verklaring CASE...WHEN...THEN beter te begrijpen, moeten we ons een klein probleem voorstellen. Stel dat u een tabel heeft met gegevens over klanten en hun totale aantal aankopen. En de taak is om dynamisch een korting te creëren. Het is uiteraard mogelijk om de korting handmatig in te stellen. Maar u heeft een drempel, en die drempels zijn vastgelegd (zoiets als: een bedrag groter dan 1000 krijgt een korting van 2%, en meer dan 5000 krijgt een korting van 5%) en u wilt dit proces graag automatiseren, zodat u U hoeft niet elke keer op zoek te gaan naar fouten als u in de database duikt (de klant heeft het vereiste bedrag verzameld - de korting verschijnt automatisch).

Laten we een voorwaardelijke klantentabel nemen met drie klanten. Ze zullen bijvoorbeeld ruim voldoende zijn.

Laten we nu een aantal voorwaarden instellen voor het automatisch verstrekken van een korting op basis van de taak. Tegelijkertijd zijn wij van mening dat de klant in ieder geval de maximale korting krijgt.

1. Bedrag vanaf 1000 - 2% korting

2. Bedrag vanaf 5000 - 5% korting

3. Bedrag vanaf 10.000 - 8% korting

4. Aantal bestellingen van 10 - 7% korting

5. Aantal bestellingen van 20 - 8% korting

Zoals u kunt zien, is de korting afhankelijk van twee factoren: het bedrag en de hoeveelheid. Laten we nu proberen er voorwaarden van te maken op basis van de korting, dat wil zeggen dat de regels het tegenovergestelde zijn, zodat ze kunnen worden gebruikt in een SQL-query. Wij krijgen het volgende:

1. 2% - Bedrag van 1000 tot 4999 en het aantal bestellingen is minder dan 10.

2. 5% - Bedrag van 5000 tot 9999 en het aantal bestellingen is minder dan 10.

3. 7% - Aantal bestellingen van 10 tot 19 en bedrag minder dan 10.000

4. 8% - Aantal vanaf 20 of bedrag vanaf 10.000

Nu hoeft het alleen nog maar opgeschreven te worden. Laten we de volgende SQL-query ophalen

We geven de naam en andere gegevens weer, selecteer naam, order_count, total_sum, -- En nu geven we de korting weer CASE -- Eerste regel 2% WANNEER c.total_sum >= 1000 en c.total_sum<= 4999 and c.order_count < 10 THEN 2 -- Второе правило 5% WHEN c.total_sum >= 5000 en c.totaal_som<= 9999 and c.order_count < 10 THEN 5 -- Третье правило 7% WHEN c.total_sum < 10000 and c.order_count >= 10 en c.order_count<= 19 THEN 5 -- Четвертое правило 8% WHEN c.total_sum >= 10000 of c.order_count >= 20 THEN 5 -- Er is niet aan de regels voldaan, wat betekent dat de korting 0 is. ANDERS 0 EINDE als korting van klant c

Als resultaat van de uitvoering krijgen we de volgende tabel:

Zoals u ziet kregen twee klanten 8 procent korting en één klant 2 procent korting. In dit geval wordt bij elke bestelling het percentage automatisch berekend en hoeft u niets aan te passen. Stijgt het bedrag van Petya bijvoorbeeld naar 5000, dan stijgt zijn korting automatisch naar 5% (althans, aangezien er nog een aantal bestellingen zijn).