SQL BETWEEN NOT DISTINCT ORDER BY
SQL operátor BETWEEN porovnává, zda-li je výraz v rozmezí hodnot low
a high
.
Poznámka: Pokud nemáte na svém počítač nainstalovaný žádný SQL server - jako např. PostgreSQL, MySQL, MS SQL Server, apod. - můžete využít SQL Online, které je on-line a zdarma. Pro vytvoření dat použijte vzorek z datové sady titanic.
CREATE TABLE "titanic" (
"pclass" INTEGER,
"class" VARCHAR(10),
"who" VARCHAR(10),
"age" DECIMAL(5,2)
);
INSERT INTO "titanic" VALUES(2,'Second','man',36.5);
INSERT INTO "titanic" VALUES(3,'Third','child',9.0);
INSERT INTO "titanic" VALUES(2,'Second','man',51.0);
INSERT INTO "titanic" VALUES(2,'Second','woman',30.0);
INSERT INTO "titanic" VALUES(1,'First','man',33.0);
INSERT INTO "titanic" VALUES(1,'First','man',58.0);
INSERT INTO "titanic" VALUES(2,'Second','woman',30.0);
INSERT INTO "titanic" VALUES(1,'First','man',22.0);
INSERT INTO "titanic" VALUES(3,'Third','child',11.0);
INSERT INTO "titanic" VALUES(3,'Third','child',0.42);
INSERT INTO "titanic" VALUES(3,'Third','child',1.0);
INSERT INTO "titanic" VALUES(3,'Third','man',24.0);
INSERT INTO "titanic" VALUES(3,'Third','man',NULL);
INSERT INTO "titanic" VALUES(1,'First','man',70.0);
INSERT INTO "titanic" VALUES(3,'Third','man',34.0);
INSERT INTO "titanic" VALUES(1,'First','man',30.0);
INSERT INTO "titanic" VALUES(3,'Third','child',11.0);
INSERT INTO "titanic" VALUES(2,'Second','man',32.0);
INSERT INTO "titanic" VALUES(3,'Third','man',NULL);
INSERT INTO "titanic" VALUES(3,'Third','woman',NULL);
Věk je mezi 30 - 34
Hledáme pasažéry, kterým bylo mezi 30 až 34 lety, včetně okrajových hodnot.
SELECT *
FROM titanic
WHERE age BETWEEN 30 AND 34
;
pclass class who age
---------------------------
2 Second woman 30
1 First man 33
2 Second woman 30
3 Third man 34
1 First man 30
2 Second man 32
Stejný příklad bez použití BETWEEN
Výše uvedený SQL příkaz by se dal i přepsat následovně. Nevýhodou je trochu horší čitelnost ve srovnání s BETWEEN.
SELECT *
FROM titanic
WHERE age >= 30
AND age <= 34
;
pclass class who age
---------------------------
2 Second woman 30
1 First man 33
2 Second woman 30
3 Third man 34
1 First man 30
2 Second man 32
Alternativní zápis podmínky
Nebo také takto, ale BETWEEN stále vyhrává, protože je nejčitelnější.
SELECT *
FROM titanic
WHERE 30 <= age
AND age <= 34
;
pclass class who age
---------------------------
2 Second woman 30
1 First man 33
2 Second woman 30
3 Third man 34
1 First man 30
2 Second man 32
Věk není mezi 30 - 34
Podmínku můžeme snadno negovat pomocí NOT
. Všimněte si, že výsledek neobsahuje záznamy, které mají ve sloupci age
hodnotu NULL
.
SELECT *
FROM titanic
WHERE age NOT BETWEEN 30 AND 34
;
pclass class who age
----------------------------
2 Second man 36.5
3 Third child 9
2 Second man 51
1 First man 58
1 First man 22
3 Third child 11
3 Third child 0.42
3 Third child 1
3 Third man 24
1 First man 70
3 Third child 11
Ověření vrácených hodnot pomocí DISTINCT
Pomocí DISTINCT
můžeme ověřit, že se ve vrácených hodnotách nenachází 30, 31, 32, 33 a 34. Hodnoty si seřadíme pomocí ORDER BY
, pro lepší čitelnost.
SELECT DISTINCT AGE
FROM titanic
WHERE age NOT BETWEEN 30 AND 34
ORDER BY age
;
age
----
0.42
1
9
11
22
24
36.5
51
58
70
Příklady
Příklad 1
Kolika pasažérům bylo mezi 50 - 70 lety a cestovali v první třídě?
SELECT COUNT(*) AS "počet"
FROM titanic
WHERE age BETWEEN 50 AND 70
AND pclass = 1
;
počet
-----
2
Příklad 2
Titanic se potopil v roce 1912. Kterým pasažérům by dnes bylo mezi 144,5 - 160 lety?
SELECT *
FROM titanic
WHERE age + (2020 - 1912) BETWEEN 144.5 AND 160
;
pclass class who age
------------------------
2 Second man 36.5
2 Second man 51
Použité funkce a příkazy SQL
V tomto článku jsme použili následující funkce a příkazy SQL:
| Funkce | Info |
| :- | :- |
| BETWEEN
| porovnává, zda-li je výraz v rozmezí hodnot — dokumentace SQL |
| NOT
| Negace výrazu — dokumentace SQL. |
| DISTINCT
| Unikátní hodnoty (odstraní duplicity) — dokumentace SQL. |
| ORDER BY
| Seřadí výsledek — dokumentace SQL. |