Wstęp
Z poprzednich lekcji wiesz jak, w klauzuli WHERE, testować czy kolumna zawiera wartość czy jest NULL oraz wiesz jak budować warunki wykorzystując liczby całkowite.
Zastanawiasz się jak zbudować klauzulę WHERE wykorzystując oba te testy? Dowiesz się tego z niniejszej lekcji.
Operatory logiczne
W klauzuli WHERE możesz użyć większej ilości wyrażeń warunkowych. Łączysz je, podobnie jak w językach programowania, operatorami AND i OR. Znaczą odpowiednio 'i’ oraz 'lub’. Czyli jeśli chcesz aby wszystkie warunki były spełnione to łączysz je operatorem AND, a jeśli tylko jeden z warunków ma być spełniony to operatorem OR. Podobnie jak w innych językach AND jest wykonywany przed OR. Na kolejność wykonania wpływasz stosując nawiasy okrągłe.
Aby uzyskać przeciwieństwo używasz operatora NOT.
Tyle teorii. Teraz praktyka.
Jak używać operatorów logicznych?
Do wiedzy o operatorach logicznych dodaj wiedzę z lekcji o NULL i połącz z wiedzą o rownum. Napisz zapytanie zwracające nazwy tabel z widoku all_tables, które nie posiadają nazwy tablespace. Czyli zapytanie ma zwracać table_name z all_tables gdy tablespace_name jest NULL. Wynik ogranicz do 10 pierwszych wierszy. Pochwal się wklejając zrzut ekranu na discorda. Ja zrobiłbym to tak:
SELECT table_name FROM all_tables WHERE tablespace_name IS NULL AND rownum<11;
Zwróć uwagę na użycie operatora logicznego AND. Po obu jego stronach znajdują się wyrażenia warunkowe: tablespace_name jest NULL oraz rownum mniejszy od 11. Oznacza, że oba warunki muszą zostać spełnione, zwrócić prawdę, aby wiersz został wybrany z bazy danych.
Podobnie używasz operatora OR.
Napisz zapytanie zwracające dane z kolumn table_name i num_rows widoku all_tables dla których tablespace_name jest NULL lub num_rows jest równe 0. Ja napisałbym to tak:
SELECT table_name ,num_rows FROM all_tables WHERE tablespace_name IS NULL OR num_rows=0;
Używając operatora NOT zmodyfikuj zapytanie tak aby zwracało dziesięć pierwszych wierszy z widoku all_tables dla których tablespace_name nie jest NULL lub num_rows jest równe zero. W tej chwili wiesz jak to zrobić na dwa sposoby. Podpowiem, że w jednym przydadzą się nawiasy, a w drugim zmodyfikowany operator. Zaprezentuj oba na discord. Ja pokażę jeden. Ten który nawiązuje do niniejszej lekcji.
SELECT table_name FROM all_tables WHERE NOT (tablespace_name IS NULL) OR num_rows=0 AND rownum<11;
W tym przypadku nawiasy nie są obowiązkowe, ale poprawiają czytelność zapytania. Daj znać tutaj lub na discordzie jaki wynik dało zapytanie oraz czy ten wynik Cię zadowala.
Wydajność
Celem zbudowanych na kolumnach tabeli indeksów jest znaczące przyspieszenie wyszukiwania danych wskazanych klauzulą WHERE. Warto wiedzieć jakie indeksy na przeszukiwanych tabelach istnieją i tak zbudować warunki aby dotyczyły poindeksowanych kolumn.
Dane w tabeli mają różną kardynalność (ang. cardinality). Czyli stosunek unikalnych wartości kolumny do liczby rekordów w tabeli. Jeśli kolumna zawiera dużo unikalnych wartości to jej dane mają wysoką kardynalność. Np. przechowuje nr telefonu, PESEL czy adres email. Jeśli kolumna zawiera mało unikalnych wartości to jej dane charakteryzują się małą kardynalnością. Np. płeć, status zamówienia czy tak/nie. Najbardziej opłaca się budować indeksy i przeszukiwać dane o wysokiej kardynalności.
Jeśli na tabeli istnieje wiele indeksów, a Twoje zapytanie w klauzuli WHERE wykorzystuje warunki na wielu poindeksowanych kolumnach to optymalizator wybierze jeden, jego zdaniem najbardziej efektywny, indeks aby wybrać dane.
Temat jedynie sygnalizuję. Będzie rozbudowany w kursie o efektywnym SQL oraz o projektowaniu bazy danych. Do realizacji dedykowanego materiału możesz namówić mnie w komentarzach.
Podsumowanie
Gratuluję Ci ukończenia dwunastej lekcji darmowej edycji mojego kursu 'Podstawy SQL dla użytkowników Oracle’. Wiesz z niej jak używać operatorów logicznych do łączenia wielu warunków w klauzuli WHERE.
Zadanie dla Ciebie: napisz i uruchom zapytanie zwracające 5 pierwszych wierszy zawierających dane z kolumn table_name i num_rows z widoku all_tables dla których tablespace_name nie jest NULL i num_rows jest większe niż 100.
Jeśli potrzebujesz podpowiedzi wbijaj na discord. Tam też chwal się swoim rozwiązaniem prezentując zrzut ekranu swojego klienta. Dedykowany serwer: Marcin Badtke – bazy danych i SQL.
Wiesz już jak budować klauzulę WHERE zawierającą wiele wyrażeń warunkowych. W następnej lekcji pokażę Ci jak sortować wynik zapytania. Następna lekcja będzie o sortowaniu przy pomocy klauzuli ORDER BY.
Tymczasem dziękuję za ukończenie niniejszej lekcji.
Wiesz co trzeba zrobić aby nie przegapić kolejnych.
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 sortować wynik zapytania klauzulą ORDER BY? Pokażę Ci w następnej lekcji. Chodź.