4. blok část A Logické operátory Studijní cíl Tento blok je věnován představení logických operátorů AND, OR, NOT v jazyce SQL a práce s nimi. Doba nutná k nastudování 1-2 hodiny Průvodce studiem Při studiu tohoto bloku se předpokládá, že čtenář je obeznámen se základní syntaxí příkazu SELECT, spojováním tabulek, použitím vyhledávacích podmínek a základních funkcí. 1. Logické operátory Při získávání dat z databáze ne vždy vyžadujeme kompletní soubor dat. V mnoha případech potřebujeme pouze ty záznamy, které odpovídají nějaké podmínce (nad daty je aplikována restrikce). Mohou nastat také případy, kdy potřebujeme, aby data odpovídala více než jedné podmínce zároveň, případně, aby odpovídala alespoň jedné podmínce z několika. Také negování podmínek je běžná potřeba. K tomuto účelu slouží logické operátory. Jazyk SQL disponuje třemi logickými operátory. Jsou to: OR (alespoň jedna podmínka musí nabývat hodnoty PRAVDA) AND (všechny podmínky musí nabývat hodnoty PRAVDA) NOT (podmínka musí nabývat hodnoty NEPRAVDA) 2. Logický operátor OR Operátor OR můžeme chápat jako spojku nebo. Musí tedy platit jedna nebo druhá podmínka. Podmínek samozřejmě můžeme řetězit libovolný počet. Hodnota PRAVDA nastává tehdy, pokud je podmínka splněna. Hodnota NEPRAVDA potom, pokud podmínka splněna není. 1
Podmínka A Podmínka B Výsledek (A OR B) PRAVDA PRAVDA PRAVDA PRAVDA NEPRAVDA PRAVDA NEPRAVDA PRAVDA PRAVDA NEPRAVDA NEPRAVDA NEPRAVDA PRAVDA NULL PRAVDA NEPRAVDA NULL NULL NULL PRAVDA PRAVDA NULL NEPRAVDA NULL NULL NULL NULL Z pravdivostní tabulky je patrné, že výsledný výraz bude nabývat hodnoty NEPRAVDA jedině v případě, že všechny dílčí podmínky budou nabývat hodnoty NEPRAVDA. Příklad pro operátor OR i další operátory si předvedeme nad tabulkou produkty, která obsahuje následující sloupce a data: Jaká je cena produktů s označením A600N a A2500H? SELECT oznaceni, cena FROM produkty oznaceni = 'A600N' OR oznaceni = 'A2500H'; Pro získání výsledků z výše uvedeného dotazu jsme použili logický operátor OR. Do výsledků jsme potřebovali zahrnout ty řádky z tabulky PRODUKTY, které mají ve sloupci OZNACENI hodnotu A600N nebo hodnota A2500H. 3. Logický operátor AND Operátor AND můžeme nahradit spojením a zároveň. Musí tedy platit první podmínka a zároveň i druhá. Funkci operátoru si ukážeme opět na pravdivostní tabulce. 2
Podmínka A Podmínka B Výsledek (A OR B) PRAVDA PRAVDA PRAVDA PRAVDA NEPRAVDA NEPRAVDA NEPRAVDA PRAVDA NEPRAVDA NEPRAVDA NEPRAVDA NEPRAVDA PRAVDA NULL NULL NEPRAVDA NULL NEPRAVDA NULL PRAVDA NULL NULL NEPRAVDA NEPRAVDA NULL NULL NULL Na rozdíl od operátoru OR, je celý pravdivý pouze v případě, že všechny dílčí podmínky výrazu nabývají hodnoty PRAVDA. Operátor je velice vhodný na získávání hodnot z určitého intervalu od - do. Ukažme si na příkladu: Které produkty jsou dražší než 20000 ale levnější než 25000? SELECT oznaceni, cena FROM produkty cena > 20000 AND cena < 25000; Do výsledků tohoto příkazu jsme potřebovali zahrnout ty řádky z tabulky PRODUKTY, které mají ve sloupci CENA hodnotu větší než 20000 ale zároveň hodnotu menší než 25000. Proto byl použit logický operátor AND. 4. Logický operátor NOT Operátor NOT slouží k negování podmínky. Pokud tedy podmínka nabývá hodnoty PRAVDA, po aplikování operátory NOT bude výsledná hodnota výrazu NEPRAVDA. NOT je jako jediný logický operátor unární (vyžaduje pouze jeden operand). Operátory AND a OR jsou binární (vyžadují dva operátory). Podmínka A Výsledek (NOT A) PRAVDA NEPRAVDA NEPRAVDA PRAVDA NULL NULL 3
Vypište všechny produkty kromě produktu s označením A600N. SELECT oznaceni FROM produkty NOT oznaceni = 'A600N'; Do výsledku příkladu jsou zahrnuty pouze ty řádky z tabulky PRODUKTY, které ve sloupci OZNACENI neobsahují hodnotu A600N. Pokud bychom logický operátor NOT vynechali, výsledkem by byl pouze řádek, který ve sloupci OZNACENI obsahuje hodnotu A600N. 5. Kombinování logických operátorů Ve velkém množství případů použití jednoho logického operátoru není dostačující, proto je možné logické operátory libovolně kombinovat. Kombinovat je možno libovolné množství operátorů. Priority vyhodnocování logických operátorů můžeme upravovat pomocí závorek. Ukažme si kombinaci kombinování logických operátorů na modifikacích výše uvedených příkladů. Jaká je cena produktů, které nenesou označení A600N nebo A2500H? SELECT oznaceni FROM produkty NOT (oznaceni = 'A600N' OR oznaceni = 'A2500H'); 4
Pro správné pochopení výsledku si nejdříve rozebereme, v jakém pořadí jsou podmínky za klauzulí v tomto případě vyhodnocovány. Postup vyhodnocení si budeme demonstrovat na řádku, kde sloupec OZNACENI nese hodnotu A8JN- 4P019M 1. Jsou vyhodnoceny operátory =, tedy výrazy oznaceni='a600n' a oznaceni='a2500h'. a. Porovná se hodnota A8JN-4P019M s hodnotou A600N. Hodnoty se nerovnají, výsledkem bude hodnota NEPRAVDA. b. Porovná se hodnota A8JN-4P019M s hodnotou A600N. Hodnoty se nerovnají, výsledkem bude hodnota NEPRAVDA. 2. Vyhodnotí se výraz v závorce, tedy operátor OR. Ten již pracuje s hodnotami získanými z bodu 1. Vyhodnocuje se tedy výraz NEPRAVDA OR NEPRAVDA. Výsledkem tohoto výrazu je hodnota NEPRAVDA. 3. Vyhodnotí se operátor NOT, který bude pracovat s hodnotou z bodu 2. Vyhodnocuje se tedy výraz NOT NEPRAVDA, kde výsledkem je hodnota PRAVDA. Řádek tedy bude zahrnutý do výsledku dotazu. Demonstrovaný příklad je možné řešit i druhým způsobem, použitím logického operátoru AND. Vyřešme si tedy stejný příklad ještě jednou: Jaká je cena produktů, které nenesou označení A600N nebo A2500H? SELECT oznaceni, cena FROM produkty (NOT oznaceni = 'A600N') AND (NOT oznaceni = 'A2500H'); Na příkladu je vidět, že stejného výsledku je možné dosáhnout více způsoby. Stačí zaměnit logické operátory mezi sebou a pomocí závorek správně nastavit priority vyhodnocování. Pojmy k zapamatování Příkazy a funkce: AND, OR, NOT Problém: užití logických operátorů ke spojování podmínek, změna priority vyhodnocování podmínek 5
Shrnutí V této lekci jste se seznámili s použitím logických operátorů. Logické operátory pracují s hodnotami PRAVDA a NEPRAVDA. Logické operátory je možno libovolně řetězit a kombinovat. Stejný problém je možno řešit více způsoby, pokud vyměníme logické operátory. Otázky na procvičení 1. Jaký slovní obrat můžeme použít při hovoru o operátoru OR a operátoru AND? 2. Jaký operátor použijeme, pokud chceme hodnoty z intervalu od do? 3. Jak můžeme upravit priority vyhodnocování výrazů? 4. V jakém pořadí bude vyhodnocován výraz NOT (oznaceni = 'XXX' AND oznaceni = 'YYY')? 5. Kolik logických operátorů můžeme zkombinovat do jednoho výrazu? Odkazy a další studijní prameny http://www.techonthenet.com/oracle (syntaxe příkazů SQL jazyka a funkcí) http://www.sqlcourse.com (interaktivni SQL trénink) http://www.oracle.com/technetwork/database/enterpriseedition/documentation (dokumentace k databázové platformě Oracle) http://www.penguin.cz/noviny/?id=chip/index (seriál Databáze standardu SQL z časopisu CHIP) Odkazy a další studijní prameny ŠIMŮNEK, M. SQL, kompletní kapesní průvodce. Grada Publishing, 1999. ISBN 80-7169-692-7. STEPHENS, K.R., PLEW, R.R. Naučte se SQL za 21 dní. Praha: Computer Press, 2004. ISBN 80-7226-870-8. GROFF, J.R., WEINBERG, P.N. SQL - kompletní průvodce. Praha: Computer Press, 2005. ISBN 80-251-0369-2. 6