Lista 1 - wmiRepo
Transkrypt
Lista 1 - wmiRepo
Bazy danych Lista pierwsza 1. 2. Ze strony wykªadu moodle.math.uni.wroc.pl ±ci¡gnij plik szkola.xls i obejrzyj go w programie Calc pakietu Open Oce (lub Excel pakietu Microsoft Oce). Twoje zadanie to zaimportowa¢ dane z tego pliku Postgresa, popracowa¢ troch¦ na tych danych i ostatecznie zaimportowa¢ otrzymane wyniki z powrotem do formatu xls. (a) Zapisz poszczególne arkusze do plików CSV. (Sprawd¹ np. w wikipedii, co to za format danych.) Po zapisaniu obejrzyj stworzone pliki w dowolnym edytorze tekstowym (np. eclipse, emacs, nano, cat). Zwró¢ uwag¦ na znak separatora poszczególnych pól. (b) W psql stwórz tabele uczniowie i stopnie o atrybutach jak w wej±ciowych danych; jako typ wszystkich atrybutów przyjmij TEXT. (Dlaczego?) CREATE TABLE osoby( nazwisko TEXT, imie TEXT, id_klasy TEXT , numer_w_dzienniku TEXT); CREATE TABLE stopnie(numer_w_dzienniku TEXT, id_klasy TEXT, przedmiot TEXT, ocena TEXT); (c) Sprawd¹ przeznaczenie i skªadni¦ polecenia COPY i podyskutuj z prowadz¡cym na temat jego odpowiednika copy. Zwró¢ gªównie uwag¦ na parametry sekcji CSV. Nast¦pnie zaimportuj dane z plików z podpunktu (a) do tabel Postgresa. Uwaga: w starszych wersjach klienta psql nie ma sekcji CSV; poeksperymentuj wtedy z WITH DELIMITER. \copy osoby FROM 'uczniowie.csv' CSV HEADER \copy stopnie FROM 'stopnie.csv' CSV HEADER (d) Wy±wietl wprowadzone przed chwil¡ dane. Poeksperymentuj z poleceniem pset; pami¦taj o wier- szu nagªówkowym. SELECT * FROM osoby; SELECT * FROM stopnie; (e) Stwórz tabel¦ uczniowie2, o takich samych atrybutach jak uczniowie, ale zmie« typ atrybutu nr w dzienniku na INTEGER. Nast¦pnie wypeªnij tabel¦ uczniowie2 danymi z tabeli uczniowie dokonuj¡c odpowiedniej konwersji typów oraz usuwaj¡c nadmiarowe spacje w danych. CREATE TABLE osoby2( nazwisko TEXT, imie TEXT, id_klasy TEXT , numer_w_dzienniku INTEGER); INSERT INTO osoby2 SELECT btrim(nazwisko), btrim(imie), btrim(id_klasy), numer_w_dzienniku::INTEGER FROM osoby; (f) Zrob analogiczn¡ konwersj¦ typów i pozb¡d¹ si¦ nadmiarowych spacji dla danych w tabeli stopnie. Wskazówka: tym razem u»yj typów INTEGER i DECIMAL(2,1) oraz, jak wcze±niej, funkcji btrim. CREATE TABLE stopnie2( numer_w_dzienniku INTEGER , id_klasy TEXT, przedmiot TEXT, ocena DECIMAL(2,1)); INSERT INTO stopnie2 SELECT numer_w_dzienniku::INTEGER, btrim(id_klasy), btrim(przedmiot), ocena::DECIMAL(2,1) FROM stopnie; (g) Wypisz wszystkich uczniów o imieniu Adam SELECT imie, nazwisko FROM osoby2 WHERE imie='Adam'; (h) Wypisz wszystkich uczniów klasy 1a, których numer z dziennika jest wi¦kszy ni» 3; wyniki posortuj malej¡co wzgl¦dem imion SELECT FROM WHERE ORDER BY imie, nazwisko uczniowie2 id_klasy = '1a' AND nr_w_dzienniku>3 imie DESC; 1 Lista pierwsza Bazy danych (i) Znajd¹ wszystkie klasy, w których który± z uczniów dostaª ocen¦ celuj¡c¡ z biologii. Usu« powtó- rzenia. SELECT id_klasy FROM stopnie2 WHERE przedmiot='biologia' AND ocena = 6.0 UNION SELECT id_klasy FROM stopnie2 WHERE przedmiot='biologia' AND ocena = 6.0; (j) Wypisz wszystkich uczniów, którzy dostali ocen¦ celuj¡c¡ z biologii lub z w-f. SELECT osoby2.imie, osoby2.nazwisko FROM osoby2, stopnie2 WHERE osoby2.id_klasy=stopnie2.id_klasy AND osoby2.numer_w_dzienniku=stopnie2.numer_w_dzienniku AND stopnie2.ocena=6.0 AND (stopnie2.przedmiot='biologia' OR stopnie2.przedmiot='w-f') UNION SELECT osoby2.imie, osoby2.nazwisko FROM osoby2, stopnie2 WHERE osoby2.id_klasy=stopnie2.id_klasy AND osoby2.numer_w_dzienniku=stopnie2.numer_w_dzienniku AND stopnie2.ocena=6.0 AND (stopnie2.przedmiot='biologia' OR stopnie2.przedmiot='w-f'); (k) Zapisz powy»sze zestawienie (z punktu (j)) do pliku zestaw.csv. W tym celu u»yj najpierw pole- cenia SELECT (...) INTO zestaw (...) i zapisz owo zestawienie w tabeli zestaw, a nast¦pnie posªu» si¦ poleceniem copy. CREATE TABLE zestaw(imie TEXT, nazwisko TEXT); INSERT INTO zestaw SELECT osoby2.imie, osoby2.nazwisko FROM osoby2, stopnie2 WHERE osoby2.id_klasy=stopnie2.id_klasy AND osoby2.numer_w_dzienniku=stopnie2.numer_w_dzienniku AND stopnie2.ocena=6.0 AND (stopnie2.przedmiot='biologia' OR stopnie2.przedmiot='w-f') UNION SELECT osoby2.imie, osoby2.nazwisko FROM osoby2, stopnie2 WHERE osoby2.id_klasy=stopnie2.id_klasy AND osoby2.numer_w_dzienniku=stopnie2.numer_w_dzienniku AND stopnie2.ocena=6.0 AND (stopnie2.przedmiot='biologia' OR stopnie2.przedmiot='w-f'); \copy zestaw INTO 'zestaw.csv' (g) Zaimportuj dane z pliku zestaw.csv do programu Calc (Excel). 3. Przy pomocy jednego zapytania wypisa¢ wszystkie permutacje zbioru trzyelementowego. CREATE INSERT INSERT INSERT TABLE g(k INTEGER); INTO g VALUES(1); INTO g VALUES(2); INTO g VALUES(3); SELECT g1.k AS "1", g2.k AS "2", g3.k AS "3" FROM g AS g1, g AS g2, g AS g3 WHERE g1.k != g2.k AND g2.k != g3.k AND g3.k!=g1.k; 2