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