Prezentowane materiały są przeznaczone dla uczniów szkół ponadgimnazjalnych Autor artykułu: mgr Jerzy Wałaszek |
©2014 mgr
Jerzy Wałaszek
|
Zadanie do wykonania we wtorek, 24.03.2015 na lekcji informatyki.
Pliki noworodki.txt oraz mamy.txt zawierają dane o dzieciach i ich matkach.
W pliku noworodki.txt każdy wiersz zawiera następujące informacje o jednym dziecku, rozdzielone znakami spacji: identyfikator, płeć (c – córka, s – syn), imię, data urodzenia, waga [g], wzrost [cm] oraz identyfikator matki.
Przykład:
1 c Agnieszka 20-lis-1999 2450 48 33
W pliku mamy.txt każdy wiersz zawiera informacje o jednej kobiecie, rozdzielone znakami spacji: identyfikator matki, imię, wiek.
Przykład:
1 Agata 25
Identyfikator matki z pliku noworodki.txt odpowiada identyfikatorowi w pliku mamy.txt.
Wykorzystując dane zawarte w plikach mamy.txt i noworodki.txt oraz dostępne narzędzia informatyczne, wykonaj poniższe polecenia.
noworodki | ||||||
id_dziecka | plec | imie_dziecka | data_urodzenia | waga | wzrost | id_mamy |
INT | CHAR(1) | VARCHAR(20) | DATE | INT | INT | INT |
matki | ||
id_matki | imie_matki | wiek |
INT | VARCHAR(20) | INT |
Tabele są połączone relacją: noworodki.id_mamy → matki.id_matki
Logujemy się na serwer mysql i tworzymy odpowiednie tabele:
CREATE TABLE noworodki ( id_dziecka INT PRIMARY KEY, plec CHAR(1) NOT NULL, imie_dziecka VARCHAR(20) NOT NULL, data_urodzenia DATE NOT NULL, waga INT NOT NULL, wzrost INT NOT NULL, id_mamy INT NOT NULL ); CREATE TABLE matki ( id_matki INT PRIMARY KEY, imie_matki VARCHAR(20) NOT NULL, wiek INT NOT NULL );
Pobieramy pliki noworodki.txt do katalogu /tmp.
Plik wczytujemy do tabeli w bazie danych
LOAD DATA INFILE '/tmp/noworodki.txt' INTO TABLE noworodki FIELDS TERMINATED BY ' ';
Sprawdź, czy dane zostały poprawnie odczytane:
SELECT * FROM noworodki;
Rekordów ma być 180.
Pobieramy do katalogu /tmp plik mamy.txt i wczytujemy go do tabeli:
LOAD DATA INFILE '/tmp/mamy.txt' INTO TABLE matki FIELDS TERMINATED BY ' '; SELECT * FROM matki;
Tabela powinna zawierać 174 wiersze.
Rozwiązanie uzyskamy za pomocą dwóch zapytań, które wyświetlą z tabeli noworodki zawartości dwóch kolumn: imie_dziecka oraz wzrost. W pierwszym zapytaniu zażądamy, aby pola plec zawierały s (syn), a w drugim c (córka). Wyniki będą posortowane malejąco względem kolumny wzrost. Wystarczy zatem odczytać pierwszy wiersz tabeli wynikowej:
SELECT imie_dziecka AS Imię, wzrost AS Wzrost FROM noworodki WHERE plec='s' ORDER BY wzrost DESC; SELECT imie_dziecka AS Imię, wzrost AS Wzrost FROM noworodki WHERE plec='c' ORDER BY wzrost DESC;
Gdyby chodziło o wyświetlenie tylko tych dzieci, bez pozostałej reszty, to musimy wykorzystać grupowanie i funkcję agregującą MAX. Grupowanie powoduje wykonanie funkcji agregującej na wszystkich rekordach, które w danej kolumnie posiadają taką samą wartość. Zatem jeśli zgrupujemy tablicę noworodki wg kolumny plec, to powstaną dwie grupy: chłopców o polu plec równym s oraz dziewcząt o polu plec równym c. Wydajemy polecenie:
SELECT plec, MAX(wzrost) FROM noworodki GROUP BY plec;
Znając maksymalny wzrost w grupie dziewcząt (c, 61) i chłopców (s,62), możemy wydać polecenia:
SELECT imie_dziecka AS Imię, wzrost AS Wzrost FROM noworodki WHERE plec='s' AND wzrost=62;
oraz:
SELECT imie_dziecka AS Imię, wzrost AS Wzrost FROM noworodki WHERE plec='c' AND wzrost=61;
W zapytaniu można również wykorzystywać wynik zwrócony przez inne zapytanie. Identyczny efekt otrzymamy, każąc bazie danych wyliczyć odpowiednie wzrosty maksymalne w grupie chłopców i dziewcząt:
SELECT imie_dziecka AS Imię, wzrost AS Wzrost FROM noworodki WHERE plec='s' AND wzrost=(SELECT MAX(wzrost) FROM noworodki WHERE plec='s'); SELECT imie_dziecka AS Imię, wzrost AS Wzrost FROM noworodki WHERE plec='c' AND wzrost=(SELECT MAX(wzrost) FROM noworodki WHERE plec='c');
Tutaj musimy zastosować grupowanie wg daty i policzyć liczbę rekordów w każdej z grup. Wykonamy to za pomocą funkcji agregującej COUNT(*):
SELECT data_urodzenia, COUNT(*) AS 'Liczba urodzin' FROM noworodki GROUP BY data_urodzenia ORDER BY COUNT(*);
Wynik odczytujemy z ostatniego wiersza.
W zapytaniu musimy połączyć ze sobą obie tabele:
SELECT imie_matki AS Matka, wiek AS Wiek, waga AS 'Waga dziecka' FROM matki,noworodki WHERE id_matki=id_mamy AND wiek < 25 AND waga > 4000 ORDER BY Matka;
Znów łączymy tabele w zapytaniu:
SELECT imie_dziecka AS 'Imię dziecka', data_urodzenia AS 'Data urodzenia' FROM matki, noworodki WHERE id_mamy=id_matki AND imie_dziecka=imie_matki ORDER BY imie_dziecka;
Warunek: ta sama data urodzenia oraz ta sama matka. Musimy zatem zgrupować wyniki zapytania względem kolumn data_urodzenia i id_mamy. Następnie należy policzyć ilość rekordów w każdej grupie i wyświetlić ze zgrupowania tylko te, które mają wartość COUNT(*) większą od 1:
SELECT data_urodzenia AS 'Data narodzin bliźniąt' FROM noworodki GROUP BY data_urodzenia,id_mamy HAVING COUNT(*)>1;
Korzystając z danych zawartych w plikach uczniowie.txt, oceny.txt, przedmioty.txt oraz z dostępnych narzędzi informatycznych wykonaj poniższe polecenia.
Wyniki należy przesłać jako załącznik lub treść listu pod adres: i-lo@eduinf.waw.pl. Na początku pliku wyników należy umieścić swoje imię i nazwisko. W rozwiązaniu należy podać polecenia mysql oraz wyniki ich działania, które kopiujemy z okna terminala (tekst należy zaznaczyć myszką, kliknąć prawym przyciskiem i z menu podręcznego wybrać polecenie kopiuj) do notatnika leafpad. Odpowiedzi bez poleceń mysql nie będą oceniane.
uczniowie | |||||
id_ucznia | nazwisko | imie | ulica | dom | id_klasy |
INT | VARCHAR(20) | VARCHAR(15) | VARCHAR(20) | INT | CHAR(2) |
oceny | |||
id_ucznia | ocena | data | id_przedmiotu |
INT | INT | DATE | INT |
przedmioty | |||
id_przedmiotu | nazwa_przedmiotu | nazwisko_naucz | imie_naucz |
INT | VARCHAR(15) | VARCHAR(20) | VARCHAR(15) |
Tabele są powiązane relacjami:
oceny.id_przedmiotu → przedmioty.id_przedmiotu
Logujemy się do mysql i wpisujemy:
CREATE TABLE uczniowie ( id_ucznia INT PRIMARY KEY, nazwisko VARCHAR(20) NOT NULL, imie VARCHAR(15) NOT NULL, ulica VARCHAR(20) NOT NULL, dom INT, id_klasy CHAR(2) NOT NULL );CREATE TABLE oceny ( id_ucznia INT NOT NULL, ocena INT NOT NULL, data DATE NOT NULL, id_przedmiotu INT NOT NULL );CREATE TABLE przedmioty ( id_przedmiotu INT PRIMARY KEY, nazwa_przedmiotu VARCHAR(15) NOT NULL, nazwisko_naucz VARCHAR(20) NOT NULL, imie_naucz VARCHAR(15) );
Pliki uczniowie.txt, oceny.txt, przedmioty.txt kopiujemy do katalogu /tmp i wczytujemy do tabel:
LOAD DATA INFILE '/tmp/uczniowie.txt' INTO TABLE uczniowie FIELDS TERMINATED BY ';';LOAD DATA INFILE '/tmp/oceny.txt' INTO TABLE oceny FIELDS TERMINATED BY ';';LOAD DATA INFILE '/tmp/przedmioty.txt' INTO TABLE przedmioty FIELDS TERMINATED BY ';';
Po prostu zliczamy rekordy z tabeli uczniowie, w których pole ulica jest równe Worcella lub Sportowa:
SELECT COUNT(*) AS 'Liczba uczniów spoza rejonu' FROM uczniowie WHERE ulica='Worcella' OR ulica='Sportowa';
I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe