Dotychczas baza danych służyła nam jedynie jako banalne narzędzie, do którego wstawialiśmy wiersze i z którego następnie te wiersze pobieraliśmy. Ale nie robiliśmy niczego skomplikowanego. Nawet nie próbowaliśmy policzyć średniej oceny dla każdego ze zdjęć. Zmieńmy to!
Potrafimy wybrać imiona i nazwiska wszystkich osób
SELECT imie, nazwisko FROM osoby;
A jak wybrać imiona i nazwiska osób, których nazwisko zaczyna się od literki P? Służy do tego instrukcja LIKE.
SELECT imie, nazwisko FROM osoby WHERE nazwisko LIKE 'P%'; imie | nazwisko -------+---------- Ewa | Piątek Basia | Piątek (2 rows)
A jak wybrać osoby, których drugą literą w nazwisku jest a?
SELECT imie, nazwisko FROM osoby WHERE nazwisko LIKE '_a%'; imie | nazwisko ---------+------------- :) | nasza-klasa cYPRIAN | pan (2 rows)
A osoby, które mają w nazwisku literkę a?
SELECT imie, nazwisko FROM osoby WHERE nazwisko LIKE '%a%'; imie | nazwisko ---------+------------- Adam | Kowalski Basia | Nowak :) | nasza-klasa cYPRIAN | pan (4 rows)
Jak to wszystko działa? Otóż instrukcja LIKE służy do porównywania wartości pola z wzorcem. Wzorzec ten może być po prostu napisem (czyli a like 'abc' to jest dokładnie to samo co a = 'abc'), ale może też zawierać znaczek _ (podkreślenie) lub %. Podkreślenie pasuje do pojedynczej litery, a procent pasuje do dowolnego napisu (w tym pustego).
A jak wybrać wszystkich znajomych osoby a? Wydaje się, że mogłoby zadziałać:
SELECT login_b FROM znajomi WHERE login_a = 'a'; login_b --------- b c (2 rows)
Ale czy podobne zapytanie zadziała w przypadku osoby b?
SELECT login_b FROM znajomi WHERE login_a = 'b'; login_b --------- (0 rows)
Nie zadziałało, a osoby a i b są znajomymi. W przypadku osoby b należałoby raczej napisać
SELECT login_a FROM znajomi WHERE login_b = 'b'; login_a --------- a (1 row)
A jak połączyć te dwa różne zapytania. Służy do tego instrukcja UNION.
SELECT login_a FROM znajomi WHERE login_b = 'a' UNION SELECT login_b FROM znajomi WHERE login_a = 'a'; login_a --------- b c (2 rows)
W ten sposób możemy łączyć wyniki wielu różnych zapytań.
Teraz nauczmy się ostatniej rzeczy. Liczenia średnich. Służy do tego instrukcja AVG.
SELECT AVG(ocena) FROM oceny; avg -------------------- 5.2500000000000000 (1 row)
Wiemy, że średnia ocen w naszej bazie to 5.25. Niestety jest to mało przydatna informacja. Bo nie wiemy jakiego zdjęcia ona dotyczy. Ale możemy łatwo poprawić nasze zapytanie, aby zwracało średnią konkretnego zdjęcia:
SELECT AVG(ocena) FROM oceny WHERE zdjecie = 'z1'; avg -------------------- 6.5000000000000000 (1 row)