2.6 Výberový dopyt – operátory selekcie
Selekcia údajov
Ako už vieme, selekcia údajov znamená filtrovanie riadkov, ktorým sa bude venovať SQL dopyt. Uskutočníme ju zadaním podmienky v klauzule WHERE.
Základné operátory porovnávania
V podmienke môžeme využívať bežné operátory, ako ich poznáme z programovacích jazykov: =, !=, <, >, <=, >=. No pozor, na rozdiel od C++ je operátorom porovnávania rovnosti jednoduchý operátor =. Na vyjadrenie nerovnosti môžeme napísať != alebo <>.
-- zamestnanci s platom aspoň 2000
SELECT
CONCAT(first_name, ' ', last_name) AS zamestnanec,
salary AS plat,
department_id AS oddelenie
FROM employees
WHERE salary >= 2000;
Logické operátory
Využívať môžeme aj logické operátory, ako ich poznáme z programovacích jazykov, píšu sa slovne: AND, OR, NOT. V komplikovanejších výrazoch je potrebné myslieť na priority operátorov.
-- zoznam zamestnancov s platom od 2000 do 3000
SELECT
CONCAT(first_name, ' ', last_name) AS zamestnanec,
salary AS plat
FROM employees
WHERE 2000 <= salary AND salary <= 3000;
-- zoznam zamestnancov s menom John, James a Julia
SELECT
CONCAT(first_name, ' ', last_name) AS zamestnanec
FROM employees
WHERE LOWER(first_name) = 'john' OR LOWER(first_name) = 'james' OR LOWER(first_name) = 'julia';
Špeciálne operátory porovnávania
Okrem toho môžeme využívať pokročilejšie výrazy, ktoré nám umožňujú efektívnejšie pracovať:
- {výraz} BETWEEN {od} AND {do}: umožní definovať uzavretý interval hodnôt (vrátane krajných);
- {výraz} IN({zoznam hodnôt}): umožní hľadať zhodu s ktoroukoľvek hodnotou z vymenovaného zoznamu;
- {textový výraz} LIKE '{reťazec so zástupnými znakmi}': umožní hľadať približnú zhodu textu využitím zástupných znakov % (čokoľvek, teda ľubovoľný počet znakov, aj nulový) a _ (akýkoľvek znak, práve jeden).
-- zoznam zamestnancov s platom od 2000 do 3000
SELECT
CONCAT(first_name, ' ', last_name) AS zamestnanec,
salary AS plat
FROM employees
WHERE salary BETWEEN 2000 AND 3000;
-- zoznam zamestnancov s menom John, James a Julia
SELECT
CONCAT(first_name, ' ', last_name) AS zamestnanec
FROM employees
WHERE LOWER(first_name) IN('john', 'james', 'julia');
-- zoznam pracovných zaradení, ktoré obsahujú slovo „manager“
SELECT job_id, job_title
FROM jobs
WHERE LOWER(job_title) LIKE '%manager%';
-- priezviská, ktoré majú na 2. pozícii písmeno „o“
SELECT DISTINCT last_name
FROM employees
WHERE last_name LIKE '_o%';
Pri využívaní operátora LIKE niekedy potrebujeme takzvaný „escape“ (únikový) znak. V MySQL/MariaDB a PostgreSQL môžeme priamo využívať znak „\“ (rovnako ako v C++), no v Oracle SQL musíme a v PostgreSQL môžeme nastaviť akýkoľvek escape znak dodatkom ESCAPE:
- {textový výraz} LIKE '{reťazec so zástupnými znakmi}' ESCAPE {znak}
-- zoznam pracovných zaradení, ktorých ID končí textom „_MAN“
SELECT job_id, job_title
FROM jobs
WHERE UPPER(job_id) LIKE '%\_MAN' ESCAPE '\';
Porovnávanie s hodnotou NULL
Pri hľadaní NULL hodnôt nemôžeme použiť priame porovnávanie – podmienkou by bol výraz s hodnotou NULL a jeho výsledkom je vždy NULL, teda takáto podmienka by bola vždy nepravdivá. Na tento účel však máme výrazy IS NULL a IS NOT NULL.
-- zoznam oddelení, ktoré majú svojho vedúceho
SELECT department_name, manager_id
FROM departments
WHERE manager_id IS NOT NULL;