
In deze post sta ik stil bij een stukje SQL. Het SQL statement dat ik wil behandelen is ‘group by’, waarmee we gegevens uit de in een tabel kunnen samenvoegen, of wel groeperen. Hierbij is ook het ‘having’ statement nuttig, waarmee een voorwaarde kan worden toegekend aan welke van de gegroepeerde gegevens getoond moeten worden in het resultaat van je query.
Dat vraagt om een voorbeeld. Stel we hebben een tabel, die informatie bevat over landen, haar provincies (in de tabel district), haar steden en de inwonersaantallen daarvan. Die tabel ziet er alsvolgt uit:
1 2 3 4 5 6 7 8 9 |
ID Name CountryCode District Population --- --------------------- ----------- ---------------- ---------- 1 Kabul AFG Kabol 1780000 2 Qandahar AFG Qandahar 237500 3 Herat AFG Herat 186800 4 Mazar-e-Sharif AFG Balkh 127800 5 Amsterdam NLD Noord-Holland 731200 6 Rotterdam NLD Zuid-Holland 593321 7 Haag NLD Zuid-Holland 440900 |
Stel nu dat we willen weten in hoeveel inwoners de gezamelelijke steden in elk district hebben. Dat kunnen we opvragen met de volgende query opdracht.
1 2 3 4 5 6 7 8 |
select CountryCode, District, sum(Population) from CITY group by District, CountryCode; |
Deze opdracht geeft een volgende resultaat terug. Ik heb hier niet het complete resultaat van de query afgedruukt, daar die in mijn voorbeelddatabase 1412 records beslaat. Merk op dat er dus ook landen bij zijn, waarbij de kolom district geen waarde bevat.
1 2 3 4 5 6 7 8 9 10 11 |
CountryCode District sum(Population) ----------- -------------------- --------------- TWN 393,616 VEN 134,501 GEO Abhasia [Aphazeti] 111,700 CIV Abidjan 2,500,000 ITA Abruzzit 115,698 ARE Abu Dhabi 624,665 IDN Aceh 253,009 BRA Acre 259,537 TUR Adana 1,479,816 |
We gaan nu een stap verder. Door aan de query een ‘having’ clause toe te voegen, gaan we een extra voorwaarde aan de selectie toekennen. Ik wil dit keer alleen die districten terug zien, waarvan de vermelde steden gezamelijk meer dan een miljoen inwoners hebben. De SQL daarvoor ziet er alsvolgt uit.
1 2 3 4 5 6 7 8 9 |
select CountryCode, District, sum(Population) from CITY group by District, CountryCode having sum(Population)>1000000; |
En, ter verduidelijking, een greep uit het resultaat.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
CountryCode District sum(Population) ----------- -------------------- --------------- CIV Abidjan 2,500,000 TUR Adana 1,479,816 ETH Addis Abeba 2,495,000 JPN Aichi 4,812,894 EGY al-Qalyubiya 1,389,515 SAU al-Sharqiya 1,572,100 CAN Alberta 1,384,388 EGY Aleksandria 3,328,196 SYR Aleppo 1,261,983 DZA Alger 2,168,000 KAZ Almaty Qalasy 1,129,400 BRA Amazonas 1,255,049 |
Uiteraard is het ook mogelijk in de query aanvullende voorwaarde mee te geven aan de selectie voordat die met het group by statement wordt gegroepeerd. De volgende SQL bijvoorbeeld, levert enkel districten terug in Nederland. In dit geval filteren we dus op landcode.
1 2 3 4 5 6 7 8 9 10 |
select CountryCode, District, sum(Population) from CITY where CountryCode = 'NLD' group by District, CountryCode having sum(Population)>1000000; |
En het resultaat.
1 2 3 4 |
CountryCode District sum(Population) ----------- ------------- --------------- NLD Noord-Holland 1,219,028 NLD Zuid-Holland 1,476,710 |
De voorwaarden kunnen we natuurlijk helemaal naar wens verder uitbouwen. Bijvoorbeeld door nog een extra and clause mee te geven, waarmee alleen districten worden geselecteerd waarvan de naam met een ‘Z’ begint. Uiteraard blijft de having clause van kracht die zegt dat het gevonden resultaat alleen mag worden getoond wanneer het district meer dan een miljoen inwoners heeft.
1 2 3 4 5 6 7 8 9 10 11 |
select CountryCode, District as provincie, sum(Population) as inwoners from CITY where CountryCode = 'NLD' and District like 'Z%' group by District, CountryCode having sum(Population)>1000000; |
We kunnen dit soort queries natuurlijk nog verder uitbouwen door koppelingen te maken naar andere tabellen, en zo informatie uit meerdere tabellen in onze database in een query resultaat uitvragen. Daarop zal ik in een volgende post ingaan.
Laat een reactie achter