5. JĘZYK BAZ DANYGII SQL
.'Ćwiczenie 5.9.5. W przykładzie 5.46 rozważaliśmy zapytanie
SELECT *
FROM Film
WHERE długość <- 120 OR długość > 120;
Jego wynik nie jest intuicyjny, gdy w jakiejś krotce długość przyjmuje wartość null. Należy podać prostsze zapytanie równoważne z pojedynczym warunkiem w klauzuli WHERE (a nie koniunkcję ani alternatywę).
!Ć\viczenie 5.9.6. Operatory złączeń, o których była mowa w bieżącym rozdziale, są nadmiarowe w tym sensie, że można je zastąpić wyrażeniem typu selcct-from-where. Należy omówić wyrażenia select-from-where, którymi można zastąpić wyrażenia zapisane poniżej:
*a) R CROSS JOIN S;
b) R NATURAL JOIN S;
c) r JOIN S ON C; (gdzie C jest pewnym warunkiem zapisanym w SQ1.).
!!Ćwiczenie 5.9.7. Operatory' złączenia zewnętrznego zawsze można zastąpić zapytaniami SQL, które zawierają inne operatory' z SQL. Należy- określić, w jaki sposób utworzyć wyrażenia w SQL, które nie korzystają w sposób jawny z operatorów złączenia ani złączenia zewnętrznego
a) R NATURAL LEFT OUTER JOIN S;
b) R NATURAL FUŁL OUTER JOIN S;
c) R FULL OUTER JOIN s ON C; (gdzie C jest pewnym warunkiem zapisanym w SQL).
W bieżącym podrozdziale skupimy uwagę na pewnym charakterystycznym aspekcie SQL3 - na zapytaniach rekurencyjnych - które zaczynają już się pojawiać w systemach komercyjnych. W poprzednich rozdziałach opisywaliśmy te cechy SQL, które obowiązują w praw-ie wszystkich implementacjach komercyjnych. Standard SQL2 został formalnie zatwierdzony, ale zapytania rekurencyjnc nie są tam dołączone i ich opis opiera się na pewnych roboczych wersjach opisu standardu $QL3, a więc może odbiegać od wersji zaimplementowanych.
Koncepcja rekurcncji w SQL3 jest zbliżona do reguł rekurencyjnych Da-talogu, które opisano w' podrozdziale 4.4. Istnieje jednak między nimi kilka różnic. Po pierwsze w standardzie SQL dopuszcza się tylko rekurencję liniową, czyli Jaką, która opisuje się jednym podzadanicm rekurencyjnym. Poza tym
wymaganie dotyczące stratyfikacji było omawiane dla operatora negai w p. 4.4.4, w SQL3 rozciąga się na inne operatory, mogące w przy padku rek rencji prowadzić do niejednoznaczności wyniku, np. do agregacji.
W podrozdziale 4.4 rozróżniliśmy relacje typu EDB (ekstensjom ne bazy danych), które zapisuje się w postaci tabel, od relacji typu IDB (i tensjonalne bazy danych), które definiuje się za pomocą reguł Datalog W języku SQL występuje instrukcja identyfikowana słow-em kluczowy WITH, która umożliwia definiowanie relacji typu IDB. Ich definicji moźi od razu używać w tej samej instrukcji. Prosta postać instrukcji WITH je następująca:
WITH R AS edefinicja R> <zaoytar.ie określone na R>
A więc definiuje się roboczą relację R, a następnie korzysta się z ni w zapytaniu. W bardziej ogólnej postaci po WITH może wystąpić kilka d finicji relacji, oddzielonych przecinkami. Każda z definiowanych rela< może być rekurencyjna. Część z nich może być wzajemnie rekurencyjr tzn. każdą z nich można zdefiniow-ać za pomocą innej, także samej sieb Definicja każdej relacji, która jest objęta rekurencją, musi być poprzedzo słowem kluczowym RECURSIVE. Ogólna postać instrukcji WITH jest nasi pująca:
1. Słowo kluczowe WITH.
2. Jedna lub kilka definicji. Definicje oddziela się przecinkami, a każ
z nich składa się z następujących elementów:
a) opcjonalne słowo kluczowe RECURSIVE, jeśli definiowana relac jest rekurencyjna;
b) nazwa definiowanej relacji;
c) słow-o kluczowe AS;
d) zapytanie, które określa relację.
3. Zapytanie, które może dotyczyć dowolnej z definiowanych rei
cji, a którego wynik jest jednocześnie wynikiem działania instruk*
WITH.
Trzeba zauw-ażyć, że inaczej niż w przypadku innych definicji rela< zdefiniowane w instrukcji WITH są dostępne tylko w obrębie tej instrukc a nie można korzystać z nich gdzie indziej. Jeśli relacja ma być trwała, trzeba ją zdefiniować w schemacie bazy danych poza instrukcją WITH.