Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
De queries die we tot nu toe hebben gemaakt leveren lijsten die niet gesorteerd zijn, terwijl dat best handig kan zijn. Willen we een lijst dat alfabetisch gesorteerd is op voornaam, achternaam, woonplaats of misschien wel een andere kolom, dan kan je het resultaat sorteren m.b.v. de clausule ORDER B
Y. Wanneer de beheerder vraagt om de telefoonlijst van alle klanten op achternaam te sorteren, dan kan dat bijvoorbeeld met de volgende query:
Wanneer je de lijst met telefoonnummers wilt sorteren op achternaam, kan het een probleem worden als sommige achternamen meerdere keren voorkomen. In dat geval kun je de tabel op twee kolommen sorteren:
In beide voorbeelden wordt de tabel oplopend gesorteerd: teksten volgens de ASCII-tabel,
getallen en datums van klein naar groot. Het is ook mogelijk om de volgorde om te keren: aflopend sorteren. De Engelse termen daarvoor zijn ‘ascending’ en ‘descending’ (ASC
en DESC
).
Wanneer je er niets bij zet, wordt automatisch oplopend gesorteerd. Om aflopend te sorteren moet je dat achter de kolom in ORDER BY
zetten.
2.3 Oefening
Maak een lijst van alle klanten (voornaam, achternaam en land) gesorteerd op land en binnen het land op achternaam.
Stel dat de beheerder van de database een lijst wil hebben met voornaam, achternaam en woonplaats van de klanten die lid zijn van de bibliotheek. Dit kan in SQL vrij eenvoudig gerealiseerd worden met de volgende query. Probeer maar eens uit! Ga naar de database op repl.it. Voor het volgende commando uit binnen repl.it:
Krijg je iets wat hier op lijkt:
Dan gaat het goed!
Uitleg: Achter SELECT
staan de kolommen die getoond moeten worden. De kolomnamen worden gescheiden door komma’s. Achter FROM
staat de naam van de tabel (of tabellen) waaruit deze kolommen komen. Een SQL-vraag wordt altijd afgesloten met een puntkomma (;). Een SQL-vraag noem je een query.
Je zou er ook voor kunnen kiezen om alle kolommen uit de Customer tabel te willen zien. Dan kun je natuurlijk alle kolommen achter SELECT
zetten, maar het kan gelukkig veel korter met behulp van *. Zie:
2.1 Oefening: Selecteer de voornaam, achternaam en telefoon van alle Klanten.
Als er aan meerdere voorwaarden moet worden voldaan kun je gebruik maken van AND en OR.
Als je bijvoorbeeld alle facturen wilt met een totaal bedrag tussen de 6 en 10 euro. Krijg je de volgende query:
Nog een voorbeeld:
Combineren van AND en OR kan natuurlijk ook:
Stel nu deze:
Wat betekent dit? Krijg ik dan:
Alle klanten die mark en Frank heten die in America wonen
Krijg ik alle klanten die mark heten en alle klanten die frank en in america wonen.
Dat 2de dus.
Als we dat niet willen moeten we even haakjes plaatsen. Dan krijg je dus dit:
2.5 Oefening
Geef alle klanten die uit amerika komen en wonen in de stad new york of mounten view
Als de beheerder van de database een lijst wil hebben van de woonplaatsen, dan zou je de volgende query kunnen opstellen:
Een probleem is echter wel, dat je sommige woonplaatsen meerdere keren in de lijst terugziet. Dat is eigenlijk overbodig, want de beheerder wil alleen weten uit welke steden zijn klanten komen. Om unieke rijen te krijgen kun je het beste gebruik maken van DISTINCT
. Hiermee verwijder je alle dubbele waarden uit het resultaat. De query ziet er als volgt uit:
2.2 Oefening: Geef een lijst van alle landen waar onze klanten vandaan komen
Als je bepaalde rijen wilt selecteren die voldoen aan één of meerdere voorwaarden, dan gebruik je WHERE
.
In het volgende voorbeeld maken we een lijstje van de Klanten die in "Spanje" wonen.
De query wordt:
De basis syntax voor de query is:
In de voorwaarde zit altijd een operator, je kunt de volgende operatoren in SQL gebruiken:
Operator
Betekenis
=
is gelijk aan
<
is kleiner dan
>
is groter dan
<=
is kleiner of gelijk aan
>=
is groter of gelijk aan
<>
is niet gelijk aan
between
ligt tussen
in
is een van de volgende waarden
2.4 Oefening
Welke klanten hebben de voornaam "Mark"? (geef de voornaam en de achternaam)
Met BETWEEN moet de kolomwaarde tussen twee waarden liggen.
Voorbeeld:
Met het commando IN kun je hetzelfde bereiken als met OR maar de query wordt dan korter.
Als je de klanten wilt selecteren die in France, Canada of Netherlands wonen, dan kun je als voorwaarde gebruiken:
Maar het kan ook met de volgende voorwaarde:
De volledige query wordt dan als volgt:
e volgende opdrachten maak je in repl.ot. Je bedenkt voor elke informatiebehoefte een query en geeft die query als antwoord op de vraag.
Welke klanten komen uit 'the Netherlands'?
Geef een (unieke) lijst van alle landen waar onze klanten zitten?
Geef een lijst van alle Tracks die langer duren dan 200000 ms.
Sorteer bovenstaande lijst van laag naar hoog.
Wat zijn track namen van de de 3 langste tracks
LIKE is een krachtige operator. Met LIKE kun je selecteren op gedeelten van de tekst.
Stel dat je een lijstje wilt van de klanten waarvan de naam met een D begint. Dat kan met de volgende query:
Je ziet dat er na LIKE staat: 'D%'
Het %
teken is een zogenaamde wildcard en staat voor een willekeurig aantal tekens.
Het betekent dus dat de naam met een D moet beginnen, en wat er achter staat doet er niet toe, dat mag alles zijn.
Als je alle namen en hun woonplaatsen wilt hebben van mensen die een dubbele l (ll) in hun naam hebben, dan gebruik je de volgende query:
In combinatie met LIKE
kun je nog een andere wildcard gebruiken, namelijk het teken _ , de underscore. Dat teken staat voor één willekeurig teken (en een procentteken (%) staat voor meerdere willekeurige tekens (dat kan ook één of nul zijn).
Stel dat we alle namen willen hebben van de klanten waarvan de naam uit vier letters bestaat. De query wordt dan:
We kunnen de beide wildcards ook combineren. Stel dat we de namen van de klanten willen hebben waarvan de voorlaatste letter een e is.
Die krijg je m.b.v. de volgende query:
2.6 Oefening
Geef de voornaam, achternaam van alle klanten waarvan de eerste letter van de voornaam met een a, e, i, o of u begint.
NOT
Met NOT kun je de klanten krijgen die niet aan een bepaalde voorwaarde voldoen.
Stel dat je alle klanten wilt hebben die niet in Canada wonen.
Dat kan m.b.v. de volgende query:
Je kunt hetzelfde lijstje krijgen m.b.v. deze query:
Als je wilt controleren m.b.v. SQL of een kolom is ingevuld dan gebruik je IS NULL
Je kunt bijvoorbeeld de volgende query uitproberen:
Het resultaat is een lijst van klanten waarvan geen telefoonnummer in de database is geregistreerd.
Je zou ook het omgekeerde kunnen bevragen: dus alle leerlingen die wel een telefoonnummer hebben. Dat kan zo:
2.7 Oefening
Je kunt het aantal rijen dat wordt afgedrukt beperken m.b.v. LIMIT.
Stel dat je de top 2 jongste werknemers uit de database wilt. Je zou dan de volgende query kunnen opstellen.
LIMIT 3 geeft aan dat de query moet stoppen na de derde rij.
Stel dat je de drie mensen wilt hebben, die wat hun geboortedatum betreft op de plaatsen 3, 4 en 5 staan. Dus de twee hoogsten niet, maar de drie die daarop volgen. Dat kan met de volgende query:
Je ziet dat er nu na LIMIT 2,3 staat; dat betekent dat er wordt begonnen met rij nummer 2 (dat is de derde rij want er wordt begonnen met tellen bij 0, de eerste rij heeft nummer 0 en de tweede rij heeft nummer 1), en er worden 3 rijen afgedrukt.