Adatbázis feladatok MONDIAL adatbázissal Horváth Árpád 2015. október 16.
Határozza meg, hány városban van több mint 500 ezer lakos!
SELECT count(name) FROM city WHERE population > 500000; 468-ban.
SELECT majdnem általálnosan SELECT (kifejezés [AS alias] *),... FROM (táblaszerűségek [AS alias]),... WHERE feltétel GROUP BY mezőnév,... HAVING csoportosítás_utáni_feltétel ORDER BY (mezőnév [DESC]),... LIMIT szám;
Határozza meg, hány országban van olyan város, amelynek több mint 500 ezer lakosa van!
SELECT count(distinct country) FROM city WHERE population > 500000; 468-ban.
Listázza ki azokat az országokat, amelyek lakossága kisebb, mint Budapesté! A lekérdezés olyan legyen, hogyha változik Budapest és az országok lakossága, akkor is helyesen működjön. A következő mezők szerepeljenek a lekérdezésben: country.name country.population A rendezés a következő szerint legyen: population növekvő
SELECT country.name, country.population FROM city, country WHERE city.name = Budapest AND country.population < city.population ORDER BY country.population;
name population Pitcairn Islands 48 Cocos Islands 596 Holy See 840 (... ) Bhutan 1822625 Kuwait 1950047 Slovenia 1951443 Lesotho 1970781
Listázza ábécérendben azokat az országokat, amelyben van olyan város, amelynek több mint 3 millió lakosa van! Rendezés ABC-rendben.
SELECT DISTINCT country.name FROM city, country WHERE city.population > 3000000 AND city.country = country.code ORDER BY country.name;
27 ilyen ország van: name Australia Bangladesh Brazil Chile China Colombia Egypt Germany (... ) Spain Thailand Turkey United Kingdom United States Vietnam Zaire
27 ilyen ország van: Australia Bangladesh Brazil Chile China Colombia Egypt Germany Hong Kong India Indonesia Iran Iraq Japan Mexico Nigeria Pakistan name
name Peru Russia South Korea Spain Thailand Turkey United Kingdom United States Vietnam Zaire
Határozza meg a 2 millió főnél több lakosú városok listáját. Szerepeljen rajta a város neve, a lakossága ezer főben egészre kerekítve, és az ország neve. Rendezze csökkenő népességsorrendbe a városokat!
SELECT city.name, round(city.population/1000) AS population1000, country.name FROM city, country WHERE city.population > 2000000 AND city.country = country.code ORDER BY city.population DESC;
város lakosság (ezer fő) ország Seoul 10229 South Korea Mumbai 9926 India Karachi 9863 Pakistan Mexico City 9816 Mexico Sao Paulo 9812 Brazil Moscow 8717 Russia Jakarta 8259 Indonesia Tokyo 7843 Japan Shanghai 7830 China Istanbul 7616 Turkey New York 7323 United States New Delhi 7207 India Hong Kong 7055 Hong Kong Beijing 7000 China London 6968 United Kingdom Tehran 6750 Iran Lima 6321 Peru Cairo 6053 Egypt Bangkok 5876 Thailand
város lakosság (ezer fő) ország Tianjin 5770 China Lagos 5686 Nigeria Rio de Janeiro 5533 Brazil Bogota 5238 Colombia Lahore 5085 Pakistan Sankt Peterburg 4838 Russia Kinshasa 4655 Zaire Shenyang 4540 China Baghdad 4478 Iraq Calcutta 4400 India Santiago 4318 Chile Saigon 3924 Vietnam Madras 3841 India Dhaka 3839 Bangladesh Pusan 3814 South Korea Wuhan 3750 China Sydney 3657 Australia Guangzhou 3580 China Los Angeles 3486 United States
város lakosság (ezer fő) ország Berlin 3472 Germany Bangalore 3302 India Yokohama 3256 Japan Hyderabad 3146 India Melbourne 3081 Australia Hanoi 3056 Vietnam Madrid 3041 Spain Buenos Aires 2988 Argentina Chongqing 2980 China Ahmadabad 2955 India Casablanca 2941 Morocco Alexandria 2917 Egypt Harbin 2830 China Chengdu 2810 China Rome 2791 Italy Chicago 2784 United States Ankara 2782 Turkey Xian 2760 China Taipei 2626 Taiwan
város lakosság (ezer fő) ország Kiev 2616 Ukraine Singapore 2558 Singapore Rangoon 2513 Myanmar Nanjing 2500 China Osaka 2492 Japan Surabaya 2484 Indonesia Zibo 2460 China Taegu 2449 South Korea Dalian 2400 China Pyongyang 2335 North Korea Jinan 2320 China Addis Ababa 2316 Ethiopia Inchon 2308 South Korea Havana 2241 Cuba Salvador 2209 Brazil Paris 2152 France Changchun 2110 China Nagoya 2108 Japan Tashkent 2106 Uzbekistan
(81 rows) város lakosság (ezer fő) ország Belo Horizonte 2092 Brazil Qingdao 2060 China Bandung 2059 Indonesia Bucharest 2037 Romania Budapest 2016 Hungary
Listázza azokat a városokat, amelyek tenger (óceánt is beleértve) partján is fekszenek, és folyó partján is. Amely városok nem fekszenek tenger partján, ott a sea értéke NULL, hasonlóan a folyónál. A város neve mellett szerepeljen az ország kódja, a tenger és a folyó neve is. A tenger neve szerint legyen rendezve.
SELECT city, country, sea, river FROM located WHERE sea IS NOT NULL AND river IS NOT NULL ORDER BY sea;
Moulmein MYA Andaman Sea Saluen Banjul WAG Atlantic Ocean Gambia New York USA Atlantic Ocean Hudson River Belem BR Atlantic Ocean Tocantins Lisbon P Atlantic Ocean Tajo Porto P Atlantic Ocean Douro Vila Nova de Gaia P Atlantic Ocean Douro Riga LV Baltic Sea Western Dwina Gdansk PL Baltic Sea Weichsel Kotka SF Baltic Sea Kymijoki Oulu SF Baltic Sea Oulujoki Arkhangelsk R Barents Sea Northern Dwina Xai Xai MOC Indian Ocean Limpopo Goteborg S Kattegat Goetaaelv Southend on Sea GB North Sea Thames Bremerhaven D North Sea Weser Le Havre F The Channel Seine 17 ilyen szerepel az adatbázisban: city country sea river
Ezek már tényleg programozós feladatok, Python ismeret szükséges hozzá Osszuk fel a Föld felszínét 8 szeletre hosszúsági fokok szerint a következőképpen. Az elsőben legyenek a 180 o és 135 o fok közöttiek, majd így tovább 45 o -onként. Kérdések következnek.
Első kérdés Hány 2 milliósnál nagyobb város található egy-egy ilyen szeletben. Adja meg a számok listáját: hosszúság darab 180.. 135 135.. 90 90.. 45 45..0 0..45 45..90 90..135 135..180
A PostgreSQL-ben PL/Python nyelven definiált függvényével alábbi módon oldható meg: CREATE FUNCTION eloszlas(poplimit integer) RETURNS int[] AS $$ lowlimits = range(-180, 179, 45) sql_query_template = """SELECT count(name) FROM city WHERE longitude BETWEEN {} and {} AND population > %d""" % poplimit sql_query = sql_query_template.format(lim,lim+45) result = plpy.execute(sql_query) values = [result[0][ count ] for lim in lowlimits ] return values $$ LANGUAGE plpythonu;
A kapott értékek hosszúság darab 180.. 135 0 135.. 90 2 90.. 45 8 45..0 6 0..45 16 45..90 10 90..135 23 135..180 4
Válassza ki az előbbi szeletek legnagyobb városait. hosszúság legnagyobb város neve 180.. 135 135.. 90 90.. 45 45..0 0..45 45..90 90..135 135..180
DROP FUNCTION legnagyobb(); CREATE FUNCTION legnagyobb() RETURNS varchar(30)[] AS $$ sql_query_template = """SELECT name FROM city WHERE longitude BETWEEN {0} AND {1} AND population - (SELECT max(population) FROM city WHERE longitude BETWEEN {0} AND {1} ) < 3 """ values = [] step = 45 for minpop in range(-180, 179, step): sql_query = sql_query_template.format(minpop,minpop+step) biggest_city = plpy.execute(sql_query)[0][ name ] values.append(biggest_city) return values $$ LANGUAGE plpythonu;
A kapott eredmények hosszúság legnagyobb város neve 180.. 135 Apia 135.. 90 Guatemala City 90.. 45 Nassau 45..0 Madrid 0..45 Luxemburg 45..90 Kuwait 90..135 Singapore 135..180 Tokyo