SQL feladatok és megoldások 1. Logikai feltételek: ÉS feltétel (AND): Listázd ki a 10 és 11 millió fő közé eső lakosságú országokat! (a különböző oszlopokba írt feltételek egymással és kapcsolatban vannak) SELECT ORSZAG.ORSZAGNEV, ORSZAG.OLELEKSZAM FROM ORSZAG WHERE (((ORSZAG.OLELEKSZAM)>10000) AND ((ORSZAG.OLELEKSZAM)<11000)); SQL megoldás egyszerűbben: (a felesleges táblaazonosítók és zárójelek nélkül) SELECT ORSZAGNEV, OLELEKSZAM FROM ORSZAG WHERE (OLELEKSZAM > 10000) AND (OLELEKSZAM < 11000); ORSZAGNEV OLELEKSZAM Belorusszia 10250 Ecuador 10262 Görögország 10041 Jugoszlávia 10411 Kamerun 10817 Kuba 10450 Magyarország 10567 Portugália 10460 Zimbabwe 10119 Egy másik egyenértékű 1
ÉS feltétel megvalósítása Between, And operátorok segítségével: SELECT ORSZAG.ORSZAGNEV, ORSZAG.OLELEKSZAM FROM ORSZAG WHERE (((ORSZAG.OLELEKSZAM) Between 10000 And 11000)); Vagy feltétel (OR): Listázd ki a magyar és osztrák városokat! Vigyázat! A feladat szövegében az és csak egy kötőszó! Az eredménytábla soraira nézve ez egy vagy feltétel! A magyar vagy osztrák városokat szeretném megjelenítetni, olyan város nem is létezik, amely egyszerre (ez lenne az és ) mindkét országhoz tartozik. (a különböző sorokba írt feltételek egymással vagy kapcsolatban vannak) SELECT VAROS.VAROSNEV, VAROS.ORSZAGNEV WHERE (((VAROS.ORSZAGNEV)="Magyarország")) OR (((VAROS.ORSZAGNEV)="")); VAROSNEV ORSZAGNEV Bécs Budapest Debrecen Graz Győr Innsbruck Kecskemét Magyarország Magyarország Magyarország Magyarország VAROSNEV ORSZAGNEV Klagenfurt Linz Miskolc Magyarország Nyíregyháza Magyarország Pécs Magyarország Salzburg Sant Pölten VAROSNEV ORSZAGNEV Steyr Szeged Magyarország Székesfehérvár Magyarország Szolnok Magyarország Szombathely Magyarország Villach Wels 2
Egy másik egyenértékű VAGY feltétel megvalósítása IN operátor segítségével: SELECT VAROS.VAROSNEV, VAROS.ORSZAGNEV WHERE (((VAROS.ORSZAGNEV) In ("Magyarország",""))); Tagadás (NOT): Listázd ki a nem magyar városokat! SELECT VAROS.VAROSNEV, VAROS.ORSZAGNEV WHERE ((Not (VAROS.ORSZAGNEV)="Magyarország")); 3
Logikai műveletek sorrendje: Listázd ki a kétszázezer lakosnál népesebb magyar és osztrák városokat! SELECT VAROS.VAROSNEV, VAROS.ORSZAGNEV, VAROS.VLELEKSZAM WHERE (((VAROS.ORSZAGNEV)="Magyarország") AND ((VAROS.VLELEKSZAM)>200)) OR (((VAROS.ORSZAGNEV)="") AND ((VAROS.VLELEKSZAM)>200)); VAROSNEV ORSZAGNEV VLELEKSZAM Bécs: 1531 Budapest Magyarország 2115 Debrecen Magyarország 220 Graz 243 Miskolc Magyarország 208 Egy másik egyenértékű SELECT VAROS.VAROSNEV, VAROS.ORSZAGNEV, VAROS.VLELEKSZAM WHERE ( ((VAROS.ORSZAGNEV)="Magyarország" Or (VAROS.ORSZAGNEV)="") AND ((VAROS.VLELEKSZAM)>200) ); 4
2. Igen/nem (logikai) típusú változók használata: Listázd ki a XX. században születet nem barbár gumimacikat! (igaz/hamis) (true/false) SELECT Gumimaci.maci_nev, Gumimaci.szül_idő, Gumimaci.barbar_e FROM Gumimaci WHERE (((Gumimaci.szül_idő) Between #1/1/1900# And #12/31/1999#) AND ((Gumimaci.barbar_e)=False)); Egy másik egyenértékű SQL megoldás: SELECT Gumimaci.maci_nev, Gumimaci.szül_idő, Gumimaci.barbar_e FROM Gumimaci WHERE((Gumimaci.szül_idő) Between #1/1/1900# And #12/31/1999#) AND (Not(Gumimaci.barbar_e)); Listázd ki a nőnemű barbár gumimacikat! (A nőnemű macik kódjának első karaktere 1 értékű) (igaz/hamis) (true/false) SELECT Gumimaci.maci_nev, Gumimaci.maci_kod, Gumimaci.barbar_e FROM Gumimaci WHERE ((Left([maci_kod],1)="1") AND ((Gumimaci.barbar_e)=True)); Egy másik egyenértékű SQL megoldás: SELECT Gumimaci.maci_nev, Gumimaci.maci_kod, Gumimaci.barbar_e FROM Gumimaci WHERE ((Left([maci_kod],1)="1") AND Gumimaci.barbar_e); 5
3. Rendezés Rendezd a fővárosokat növekvő ill. csökkenő sorrendbe! SELECT ORSZAG.FOVAROSNEV FROM ORSZAG ORDER BY ORSZAG.FOVAROSNEV; SELECT ORSZAG.FOVAROSNEV FROM ORSZAG ORDER BY ORSZAG.FOVAROSNEV DESC; Listázd ki a városokat országok szerint növekvő és azon belül lakosság szerint csökkenő sorrendbe! SELECT VAROS.VAROSNEV, VAROS.ORSZAGNEV, VAROS.VLELEKSZAM ORDER BY VAROS.ORSZAGNEV, VAROS.VLELEKSZAM DESC; 6
VAROSNEV ORSZAGNEV VLELEKSZAM Kabul Afganisztán 1424 Qandahar Afganisztán 226 Herat Afganisztán 177 Mazar-i-Sharif Afganisztán 131 Jalalabad Afganisztán 58 Qonduz Afganisztán 57 Baghlan Afganisztán 41 Magmana Afganisztán 40 Pul-i-Khomri Afganisztán 33 Ghazni Afganisztán 32 Tirana Albánia 226 Durres Albánia 79 Elbasan Albánia 78 Shkoder Albánia 76 Vlore Albánia 68 Korce Albánia 62 Berat Albánia 41 VAROSNEV VLELEKSZAM ORSZAGNEV Kabul 1424 Afganisztán Qandahar 226 Afganisztán Herat 177 Afganisztán Mazar-i-Sharif 131 Afganisztán Jalalabad 58 Afganisztán Qonduz 57 Afganisztán Baghlan 41 Afganisztán Magmana 40 Afganisztán Pul-i-Khomri 33 Afganisztán Ghazni 32 Afganisztán Tirana 226 Albánia Durres 79 Albánia Elbasan 78 Albánia Shkoder 76 Albánia Vlore 68 Albánia Korce 62 Albánia Berat 41 Albánia Oldjuk meg az előző feladatot úgy, hogy az országok az utolsó oszlopban legyenek! SELECT VAROS.VAROSNEV, VAROS.VLELEKSZAM, VAROS.ORSZAGNEV ORDER BY VAROS.ORSZAGNEV, VAROS.VLELEKSZAM DESC; Egy másik egyenértékű 7
4. Összegzés Az adatbázisban hány (darab) város tartozik az egyes országokhoz? SELECT VAROS.ORSZAGNEV, Count(VAROS.VAROSNEV) AS CountOfVAROSNEV GROUP BY VAROS.ORSZAGNEV; ORSZAGNEV CountOfVAROSNEV Afganisztán 10 Albánia 9 Algéria 13 Amerikai Szamoa 5 Amerikai Virgin-szigetek 4 Andorra 2 Angola 7 Antigua 2 Arab Emírségek 4 Argentína 11 Mekkora a Föld lakossága, hány ország van rajta, mekkora legnagyobb, a legkisebb és az átlagos országlélekszám? SELECT Sum(ORSZAG.OLELEKSZAM) AS SumOfOLELEKSZAM, Count(ORSZAG.OLELEKSZAM) AS CountOfOLELEKSZAM, Min(ORSZAG.OLELEKSZAM) AS MinOfOLELEKSZAM, Max(ORSZAG.OLELEKSZAM) AS MaxOfOLELEKSZAM, Avg(ORSZAG.OLELEKSZAM) AS AvgOfOLELEKSZAM FROM ORSZAG; SumOfOLELEKSZAM CountOfOLELEKSZAM MinOfOLELEKSZAM MaxOfOLELEKSZAM AvgOfOLELEKSZAM 5251951 206 2 1112299 25494,9077669903 8
QBE megoldás olvashatóbb mezőnevekkel az eredménytáblában: SELECT Sum(ORSZAG.OLELEKSZAM) AS [Föld lakossága], Count(ORSZAG.OLELEKSZAM) AS [Országok száma], Min(ORSZAG.OLELEKSZAM) AS [Legkisebb népesség], Max(ORSZAG.OLELEKSZAM) AS [Legnagyobb népesség], Avg(ORSZAG.OLELEKSZAM) AS [Átlagos népesség] FROM ORSZAG; Föld lakossága Országok száma Legkisebb népesség Legnagyobb népesség Átlagos népesség 5251951 206 2 1112299 25494,9077669903 Mekkora az átlagos városi lakosságszáma azoknak az országoknak, melyeknek a neve m vagy s betűvel kezdődik, és 10-nél több városuk van? SELECT VAROS.ORSZAGNEV AS Országnév, Count(VAROS.VAROSNEV) AS Városszám, Avg(VAROS.VLELEKSZAM) AS [Átlagos városi lélekszám] GROUP BY VAROS.ORSZAGNEV HAVING (((VAROS.ORSZAGNEV) Like "m*") AND ((Count(VAROS.VAROSNEV))>10)) OR (((VAROS.ORSZAGNEV) Like "s*") AND ((Count(VAROS.VAROSNEV))>10)) ORDER BY Avg(VAROS.VLELEKSZAM) DESC; Országnév Városszám Átlagos városi lélekszám Mexikó 15 1158,47 Marokkó 11 1071,18 Spanyolország 19 566,95 Magyarország 11 323,64 Malaysia 13 217,69 Svédország 15 175,53 Svájc 11 117,73 9
5. Számított mező Mekkora lesz az Indiai városok lakossága 10 év múlva, ha kb. 15% növekedéssel számolhatunk! SELECT VAROS.ORSZAGNEV AS Országnév, VAROS.VAROSNEV AS Városnév, VAROS.VLELEKSZAM AS [Jelen városi lélekszám], [VLELEKSZAM]*1.15 AS [Becsült jövőbeli lélekszám] WHERE (((VAROS.ORSZAGNEV)="India")) ORDER BY VAROS.VLELEKSZAM DESC; Országnév Városnév Jelen városi lélekszám Becsült jövőbeli lélekszám India Bombay 8243,00 9479,45 India Új-Delhi 5714,00 6571,1 India Calcutta 3305,00 3800,75 India Madras 3277,00 3768,55 India Bangalore 2476,00 2847,4 India Hyderabad 2151,00 2473,65 India Ahmedabad 2060,00 2369 6. Azonos értékek szűrése Írasd ki az a betűs országokat a város táblából, de mindegyiket csak egyszer! SELECT DISTINCT VAROS.ORSZAGNEV WHERE (((VAROS.ORSZAGNEV) Like "a*")); 10
7. Csoportosítás számított mezőre Listázd ki azokat a betűket, amelyekkel több mint 10 ország neve kezdődik! SELECT Left([ORSZAGNEV],1) AS Kezdőbetű, Count(ORSZAG.ORSZAGNEV) AS CountOfORSZAGNEV FROM ORSZAG GROUP BY Left([ORSZAGNEV],1) HAVING (((Count(ORSZAG.ORSZAGNEV))>10)) ORDER BY Count(ORSZAG.ORSZAGNEV) DESC; Kezdőbetű CountOfORSZAGNEV S 23 B 20 M 17 K 16 A 14 G 12 T 11 N 11 8. Paraméteres lekérdezés Listázd ki a kezelő által megadott ország városait! SELECT VAROS.ORSZAGNEV, VAROS.VAROSNEV WHERE (((VAROS.ORSZAGNEV)=[Kérem az ország nevét:])); ORSZAGNEV VAROSNEV Bécs Graz Innsbruck Klagenfurt Linz Salzburg 11
9. Táblák egyesítése Listázzuk ki az ország, illetve a város táblát! SELECT ORSZAG.* FROM ORSZAG; SELECT VAROS.* ; Hozzuk létre a két tábla direktszorzatát! (Minden sort minden sorral párosítunk.) SELECT ORSZAG.*, VAROS.*, ORSZAG; 12
Hozzuk létre a két tábla természetes összefésülését! (Minden várost csak a hozzá tartozó országgal párosítunk.) SELECT ORSZAG.*, VAROS.* FROM ORSZAG INNER JOIN VAROS ON ORSZAG.ORSZAGNEV = VAROS.ORSZAGNEV; Hozzuk létre a két tábla balról illesztését! (Minden várost csak a hozzá tartozó országgal párosítunk, de azokat az országokat is kiírjuk, melyeknek nincs városuk az adatbázisban.) SELECT ORSZAG.*, VAROS.* FROM ORSZAG LEFT JOIN VAROS ON ORSZAG.ORSZAGNEV = VAROS.ORSZAGNEV; 13
Mely országoknak nincs városuk? SELECT ORSZAG.ORSZAGNEV, VAROS.VAROSNEV FROM ORSZAG LEFT JOIN VAROS ON ORSZAG.ORSZAGNEV = VAROS.ORSZAGNEV WHERE (((VAROS.VAROSNEV) Is Null)); ORSZAGNEV VAROSNEV Eldorádó Tündérország Listázd ki a fővárosokat népesség szerint csökkenő sorrendben! 14
SELECT ORSZAG.ORSZAGNEV, ORSZAG.FOVAROSNEV, VAROS.VLELEKSZAM FROM ORSZAG INNER JOIN VAROS ON (ORSZAG.FOVAROSNEV = VAROS.VAROSNEV) AND (ORSZAG.ORSZAGNEV = VAROS.ORSZAGNEV) ORDER BY VAROS.VLELEKSZAM DESC; ORSZAGNEV FOVAROSNEV VLELEKSZAM Egyiptom Kairó 11000 Dél-Korea Szöul 9646 Mexikó Mexikóváros 8831 Oroszország Moszkva 8769 Franciaország Párizs 8707 Japán Tokió 8324 Nagy-Britannia London 6678 Mely országok nevei városnevek is egyben? SELECT ORSZAG.ORSZAGNEV FROM ORSZAG INNER JOIN VAROS ON ORSZAG.ORSZAGNEV = VAROS.VAROSNEV; ORSZAGNEV Macau Monaco Salvador San Marino 15
10. Összetett lekérdezések Mely városnevek szerepelnek kettőnél több országban, és melyek ezek az országok? QBE megoldás első lépcső: SELECT VAROS.VAROSNEV, Count(VAROS.ORSZAGNEV) AS CountOfORSZAGNEV GROUP BY VAROS.VAROSNEV HAVING (((Count(VAROS.ORSZAGNEV))>2)) ORDER BY Count(VAROS.ORSZAGNEV) DESC; Az eredmény Többszörös városnevek néven elmentve: VAROSNEV CountOfORSZAGNEV QBE megoldás második lépcső: Victoria 4 Santiago 4 Georgetown 4 San Juan 3 Hamilton 3 SELECT VAROS.VAROSNEV, VAROS.ORSZAGNEV, VAROS.VLELEKSZAM INNER JOIN [Többszörös városnevek] ON VAROS.VAROSNEV = [Többszörös városnevek].varosnev; 16
VAROSNEV ORSZAGNEV VLELEKSZAM Georgetown Malaysia 251 Georgetown Saint Vincent 1 Georgetown Gambia 3 Georgetown Guyana 200 Hamilton Új-Zéland 104 Hamilton Kanada 307 Hamilton Bermuda 3 San Juan Argentína 292 San Juan Dominikai Köztársaság 50 San Juan Puerto Rico 449 17