.5 l*ł 5. JĘZYK BAZ DANYCH SQL
MĆwiczenie 5.3.6. Można już było uprzednio dostrzec, że operatory w SQL są nadmiarowe, tzn. że można je zawsze zastąpić innymi operatorami. Na przykład s tn R można zastąpić wyrażeniem s = any R. Należy wykazać, że operatory f.xtsts oraz NOT exiSTS są nadmiarowe. Należy w tym celu zamiast dowolnego wyrażenia postaci EXISTS R lub NOT EXISTS R wskazać postać wyrażenia równoważnego, które nie zawiera operatora EXISTS (chyba że ten operator występuje wewnątrz wyrażenia R). Uwaga: W klauzuli SELECT można stosować stałe, aczkolwiek nie są to częste przypadki.
Działania, które omawialiśmy dotychczas, przeważnie operowały na poszczególnych krotkach. Wyjątkiem były do tej pory tylko operatory sumowania, przecięcia oraz różnicy, które zostały omówione w p. 5.2.5. W bieżącym podrozdziale oraz następującym po nim będziemy rozważać działania, których argumentami są całe relacje, a nie ich poszczególne krotki. W tych przypadkach jest ważne znaczenie relacji w SQL, która tutaj jest wielozbiorem, a nic zbiorem, a więc krotka może w relacji występować więcej niż jeden raz. Możemy wymusić, aby wynik działania w SQL był zbiorem, a jak to zrobić, okaże się w p. 5.4.1. Z kolei w p. 5.4.2 przekonamy się, że można uniknąć wy el i m i n owan i a powtórzeń.
Jak już wspomnieliśmy w p. 5.3.4 pojęcie relacji w SQI. różni się od pojęcia abstrakcyjnego, które zostało przedstawione w rozdziale 3. W relacji, która jest traktowana jako zbiór, każda krotka nic może mieć więcej kopii. Natomiast kiedy zapytanie w SQL tworzy nową relację, to system standardowo nie sprawdza, czy nowa krotka jest już zapisana w relacji, tylko ją po prostu tam dołącza. A więc w wyniku zapytania SQL krotka może wystąpić kilka razy.
W punkcie 5.2.4 przedstawiono kilka równoważnych definicji znaczenia zapytania SQL, a jedna z nich określała, żc wykonanie klauzuli select-from--where rozpoczyna się od utworzenia iloczynu kartezjańskiego relacji, które występują w klauzuli FROM. Każda utworzona krotka jest następnie testowana w warunku klauzuli WHERE i tc, które spełniają warunek, są następnie rzutowane na listę atrybutów podaną w klauzuli SELECT. Właśnie w wyniku rzutowania może powstać taka sytuacja, że po raz kolejny zostanie do wyniku dołączona taka sama krotka. A następnie, ponieważ relacje w SQI. są wiclo-zbiorami, ta relacja może zostać argumentem iloczynu kartezjańskiego i każda kopia jest wówczas łączona w parę ze wszystkimi krotkami drugiej relacji, co spowoduje zwielokrotnienie powtórzeń w iloczynie.
Jeśli należy uniknąć w wyniku powtarzania się krotek w zapytaniu po słowie kluczowym SELECT, trzeba użyć słowa kluczowego DlS'i INCT. Dzięki niemu SQL do wyniku zapytania dołączy tylko po jednej kopii każdej krotki. A więc odpowiedź na pewno nie będzie zawierała powtórzeń.
PRZYKŁAD 5.20
Rozważmy ponownie zapytanie z rys. 5.7, w którym bez użycia podzapytań trzeba było wyszukać producentów filmów z udziałem Harrisona Forda. Okazało się, że George Lucas wystąpił w wyniku wielokrotnie. Jeśli chcielibyśmy, aby każdy producent został tam wymieniony tylko jeden raz. to trzeba by zmienić wiersz I) w następujący sposób:
1) SELECT DISTINCT nazwisko
Wówczas przed wydrukowaniem wyniku powtórzenia zostały by usunięte.
Przypadkowo wynik zapytania z rys. 5.5, gdzie korzystaliśmy z podzapytań, nic zawierał nadmiarowych odpowiedzi. Podzapytanie z wiersza 4) z rys. 5.5 rzeczywiście dołączało do wyniku numer certyfikatu George’a Lucasa wielokrotnie, jednakże w zapylaniu głównym z wiersza 1) każda krotka z relacji Fi mDyr była sprawdzana tylko jeden raz. Można przyjąć założenie, że krotka z George’em Lucasem występowała w tej relacji tylko jeden raz. a jeśli tak, to tylko jedna krotka mogła spełnić w arunek z klauzuli WHERE w wierszu 3). Czyli wynik zawierał tylko jedno wystąpienie Gcorgc’a Lucasa.
□
Inaczej niż występuje to w przypadku instrukcji SELECT, która standardowo zachowuje powtórzenia krotek i tylko na wyraźne polecenie, spccyfi-kowane poprzez słowo kluczowe DISTINCT, usuwa je z wyniku, teoriomno-gościowe działania sumy, przecięcia i różnicy, które zostały już wstępnie przedstawione w p. 5.2.5, standardowo eliminują powtórzenia. Aby uniknąć usunięcia powtórzeń z wyniku operatory' UNION, tntersect lub EXCEP'i należy poprzedzić słowem kluczowym ALT.. W takim przypadku uzyskamy semantykę wiclozbiorów, którą omów iono w p. 4.6.2
PRZYKŁAD 5.21
Rozważmy ponownie wyrażenie z sumą z przykładu 5.16. tym razem jednak zastosujmy słowo kluczowa all:
(SELECT tytuł, rok FROM Film)
UNION ALL
(SF.LF.CT LytułFilmu AS tytuł, rok Fi 'mu AS rok FROM GwiazdyW);