Ćwiczenie zapytań języka bazy danych PostgreSQL 1. Uruchom link w przeglądarce: http://127.0.0.1/phppgadmin 2. Kliknij w zaznaczony na czerwono link PostgreSQL: 3. Zaloguj się wpisując hasło i login student. 4. Kliknij w link zaznaczony na rysunku: 5. Baza postgres2 ma 3 tabele (kliknij przy dla każdej tabeli prawym przyciskiem na link 'przeglądaj' i następnie otwórz w nowej karcie): PRACOWNIK: ETAT:
ZESPOL: 6. Klucze i relacje między tabelami: tabela PRACOWNIK posiada klucz podstawowy NUMER, tabela PRACOWNIK posiada klucz obcy do tabeli ETAT: kolumna ETAT z tabeli PRACOWNIK odnosi się do kolumny ID_ETAT z tabeli ETAT, tabela PRACOWNIK posiada klucz obcy do samej siebie: kolumna SZEF odnosi się do kolumny NUMER, tabela PRACOWNIK posiada klucz obcy do tabeli ZESPOL: kolumna ID_ZESP z tabeli PRACOWNIK odnosi się do kolumny ID_ZESP z tabeli ZESPOL, tabela ETAT posiada klucz podstawowy ID_ETAT, tabela ZESPOL posiada klucz podstawowy ID_ZESP. 7. Zrealizuj następujące polecenia SQL: A1) Wyświetl wszystkie kolumny dla wszystkich rekordów tabeli PRACOWNIK: Kliknij w link SQL w oknie wyświetlonym po wejściu do bazy postgres2: Wpisz komendę: SELECT * ; instrukcja wyświetlania: SELECT informacja, że potrzebne są wszystkie kolumny: * określenie z jakiej tabli mają być wyświetlane rekordy: FROM + nazwa tabeli
wynik zapytania : Kolejne zapytania realizuj w oknie edycji zapyta ń kliknij Edycja zapytania SQL w screenie powyżej!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! A2) JW. ale wyświetl tylko kolumny NAZWISKO i PLACA_POD dla wszystkich rekordów tabeli PRACOWNIK: ; zamiast * należy użyć użyć poszczególnych nazw kolumn A3) JW. ale wyświetl tylko kolumny NAZWISKO i PLACA_POD dla wszystkich rekordów tabeli PRACOWNIK, dla których płaca podstawowa jest większa niż 1200: WHERE "PLACA_POD" > 1200; A4) JW. ale ogranicz zapytanie dla nazwisk, które zaczynają się na literę 'M': WHERE "PLACA_POD" > 1200 AND "NAZWISKO" LIKE 'M%'; analogicznie można określić nazwisko kończące się na dowolną literę lub litery np. LIKE '%EM' lub posiadające jakiś tekst w środku np. LIKE '%EM%' łączenie warunków poprzez operatory logiczne: AND i OR A5) JW. ale posortuj wynik zapytania po nazwisku rosnąco: WHERE "PLACA_POD" > 1200 AND "NAZWISKO" LIKE 'M%' ORDER BY "NAZWISKO" ASC;
ORDER BY "NAZWA_KOLUMNY" ASC: sortuje wynik zapytania po wybranej kolumnie rosnąco ORDER BY "NAZWA_KOLUMNY" DESC: sortuje wynik zapytania po wybranej kolumnie malejąco B1) Wyświetl zawartość połączonych tabeli PRACOWNIK oraz ETAT dla wszystkich kolumn: SELECT * JOIN "ETAT" ON "PRACOWNIK"."ETAT" = "ETAT"."ID_ETAT"; instrukcja JOIN służy do łączenia tabel, natomiast ON określa po jakiej kolumnie są łączone tabele: "NAZWA_TABELI_1" JOIN "NAZWA_TABELI_2" ON "NAZWA_TABELI_1"."KLUCZ_OBCY_ODNOSZĄCY_SIĘ_DO_TABELI_2" = "NAZWA_TABELI_2"."ID_REKORDU" kolejność w tabel w instrukcji JOIN oraz kolumn po ON nie ma znaczenia czyli dla przykładu powyżej można napisać np. : "ETAT" JOIN "PRACOWNIK" ON "ETAT"."ID_ETAT" = "PRACOWNIK"."ETAT" jeśli nazwy kolumn po których łączone są tabele nie powtarzają się, to nie trzeba pisać nazwy tabeli: SELECT * JOIN "ETAT" ON "ETAT" = "ID_ETAT"; B2) JW. ale wyświetl nazwę kolumny NAZWISKO, PLACA_POD oraz nazwę etatu:, "NAZWA" JOIN "ETAT" ON "ETAT" = "ID_ETAT"; B3) JW. ale przed nazwami kolumn użyj aliasów tabeli: SELECT p."nazwisko", p."placa_pod", e."nazwa" p JOIN "ETAT" e ON p."etat" = e."id_etat"; aliasy pozwalają używać zamiast długiej nazwy tabeli używać np. pojedynczej litery, przy długich zapytaniach, gdzie jest łączone np. 5 tabel mogą ułatwić określenie, jakie kolumny należą do poszczególnych tabel, a zarazem zapytanie nie będzie tak długie jak w przypadku użycia pełnych nazw tabel. C1) Połącz tabele PRACOWNIK, ETAT, ZESPOL i wyświetl dla nich nazwisko, płacę podstawową nazwę zespołu i nazwę etatu: SELECT p."nazwisko", p."placa_pod", e."nazwa", z."nazwa" p JOIN "ETAT" e ON p."etat" = e."id_etat" JOIN "ZESPOL" z ON p."id_zesp" = z."id_zesp"; C2) JW. ale posortuj powyższe zapytanie poprzez kolumnę płaca podstawowa malejąco: SELECT p."nazwisko", p."placa_pod", e."nazwa", z."nazwa" p JOIN "ETAT" e ON p."etat" = e."id_etat" JOIN "ZESPOL" z ON p."id_zesp" = e."id_zesp" ORDER BY p."placa_pod" DESC; D) Dodaj rekord do tabeli PRACOWNIK: INSERT INTO "PRACOWNIK"
("NUMER", "NAZWISKO", "ETAT", "SZEF", "PRACUJE_OD", "PLACA_POD", "ID_ZESP") VALUES (1211, 'Lubomirski', 1, 1030, now(), 1200, 30); INSERT INTO "NAZWA_TABELI" dodanie do tabeli dalej w nawiasach muszą się pojawić wszystkie kolumny tabeli, następnie słowo VALUES oraz w nawiasach wartości jakie mają zostać wpisane do kolumn, now() funkcja zwracająca bieżącą datę, teksty piszemy w pojedynczych cudzysłowach np. 'Lubomirski', liczby bez cudzysłowów, kolejność nazw kolumn w nawiasach i ich wartości w nawiasach po słowie VALUES musi być taka sama. E) Usuń rekord z tabeli PRACOWNIK o nazwisku 'Kolski' : DELETE WHERE "NAZWISKO" = 'Kolski'; DELETE FROM "NAZWA_TABELI" usunięcie rekordów z tabeli, WHERE warunek usuwania wierszy, jeśli go nie będzie, to zostanie usunięta całą zawartość tabeli. F) Daj pracownikom zarabiającym poniżej 2000, podwyżkę o 10%: UPDATE "PRACOWNIK" SET "PLACA_POD" = 1.1 * "PLACA_POD" WHERE "PLACA_POD" < 2000; UPDATE "PRACOWNIK" zmiana w tabeli, SET zmiana konkretnej kolumny/kolumn tabeli na określoną wartość/wartości WHERE warunek zmieniania konkretnej kolumny/kolumn dla wybranych rekordów, jeśli go nie będzie, to zostanie zmieniona wartość kolumny/kolumn dla wszystkich rekordów. G1) Wyświetl średnią płacy podstawowej z tabeli PRACOWNIK: SELECT avg("placa_pod") avg(...) funkcja licząca średnią, inne to np. max(), min(), count() G2) JW. użyj aliasów nazywając kolumnę wyświetlania "SREDNIA_ZAROBKOW" SELECT avg("placa_pod") "SREDNIA_ZAROBKOW" H) Wyświetl średnią płacy dla poszczególnych zespołów oraz zespoły: Pierwsza część wyświetlenie id zespołu plus średnia płaca (będzie to podzapytanie w b), którego wynik zostanie połączony z tabelą ZESPOL): SELECT avg("placa_pod"), "ID_ZESP" p GROUP BY "ID_ZESP" Całe zapytanie: SELECT z."nazwa", q."srednia_zarobkow" FROM "ZESPOL" z JOIN ( SELECT avg("placa_pod") "SREDNIA_ZAROBKOW", "ID_ZESP" p GROUP BY "ID_ZESP" ) q ON z."id_zesp" = q."id_zesp" ORDER BY q."srednia_zarobkow" DESC; I) Wyświetl wszystkie nazwiska, które mają w sobie literę k: SELECT "NAZWA" FROM SELECT "PRACOWNIK" WHERE lower("nazwa") LIKE '%k%';
lower(..) zamienia tymczasowo w zapytaniu wszystkie duże litery tekstu na małe, małe pozostają bez zmian, przeciwieństwo to upper(...) Więcej informacji: http://ssamolej.kia.prz.edu.pl/dydaktyka/inf_1ee_zi/instrukcja_bd_en_v3-1.pdf