06. Zastosowanie klauzuli WHERE.txt

(39 KB) Pobierz
#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...
Zgłoś jeśli naruszono regulamin