
Zoals in mijn vorige post over SQl en het group by statement beloofd, wijd ik nu nog wat verder uit over het combineren van informatie uit meerdere tabellen in je query.
Waarom dat nuttig kan zijn, ligt natuurlijk voor de hand. In een goed ingerichte database, wordt data vastgelegd in verschillende tabellen. De informatie die je query moet teruggeven zal dan ook vaak afkomstig zijn uit meer dan een tabel.
Laten we een voorbeeld nemen, waarbij we even teruggrijpen op mijn vorige post. We hebben dit keer te maken met twee tabellen. Ook hier hebben we te maken met de tabel ‘city’ tabel, die informatie bevat over landen, haar provincies. Daarnaast halen we dit keer informatie op uit de tabel ‘Country’. Hierin ligt informatie aangaande verschillende landen vast.
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 |
1 2 3 4 5 6 7 8 9 10 11 12 |
Code Name Continent Region ---- -------------------- ------------- ------------------------- ABW Aruba North America Caribbean AFG Afghanistan Asia Southern and Central Asia AGO Angola Africa Central Africa AIA Anguilla North America Caribbean ALB Albania Europe Southern Europe AND Andorra Europe Southern Europe ANT Netherlands Antilles North America Caribbean ARE United Arab Emirates Asia Middle East ARG Argentina South America South America ARM Armenia Asia Middle East |
Zoals je ziet ligt in beide tabellen informatie over het land vast. In de tabel city vinden we namelijk de CountryCode. Deze hebben we in de vorige post ook gebruikt in onder andere het volgende stukje SQL waarmee informatie wordt opgehaald over het aantal inwoners in de provinciesteden van een land.
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; |
1 2 3 4 |
CountryCode District sum(Population) ----------- ------------- --------------- NLD Noord-Holland 1,219,028 NLD Zuid-Holland 1,476,710 |
Nadeel van deze query is dat de CountryCode natuurlijk lang niet voor iedereen duidelijkheid geeft over het bedoelde land. Zoals je hierboven ziet vinden we in de tabel Country zowel de CountryCode als de volledige naam van het land. We gaan dus informatie uit beide tabellen ophalen om zo het resultaat van de query duidelijker te maken.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
select u.Name, c.CountryCode, c.District as provincie, sum(c.Population) as inwoners from CITY c, country u where u.Code = c.CountryCode and c.CountryCode = 'NLD' group by u.Name, c.District, c.CountryCode having sum(c.Population)>1000000; |
Het resultaat van de query geeft nu netjes een naam van het land terug. We zo duidelijk. Merk op dat in de SQL de tabellen en kolommen van een alias voorzien zijn. Het alias ‘c’ verwijst naar de city tabel. Het alias ‘u’ naar de tabel Country. Het gebruik van een alias is niet verplicht. Echter wel zo overzichtelijk en wanneer je verschillende tabellen hebt die kolommen bevatten met eenzelfde naam zelfs noodzakelijk.
Goed, het resultaat van de query. Dat ziet er nu alsvolgt uit.
1 2 3 4 |
Name CountryCode District inwoners ----------- ----------- ------------- --------- Netherlands NLD Noord-Holland 1,219,028 Netherlands NLD Zuid-Holland 1,476,710 |
Laat een reactie achter