MySQL Tahák

Logické Operátory

Tato část je sice pojmenovaná jako logické operátory, ale týká se spíš logiky celkově, protože tu nejsou jen samotné logické operátory. Najdete tu seznam porovnávacích a logických operátorů, BETWEEN, IN, LIKE, CASE, IS NULL a funkce IF a CAST.

Porovnávací operátory

V MySQL máme k dispozici k porovnávání hodnot pár porovnávacích operátorů. Ukazuje je následující tabulka.

Popis
> větší než
>= větší nebo rovná se
< menší než
<= menší nebo rovná se
= rovná se
!= nerovná se
<=> NULL-safe rovná se (pokud porovnáme NULL hodnoty a budou se rovnat, tak se vrátí 1, ne NULL)

V následující ukázce si můžete některé porovnávací operátory prohlédnout v kódu.

SELECT * FROM users WHERE age > 18;
SELECT * FROM users WHERE username = 'Adam';
SELECT 0 > 1; # vrátí 0 (nepravda)
SELECT NULL = NULL; # vrátí NULL
SELECT NULL <=> NULL; # vrátí 1 (pravda)

Logické operátory

V MySQL máme k dispozici logické operátory, které můžeme použít k tvorbě komplikovanějších podmínek. Ukazuje je následující tabulka.

Popis
AND, && logické A (a zároveň)
NOT, ! negace
OR, || logické nebo
XOR exkluzivní disjunkce

Až na XOR jsou myslím všechny operátory jasné. Operátor XOR vrátí NULL, když je jakýkoliv z operandů NULL. Pokud žádný z operandů není NULL, tak se vrátí 1 (pravda) pokud je lichý počet operandů nenulový, jinak se vrátí 0 (nepravda).

V následující ukázce si můžete některé logické operátory prohlédnout v kódu.

SELECT * FROM users WHERE age > 6 AND age < 18;
SELECT 2 > 1 OR 3 < 1; # vrátí 1 (pravda)
SELECT NOT 0 > 1; # vrátí 1 (pravda)
SELECT 1 XOR 1 XOR 1; # vrátí 1
SELECT 1 XOR 1; # vrátí 0

BETWEEN

Pokud potřebujeme vytvořit podmínku ve které se ptáme jestli je nějaká hodnota uvnitř nějakého intervalu, tak k tomu můžeme použít BETWEEN operátor. Použijeme jej tak že za hodnotu na kterou ho chceme aplikovat napíšeme slovo 'BETWEEN', hodnotu od které interval začíná, slovo 'AND' a hodnotu kde interval končí.

# následující příkaz vrátí všechny položky, které mají ve sloupci released_year hodnotu, která je uvnitř intervalu od 2004 do 2015
SELECT * FROM books
WHERE released_year BETWEEN 2004 AND 2015;
 
SELECT 3 BETWEEN 2 AND 5; # vrátí 1 (pravda)
SELECT 1 BETWEEN 2 AND 5; # vrátí 0 (nepravda)

Pokud se naopak chceme zeptat jestli se nějaká hodnota nenachází v nějakém intervalu, tak před BETWEEN můžeme připsat slovo NOT.

# následující příkaz vrátí všechny položky, které mají ve sloupci released_year hodnotu, která není uvnitř intervalu od 2004 do 2015
SELECT * FROM books
WHERE released_year NOT BETWEEN 2004 AND 2015;
 
SELECT 3 NOT BETWEEN 2 AND 5; # vrátí 0 (nepravda)
SELECT 1 NOT BETWEEN 2 AND 5; # vrátí 1 (pravda)

IN

Pokud se chceme zeptat jestli se nějaká hodnota rovná nějaké hodnotě ze seznamu hodnot, tak k tomu můžeme použít operátor IN. Použijeme jej tak, že za hodnotu na kterou ho chceme aplikovat napíšeme slovo 'IN' a za něj do závorek vypíšeme seznam hodnot.

# následující příkaz vrátí jen položky, které mají ve sloupci username hodnotu 'Pavel', 'Marek' nebo 'Mirek'
SELECT * FROM users
WHERE username IN ('Pavel', 'Marek', 'Mirek');
 
SELECT 3 IN (4, 7, 9); # vrátí 0 (nepravda)
SELECT 7 IN (4, 7, 9); # vrátí 1 (pravda)

Pokud se naopak chceme zeptat jestli se nějaká hodnota nerovná žádné hodnotě ze seznamu hodnot, tak před IN můžeme připsat slovo NOT.

# následující příkaz vrátí jen položky, které nemají ve sloupci username hodnotu 'Pavel', 'Marek' nebo 'Mirek'
SELECT * FROM users
WHERE username NOT IN ('Pavel', 'Marek', 'Mirek');
 
SELECT 3 NOT IN (4, 7, 9); # vrátí 1 (pravda)
SELECT 7 NOT IN (4, 7, 9); # vrátí 0 (nepravda)

LIKE

Pomocí operátoru LIKE se můžeme zeptat jestli řetězec splňuje nějaký vzor. Tento příkaz použijeme tak, že za hodnotu na kterou jej chceme aplikovat napíšeme slovo 'LIKE' a řetězec, který představuje vzor, který má hodnota splnit. Tento řetězec může obsahovat znaky procenta nebo podtržítka. Co tyto znaky představují popisuje následující tabulka. Na malá a velká písmena se nehledí.

Popis
% libovolný počet jakýchkoliv znaků
_ libovolný znak

Pokud bychom znaky procenta nebo podtržítka chtěli v našem vzoru použít jako normální znaky, tak je musíme escapnout: \%, \_.

Následující ukázka použití operátoru LIKE ukazuje.

# následující příkaz vybere všechny položky, které mají ve sloupci username řetězec začínající na 'Pa'
SELECT * FROM users
WHERE username LIKE 'Pa%'; # řetězec musí začínat znaky 'Pa'

Pokud bychom naopak chtěli zjistit jestli řetězec nesplňuje nějaký vzor, tak před LIKE můžeme připsat slovo NOT.

# následující příkaz vybere všechny položky, které mají ve sloupci username řetězec, který nezačíná na 'Pa'
SELECT * FROM users
WHERE username NOT LIKE 'Pa%'; # řetězec nesmí začínat znaky 'Pa'

CASE

Pomocí CASE a pár dalších slov můžeme nastavovat hodnoty podle podmínek podobně jako v programovacích jazycích pomocí if, else if a else. Nevím jak bych to popsal v textu, tady je ukázka podle které to pravděpodobně pochopíte lépe:

SELECT title, released_year,
    CASE # výběr hodnoty podle podmínek
        WHEN released_year >= 2000 THEN 'Modern Lit' # pokud je hodnota ve sloupci released_year větší nebo rovna 2000, nastaví se hodnota 'Modern Lit'
        WHEN released_year <= 1800 THEN 'Classic Lit' # jinak pokud je hodnota ve sloupci released_year menší nebo rovna 1800, nastaví se hodnota 'Classic Lit'
        ELSE '20th Century Lit' # jinak se nastaví hodnota '20th Century Lit'
    END AS genre # hodnoty se uloží pod sloupec genre
FROM books;

IS NULL

Zapsáním 'IS NULL' za hodnotu můžeme zjistit jestli je NULL nebo ne.

SELECT * FROM users
WHERE score IS NULL; # vrátí jen položky, které mají ve sloupci score NULL

Funkce IF

Pomocí funkce IF můžeme nastavit jednu ze dvou hodnot podle předané podmínky. Jako první parametr funkci IF předáváme podmínku. Jako druhý parametr předáváme hodnotu, která se nastaví když se podmínka splní a jako třetí parametr předáváme hodnotu, která se nastaví když se podmínka nesplní.

SELECT username, score, IF(score > 50, 'uspěl', 'neuspěl') AS vysledek
FROM users;

Funkce CAST

Občas můžeme chtít hodnoty převést na jiný datový typ než s nimi vytvoříme například nějakou podmínku. K tomu nám slouží funkce CAST. Do této funkce napíšeme hodnotu kterou chceme převést, text 'AS' a datový typ na který chceme hodnotu převést.

# následující funkce převede DATE na DATETIME
SELECT CAST('2021-08-15' AS DATETIME); # funkce vrátí tuto hodnotu: '2021-08-15 00:00:00'