Lekcja w formie wideo

Wstęp

W jednej z poprzednich lekcji mówiłem o klauzuli FETCH, pochodzącej ze standardu ANSI, pozwalającej na ograniczenie ilości rekordów w wyniku.

Oracle ma również swoje natywne rozwiązanie o podobnej funkcjonalności. To pseudokolumna rownum.

Co to znaczy pseudokolumna?

Rownum nazywana jest pseudokolumną ponieważ nie jest częścią żadnej tabeli Wartości rownum nie istnieją. Są generowane przez motor bazy danych w momencie wybierania danych z tabeli. Oracle nadaje wierszom kolejne numery poczynając od jeden. Tę cechę możesz wykorzystać na przykład w klauzuli WHERE do ograniczania ilości zwracanych wierszy. Używasz rownum podobnie jak każdej innej kolumny.

Jak używać rownum?

Pamiętasz jak ograniczać ilość rekordów przy pomocy klauzuli FETCH? Masz rację, klauzulę FETCH stosujesz na końcu zapytania. Ten sam efekt możesz osiągnąć przy pomocy rownum w taki sposób:

SELECT
  *
FROM
  all_tables
WHERE
  rownum<5;

Dzięki temu Oracle zwróci Ci 5 pierwszych wierszy. Pamiętasz jakie jeszcze funkcjonalności miało FETCH?

Funkcjonalności klauzuli FETCH: procentowe określanie liczby rekordów oraz ustalanie offsetu.

Można było zwrócić procent wyniku oraz wskazać numer wiersza od którego wynik ma być zwrócony do Twojego klienta.

Rownum nie ma takich możliwości. Ale nie musisz wierzyć mi na słowo. Spróbuj samodzielnie napisać i wykonać zapytanie zwracające rekordy począwszy od piątego. Ja zrobiłbym to tak:

SELECT
  *
FROM
  all_tables
WHERE
  rownum>5;

Jak sądzisz dlaczego zapytanie nie zwróciło żadnego wiersza?

Wartość rownum inkrementowana jest po nadaniu numeru w momencie wybierania wiersza. Czyli pierwszy wybrany z tabeli wiersz dostał numer jeden. Tym samym warunek rownum>5 zwrócił fałsz. W następstwie drugi wiersz, który miałby zostać zwrócony, dostaje numer jeden. Co także nie spełnia warunku. I tak dalej z kolejnymi wierszami. W efekcie zapytanie kończy się bez zwracania czegokolwiek do klienta.

A co się stanie gdy użyjesz znaku równości? Na przykład wybierz z all_tables wiersz o numerze pięć. Pochwal się efektem na discordzie. Jak każdą kolumnę także pseudokolumnę rownum możesz użyć w klauzuli SELECT. Spróbuj i pokaż efekt na discordzie.

Wydajność

Jawne specyfikowanie motorowi bazy danych, że interesuje Cię jedynie określona liczba wierszy lub wartości wyniku wpływa pozytywnie na wydajność. Optymalizatory baz danych, a na pewno optymalizator Oracle, przygotowany jest do optymalizowania takich zapytań. Dlatego jeśli Twój wynik zawiera tysiące wierszy, ale interesuje Cię jedynie stosunkowo niewielka liczba początkowych to nie wahaj się powiedzieć o tym instancji bazy danych. Odwdzięczy się mniejszą konsumpcją zasobów komputera. Dzięki czemu dostaniesz wynik szybciej.

Nigdy, absolutnie nigdy nie przedkładaj filtrowania wyniku w aplikacji nad filtrowanie w bazie danych. Komunikacja sieciowa jest najbardziej kosztowna z wszystkich operacji IO. Nie musisz wierzyć mi na słowo. Przetestuj samodzielnie i pochwal się wynikiem na discord. Możesz też użyć komentarzy pod tym materiałem aby namówić mnie do przeprowadzenia takich testów.

Podsumowanie

Gratuluję Ci ukończenia jedenastej lekcji darmowej edycji mojego kursu 'Podstawy SQL dla użytkowników Oracle’. Wiesz z niej czym jest i jak używać pseudokolumny rownum. Wiesz także jak w klauzuli WHERE budować warunki używające danych liczbowych.

Zadanie dla Ciebie: napisz i uruchom zapytanie zwracające pięć pierwszych wierszy zawierających rownum oraz kolumnę table_name z widoku all_tables. Wynikom nadaj przyjazne nazwy przy pomocy aliasów.

Jeśli potrzebujesz podpowiedzi wbijaj na discord. Tam też chwal się swoim rozwiązaniem prezentując screenshot. Dedykowany serwer: Marcin Badtke – bazy danych i SQL.

Wiesz już jak budować wyrażenia warunkowe dla danych liczbowych i dla NULL. W następnej lekcji pokażę Ci jak budować klauzulę WHERE zawierającą wiele wyrażeń warunkowych. Następna lekcja będzie o operatorach logicznych.

Tymczasem dziękuję za ukończenie niniejszej lekcji.

Wiesz co trzeba zrobić aby nie przegapić kolejnych.

Jak wykorzystać pseudokolumnę rownum do ograniczenia liczby wierszy posortowanego wyniku przeczytasz w lekcji 14.

Gratuluję Ci ukończenia jedenastej lekcji darmowej edycji mojego kursu 'Podstawy SQL dla użytkowników Oracle’. Skomentuj poniżej jak Ci się podobała.

Jak łączyć warunki w klauzuli WHERE zapytanie SQL? Pokażę Ci w następnej lekcji. Chodź.

Idź do następnej lekcji

Wróć do poprzedniej lekcji

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *