Skip to Content

Skomplikowane zapytania

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

  1. 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.

  1. SELECT imie, nazwisko FROM osoby WHERE nazwisko LIKE 'P%';
  2. imie | nazwisko
  3. -------+----------
  4. Ewa | Piątek
  5. Basia | Piątek
  6. (2 rows)

A jak wybrać osoby, których drugą literą w nazwisku jest a?

  1. SELECT imie, nazwisko FROM osoby WHERE nazwisko LIKE '_a%';
  2. imie | nazwisko
  3. ---------+-------------
  4. :) | nasza-klasa
  5. cYPRIAN | pan
  6. (2 rows)

A osoby, które mają w nazwisku literkę a?

  1. SELECT imie, nazwisko FROM osoby WHERE nazwisko LIKE '%a%';
  2. imie | nazwisko
  3. ---------+-------------
  4. Adam | Kowalski
  5. Basia | Nowak
  6. :) | nasza-klasa
  7. cYPRIAN | pan
  8. (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ć:

  1. SELECT login_b FROM znajomi WHERE login_a = 'a';
  2. login_b
  3. ---------
  4. b
  5. c
  6. (2 rows)

Ale czy podobne zapytanie zadziała w przypadku osoby b?

  1. SELECT login_b FROM znajomi WHERE login_a = 'b';
  2. login_b
  3. ---------
  4. (0 rows)

Nie zadziałało, a osoby a i b są znajomymi. W przypadku osoby b należałoby raczej napisać

  1. SELECT login_a FROM znajomi WHERE login_b = 'b';
  2. login_a
  3. ---------
  4. a
  5. (1 row)

A jak połączyć te dwa różne zapytania. Służy do tego instrukcja UNION.

  1. SELECT login_a FROM znajomi WHERE login_b = 'a'
  2. UNION
  3. SELECT login_b FROM znajomi WHERE login_a = 'a';
  4. login_a
  5. ---------
  6. b
  7. c
  8. (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.

  1. SELECT AVG(ocena) FROM oceny;
  2. avg
  3. --------------------
  4. 5.2500000000000000
  5. (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:

  1. SELECT AVG(ocena) FROM oceny WHERE zdjecie = 'z1';
  2. avg
  3. --------------------
  4. 6.5000000000000000
  5. (1 row)