Na dzisiejszych zajęciach nauczymy się korzystać z programu psql oraz poznamy podstawy pisania zapytań w języku SQL. Rozpoczynamy od zalogowania się na którykolwiek komputer w laboratorium. --------------------------------------------------------------------- Zadanie 1 ========= Będziemy pracować w programie psql, uruchamianym z poziomu terminala. Uruchamianie: psql -h lkdb mrbd gdzie lkdb to nazwa naszego serwera baz danych, a mrbd to nasza baza danych. Oczywiście podajemy hasło. Jeśli się udało to dostajemy prompt mrbd=> i możemy pracować. Psql ma wbudowaną edycję wiersza poleceń, na przykład cofanie strzałkami do poprzednich poleceń. Psql ma dwa rodzaje poleceń: - polecenia SQL wpisywane normalnie i zakończone średnikiem; - polecenia psql rozpoczynające się znakiem odwrotnego ukośnika '\' (backslash), po której następuje nazwa polecenia (zwykle jednoznakowa), a następnie argumenty. Opis poleceń otrzymamy pisząc \? (jest długa, ale warto obejrzeć pobieżnie całą). Do kończenia pracy służy polecenie \q Pomoc składniową dla poleceń SQL dostajemy pisząc \h na przykład \h ALTER USER (zaraz go użyjemy do zmiany hasła). Natomiast polecenie \d pokazuje opis tabeli (ale najpierw trzeba mieć tabelę). Skoro już jesteśmy w psql, to zmienimy hasło. Piszemy ALTER USER ab123456 PASSWORD 'nowetajnehasło'; Wychodzimy (zobacz wyżej) i logujemy się jeszcze raz, już z nowym hasłem. [Uwaga: SQL nie rozróżnia dużych i małych liter w słowach kluczowych, dla czytelności będę je pisał dużymi literami.] Na dzisiejszych zajęciach będziemy pracować na bazie zoo.sql. Skrypt tworzący bazę musimy sobie ściągnąć z https://students.mimuw.edu.pl/~zbyszek/bd/mat/demo-sql/zoo.sql zapisać na swoim komputerze, po czym przesłać na maszynę students scp zoo.sql ab123456@students.mimuw.edu.pl: (uwaga na dwukropek!). Aby odpalić w psql skrypt zapisany w pliku zoo.sql ustawiamy przenosimy go do katalogu z którego uruchomiliśmy program (albo ustawiamy się w tym katalogu i odpalamy psql), po czym używamy polecenia: \i zoo.sql i dostajemy odpowiedzi z kolejno wykonanych poleceń SQL. ------------------------------------------------------------------- Zadanie 2 ========= Obejrzyjmy (poleceniem \d) tabele Gatunki i Zwierzaki. Następnie zróbmy to samo w SQL SELECT * FROM Gatunki; SELECT * FROM Zwierzaki; Polecenie SELECT służy do wykonywania zapytań do bazy danych. Aby wybrać tylko niektóre informacje z tabeli (na przykład tylko niektóre kolumny) używamy polecenia SELECT następująco: SELECT kolumny FROM tabela WHERE warunki; Przykładowo: SELECT nazwa, kontynent FROM Gatunki; We frazie SELECT podajemy nazwy kolumn ('*' to był skrót notacyjny oznaczający ,,wszystkie kolumny''), a we frazie FROM nazwy tabel, na razie tylko jedną. Jeśli chcemy otrzymać wiersze odpowiedzi w kolejności alfabetycznej, na przykład według nazwy, należy dołączyć _na końcu_ frazę ORDER BY. SELECT nazwa, kontynent FROM Gatunki ORDER BY nazwa; ORDER BY sortuje wiersze wyniku rosnąco względem podanej kolumny. Aby posortował malejąco należy dodać słowo DESC po nazwie kolumny. Można także podać więcej kolumn rozdzielając je przecinkami. Uwaga! Jeżeli sortowanie nie jest podane jawnie, to wiersze wyniku mogą być w dowolnej kolejności. Możemy także wybrać tylko niektóre wiersze, na przykład gatunki z Europy. SELECT * FROM Gatunki WHERE kontynent = 'Europa'; We frazie WHERE podajemy warunek, który muszą spełniać wybrane wiersze. Napisy występują w apostrofach! Użycie cudzysłowu jest błędem. Poza tym składnia jest naturalna, w warunkach złożonych używamy spójników AND, NOT i OR. SELECT * FROM Gatunki WHERE kontynent = 'Afryka' AND ochrona = 'tak'; Wiersze w tabeli nie powinny się powtarzać (uznaje się to za błąd). Czasami jednak w zapytaniu pomijamy niektóre kolumny, co powoduje pojawienie się dupliktaów SELECT kontynent FROM Gatunki; Możemy je eliminować, umieszczając po SELECT słowo DISTINCT SELECT DISTINCT kontynent FROM Gatunki; A skąd mamy wiedzieć jakie tabele mamy utworzone w bazie? Możemy napisać po prostu \d (bez argumentu). Skąd pochodzą pokazane nazwy? Z tabeli katalogowej SELECT table_name FROM user_tables; ---------------------------------------------------------------------- Zadanie 3 ========= Czas na samodzielną pracę 1. Wybierz wszystkie gatunki chronione. 2. Wybierz pokarmy, które lubią (przysmak) gatunki z Afryki. 3. Wybierz nazwy, kontynenty i przysmaki wszystkich gatunków, które: albo mają nazwę zaczynające się literą ,s', albo lubią siano i pochodzą z Afryki. Do wybierania napisów według wzorca służy w SQL dość prymitywny operator LIKE, po którym następuje wzorzec. Wzorzec jest napisem, w którym ,%' pasuje do dowolnego ciągu znaków, a ,_' do jednego dowolnego znaku. Przykładowo: SELECT * FROM Gatunki WHERE kontynent LIKE 'A%'; wybierze gatunki z kontynentów rozpoczynających się literą A. 4. Wylicz sinus liczby 3.14. W SQL możemy obliczać wartości funkcji wbudowanych, wywołując je w wyrażeniach. We frazie SELECT mogą wystąpić dowolne wyrażenia -- kolumny są ich sczególnym przypadkiem. Chcąc dowiedzieć się, ile jest 121 + 242 piszemy SELECT 121 + 242; Warto też spróbować SELECT current_date, current_time; Frazę FROM możemy pominąć (jest to lekka niezgodność ze standardem). =================================================================== Odpowiedzi: 1. SELECT nazwa FROM Gatunki WHERE ochrona = 'tak'; 2. SELECT DISTINCT przysmak FROM Gatunki WHERE kontynent = 'Afryka'; 3. SELECT nazwa, kontynent, przysmak FROM Gatunki WHERE nazwa LIKE 's%' OR (przysmak = 'siano' AND kontynent = 'Afryka'); 4. SELECT sin(3.14); ====================================================================