SELEKCJAA cóż to takiego ?
Jest to wyświetlenie a raczej ograniczanie zapytania tylko do tych wierszy które spełniają określony warunek lub warunki, natomiast pozostałe zostają odfiltrowane.
Warunek selekcji może przyjąć jedną z trzech możliwych wartości, są nimi:
- true - wiersz jest zwracany jako wynik
- false - wiersz jest pomijany
- null - wiersz jest pomijany
Do utworzenia warunku selekcji wykorzystujemy operatory:
- porównań
- Dopasowania wzorca
- Logiczne
- Sprawdzenia wartości null
Co to dla nas oznacza ?
W praktyce oznacza to tylko tyle że na podstawie określonych warunków logicznych możemy wyselekcjonować sobie te wiersze które nas interesują.
Ponieważ tutaj sprawa jest prosta to pokażę kilka przykładów zamiast się rozpisywać
Wyświetla wszystkie elementy z lokalizacji 10
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wyświetla wszystkie elementy z lokalizacji 11 które mają ilość wiekszą niż 30
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wyświetla wszystkie elementy które mają pustą kolumnę Producent
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Tutaj podam jeszcze błędne zapytanie które nie generuje błędu ale wyświetla zły wynik
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dlaczego tak się dzieje ? Dlatego że pusty ciąg znaków nie jest wartością null ponieważ null jest równocześnie pusty ale też nie pusty znaczy się taki nie wiadomo jaki.
Wyświetla wszystkie elementy które moją wypełnioną kolumnę Producent
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Teraz zajmiemy się operatorem dopasowania LIKE
Dzięki temu operatorowi który ma możliwość przyjęcia w swojej składni tzw. znaków specjalnych % (zastępuje dowolny ciąg znaków) oraz _ (zastępuje pojedynczy znak),
które umożliwiają nam elastyczniejsze podejście do wartości tekstowych podczas filtrowania. Podczas używania LIKE należy pamiętać że wielkość liter ma znaczenie.
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
SORTOWANIECzasami do prawidłowej prezentacji wyników potrzebne jest nam sortowanie. Okazuje się że taki mechanizm jest wbudowany w sql i ma następującą składnie:
SELECT ... FROM tabela ORDER BY kolumna [ASC | DESC]{,kolumna [ASC | DESC]}
W praktyce użycie tej składni wygląda tak:
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Przy sortowaniu należy zwrócić uwagę na kolejność kolumn wymienionych za ORDER BY dlatego że sortowanie będzie się odbywało od lewej do prawej.
Czyli w przypadku jak wyżej, najpierw tabela zostanie posortowana według ID autora, następnie "wewnątrz" danego autora odbędzie się sortowanie projektów według ich kodu
ORDER BY umożliwia nam odwołanie się także po numerze kolumny zamiast po nazwie
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
oraz po aliasie kolumny
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Należy wspomnieć że nie wymienienie kierunku sortowania skutkuje sortowaniem rosnącym.
PSEUDOKOLUMNY
Najkrócej można by powiedzieć że to taka kolumna którą można wykorzystać w zapytaniu i której wartość jest generowana podczas wykonywania zapytania.
Do takich kolumn należą np:
- ROWNUM
- ROWID
- LEVEL
Na pierwszy ogień weźmiemy ROWNUM, jak sama nazwa wskazuje służy do numeracji wierszy które są wyświetlane w wyniku zapytania.
Jak zwykle przykład wykorzystania
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jak wynika z zapytania, wybraliśmy rekordy z tabeli projekty dla autora o id = 1 następnie tym wierszom nadaliśmy liczbę porządkową za pomocą ROWNUM.
Prawda że proste
, jednak nie ma róży bez kolców, i tak jest w tym przypadku. Dodajmy do naszego zapytania sortowanie po kolumnie KOD.
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
I co się okazuje że naszą LP szlag trafił
, dzieje się tak z kolejności wykonywania poszczególnych składowych zapytania gdzie ROWNUM niestety jest gdzieś po środku, a dokładnie rzecz biorąc jest wykonywane
za przefiltrowaniem rekordów (klauzula WHERE), a sortowaniem (ORDER BY).
No to co teraz ? To znaczy że nie da się użyć ROWNUM ? A jak je użyjemy to nie można sortować ?
Otóż i na to jest rozwiązanie, co prawda troszkę na "okrętkę", ale się da
, pomocą przychodzą nam tzw. podzapytania.
Tutaj należy wam się małe wyjaśnienie co to podzapytanie, otóż jest to nic innego jak zapytanie które podstawiamy w nawiasach zamiast tabeli za klauzulą from. Pisząc to jeszcze prościej, jest to "wirtualna tabela" stworzona z naszego zapytania.
A teraz przykład użycia takiego podzapytania razem z naszą pseudo kolumną
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dało się ? Dało
Hmmm ... można zadać pytanie czy ROWNUM tylko do tego służy ? Otóż nie ..., ROWNUM można także użyć do limitowania wierszy.
Jeżeli np. chcemy aby nasze zapytanie w wyniku zwróciło pierwsze trzy wiersze to wystarczy skonstruować odpowiedni warunek WHERE co macie pokazane w kodzie poniżej.
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No dobra poznaliście już użyteczne ROWNUM, to teraz by wypadało opisać ROWID, ale musze się przyznać szczerze że nie bardzo ma pomysł jak to ładnie opisać
Więc na razie napiszę że teoretycznie rowid można użyć jako kluczy głównych w tabelach ponieważ rowid jest znacznie szybsze od dedykowanych kolumn z kluczami głównymi ponieważ rowid fizycznie identyfikuje poszczególne wiersze w bazie danych i może na tą chwile poprzestańmy na tym.
Ok to teraz czas na LEVEL.
Wyobraźmy sobie że mamy tabelę która ma odwołanie (klucz obcy) do samej siebie, w Naszej bazie taką tabelą jest "Lokalizacje", gdzie przechowujemy strukturę naszych magazynów które są wyposażone w regały, a one z kolei mają półki.
Moglibyśmy zapisać te dane w postaci kolumn, gdzie każda następna kolumna byłaby odpowiednikiem naszej półki w regale, pół biedy jak by jeszcze te regały miały taką samą długość i ilość półek, ale już totalną masakrą miały różną ilość (tych półek).
Nie wspomnę już nawet o tym że do dyspozycji mamy ograniczoną ilość kolumn która może się nam skończyć. Wiec co zrobić ?
No skoro nie opłaca się iść wszerz to może pójść wzdłuż, czyli zapisać dane w postaci hierarchicznej wiersz po wierszu, czyli element podrzędny (półka) będzie przechowywał id elementu nadrzędnego (regał) a ten z kolei id swojego elementu nadrzędnego (magazyn).
Jak pewnie zauważyliście taką hierarchię można rozbudowywać w dół do dowolnego poziomu jaki nam będzie potrzebny. No tak ale jak teraz sprawdzić który jest tym ostatnim ? I tu z pomocą przychodzi nam właśnie wspomniana wcześniej pseudo kolumna LEVEL która nam grzecznie poda numer poziomu dla danej gałęzi
Oto przykład kodu
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Co prawda składnia jest deczko skomplikowana , ale na szczęście jest tak tylko na pierwszy rzut oka
Składni od SELECT do FROM nie ma co wyjaśniać więc zacznijmy od razu od CONNECT BY PRIOR, jest to nic innego jak podanie złączenia pomiędzy poziomami naszych lokalizacji (czyli łączymy np. magazyn z jego regałami, a regały z półkami)
START WITH super IS NULL - jest to nic innego jak podanie od którego poziomu ma się rozpocząć łączenie. W naszym przypadku jest to wartość null ponieważ nasze magazyny w hierarchii nie mają już nic nad sobą więc nie mają także przypisanego "rodzica".
Należy pamiętać że zamiast wartości null możemy przyporządkować dowolny "poziom" od którego chcemy zacząć np. od magazynu części
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
albo magazynu projektów
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Uhhh ..... , no to pozostała nam do omówienia jeszcze jedna rzecz o której nic nie pisałem, a bez której chyba by nie istniał Oracle
Jest nią bardzo użyteczna tabela dual. Jak się dało zauważyć podczas moich wypocin na temat operatorów arytmetycznych, użyliśmy takiego zapytania
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
w rezultacie otrzymaliśmy wynik naszych obliczeń, ale zamiast w jednym wierszu, był on widoczny aż w 8. Dlaczego tak się dzieje ? Dlatego że nasz wynik był generowany dla każdego wiersza który jest w tabeli.
No dobrze, a jak byśmy chcieli żeby w jednym wierszu, to co zrobić ? Użyć do tego tabeli dual;
język sql
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No ok ... ale dlaczego tak jest ? Dlatego że tak sobie wymyślili twórcy Oracle, że jak w zapytaniu jest SELECT to musi być też informacja skąd wziąć nasze rekordy co oznacza obowiązkową klauzule FROM, skoro już napisaliśmy FROM no to musimy tez podać jakieś źródło rekordów.
Co w oczywisty sposób utrudniło pewne operacje w bazie, dlatego mądrzy ludzie poszli po rozum do głowy i stworzyli tabelę dual
Sama tabela dual nie jest niczym nadzwyczajnym, jest to po prostu tabela która zawiera jedną kolumnę i jeden wiersz w którym jest wpisany "X"