352 5. JĘZYK BAZ DANYCH SQI-
d) Wyjaśnić, w jaki sposób zmienić wyrażenie utworzone w punkcie c) tak, aby było ono równoważne wyrażeniu, które pasuje do rozwiązania z przykładu 5.40.
!Ćwiczenie 5.8.5. Każde z zap>tań z ćwiczenia 5.8.3 należy wyrazić jako zapytanie lub perspektywę w terminach algebry relacji, zastąpić w zapytaniach perspektywy ich definicjami algebraicznymi, a następnie jak najbardziej uprościć wyrażenia wynikowe. W końcu należy zapisać zapytania w SQL: które są rów'now'azne otrzymanym wyrażeniom, a które odnoszą się tylko do tabel bazowy ch.
Ćwiczenie 5.8.6. Za pomocą tabel bazowych:
Klasy (klasa, t.yp, kraj, liczbaDział, działo, wyporność)
Okręty(na2vra, klasa, wodowanie)
z ćwiczenia 4.1.3 należy:
a) Zdefiniować perspektywę OkrętyBrytyjskie, która dla wszystkich okrętów' brytyjskich zawiera ich klasy, typy, liczby dział, kaliber dział, wyporność oraz rok wodowania.
b) Korzystając z perspektywy zdefiniowanej w a), należy utworzyć zapytanie o liczbę dział i wyporność wszystkich brytyjskich okrętów bojowych, które zwodowano przed 1919 r.
!c) Należ>' przedstawić zapytanie z punktu b) i perspektywę z a) jako wyrażenia algebry relacji, następnie zastąpić w wyrażeniu zapytania perspektywę jej wyrażeniem, a potem uprościć powstałe wyrażenie.
!d) Zapisać wyrażenie z punktu c) jako zapytanie SQL, które dotyczy tabel bazowych Klasy i Okręty.
W bieżącym podrozdziale omówimy sposób korzystania w języku SQL z wartości NULL. Bardzo ważne zastosowanie NULL zachodzi przy wyliczaniu złączenie wówczas, gdy należy chronić dane, a krotka z jednej relacji nic daje się połączyć z żadną krotką pewnej innej relacji. Taka wersja złączenia nazywa się złączeniem zewnętrznym. Omówimy kilka wariantów implementacji złączenia zewnętrznego. Operator złączenia zewnętrznego jest dostępny w standardzie SQL2, ale wcześniejsze wersje SQL przeważnie już dopuszczają stosowanie wartości NULL.
W naszej książce już kilka razy- omówiono zastosowanie wartości NULL w języku SQL. W punkcie 4.7.4 omówiono na przykład zastosowanie NULT-przy reprezentowaniu wartości nieznanych lub nieistniejących. Wartości NULL są stosowane w krotkach wstawianych do relacji wówczas, gdy w poleceniu nie określono wszystkich składowych wstawianej krotki. Wartość NUi jest wstawiana zamiast brakujących wartości, chyba że określono inne wart' ści domniemane. Przekonamy się, źc źródłem pojawienia się w bazie danyt wartości NULL są także złączenia zewnętrzne.
Pułapki związane z NULL
Istnieje pokusa, aby w SQL2 stosować wartość NULL wówczas, gdy nie można określić wartości, która „nie jest znana, ale na pewno istnieje”. Jednakże ta intuicja w niektórych sytuacjach okazuje się zawodna. Załóżmy na przykład, że * stanowi pewną składową, której dziedziną są liczby całkowite. A zatem należy sądzić, że bez względu na wartość x wyrażenie 0 * x będzie miało wartość 0, ponieważ dowolna wartość całkowita przemnożona przez 0 daje w wyniku 0. Ale gdy * ma wartość NULL, to stosuje się zasadę (1) z p. 5.9.1, czyli iloczyn 0 i NULL ma wartość NULL. Możn< by też sądzić, że * x przyjmuje wartość 0, ponieważ bez względu n< wartość .v różnica z wartością a: daje w wyniku 0. Jednakże i w tym przypadku stosuje się zasadę (1) i w wyniku powstaje wartość NULL.
Przy? działaniach z wartością NULL należy pamiętać dwie reguły:
1. Jeśli jako argument działania arytmetycznego takiego jak x lub + w stępuje NULL i pewna inna wartość, być może też NUTU, to wynikłe jest wartość NULL.
2. Przy' porównywaniu wartości NULL z pewną inną wartością, być mo także NULL, za pomocą operatorów- algebraicznych takich jak = lub w wyniku powstaje wartość UNKNCWN (nieznana). Wartość UNKNOt jest trzecią, obok true i FALSE, wartością logiczną: będzie o n mowa w dalszym ciągu.
Trzeba jednak pamiętać również o tym, iż wartość NULL, mimo że kor; sta się z niej w- krotkach, nie jest stałą. Nie można więc jej traktow-ać przy wy cza ni u wartości wyrażeń tak samo, jak traktuje się argumenty- innego rodzaju.
PRZYKŁAD 5.45
Załóżmy, że wartością * jest NULL. Zatem wartością * + 3 jest także NUI Jednakże NULL + 3 nie jest poprawnym wyrażeniem w SQL. Z podobne powodu wartością .v - 3 jest UNKNOWN, ponieważ nie można stwierdzić c wartością*, która jest zapisana jako NULL, jest 3, czy też nic, a z kolei wy żenić null = 3 nie jest poprawnym wyrażeniem w $QL.
Czasami można sprawdzić, czy wartością * jest NULL, stosując wyrażei x IS NULL. Przyjmuje ono wartość TRUE, gdy wartością* jest NULL, a w