#127 Rozdział 6. Zastosowanie klauzuli WHERE W rozdziale 5. opisałem instrukcję SELECT służšcš do pobierania danych z tabel bazy danych. Używałem klauzuli WHERE, która wskazywała wiersze majšce być wybrane jako wynik zapytania. Klauzula WHERE działa jak filtr, który odrzuca wiersze nie spełniajšce założonych kryteriów. W tym rozdziale opiszę więcej technik, które mogš być wykorzystane w klauzuli WHERE po to, by zwiększyć precyzję wyszukiwania danych. W poprzednim rozdziale omówiłem operatory porównania stosowane wewnštrz klauzuli WHERE. Teraz pokażę jeszcze inne metody umożliwiajšce tworzenie efektywnych zapytań. Przedstawię również, jak tworzyć złożone zapytania wykorzystujšc operatory logiczne. Oczywicie, klauzulę WHERE wykorzystujemy nie tylko w instrukcji SELECT, ale również w instrukcjach UPDATE i DELETE. Niezależnie od instrukcji, zasady użycia klauzuli WHERE sš zawsze takie same. Klauzula WHERE Zanim zaprezentuję nowe tematy zwišzane z użyciem klauzuli WHERE, podsumujmy to, co na ten temat powiedziałem w poprzednich rozdziałach. Listing 6.1 zawiera prototyp klauzuli WHERE stosowanej w instrukcji SELECT, UPDATE i DELETE. ------------------------- Listing 6.1. Klauzula WHERE w instrukcjach UPDATE, DELETE i SELECT UPDATE table SET ( column = value, ....) [WHERE expression] DELETE FROM table [WHERE expression] SELECT select_list FROM table [WHERE expression] ------------------------- 128 Użycie operatorów logicznych w klauzuli WHERE W wielu wypadkach użycie pojedynczego porównania nie wystarczy do jednoznacznego okrelenia danych, które chcemy wybrać z tabeli. Przeledmy to na przykładzie zapytań z naszej bazy danych o filmach. Na przykład problem ten napotkamy chcšc znaleć wszystkie filmy wyprodukowane przez studio Delighted Artists, których przychód był większy niż 50 milionów dolarów. Inne kryterium, które również wymaga złożonych zapytań, to wyszukanie filmów o budżecie między 10 i 20 milionów dolarów. Żaden z tych warunków nie może być napisany przy pomocy pojedynczych wyrażeń, które pokazałem do tej pory. Język SQL dostarcza trzy operatory logiczne, które wykorzystujemy do tworzenia złożonych zapytań wewnštrz klauzuli WHERE. Dwa z nich sš specjalnie stworzone do wykorzystania w klauzuli WHERE, trzeci służy do negacji (zaprzeczenia) wyników wyrażeń. Tymi operatorami sš AND, OR i NOT. Programowanie logiki Operacje zawarte w klauzuli WHERE podlegajš zasadom logiki boolowskiej. Wynik wyrażenia przyjmuje zawsze jednš z dwóch wartoci: prawda lub fałsz. W przypadku, gdy wynik wyrażenia to prawda, wiersz jest wybierany, w przeciwnym wypadku - pomijany. Przyjrzyjmy się prostemu przykładowi. Załóżmy, że jedno pole tabeli zawiera liczbę 5. Gdyby wyrażenie miało postać pole > 3 to wynikiem wyrażenia byłaby prawda. W przeciwnym przypadku, gdy wyrażenie jest w postaci pole < 3, to wynikiem tego wyrażenia jest wartoć fałsz. Gdyby pierwsze wyrażenie było zawarte w klauzuli WHERE, to rekord byłby wybrany, natomiast w drugim przypadku nie. Operatory logiczne umożliwiajš łšczenie wielu prostych wyrażeń i tworzenie złożonych wyrażeń zwracajšcych jako wynik prawdę lub fałsz. Operator AND Operator AND zwraca wynik prawda, gdy wyrażenia po dwóch stronach operatora sš prawdziwe. Jeżeli choć jedno z nich jest nieprawdziwe, wtedy całe wyrażenie zwraca jako wynik wartoć fałsz. Na przykład chcšc znaleć filmy ze studia Delighted Artists (studio_id=3), których przychód jest null, musisz zastosować operator AND, jak to pokazuje listing 6.2. ------------------------- Listing 6.2. Zapytanie używajšce operatora AND SELECT movie_title, studio_id, gross FROM Movies WHERE studio_id = 3 AND gross IS NULL #129 MOVIE_TITLE STUDIO_ID GROSS ------------------------- BILL DURHAM 3 ------------------------- Na listingu widać, że w wyniku zapytania pojawiły się te rekordy, które spełniajš narzucone warunki. Jest wiele wierszy, dla których w polu przychód jest wartoć null i jest wiele wierszy z filmami ze studia Delighted Artists, ale tylko jeden wiersz spełnia te dwa kryteria jednoczenie. Operator OR Operator OR zwraca wynik prawda, gdy jedno z wyrażeń po prawej lub po lewej stronie operatora jest prawdziwe. Gdy oba wyrażenia sš prawdziwe, wynik też przyjmuje wartoć prawda. Wyrażenie SELECT z listingu 6.3. różni się od poprzedniego zmianš operatora AND na OR. Zwróćmy uwagę na całkiem inny wynik. ------------------------- Listing 6.3. Zapytanie z operatorem OR SELECT movie_title, studio_id, gross FROM Movies WHERE studio_id - 3 OR gross IS NULL MOVIE_TITLE STUDIO_ID GROSS ------------------------- PRICE KONG - 2 BILL DURHAM 3 SQL STRKES BACK 3 10 THE PROGRAMMER 3 45.3 ------------------------- Jako wynik zapytania wybrane sš wiersze, które spełniajš co najmniej jeden z wypisanych warunków. Operator NOT Operatora NOT używamy do zaprzeczenia wartoci wyrażenia. Na przykład w wiecie liczb wyrażenie 2=2 jest prawdziwe. Dodanie operatora NOT powoduje, że wartoć logiczna wyrażenia NOT 2=2 to fałsz. ------------------------- Listing 6.4. Wykorzystanie operatora NOT do pominięcia wybranych wierszy SELECT movie_title, studio_id FROM Movies WHERE NOT studio id - 3 MOVIE_TITLE STUDIO_ID ------------------------- MINERAŁ HOUSE 1 PRICE KONG 2 THE CODE WARRIOR 2 CONDEPENDENCE DAY 1 THE LINUX FILES 2 HARD CODE 1 THE REAR WINDOWS 1 1 rows selected ------------------------- #130 Operatora NOT używamy, gdy wiemy jakie dane chcemy pominšć z wyniku zapytania. Na przykład chcšc zobaczyć wszystkie filmy, które nie pochodzš ze studia Delighted Arists napiszemy zapytanie wykorzystujšce operator NOT. Jak widać, wszystkie filmy z wyjštkiem tych ze studia Delighted Artists pojawiajš się jako wynik zapytania. Podobne zapytanie można również utworzyć wykorzystujšc operator OR. ------------------------- Listing 6.5. Wykorzystanie operatora OR do wykluczenia wierszy w wyniku zapytania SELECT movie_title, studio_id FROM Movies WHERE studio_id - l OR studio_id - 2 OR studio_id =3 MOVIE_TITLE STUDIO_ID ------------------------- MINERAŁ HOUSE 1 PRICE KONG 2 THE CODE WARRIOR 2 Bili Durham 3 CONDEPENDENCE DAY 1 THE LINUX FILES 2 Sql strikes back 3 The programraer 3 THE REAR WINDOWS 1 9 rows selected ------------------------- Wyniki obu zapytań sš identyczne. W zaprezentowanych przykładach wyrażenie z operatorem OR nie jest nawet bardziej skomplikowane niż to z operatorem NOT. Jednak w przypadku tabeli o 100 wierszach i 10 studiach filmowych napisanie odpowiedniego zapytania z wykorzystaniem operatora OR byłoby już znacznie bardziej kłopotliwe niż z operatorem NOT, które pozostaje w niezmienionej postaci. Wyobramy sobie tabelę, w której zgromadzone sš filmy wyprodukowane przez 1000 różnych studiów filmowych, albo sytuację, że nie znasz wszystkich studiów filmowych wprowadzonych do bazy danych. W takiej sytuacji użycie zapytania z operatorem NOT wydaje się jedynym prawidłowym rozwišzaniem. Wykorzystujšc operatory porównania można ten sam efekt osišgnšć bez użycia operatora NOT. Przyjrzyjmy się klauzuli WHERE z listingu 6.4. WHERE NOT studio = 'Delighted Artists' Jest identyczny z WHERE studio <> 'Delighted Artists' Oczywicie, sš też pewne porównania, które wymagajš użycia operatora NOT, aby zanegować wynik. Przykładem jest operator is NULL. Chcšc stwierdzić, czy kolumna zawiera wartoci inne niż null, musimy posłużyć się porównaniem postaci IS NOT NULL. #131 Wykorzystanie złożonych operatorów logicznych Wielokrotne operatory logiczne mogš być wykorzystywane do utworzenia złożonych instrukcji WHERE, w których wykorzystywanych jest kilka wyrażeń jednoczenie. Chcemy, dajmy na to, napisać zapytanie, które wyszukuje filmy, dla których nie okrelono przychodu, a pochodzš ze studia MPM lub Delighted Artists. Tworzymy je wykorzystujšc wielokrotnie operatory logiczne jak pokazuje listing 6.6. ------------------------- Listing 6.6. Kilka operatorów w jednym zapytaniu SELECT movie__title, studio_id, gross FROM Movies WHERE studio_id = 2 OR studio_id = 3 AND gross IS NULL MOVIE_TITLE STUDIO_ID GROSS ------------------------- PRICE KONG 2 The Code Warrior 2 17.8 BILL DURHAM 3 The Linux Files 2 17.5 ------------------------- Jak widać, zapytanie nie zadziałało zgodnie z oczekiwaniami. Poza pozycjami spełniajšcymi okrelone kryteria pojawiły się dodatkowe wiersze dotyczšce studia MPM, a zawierajšce wartoci w polu przychód. Taki rezultat wynika z zasady kolejnoci wykonywania działań: operator AND wyliczany jest przed operatorem OR. Analizujšc dokładnie zapytanie stwierdzimy, że składa się ono z dwóch częci połšczonych operatorem OR. Aby prawdziwe było całe wyrażenie, wystarczy żeby jeden człon był prawdziwy. Stšd jako rezultat zapytania wybrane sš rekordy ze studia MPM lub te ze studia Delighted Artists majšce nieokrelony przychód. Wraz ze wzrostem złożonoci zapytania coraz trudniej objšć kolejnoć wykonywanych operacji. Z pomocš przychodzš nawiasy wykorzystywane do grupowania wyrażeń w klauzuli WHERE. Listing 6.7 zawiera przykład zapytania, które ustala kolejnoć wykonywania instrukcji przy użyciu nawiasów. ------------------------- Listing 6.7. Wykorzystanie nawiasów do ustalenia kolejnoci wykonania instmckji SELECT movie_tltle, studio_ld, gross FROM Movles WHERE (studio_id = 2 OR studio_id = 3) AND gross IS NULL MOVIE_TITLE STUDIO_ID GROSS ------------------------- PRICE KONG 2 BILL DURHAM 3 ------------------------- Jak widać, nawiasy ustalajš kolejnoć w ten sposób, że najpierw wykonujš się instrukcje połšczone operatorem OR, a następnie wykonana jest...
sliwak