288 5 JĘZYK BAZ DANYCH SQI.
W przykładzie 5.1 występuje porównanie:
nazwaStudia = 'Disney'
Powoduje ono, że wartości atrybutu nazwaStudia w relacji Film są porównywane ze stałą 'Disney'. Jest to wartość tekstowa, teksty w- $QL są ujmowane w pojedyncze cudzysłowy-. Można także używać stałych numerycznych zarówno całkowitych, jak i rzeczywistych, przy czym dla stałych rzeczywistych stosuje się standardowy zapis np. -12.34 lub 1. 23E45.
W wyniku porównania powstaje wartość logiczna: albo TRuE (prawda), albo FALSE (fałsz). Wartości logiczne można łączyć w wyrażenia logiczne za pomocą operatorów logicznych AND, CR i NCT, które mają takie samo znaczenie jak w Pascalu. W przykładzie 5.1 występowało wyrażenie logiczne ze spójnikiem AND. Klauzula WHERE w tym przykładzie nabywała wartości praw-da, jeśli były spełnione oba porównania występujące w warunku klauzuli, tzn. jeśli studiem był 'Disney', a rok produkcji 1990. Poniżej przedstawiamy kilka kolejnych przykładów zapytań ze złożoną postacią klauzuli WHERE.
PRZYKŁAD 5.6
W poniższym zapytaniu chcemy uzyskać dane o czarno-białych filmach wyprodukowanych przed rokiem 1970.
SELECT tytuł FROM Film
WHERE rok < 1970 AND NOT czyKolcr;
Tutaj ponownie w-arunek został sformułowany w postaci koniunkcji dwóch wyrażeń logicznych. Pierwsze z nich jest zwykłym porównaniem, ale drugie, sprawdzające typ taśmy jest zanegowanym atrybutem. Można tak zrobić, ponieważ atrybut czyKolcr jest typu logicznego.
Teraz zaś rozważmy kolejne zapytanie:
SELECT tytuł FROM Film
WHERE (rok < 1970 OR długość < 90) AND nazwaStudia = 'MGM';
Zapytanie powyższe służy do wybrania tych filmów, które wyprodukowało studio MGM oraz które albo były produkowane przed rokiem 1970, albo trwają krócej niż 90 minut. Warto zwrócić uwagę, że wyrażenia można ujmować w' nawiasy okrągłe. Tutaj użyto nawiasów- po to, by zmienić standardową kolejność wykonywania operatorów-, która w SQL jest taka sama jak w innych językach programowania, tzn. AND jest wykonywany przed operatorem OR, a operator NOT przed oboma poprzednimi.
□
Dwa teksty są równe, jeśli występują w nich kolejno te same znaki. W języku SQL można definiować różne typy tekstów, na przykład znakowe tablice o stałej długości lub listy znaków o długości zmiennej*. Można zatem oczekiwać, że stałe tekstowe będą utożsamiane zgodnie z oczekiwaniami. Na przykład napis „nic” można przechowywać jako tekst o ustalonej długości 10 znaków z 7 znakami „uzupełniającymi” lub jako listę. Spodziewamy się, że wartości obu typów sąjednakowe i że jest to tekst ‘nic5.
Reprezentowanie wartości logicznych i tekstów binarnych
W języku SQL wartości logiczne można reprezentować jako specjalny przypadek napisów binarnych. Tekst binarny jest reprezentowany przez ustalony ciąg zer i jedynek poprzedzony literą B. A więc na przykład B' 011' reprezentuje tekst złożony z trzech bitów, pierwszy jest 0, a pozostałe dwa 1. Można korzystać także z zapisu szesnastkow-ego, który składa się z. ciągu cyfr szesnastkowych (od 0 do 9 i od a do /do oznaczenia cyfr określających wartości od 10 do 15), który' poprzedził znak X. Na przykład X' 7f f' oznacza ciąg dwunastu bitów, pierwszy z nich to 0, po nim następuje 11 jedynek. Zauważmy, że każda cyfra szesnastkowa zapisuje się na czterech bitach, przy czym nic należy pomijać początkowych zer.
Wartości logiczne można określać poprzez zapis takich stałych binarnych, wówczas w-artość TRUE jest zapisywana jako bit 1, czyli stała B' 1'. Analogicznie wartość FALSE zapisuje się jako B' 0'.
Przy teście „nierównośćiowym” tekstów, tzn. przy wykonywaniu porównań takich jak < lub >=, o wartości porów-nania decyduje czy kolejne znaki z. tekstu z lewej strony są leksykograficznie (tzn. alfabetycznie lub inaczej słownikowo) wcześniejsze, czy dalsze w stosunku do znaków tekstu umieszczonego po prawej stronie wyrażenia. Należy to rozumieć następująco: jeśli porównujemy dwa teksty a\a2... an oraz h\b2... bm, to pierwszy jest „mniejszy niż" drugi, jeżeli a\ < b\ lub jeżeli ai - b3 i jednocześnie a2 < b2 lub jeżeli a\ -= b\ i jednocześnie a2 - b2 i jednocześnie a3 < by itd. Uważamy także, że za chodzi (X\Qi... a„ < b\b2... bm, jeżeli n < Jti oraz a\a2... a„ = h\b2... hn\ tzn pierwszy tekst jest popraw-nym przedrostkiem drugiego tekstu. Na przykłac jest spełniony warunek 'nic' < 'niebo', ponieważ pierwsze dwa znak w obu tekstach „ni” są takie same, a trzeci znak z lewej strony „c” jest alfa betycznie wcześniejszy niż trz.eci znak w prawym tekście „e”. Z kolei teks 'nic' < 'nicość', poniew-aż pierwszy tekst jest poprawnym przedrostkien
‘ A w każdym razie można myśleć o tekstach jako odpowiednio o listach albo o lablicacl Jednak sposób implementacji tekstów nie jest ustalony w żadnym standardzie SQL.