MySQL (18) - Filtrujeme data
"Zrcadlo, zrcadlo, kdo je na světě nejkrásnější"? Aneb, jak si vybrat tu pravou (množinu dat, pochopitelně).
6.5.2005 09:00 |
Petr Zajíc
| Články autora
| přečteno 64644×
Jestliže příkaz SELECT umí vybrat z tabulky jen určitý počet
sloupců, asi doufáte, že umí vybrat i určitý počet řádků. A máte
pravdu. Přesně k tomu slouží v SQL klauzule WHERE příkazu SELECT. Dnes
uvidíme jak se používá a jaké s tím může být spojeno úskalí.
Klauzule WHERE
O tomto klíčovém slově jsme již mluvili v souvislosti s úpravou dat
a mazáním,
takže jej známe. WHERE však nemusí sloužit pouze k omezení počtu
měněných záznamů, může rovněž filtrovat záznamy vracené. Na první
pohled tak asi pochopíte význam následujících příkazů:
select * from knihy;
select * from knihy where cena <=500;
První z nich by vrátil všechny knihy, ten druhý jen takové, které si
můžeme pořídit za pětistovku. V klauzuli WHERE se velmi často porovnává
hodnota nějakého sloupce s konstantou, jak jsme právě viděli.
Ovšem WHERE může být daleko složitější. Častá situace je ta, kdy se
pokusíme filtrovat pomocí více kritérií najednou. V takovém případě
používá MySQL arzenál logických výrazů zahrnujících operátory OR, AND,
NOT a závorky. Myslím, že pokud programujete, budete asi moc dobře
vědět, o čem mluvím. Následuje několik příkladů na složitější podmínky
WHERE.
select * from knihy
where cena <=500 and obor='počítače';
select odberatel from faktura where cena > 2000 or prodleni > 10;
select id, nazev from soucastky where not (vyprodano=1);
Vidíte, že kód SQL je v tomto případě dostatečně intuitivní a rovněž
se velmi dobře čte.
Tip: V případě používání závorek
buďte pragmatičtí. Pokud si nejste jisti prioritou operátorů,
závorkujte. MySQL totiž stejně před provedením dotazu nadbytečné
závorky odstraní a vy budete mít klidnou hlavu. Není to sice příliš
profesionální rada, ale běžně to tak dělá spousta lidí.
WHERE a hodnoty NULL
Pomocí klauzule WHERE se v praxi často dotazujeme rovněž na sloupce,
které mají hodnotu NULL. Protože však hodnota NULL je neznámá, nemůžeme
ji porovnávat pomocí operátorů '<', '>' a '='. Následující dotaz
je tedy principielně nesmyslný:
select * from faktura
where zaplaceno_dne > null;
a to proto, že porovnáváme sloupec a neznámou hodnotu. Nicméně,
MySQL má výraz IS NULL, s nímž to již tak nesmyslné nebude.
select * from faktura
where zaplaceno_dne is null;
Pozn.: Ještě jednou - NULL je neznámá
nebo nezadaná hodnota. Dotaz se tedy ptá na faktury, u nichž je datum
zaplacení neznámé nebo nezadané. Asi tušíte, že v českých podmínkách
bude tento dotaz součástí většiny účetních aplikací ;-)))
V souvislosti s WHERE a NULL bych si dovolil rozebrat ještě jeden
oblíbený problém. Člověku by se mohlo zdát, že dvojice dotazů
select * from faktura
where zaplaceno_dne > '20050501';
select * from faktura where zaplaceno_dne <= '20050501';
musí dohromady vrátit všechna data z tabulky. Odpověď je, že to tak
může být a nemusí. Pokud sloupec zaplaceno_dne NESMÍ obsahovat hodnoty
NULL, je vše v pořádku. Pokud však hodnoty NULL obsahovat smí, ani
jeden dotaz nevrátí řádky s nevyplněným datem zaplacení. Na to by se
mělo pamatovat a buď upravit druhý dotaz ve smyslu
select * from faktura
where zaplaceno_dne <= '20050501' or zaplaceno_dne is null;
nebo alespoň počítat s tím, že nezadané hodnoty mohou výběr
zkomplikovat. Pokud si to budete chtít nějak zapamatovat, porovnání
dvou hodnot může dopadnout ČTYŘMI (!) způsoby:
- Obě jsou si rovny
- První je menší než druhá
- První je větší než druhá
- Jedna či obě jsou NULL (neznámé)
Pozn. Než se s tím sžijete,
zažijete spoustu legrace s laděním dotazů. Věřte mi, znám to.
WHERE, LIKE, BETWEEN a IN
Porovnávat hodnoty sloupců s konstantami pomocí porovnávacích
operátorů a logiky není to jediné, co se v klauzuli where dá dělat.
Časté je použití operátoru BETWEEN, zejména u datumů. Ačkoli by se dal
přepsat pomocí znaků nerovnosti, BETWEEN se mnohem lépe čte:
select * from knihy
where porizeno between '20050401' and '20050430';
Je dobré si uvědomit, že operátor BETWEEN ... AND vrátí logickou
jedničku, pokud je porovnávaná hodnota uvnitř intervalu, a to včetně
hraničních hodnot.
Pozn.: Rovněž je dobré si uvědomit, že
použití BETWEEN ... AND není omezeno na datumy. Lze jej použít třeba
pro hodnoty typu integer.
Operátor LIKE se hodí na porovnávání řetězců. Funguje se dvěma
zástupnými znaky, kde "%" (procento) zastupuje nula a více znaků,
kdežto "_" (podtržítko) reprezentuje právě jeden znak. Procento se
používá častěji. Všechny lidi,
jejichž příjmení začíná na 'D' byste tedy z adresáře vybrali
následujícím dotazem:
select * from adresar
where prijmeni like 'D%';
Pozn.: Mnohem mocnější je
vyhledávání pomocí regulárních výrazů, což MySQL podporuje. Bude o tom
řeč někdy příště. Hodí se rovněž poznamenat, že operátor LIKE je v
MySQL velice slušně optimalizován a je tudíž dost rychlý.
Častá úloha je vybrat z tabulky záznamy, kde vybíraná hodnota je
prvkem nějakého seznamu. Například lidi z Prahy, Brna nebo Ostravy
můžete s vědomostmi, které jsme zatím načerpali, vybrat takto:
select * from lidi where
mesto = 'Praha' or mesto = 'Brno' or mesto = 'Ostrava';
Tohle bude fungovat, ale je to trochu neohrabané. Zejména, pokud by
hodnot seznamu bylo více. MySQL to umí zapsat jinak:
select * from lidi where
mesto in ('Praha', 'Brno', 'Ostrava');
Takto sestavený seznam se mnohem lépe čte a mnohem lépe se rovněž
udržuje. Ještě dodejme, že prvky seznamu nemusejí být jen staticky
zadány, že to může být výsledek dotazu SELECT. O tom se však ještě bude
mluvit později.
Verze pro tisk
|
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|