1. NULL
Transkrypt
1. NULL
Opracowanie omawia (pokrótce) następujące zagadnienia SQL: wartośd NULL, funkcje COUNT i SUM. W przykładach zostanie wykorzystana relacja o schemacie przedstawionym poniżej. Relacja A A B 1 1 2 3 2 1 2 1. NULL Wartośd pusta (NULL) jest wartością specyficzną i może byd na początku przyczyną licznych wątpliwości. Znając jednak kilka podstawowych zasad, można owe wątpliwości szybko rozwiad. Wynikiem operacji arytmetycznych, w których przynajmniej jeden element to NULL, jest NULL. Przykład: SELECT 2+NULL FROM DUAL; Wynik: 2+NULL Nie można dokonywad operacji porównania, większości i mniejszości gdy jednym z elementów jest NULL. Podczas przetwarzania, gdy zajdzie potrzeba porównania jednej wartości z inną wartością, a co najmniej jedna będzie NULL, krotka jest pomijana. Przykład: SELECT* FROM A WHERE B>0 Wynik: A 1 3 B 1 2 2 Komentarz: Dwie krotki z relacji A zostały pominięte. Ich eliminacja nastąpiła podczas sprawdzania warunku B>0. Ponieważ dla tychże krotek B było wartością pustą, zatem zostały one pominięte. 1 Dla funkcji grupowych (np. SUM, COUNT) jeśli wartośd krotki na której działa funkcja jest NULL, to krotka ta jest pomijana. Wyjątkiem jest funkcja Count z parametrem *. COUNT(*) zlicza również wystąpienia wartości pustej. 2. COUNT Funkcja ta służy do zliczania ilości wystąpieo krotek. Jest to funkcja grupowa, co oznacza, że ilośd wystąpieo krotek zliczana jest w ramach jednej grupy. Jeśli nie użyto klauzuli GROUP BY to zliczane są krotki z całej relacji. a. Count(*) Zlicza wszystkie wystąpienia, również wartości puste. Przykład: SELECT COUNT(*) FROM A; Wynik: COUNT(*) 5 Komentarz: Zliczamy ilośd wszystkich krotek w całej tabeli. Przykład: SELECT B, COUNT(*) FROM A GROUP BY B Wynik: B 1 2 COUNT(*) 1 2 2 Komentarz: W powyższym zapytaniu zliczamy ilośd krotek w ramach jednej grupy. Grupowanie to operacja trywialna (jeśli chodzi o zasadę działania), dlatego w dalszej części tego dokumentu grupowanie nie będzie szczegółowo rozpisywane. W tym przypadku podział na grupy przedstawia się następująco: 2 B 1 - A 1 2 1 3 2 B 1 2 2 Kolumny A i B po prawej stronie zostały zaznaczone kolorem szarym, ponieważ po pogrupowaniu nie odnosimy się już bezpośrednio do atrybutów A i B, ale do całych grup. Łatwo zauważyd, że w grupie dla B=1 mamy 1 krotkę, w pozostałych po dwie krotki. b. COUNT(ATRYBUT) Ta postad funkcji Count, odpowiada za zliczanie krotek w ramach grupy, ale liczenie odbywa się po atrybucie, na który wskazuje argument ATRYBUT. Wartości puste nie są zliczane. Przykład SELECT COUNT(B) FROM A Wynik: COUNT(B) 5 Komentarz: Zliczamy krotki w kolumnie B. Ponieważ pomijamy wartości puste, wynik to 3. c. COUNT(WYRAŻENIE) Jeśli parametrem aktualnym funkcji Count jest wyrażenie, to jest ono obliczane, a następnie następuje zliczanie ilości krotek w grupie, które odpowiadają wyrażeniu. Działanie funkcji można także wytłumaczyd w nieco inny sposób na podstawie grupowania: w relacji następuje grupowanie zgodnie z parametrem, następnie zliczana jest ilośd krotek w grupach i ostatecznie sumowana jest ilośd we wszystkich grupach. Wartości puste nie są zliczane. Najlepiej zobrazuje to poniższy przykład. Przykład: SELECT COUNT(A+B) FROM A Wynik: COUNT(A+B) 2 3 Komentarz: Wykonujemy najpierw operację A+B. Rozważamy po kolei każdą krotkę. Dla pierwszej jest to: 1+1=2, dla drugiej2+null = null, dla trzeciej 5, dla dwóch ostatnich wartośd null. Teraz zliczamy wystąpienia wyliczonych sum. Suma 2 występuje tylko jeden raz (dla krotki pierwszej), suma 5 występuje jeden raz (dla krotki 3), wartości puste pomijamy. Zatem zliczyliśmy łącznie dwa wiersze. Gdyby w relacji A była jeszcze krotka (1,4), to wynik byłby 3, ponieważ dwukrotnie wystąpiłaby suma 5. Na podstawie powyższych opisów można (słusznie) stwierdzid, że funkcja COUNT(NULL) zawsze zwraca 0. d. COUNT(STAŁA_LICZBOWA) Jeśli do funkcji Count zostanie podana jako parametr stała liczbowa, to rezultat jest taki sam jak po wykonaniu COUNT(*). Oczywiście stałą liczbową oprócz samej liczby, może byd wyrażenie arytmetyczne, którego składniki, to stałe liczbowe, czyli np.: COUNT(2+6/2-(1.5)) 3. SUM Funkcja SUM służy do sumowania wartości krotek. Jest to, podobnie jak COUNT, funkcja grupowa, co oznacza, że ilośd wystąpieo krotek sumowana jest w ramach jednej grupy. Jeśli nie użyto klauzuli GROUP BY to sumowane są krotki z całej relacji. Wartości puste nie są sumowane (są pomijane). a. SUM(ATRYBUT) Funkcja ta odpowiada za sumowanie wartości wskazanej kolumny. Przykład: SELECT SUM(A) FROM A; Wynik: SUM(A) 7 Komentarz: Dodajemy wszystkie wartości atrybutu A. Wartośd pustą pomijamy. Zatem wynik to 1+2+3+1=7 4 b. SUM(WYRAŻENIE) Dla takiej wersji funkcji SUM obliczane jest najpierw wyrażenie. Następnie sumowane są wszystkie komórki które dopasują się do wyrażenia. Innymi słowy: następuje grupowanie relacji zgodnie z parametrem WYRAŻENIE, dla każdej grupy obliczana jest suma (ilośd krotek w grupie razy suma). Ostatecznie sumowane są sumy z poszczególnych grup. Najlepiej zobrazuje to poniższy przykład. Przykład: SELECT SUM(A+B) FROM A Wynik: SUM(A+B) 7 Komentarz: Rozważamy każdą krotkę z relacji A. Wykonujemy najpierw operację A+B. Zatem będzie to po kolei: 2, null, 5, null, null. Grupujemy według obliczonych sum, otrzymując grupy: 2, null, 5. W każdej grupie wyliczamy sumę, jest to kolejno: 2, null, 5. Teraz wystarczy zsumowad te sumy (oczywiście null pomijamy). Otrzymujemy: 2+5=7. Gdyby w relacji była jeszcze krotka (1,4), to dla grupy 5, suma wyniosłaby 10, bo w grupie tej znalazłyby się dwa elementy. Ostateczny wynik byłby zatem 2+10=12). Na podstawie powyższego opisu można wnioskowad ( i słusznie), że wynikiem SUM(NULL) zawsze będzie NULL. To spostrzeżenie można nawet uogólnid: wynikiem funkcji grupowej, która jako parametr przyjmuje NULL, jest zawsze NULL. Zasada ta nie dotyczy tylko funkcji COUNT(*) c. SUM(STAŁA_LICZBOWA) Jeśli parametrem funkcji SUM jest stała liczbowa, to w wyniku zwrócona zostanie licznośd komórek pomnożona przez podaną stałą. Innymi słowy jest to równoważne: COUNT(*)∙STAŁA. Przykład: SELECT SUM(1.5*4-8/2) FROM A; Wynik: SUM(1.5*4-8/2) 10 Komentarz: 8 Obliczona stała wynosi: 1.5 ∙ 4 − 2=2. Ilośd krotek w relacji to 5. Zatem wynik zapytania: 2 ∙ 5 = 10 5 Powyższe informacje nie zostały dogłębnie sprawdzone w literaturze, dlatego autor nie poświadcza ich pełnej autentyczności Autor: Dawid Gierszewski. 6