< Sloupce ve výsledku | SQL postupně | Pořadí řádků >
Můžeme požadovat, aby se do výsledku dostaly jen záznamy, které splňují námi zadané podmínky. Podmínky mohou být kladeny na hodnotu v nějakém sloupci(poli) či na vzájemný vztah více sloupců (polí). Zapisují se do klauzule where
.
Základní podmínka může mít jeden z následujících tvarů:
<pole> { = | <> | > | < | <= | >= | like } <výraz>
<pole> [not] between <výraz1> and <výraz2>
<pole> [not] in (<seznam_výrazů_oddělených_čárkami>)
Základní podmínky můžeme kombinovat pomocí logických operátorů and
, or
, not
.
Příklad: Vypište čísla objednávek s dodací adresou jinou, než je kontaktní adresa zákazníka.
select CISO as CISLO_OBJEDNAVKY
from OBJ join ZAK on (ZAK=LOG)
where ZAK.MEST<>OBJ.MEST or ZAK.ULIC<>OBJ.ULIC; |
Pokud se některá pole z různých tabulek jmenují stejně, musíme v podmínce specifikovat, které to je. |
Příklad: Vypište čísla objednávek zákazníka s loginem "bohus".
select CISO as "číslo objednávky"
from OBJ
where ZAK='bohus'; |
V jazyku Oracle musí být textové konstanty v jednoducých apostrofech, zatímco uvozovky jsou vyhrazeny pro identifikátory databázových objektů – polí, tabulek atd. |
Příklad: Vypište čísla objednávek přijatých po 1.5.2009.
select CISO as CISLO_OBJEDNAVKY
from OBJ
where DAT>='01052009'; |
V jazyku Oracle lze datumovou hodnotu zadat jako text, v naší národní lokalizaci je to 'DDMMYYYY'. |
Příklad: Vypište čísla objednávek přijatých od 1.1.2009 do 30.4.2009.
select CISO as CISLO_OBJEDNAVKY
from OBJ
where DAT between '01012009' and '30042009'; |
Příklad: Vypište čísla neodeslaných objednávek.
select CISO as CISLO_OBJEDNAVKY
from OBJ
where DATOD is null; |
Jediný způsob, jak se dotázat na záznamy s prázdnou, tj. NULL, (resp. neprázdnou) hodnotou v nějakém poli, je operátor "is null" (resp. "is not null"). Porovnání pole = NULL nebo pole <> NULL nikdy není vyhodnoceno jako TRUE ani jako FALSE, ale vždy jen jako UNKNOWN. |
Příklad: Vypište čísla objednávek s dodáním do Prahy.
select CISO as CISLO_OBJEDNAVKY
from OBJ
where MEST like '%Praha%'; |
Porovnání like je pro textové hodnoty, lze porovnávat s tzv. "maskou". V masce mohou být zástupný symbol % za jakýkoli (i prázdný) text, a zástupný symbol _ za jeden znak. Jiná varianta pro tento příklad: |
select CISO as CISLO_OBJEDNAVKY
from OBJ
where PSC like '1%'; |
Příklad: Vypište čísla objednávek určených k osobnímu převzetí nebo rozvozu.
select CISO as CISLO_OBJEDNAVKY
from OBJ
where DOPR in ('1','2'); |
Seznam k porovnání může být také výsledkem poddotazu (k poddotazům se tento tutoriál propracuje později). |
Příklad: Vypište čísla objednávek s dodáním do Prahy, Brna nebo Vyškova
Pro tento příklad není jednoduché řešení, protože není možné "kombinovat in
a like
", alespoň ne v jazyce Oracle. Řešením je formulovat více podmínek s porovnáním like
, a ty podmínky spojit logickým operátorem or
.
Efektivita podmínek
V této kapitole nejsou zmíněny jiné podmínky, než ty základní. Je třeba kriticky zvažovat užití jiných podmínek, mohou výrazně ovlivnit rychlost zpracování dotazů.
| Dále pamatujte na to, že:
- Porovnání s konstantou nebo polem je vždy rychlejší než porovnání výrazů:
MNOZ > SKLAD je rychlejší jež
MNOZ/SKLAD > 1
- Porovnání
in je rychlejší než série porovnání na rovnost spojených podmínkami or :
DOPR in ('1','2','4') je rychlejší než
DOPR='1' or DOPR='2' or DOPR='3'
- Porovnání
between je rychlejší než kombinace <= a >= :
DAT between '01012009' and '30042009' je rychlejší než
DAT >= '01012009' and DAT <= '30042009'
- Porovnání
like "od začátku" je rychlejší než "podle vnitřku":
MEST like 'Praha%' je rychlejší než
MEST like '%Praha%' i v případě, že výsledek je stejný.
|
< Sloupce ve výsledku | SQL postupně | Pořadí řádků >