SQLite Dotaz: Select, Where, LIMIT, OFFSET, Count, Group By
โก Chytrรฉ shrnutรญ
SQLite Dotazy naฤรญtajรญ a filtrujรญ data pomocรญ klauzulรญ SELECT, FROM, WHERE, GROUP BY, ORDER BY a LIMIT. Kombinace tฤchto klauzulรญ s operรกtory, agregacemi, poddotazy a operacemi mnoลพin umoลพลuje ฤรญst, upravovat a sumarizovat zรกznamy z libovolnรฉho SQLite databรกze.

Nรกsledujรญcรญ ฤรกsti se vฤnujรญ ฤtenรญ dat pomocรญ operรกtorลฏ SELECT a FROM, filtrovรกnรญ ลรกdkลฏ pomocรญ operรกtoru WHERE a jeho operรกtorลฏ, ลazenรญ a omezovรกnรญ vรฝsledkลฏ, agregaฤnรญm funkcรญm, GROUP BY a HAVING, poddotazลฏm, operacรญm s mnoลพinami, zpracovรกnรญ NULL, vรฝrazลฏm CASE a bฤลพnรฝm tabulkovรฝm vรฝrazลฏm.
Psรกt SQL dotazy v SQLite databรกze, musรญte vฤdฤt, jak fungujรญ klauzule SELECT, FROM, WHERE, GROUP BY, ORDER BY a LIMIT a jak je pouลพรญvat.
Bฤhem tohoto tutoriรกlu se nauฤรญte pouลพรญvat tyto klauzule a jak je psรกt SQLite doloลพky.
ฤtenรญ dat pomocรญ Select
Klauzule SELECT je hlavnรญ pลรญkaz, kterรฝ pouลพรญvรกte k dotazovรกnรญ SQLite databรกze. V klauzuli SELECT uvedete, co vybrat. Ale pลed klauzulรญ select se podรญvejme, odkud mลฏลพeme vybrat data pomocรญ klauzule FROM.
Klauzule FROM se pouลพรญvรก k urฤenรญ, kde chcete vybrat data. V klauzuli from mลฏลพete zadat jednu nebo vรญce tabulek nebo poddotazลฏ, ze kterรฝch chcete vybrat data, jak uvidรญme pozdฤji ve vรฝukovรฝch programech.
Vลกimnฤte si, ลพe pro vลกechny nรกsledujรญcรญ pลรญklady musรญte spustit sqlite3.exe a otevลรญt pลipojenรญ k ukรกzkovรฉ databรกzi jako plynulรฉ:
Krok 1) V tomto kroku,
Otevลete sloลพku Tento poฤรญtaฤ, pลejdฤte do adresรกลe โC:\sqliteโ a potรฉ otevลete soubor โsqlite3.exeโ:
Krok 2) Otevลete databรกzi โTutorialsSampleDB.dbโ pomocรญ nรกsledujรญcรญho pลรญkazu:
Nynรญ jste pลipraveni spustit jakรฝkoli typ dotazu na databรกzi.
V klauzuli SELECT mลฏลพete vybrat nejen nรกzev sloupce, ale mรกte spoustu dalลกรญch moลพnostรญ, jak urฤit, co vybrat. Takto:
SELECT *
Tento pลรญkaz vybere vลกechny sloupce ze vลกech odkazovanรฝch tabulek (nebo poddotazลฏ) v klauzuli FROM. Napลรญklad:
SELECT * FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Tรญm vyberete vลกechny sloupce z tabulek studentลฏ i tabulek oddฤlenรญ:
VYBERTE nรกzev tabulky.*
Tรญm vyberete vลกechny sloupce pouze z tabulky โnรกzev_tabulkyโ. Napลรญklad:
SELECT Students.* FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Tรญm vyberete pouze vลกechny sloupce z tabulky studentลฏ:
Doslovnรก hodnota
Doslovnรก hodnota je konstantnรญ hodnota, kterou lze zadat v pลรญkazu select. Doslovnรฉ hodnoty mลฏลพete normรกlnฤ pouลพรญvat stejnรฝm zpลฏsobem, jako pouลพรญvรกte nรกzvy sloupcลฏ v klauzuli SELECT. Tyto doslovnรฉ hodnoty se zobrazรญ pro kaลพdรฝ ลรกdek z ลรกdkลฏ vrรกcenรฝch dotazem SQL.
Zde je nฤkolik pลรญkladลฏ rลฏznรฝch doslovnรฝch hodnot, kterรฉ mลฏลพete vybrat:
- Numerickรฝ literรกl โ ฤรญsla v libovolnรฉm formรกtu jako 1, 2.55, โฆ atd.
- ลetฤzcovรฉ literรกly โ Libovolnรฝ ลetฤzec 'USA', 'toto je ukรกzkovรฝ text', โฆ atd.
- NULL โ hodnota NULL.
- Current_TIME โ Ukรกลพe vรกm aktuรกlnรญ ฤas.
- CURRENT_DATE โ tรญm zรญskรกte aktuรกlnรญ datum.
To mลฏลพe bรฝt uลพiteฤnรฉ v nฤkterรฝch situacรญch, kdy musรญte vybrat konstantnรญ hodnotu pro vลกechny vrรกcenรฉ ลรกdky. Pokud napลรญklad chcete vybrat vลกechny studenty z tabulky Studenti s novรฝm sloupcem nazvanรฝm zemฤ, kterรฝ obsahuje hodnotu โUSAโ, mลฏลพete to udฤlat takto:
SELECT *, 'USA' AS Country FROM Students;
Tรญm zรญskรกte vลกechny sloupce studentลฏ plus novรฝ sloupec โZemฤโ, jako je tento:
Vลกimnฤte si, ลพe tento novรฝ sloupec Zemฤ ve skuteฤnosti nenรญ novรฝm sloupcem pลidanรฝm do tabulky. Je to virtuรกlnรญ sloupec, vytvoลenรฝ v dotazu pro zobrazenรญ vรฝsledkลฏ a nebude se vytvรกลet v tabulce.
Jmรฉna a alias
Alias โโje novรฝ nรกzev pro sloupec, kterรฝ umoลพลuje vybrat sloupec s novรฝm nรกzvem. Aliasy sloupcลฏ jsou specifikovรกny pomocรญ klรญฤovรฉho slova โASโ.
Napลรญklad, pokud chcete vybrat sloupec StudentName, kterรฝ mรก bรฝt vrรกcen se โStudent Nameโ namรญsto โStudentNameโ, mลฏลพete mu pลiลadit alias takto:
SELECT StudentName AS 'Student Name' FROM Students;
Tรญm zรญskรกte jmรฉna studentลฏ se jmรฉnem โStudent Nameโ namรญsto โStudentNameโ takto:
Vลกimnฤte si, ลพe nรกzev sloupce je stรกle โStudentNameโ; sloupec StudentName je stรกle stejnรฝ, alias se v nฤm nemฤnรญ.
Alias โโnezmฤnรญ nรกzev sloupce; pouze zmฤnรญ zobrazovanรฝ nรกzev v klauzuli SELECT.
Vลกimnฤte si takรฉ, ลพe klรญฤovรฉ slovo โASโ je volitelnรฉ, nรกzev aliasu mลฏลพete zadat i bez nฤj, nฤco takovรฉho:
SELECT StudentName 'Student Name' FROM Students;
A dรก vรกm pลesnฤ stejnรฝ vรฝstup jako pลedchozรญ dotaz:
Tabulkรกm mลฏลพete takรฉ pลidฤlit aliasy, nejen sloupce. Se stejnรฝm klรญฤovรฝm slovem โASโ. Mลฏลพete napลรญklad provรฉst toto:
SELECT s.* FROM Students AS s;
Tรญm zรญskรกte vลกechny sloupce v tabulce Studenti:
To mลฏลพe bรฝt velmi uลพiteฤnรฉ, pokud se pลipojujete k vรญce neลพ jednomu stolu; mรญsto opakovรกnรญ celรฉho nรกzvu tabulky v dotazu mลฏลพete kaลพdรฉ tabulce pลiลadit krรกtkรฝ alias. Napลรญklad v nรกsledujรญcรญm dotazu:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Tento dotaz vybere jmรฉno kaลพdรฉho studenta z tabulky โStudentiโ a jeho nรกzev oddฤlenรญ z tabulky โOddฤlenรญโ:
Stejnรฝ dotaz vลกak lze napsat takto:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Tabulce Students jsme dali alias โsโ a tabulce departments alias โdโ. Pak jsme mรญsto pouลพitรญ celรฉho nรกzvu tabulky pouลพili jejich aliasy k odkazovรกnรญ na nฤ. INNER JOIN spojuje dvฤ nebo vรญce tabulek pomocรญ podmรญnky. V naลกem pลรญkladu jsme spojili tabulku Students s tabulkou Departments se sloupcem DepartmentId. Podrobnรฉ vysvฤtlenรญ INNER JOIN je takรฉ uvedeno v โSQLite Pลipojujeโtutoriรกlโ.
Tรญm zรญskรกte pลesnรฝ vรฝstup jako pลedchozรญ dotaz:
KDE
Zรกpis SQL dotazลฏ pomocรญ samotnรฉ klauzule SELECT s klauzulรญ FROM, jak jsme vidฤli v pลedchozรญ ฤรกsti, vรกm poskytne vลกechny ลรกdky z tabulek. Pokud vลกak chcete filtrovat vrรกcenรก data, musรญte pลidat klauzuli โWHEREโ.
Klauzule WHERE se pouลพรญvรก k filtrovรกnรญ vรฝslednรฉ sady vrรกcenรฉ dotazem SQL. Klauzule WHERE funguje takto:
- V klauzuli WHERE mลฏลพete zadat โvรฝrazโ.
- Tento vรฝraz bude vyhodnocen pro kaลพdรฝ ลรกdek vrรกcenรฝ z tabulek zadanรฝch v klauzuli FROM.
- Vรฝraz bude vyhodnocen jako booleovskรฝ vรฝraz s vรฝsledkem buฤ true, false, nebo null.
- Potom budou vrรกceny pouze ลรกdky, pro kterรฉ byl vรฝraz vyhodnocen s hodnotou true, a ty s nepravdivรฝmi nebo nulovรฝmi vรฝsledky budou ignorovรกny a nebudou zahrnuty do sady vรฝsledkลฏ.
Chcete-li filtrovat sadu vรฝsledkลฏ pomocรญ klauzule WHERE, musรญte pouลพรญt vรฝrazy a operรกtory.
Seznam operรกtorลฏ v SQLite a jak je pouลพรญvat
V nรกsledujรญcรญ ฤรกsti vysvฤtlรญme, jak mลฏลพete filtrovat pomocรญ vรฝrazลฏ a operรกtorลฏ.
Vรฝraz je jedna nebo vรญce doslovnรฝch hodnot nebo sloupcลฏ vzรกjemnฤ kombinovanรฝch pomocรญ operรกtoru.
Vลกimnฤte si, ลพe vรฝrazy mลฏลพete pouลพรญt jak v klauzuli SELECT, tak v klauzuli WHERE.
V nรกsledujรญcรญch pลรญkladech si vyzkouลกรญme vรฝrazy a operรกtory v klauzuli select i v klauzuli WHERE. Abychom vรกm ukรกzali, jak fungujรญ.
Existujรญ rลฏznรฉ typy vรฝrazลฏ a operรกtorลฏ, kterรฉ mลฏลพete zadat nรกsledovnฤ:
SQLite operรกtor zลetฤzenรญ โ||โ
Tento operรกtor se pouลพรญvรก ke zลetฤzenรญ jednรฉ nebo vรญce literรกlovรฝch hodnot nebo sloupcลฏ. Vytvoลรญ jeden ลetฤzec vรฝsledkลฏ ze vลกech zลetฤzenรฝch literรกlovรฝch hodnot nebo sloupcลฏ. Napลรญklad:
SELECT 'Id with Name: '|| StudentId || StudentName AS StudentIdWithName FROM Students;
Toto se zลetฤzรญ do novรฉho aliasu โStudentIdWithNameโ:
- Doslovnรก ลetฤzcovรก hodnota โId s nรกzvem:โ
- s hodnotou sloupce โStudentIdโ a
- s hodnotou ze sloupce โJmรฉno studentaโ
SQLite Operรกtor CAST:
Operรกtor CAST se pouลพรญvรก k pลevodu hodnoty z datovรฝ typ na jinรฝ datovรฝ typ.
Napลรญklad pokud mรกte ฤรญselnou hodnotu uloลพenou jako ลetฤzec, napลรญklad โ'12.5'โ a chcete ji pลevรฉst na ฤรญselnou hodnotu, mลฏลพete k tomu pouลพรญt operรกtor CAST, napลรญklad โCAST('12.5' AS REAL)โ. Nebo pokud mรกte desetinnou hodnotu, napลรญklad 12.5, a potลebujete zรญskat pouze celoฤรญselnou ฤรกst, mลฏลพete ji pลevรฉst na celรฉ ฤรญslo, napลรญklad โCAST(12.5 AS INTEGER)โ.
Pลรญklad
V nรกsledujรญcรญm pลรญkazu se pokusรญme pลevรฉst rลฏznรฉ hodnoty na jinรฉ datovรฉ typy:
SELECT CAST('12.5' AS REAL) ToReal, CAST(12.5 AS INTEGER) AS ToInteger;
To vรกm dรก:
Vรฝsledek je nรกsledujรญcรญ:
- CAST('12.5' โโAS REAL) โ hodnota '12.5' โโje ลetฤzcovรก hodnota, bude pลevedena na hodnotu REAL.
- CAST(12.5 AS INTEGER) โ hodnota 12.5 je dekadickรก hodnota, bude pลevedena na celoฤรญselnou hodnotu. Desetinnรก ฤรกst bude zkrรกcena a bude z nรญ 12.
SQLite Aritmetickรฝ Operators:
Vezmฤte dvฤ nebo vรญce ฤรญselnรฝch literรกlovรฝch hodnot nebo ฤรญselnรฝch sloupcลฏ a vraลฅte jednu ฤรญselnou hodnotu. Podporovanรฉ aritmetickรฉ operรกtory v SQLite jsou:
- Sฤรญtรกnรญ โ+โ โ udรกvรก souฤet dvou operandลฏ.
- Vtracce โโโ โ podลรญzenรฝtracts dva operandy a vรฝsledkem je rozdรญl.
- Nรกsobenรญ โ*โ โ souฤin dvou operandลฏ.
- Pลipomรญnka (modulo) โ%โ โ udรกvรก zbytek, kterรฝ vznikne dฤlenรญm jednoho operandu druhรฝm operandem.
- Dฤlenรญ โ/โ โ vracรญ podรญl, kterรฝ vznikne dฤlenรญm levรฉho operandu pravรฝm operandem.
Pลรญklad:
V nรกsledujรญcรญm pลรญkladu si vyzkouลกรญme pฤt aritmetickรฝch operรกtorลฏ s doslovnรฝmi ฤรญselnรฝmi hodnotami ve stejnรฉ klauzuli select:
SELECT 25+6, 25-6, 25*6, 25%6, 25/6;
To vรกm dรก:
Vลกimnฤte si, jak jsme zde pouลพili pลรญkaz SELECT bez klauzule FROM. A toto je povoleno SQLite pokud vybรญrรกme doslovnรฉ hodnoty.
SQLite Porovnรกvacรญ operรกtoลi
Porovnejte dva operandy mezi sebou a vraลฅte hodnotu true nebo false nรกsledovnฤ:
- โ<โ โ vracรญ hodnotu true, pokud je levรฝ operand menลกรญ neลพ pravรฝ operand.
- โ<=โ โ vracรญ hodnotu true, pokud je levรฝ operand menลกรญ nebo roven pravรฉmu operandu.
- โ>โ โ vracรญ hodnotu true, pokud je levรฝ operand vฤtลกรญ neลพ pravรฝ operand.
- โ>=" โ vracรญ hodnotu true, pokud je levรฝ operand vฤtลกรญ nebo roven pravรฉmu operandu.
- โ=โ a โ==โ โ vracรญ hodnotu true, pokud jsou oba operandy stejnรฉ. Vลกimnฤte si, ลพe oba operรกtory jsou stejnรฉ a nenรญ mezi nimi ลพรกdnรฝ rozdรญl.
- โ!=" a โ<>" โ vrรกtรญ hodnotu true, pokud se dva operandy neshodujรญ. Vลกimnฤte si, ลพe oba operรกtory jsou stejnรฉ a nenรญ mezi nimi ลพรกdnรฝ rozdรญl.
Vลกimnฤte si, ลพe, SQLite vyjadลuje skuteฤnou hodnotu s 1 a nepravdivou hodnotu s 0.
Pลรญklad:
SELECT 10<6 AS '<', 10<=6 AS '<=', 10>6 AS '>', 10>=6 AS '>=', 10=6 AS '=', 10==6 AS '==', 10!=6 AS '!=', 10<>6 AS '<>';
To dรก nฤco takovรฉho:
SQLite Operรกtory shody vzorลฏ
โLIKEโ โ pouลพรญvรก se pro porovnรกvรกnรญ vzorลฏ. Pomocรญ โLIKEโ mลฏลพete vyhledรกvat hodnoty, kterรฉ odpovรญdajรญ vzoru zadanรฉmu pomocรญ zรกstupnรฉho znaku.
Operand nalevo mลฏลพe bรฝt buฤ hodnota ลetฤzcovรฉho literรกlu, nebo sloupec ลetฤzce. Vzor lze specifikovat nรกsledovnฤ:
- Obsahuje vzor. Napลรญklad StudentName LIKE '%a%' โ tato funkce vyhledรก jmรฉna studentลฏ, kterรก obsahujรญ pรญsmeno โaโ na libovolnรฉ pozici ve sloupci StudentName.
- Zaฤรญnรก vzorem. Napลรญklad โJmรฉnoStudenta LIKE 'a%'โ โ vyhledรก jmรฉna studentลฏ, kterรก zaฤรญnajรญ pรญsmenem โaโ.
- Konฤรญ danรฝm vzorem. Napลรญklad โJmรฉnoStudenta LIKE '%a'โ โ Vyhledรก jmรฉna studentลฏ, kterรก konฤรญ pรญsmenem โaโ.
- Hledรกnรญ libovolnรฉho jednotlivรฉho znaku v ลetฤzci pomocรญ podtrลพรญtka โ_โ. Napลรญklad โStudentName LIKE 'J___'โ โ Vyhledรกvรกnรญ jmen studentลฏ, kterรก majรญ dรฉlku 4 znaky. Musรญ zaฤรญnat pรญsmenem โJโ a za tรญmto pรญsmenem mลฏลพe bรฝt libovolnรฝch tลi dalลกรญ znaky.
Pลรญklady shody vzorลฏ:
Zรญskejte jmรฉna studentลฏ zaฤรญnajรญcรญ pรญsmenem โjโ:
SELECT StudentName FROM Students WHERE StudentName LIKE 'j%';
Vรฝsledek:
Zรญskejte, aby jmรฉna studentลฏ konฤila pรญsmenem โyโ:
SELECT StudentName FROM Students WHERE StudentName LIKE '%y';
Vรฝsledek:
Zรญskejte jmรฉna studentลฏ, kterรก obsahujรญ pรญsmeno โnโ:
SELECT StudentName FROM Students WHERE StudentName LIKE '%n%';
Vรฝsledek:
โGLOBโ โ je ekvivalentem operรกtoru LIKE, ale GLOB rozliลกuje velkรก a malรก pรญsmena, na rozdรญl od operรกtoru LIKE. Napลรญklad nรกsledujรญcรญ dva pลรญkazy vrรกtรญ rลฏznรฉ vรฝsledky:
SELECT 'Jack' GLOB 'j%'; SELECT 'Jack' LIKE 'j%';
To vรกm dรก:
Prvnรญ pลรญkaz vrรกtรญ 0 (nepravda), protoลพe operรกtor GLOB rozliลกuje velkรก a malรก pรญsmena, takลพe 'j' se nerovnรก 'J'. Druhรฝ pลรญkaz vลกak vrรกtรญ 1 (pravda), protoลพe operรกtor LIKE nerozliลกuje malรก a velkรก pรญsmena, takลพe 'j' se rovnรก 'J'.
Dalลกรญ operรกtoลi:
SQLite A AUTOMATIZACI
Logickรฝ operรกtor, kterรฝ kombinuje jeden nebo vรญce vรฝrazลฏ. Vrรกtรญ hodnotu true, pouze pokud vลกechny vรฝrazy poskytnou hodnotu โtrueโ. Vrรกtรญ vลกak hodnotu false, pouze pokud vลกechny vรฝrazy poskytnou hodnotu โfalseโ.
Pลรญklad:
Nรกsledujรญcรญ dotaz vyhledรก studenty, kteลรญ majรญ StudentId > 5 a StudentName zaฤรญnรก pรญsmenem N, vrรกcenรญ studenti musรญ splลovat dvฤ podmรญnky:
SELECT * FROM Students WHERE (StudentId > 5) AND (StudentName LIKE 'N%');
Jako vรฝstup na vรฝลกe uvedenรฉm snรญmku obrazovky zรญskรกte pouze โNancyโ. Nancy je jedinou studentkou, kterรก splลuje obฤ podmรญnky.
SQLite OR
Logickรฝ operรกtor, kterรฝ kombinuje jeden nebo vรญce vรฝrazลฏ, takลพe pokud jeden z kombinovanรฝch operรกtorลฏ dรก hodnotu true, vrรกtรญ hodnotu true. Pokud vลกak vลกechny vรฝrazy dรกvajรญ hodnotu false, vrรกtรญ hodnotu false.
Pลรญklad:
Nรกsledujรญcรญ dotaz vyhledรก studenty, kteลรญ majรญ StudentId > 5 nebo StudentName zaฤรญnรก pรญsmenem N, vrรกcenรญ studenti musรญ splลovat alespoล jednu z podmรญnek:
SELECT * FROM Students WHERE (StudentId > 5) OR (StudentName LIKE 'N%');
To vรกm dรก:
Jako vรฝstup na vรฝลกe uvedenรฉm snรญmku obrazovky zรญskรกte jmรฉno studenta s pรญsmenem โnโ ve svรฉm jmรฉnฤ plus ID studenta s hodnotou > 5.
Jak vidรญte, vรฝsledek je jinรฝ neลพ dotaz s operรกtorem AND.
SQLite MEZI
Funkce BETWEEN se pouลพรญvรก k vรฝbฤru hodnot, kterรฉ jsou v rozsahu dvou hodnot. Napลรญklad โX BETWEEN Y AND Zโ vrรกtรญ hodnotu true (1), pokud se hodnota X nachรกzรญ mezi hodnotami Y a Z. V opaฤnรฉm pลรญpadฤ vrรกtรญ hodnotu false (0). โX BETWEEN Y AND Zโ je ekvivalentnรญ funkci โX >= Y AND X <= Zโ, X musรญ bรฝt vฤtลกรญ nebo rovno Y a X je menลกรญ nebo rovno Z.
Pลรญklad:
V nรกsledujรญcรญm pลรญkladu dotazu napรญลกeme dotaz, abychom zรญskali studenty s hodnotou Id mezi 5 a 8:
SELECT * FROM Students WHERE StudentId BETWEEN 5 AND 8;
To dรก pouze studentลฏm s ID 5, 6, 7 a 8:
SQLite IN
Vezme jeden operand a seznam operandลฏ. Vrรกtรญ hodnotu true, pokud je hodnota prvnรญho operandu rovna jednรฉ z hodnot operandลฏ ze seznamu. Operรกtor IN vrรกtรญ hodnotu true (1), pokud seznam operandลฏ obsahuje hodnotu prvnรญho operandu v rรกmci svรฝch hodnot. V opaฤnรฉm pลรญpadฤ vrรกtรญ hodnotu false (0).
Takto: โcol IN(x, y, z)โ. To je ekvivalentnรญ k โ(col=x) nebo (col=y) nebo (col=z)โ.
Pลรญklad:
Nรกsledujรญcรญ dotaz vybere pouze studenty s ID 2, 4, 6, 8:
SELECT * FROM Students WHERE StudentId IN(2, 4, 6, 8);
Stejnฤ jako tento:
Pลedchozรญ dotaz poskytne pลesnรฝ vรฝsledek jako nรกsledujรญcรญ dotaz, protoลพe jsou ekvivalentnรญ:
SELECT * FROM Students WHERE (StudentId = 2) OR (StudentId = 4) OR (StudentId = 6) OR (StudentId = 8);
Oba dotazy poskytujรญ pลesnรฝ vรฝstup. Rozdรญl mezi tฤmito dvฤma dotazy je vลกak ten, ลพe u prvnรญho dotazu jsme pouลพili operรกtor โINโ. Ve druhรฉm dotazu jsme pouลพili vรญce operรกtorลฏ โORโ.
Operรกtor IN je ekvivalentnรญ pouลพitรญ vรญce operรกtorลฏ OR. Operรกtor โWHERE StudentId IN(2, 4, 6, 8)โ je ekvivalentnรญ operรกtoru โWHERE (StudentId = 2) OR (StudentId = 4) OR (StudentId = 6) OR (StudentId = 8);โ.
Stejnฤ jako tento:
SQLite NE V
Operand โNOT INโ je opakem operรกtoru IN. Mรก vลกak stejnou syntaxi; bere jeden operand a seznam operandลฏ. Vrรกtรญ hodnotu true, pokud hodnota prvnรญho operandu nenรญ rovna hodnotฤ jednoho z operandลฏ ze seznamu, tj. vrรกtรญ hodnotu true (0), pokud seznam operandลฏ neobsahuje prvnรญ operand. Napลรญklad: โcol NOT IN(x, y, z)โ. Toto je ekvivalentnรญ operaci โ(col<>x) AND (col<>y) AND (col<>z)โ.
Pลรญklad:
Nรกsledujรญcรญ dotaz vybere studenty s ID, kterรก se nerovna jednomu z tฤchto ID 2, 4, 6, 8:
SELECT * FROM Students WHERE StudentId NOT IN(2, 4, 6, 8);
Takhle
Pลedchozรญ dotaz dรกvรกme pลesnรฝ vรฝsledek jako nรกsledujรญcรญ dotaz, protoลพe jsou ekvivalentnรญ:
SELECT * FROM Students WHERE (StudentId <> 2) AND (StudentId <> 4) AND (StudentId <> 6) AND (StudentId <> 8);
Stejnฤ jako tento:
Na vรฝลกe uvedenรฉm snรญmku obrazovky
Pouลพili jsme nฤkolik rลฏznรฝch operรกtorลฏ โ<>โ, abychom zรญskali seznam studentลฏ, kteลรญ se nerovnajรญ ลพรกdnรฉmu z nรกsledujรญcรญch ID 2, 4, 6 ani 8. Tento dotaz vrรกtรญ vลกechny ostatnรญ studenty kromฤ tฤchto seznamลฏ ID.
SQLite EXISTUJE
Operรกtory EXISTS neberou ลพรกdnรฉ operandy; po nฤm trvรก pouze klauzule SELECT. Operรกtor EXISTS vrรกtรญ hodnotu true (1), pokud jsou vrรกceny nฤjakรฉ ลรกdky z klauzule SELECT, a vrรกtรญ hodnotu false (0), pokud z klauzule SELECT nejsou vrรกceny ลพรกdnรฉ ลรกdky.
Pลรญklad:
V nรกsledujรญcรญm pลรญkladu vybereme nรกzev oddฤlenรญ, pokud ID oddฤlenรญ existuje v tabulce studentลฏ:
SELECT DepartmentName FROM Departments AS d WHERE EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
To vรกm dรก:
Vrรกtรญ se pouze tลi katedry: โIT, Fyzika a Umฤnรญโ. Nรกzev katedry โMatematikaโ se nevrรกtรญ, protoลพe na tรฉto katedลe nenรญ ลพรกdnรฝ student, takลพe ID katedry v tabulce studentลฏ neexistuje. Proto operรกtor EXISTS katedru โMatematikaโ ignoroval.
SQLite NENร
Reverseje vรฝsledek pลedchozรญho operรกtoru, kterรฝ nรกsleduje za nรญm. Napลรญklad:
- NOT BETWEEN โ Vrรกtรญ true, pokud BETWEEN vrรกtรญ false a naopak.
- NOT LIKE โ Vrรกtรญ true, pokud LIKE vrรกtรญ false a naopak.
- NOT GLOB โ Vrรกtรญ true, pokud GLOB vrรกtรญ false a naopak.
- NOT EXISTS โ Vrรกtรญ true, pokud EXISTS vrรกtรญ false a naopak.
Pลรญklad:
V nรกsledujรญcรญm pลรญkladu pouลพijeme operรกtor NOT s operรกtorem EXISTS k zรญskรกnรญ nรกzvลฏ kateder, kterรฉ neexistujรญ v tabulce Studenti, coลพ je opaฤnรฝ vรฝsledek operรกtoru EXISTS. Hledรกnรญ tedy bude provedeno pomocรญ DepartmentId, kterรฉ v tabulce oddฤlenรญ neexistuje.
SELECT DepartmentName FROM Departments AS d WHERE NOT EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
Vรฝstup:
Vrรกtรญ se pouze oddฤlenรญ โMatematikaโ. Protoลพe oddฤlenรญ โMatematikaโ je jedinรฉ oddฤlenรญ, kterรฉ v tabulce studentลฏ neexistuje.
Omezenรญ a objednรกnรญ
SQLite Objednรกvka
SQLite Poลadรญ znamenรก seลadit vรฝsledek podle jednoho nebo vรญce vรฝrazลฏ. Chcete-li seลadit sadu vรฝsledkลฏ, musรญte pouลพรญt klauzuli ORDER BY takto:
- Nejprve musรญte zadat klauzuli ORDER BY.
- Na konci dotazu musรญ bรฝt uvedena klauzule ORDER BY; za nรญm lze uvรฉst pouze klauzuli LIMIT.
- Zadejte vรฝraz, pomocรญ kterรฉho se majรญ data seลadit, tento vรฝraz mลฏลพe bรฝt nรกzev sloupce nebo vรฝraz.
- Za vรฝrazem mลฏลพete zadat volitelnรฝ smฤr ลazenรญ. Buฤ DESC, chcete-li data seลadit sestupnฤ, nebo ASC, abyste data seลadili vzestupnฤ. Pokud byste ลพรกdnรฝ z nich nezadali, data by seลadila vzestupnฤ.
- Mลฏลพete zadat vรญce vรฝrazลฏ pomocรญ โ,โ mezi sebou.
Pลรญklad
V nรกsledujรญcรญm pลรญkladu vybereme vลกechny studenty seลazenรฉ podle jejich jmen, ale v sestupnรฉm poลadรญ, a potรฉ podle nรกzvu katedry ve vzestupnรฉm poลadรญ:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId ORDER BY d.DepartmentName ASC , s.StudentName DESC;
To vรกm dรก:
- SQLite nejprve seลadรญ vลกechny studenty podle nรกzvu katedry ve vzestupnรฉm poลadรญ
- Potรฉ se pro kaลพdรฝ nรกzev oddฤlenรญ zobrazรญ vลกichni studenti pod tรญmto nรกzvem oddฤlenรญ v sestupnรฉm poลadรญ podle jejich jmen
SQLite Omezit:
Pomocรญ klauzule LIMIT mลฏลพete omezit poฤet ลรกdkลฏ vrรกcenรฝch vaลกรญm dotazem SQL. Napลรญklad LIMIT 10 vรกm poskytne pouze 10 ลรกdkลฏ a vลกechny ostatnรญ ลรกdky ignoruje.
V klauzuli LIMIT mลฏลพete pomocรญ klauzule OFFSET vybrat urฤitรฝ poฤet ลรกdkลฏ poฤรญnaje od urฤitรฉ pozice. Napลรญklad โLIMIT 4 OFFSET 4โ bude ignorovat prvnรญ 4 ลรกdky a vrรกtรญ 4 ลรกdky poฤรญnaje pรกtรฝm ลรกdkem, takลพe zรญskรกte ลรกdky 5, 6, 7 a 8.
Klauzule OFFSET je volitelnรก, mลฏลพete ji napsat napลรญklad jako โLIMIT 4, 4โ a dostanete pลesnรฉ vรฝsledky.
Pลรญklad:
V nรกsledujรญcรญm pลรญkladu vrรกtรญme pomocรญ dotazu pouze 3 studenty poฤรญnaje studentskรฝm ID 5:
SELECT * FROM Students LIMIT 4,3;
Tรญm zรญskรกte pouze tลi studenty od ลรกdku 5. Zรญskรกte tedy ลรกdky se StudentId 5, 6 a 7:
Odstraลovรกnรญ duplikรกtลฏ
Pokud vรกลก SQL dotaz vracรญ duplicitnรญ hodnoty, mลฏลพete pouลพรญt klรญฤovรฉ slovo โDISTINCTโ k odstranฤnรญ tฤchto duplicit a vrรกcenรญ odliลกnรฝch hodnot. Po pouลพitรญ klรญฤe DISTINCT mลฏลพete zadat vรญce neลพ jeden sloupec.
Pลรญklad:
Nรกsledujรญcรญ dotaz vrรกtรญ duplicitnรญ โhodnoty nรกzvu oddฤlenรญโ: Zde mรกme duplicitnรญ hodnoty s nรกzvy IT, Physics a Arts.
SELECT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Tรญm zรญskรกte duplicitnรญ hodnoty pro nรกzev oddฤlenรญ:
Vลกimnฤte si, ลพe existujรญ duplicitnรญ hodnoty pro nรกzev oddฤlenรญ. Nynรญ pouลพijeme klรญฤovรฉ slovo DISTINCT se stejnรฝm dotazem k odstranฤnรญ tฤchto duplikรกtลฏ a zรญskรกnรญ pouze jedineฤnรฝch hodnot. Takhle:
SELECT DISTINCT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Tรญm zรญskรกte pouze tลi jedineฤnรฉ hodnoty pro sloupec nรกzvu oddฤlenรญ:
Agregรกt
SQLite Agregรกty jsou vestavฤnรฉ funkce definovanรฉ v SQLite kterรฝ seskupรญ vรญce hodnot z vรญce ลรกdkลฏ do jednรฉ hodnoty.
Zde jsou podporovanรฉ agregรกty SQLite:
SQLite AVG()
Vrรกtรญ prลฏmฤr pro vลกechny hodnoty x.
Pลรญklad:
V nรกsledujรญcรญm pลรญkladu zรญskรกme prลฏmฤrnou znรกmku, kterou studenti zรญskajรญ ze vลกech zkouลกek:
SELECT AVG(Mark) FROM Marks;
To vรกm dรก hodnotu โ18.375โ:
Tyto vรฝsledky pochรกzejรญ ze souฤtu vลกech hodnot znรกmek dฤleno jejich poฤtem.
COUNT() โ COUNT(X) nebo COUNT(*)
Vrรกtรญ celkovรฝ poฤet, kolikrรกt se objevila hodnota x. A zde jsou nฤkterรฉ moลพnosti, kterรฉ mลฏลพete pouลพรญt s COUNT:
- COUNT(x): Poฤรญtรก pouze x hodnot, kde x je nรกzev sloupce. Bude ignorovat hodnoty NULL.
- COUNT(*): Spoฤรญtรก vลกechny ลรกdky ze vลกech sloupcลฏ.
- COUNT (DISTINCT x): Pลed x mลฏลพete zadat klรญฤovรฉ slovo DISTINCT, kterรฉ zรญskรก poฤet rลฏznรฝch hodnot x.
Pลรญklad
V nรกsledujรญcรญm pลรญkladu zรญskรกme celkovรฝ poฤet oddฤlenรญ s COUNT(DepartmentId), COUNT(*) a COUNT(DISTINCT DepartmentId) a jak se liลกรญ:
SELECT COUNT(DepartmentId), COUNT(DISTINCT DepartmentId), COUNT(*) FROM Students;
To vรกm dรก:
Takto:
- COUNT(DepartmentId) vรกm poskytne poฤet vลกech ID oddฤlenรญ a bude ignorovat hodnoty null.
- COUNT(DISTINCT DepartmentId) vรกm dรกvรก odliลกnรฉ hodnoty DepartmentId, kterรฉ jsou pouze 3. Coลพ jsou tลi rลฏznรฉ hodnoty nรกzvu oddฤlenรญ. Vลกimnฤte si, ลพe ve jmรฉnu studenta je 8 hodnot nรกzvu oddฤlenรญ. Ale pouze tลi rลฏznรฉ hodnoty, kterรฝmi jsou matematika, IT a fyzika.
- COUNT(*) poฤรญtรก poฤet ลรกdkลฏ v tabulce studentลฏ, coลพ je 10 ลรกdkลฏ pro 10 studentลฏ.
GROUP_CONCAT() โ GROUP_CONCAT(X) nebo GROUP_CONCAT(X,Y)
Agregaฤnรญ funkce GROUP_CONCAT zลetฤzรญ nรกsobky hodnot do jednรฉ hodnoty a oddฤlรญ je ฤรกrkou. Mรก nรกsledujรญcรญ moลพnosti:
- GROUP_CONCAT(X): Toto zลetฤzรญ vลกechny hodnoty x do jednoho ลetฤzce s ฤรกrkou โ,โ pouลพรญvanou jako oddฤlovaฤ mezi hodnotami. Hodnoty NULL budou ignorovรกny.
- GROUP_CONCAT(X, Y): Toto zลetฤzรญ hodnoty x do jednoho ลetฤzce, pลiฤemลพ hodnota y se pouลพije jako oddฤlovaฤ mezi kaลพdou hodnotou namรญsto vรฝchozรญho oddฤlovaฤe ','. Hodnoty NULL budou takรฉ ignorovรกny.
- GROUP_CONCAT(DISTINCT X): Toto zลetฤzรญ vลกechny odliลกnรฉ hodnoty x do jednoho ลetฤzce s ฤรกrkou โ,โ pouลพรญvanou jako oddฤlovaฤ mezi hodnotami. Hodnoty NULL budou ignorovรกny.
GROUP_CONCAT(nรกzev oddฤlenรญ) Pลรญklad
Nรกsledujรญcรญ dotaz zลetฤzรญ vลกechny hodnoty nรกzvu oddฤlenรญ z tabulky studentลฏ a oddฤlenรญ do jednoho ลetฤzce oddฤlenรฉho ฤรกrkou. Takลพe mรญsto vracenรญ seznamu hodnot jedna hodnota na kaลพdรฉm ลรกdku. Vrรกtรญ pouze jednu hodnotu na jednom ลรกdku se vลกemi hodnotami oddฤlenรฝmi ฤรกrkou:
SELECT GROUP_CONCAT(d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
To vรกm dรก:
Zรญskรกte tak seznam hodnot nรกzvลฏ 8 oddฤlenรญ spojenรฝch do jednoho ลetฤzce oddฤlenรฉho ฤรกrkou.
GROUP_CONCAT(DISTINCT nรกzev oddฤlenรญ) Pลรญklad
Nรกsledujรญcรญ dotaz zลetฤzรญ odliลกnรฉ hodnoty nรกzvu oddฤlenรญ z tabulky studentลฏ a oddฤlenรญ do jednoho ลetฤzce oddฤlenรฉho ฤรกrkou:
SELECT GROUP_CONCAT(DISTINCT d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
To vรกm dรก:
Vลกimnฤte si, jak se vรฝsledek liลกรญ od pลedchozรญho vรฝsledku; vrรกtily se pouze tลi hodnoty, coลพ jsou odliลกnรก jmรฉna oddฤlenรญ, a duplicitnรญ hodnoty byly odstranฤny.
GROUP_CONCAT(Nรกzev oddฤlenรญ ,'&') Pลรญklad
Nรกsledujรญcรญ dotaz zลetฤzรญ vลกechny hodnoty sloupce nรกzvu oddฤlenรญ z tabulky studentลฏ a oddฤlenรญ do jednoho ลetฤzce, ale se znakem '&' namรญsto ฤรกrky jako oddฤlovaฤe:
SELECT GROUP_CONCAT(d.DepartmentName, '&') FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
To vรกm dรก:
Vลกimnฤte si, jak je k oddฤlenรญ hodnot pouลพit znak โ&โ mรญsto vรฝchozรญho znaku โ,โ.
SQLite MAX() & MIN()
MAX(X) vรกm vrรกtรญ nejvyลกลกรญ hodnotu z hodnot X. MAX vrรกtรญ hodnotu NULL, pokud jsou vลกechny hodnoty x nulovรฉ. Zatรญmco MIN(X) vรกm vrรกtรญ nejmenลกรญ hodnotu z hodnot X. MIN vrรกtรญ hodnotu NULL, pokud jsou vลกechny hodnoty X nulovรฉ.
Pลรญklad
V nรกsledujรญcรญm dotazu pouลพijeme funkce MIN a MAX k zรญskรกnรญ nejvyลกลกรญ a nejniลพลกรญ znรกmky z tabulky โZnรกmkyโ:
SELECT MAX(Mark), MIN(Mark) FROM Marks;
To vรกm dรก:
SQLite SUM(x), Celkem (x)
Oba vrรกtรญ souฤet vลกech hodnot x. Liลกรญ se ale v nรกsledujรญcรญm:
- Pokud jsou vลกechny hodnoty null, SUM vrรกtรญ null, ale Total vrรกtรญ 0.
- TOTAL vลพdy vracรญ hodnoty s plovoucรญ desetinnou ฤรกrkou. SUM vrรกtรญ celoฤรญselnou hodnotu, pokud jsou vลกechny hodnoty x celรฉ ฤรญslo. Pokud vลกak hodnoty nejsou celรฉ ฤรญslo, vrรกtรญ hodnotu s plovoucรญ desetinnou ฤรกrkou.
Pลรญklad
V nรกsledujรญcรญm dotazu pouลพijeme funkce SUM a total k zรญskรกnรญ souฤtu vลกech znรกmek v tabulkรกch โZnรกmkyโ:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks;
To vรกm dรก:
Jak vidรญte, TOTAL vลพdy vracรญ plovoucรญ desetinnou ฤรกrku. Ale SUM vrรกtรญ celoฤรญselnou hodnotu, protoลพe hodnoty ve sloupci โMarkโ mohou bรฝt v celรฝch ฤรญslech.
Rozdรญl mezi pลรญkladem SUM a TOTAL:
V nรกsledujรญcรญm dotazu ukรกลพeme rozdรญl mezi SUM a TOTAL, kdyลพ zรญskajรญ SUM hodnot NULL:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks WHERE TestId = 4;
To vรกm dรก:
Vลกimnฤte si, ลพe pro TestId = 4 nejsou ลพรกdnรฉ znaฤky, takลพe pro tento test existujรญ hodnoty null. SUM vrรกtรญ nulovou hodnotu jako prรกzdnou, zatรญmco TOTAL vrรกtรญ 0.
Skupina vytvoลenรก
Klauzule GROUP BY se pouลพรญvรก k urฤenรญ jednoho nebo vรญce sloupcลฏ, kterรฉ budou pouลพity k seskupenรญ ลรกdkลฏ do skupin. ลรกdky se stejnรฝmi hodnotami budou shromรกลพdฤny (uspoลรกdรกny) do skupin.
Pro jakรฝkoli jinรฝ sloupec, kterรฝ nenรญ zahrnut ve skupinฤ podle sloupcลฏ, mลฏลพete pouลพรญt agregaฤnรญ funkci.
Pลรญklad:
Nรกsledujรญcรญ dotaz vรกm poskytne celkovรฝ poฤet studentลฏ pลรญtomnรฝch v jednotlivรฝch oddฤlenรญch.
SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId GROUP BY d. DepartmentName;
To vรกm dรก:
Klauzule GROUPBY DepartmentName seskupรญ vลกechny studenty do skupin po jednรฉ pro kaลพdรฝ nรกzev oddฤlenรญ. Pro kaลพdou skupinu โoddฤlenรญโ bude poฤรญtat studenty na nรญ.
klauzule HAVING
Pokud chcete filtrovat skupiny vrรกcenรฉ klauzulรญ GROUP BY, mลฏลพete zadat klauzuli โHAVINGโ s vรฝrazem za klauzuli GROUP BY. Vรฝraz bude pouลพit k filtrovรกnรญ tฤchto skupin.
Pลรญklad
V nรกsledujรญcรญm dotazu vybereme ty katedry, na kterรฝch jsou pouze dva studenti:
SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId GROUP BY d. DepartmentName HAVING COUNT(s.StudentId) = 2;
To vรกm dรก:
Klauzule HAVING COUNT(S.StudentId) = 2 vyfiltruje vrรกcenรฉ skupiny a vrรกtรญ pouze ty skupiny, kterรฉ obsahujรญ prรกvฤ dva studenty. V naลกem pลรญpadฤ mรก katedra umฤnรญ 2 studenty, takลพe je zobrazena ve vรฝstupu.
SQLite Dotaz a poddotaz
Uvnitล jakรฉhokoli dotazu mลฏลพete pouลพรญt jinรฝ dotaz buฤ v SELECT, INSERT, DELETE, UPDATE nebo uvnitล jinรฉho poddotazu.
Tento vnoลenรฝ dotaz se nazรฝvรก poddotaz. Nynรญ uvidรญme nฤkolik pลรญkladลฏ pouลพitรญ poddotazลฏ v klauzuli SELECT. V tutoriรกlu Modifying Data vลกak uvidรญme, jak mลฏลพeme pouลพรญt poddotazy s pลรญkazy INSERT, DELETE a UPDATE.
Pouลพitรญ poddotazu v pลรญkladu klauzule FROM
V nรกsledujรญcรญm dotazu zahrneme poddotaz do klauzule FROM:
SELECT s.StudentName, t.Mark FROM Students AS s INNER JOIN ( SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId ) ON s.StudentId = t.StudentId;
dotaz:
SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId
Vรฝลกe uvedenรฝ dotaz se zde nazรฝvรก poddotaz, protoลพe je vnoลen do klauzule FROM. Vลกimnฤte si, ลพe jsme mu dali alias โtโ, abychom mohli odkazovat na sloupce vrรกcenรฉ z nฤj v dotazu.
Tento dotaz vรกm poskytne:
Takลพe v naลกem pลรญpadฤ,
- s.StudentName je vybrรกno z hlavnรญho dotazu, kterรฝ udรกvรก jmรฉna studentลฏ a
- t.Mark je vybrรกn z dรญlฤรญho dotazu; to dรกvรก znรกmky zรญskanรฉ kaลพdรฝm z tฤchto studentลฏ
Pouลพitรญ poddotazu v pลรญkladu klauzule WHERE
V nรกsledujรญcรญm dotazu zahrneme poddotaz do klauzule WHERE:
SELECT DepartmentName FROM Departments AS d WHERE NOT EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
dotaz:
SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId
Vรฝลกe uvedenรฝ dotaz se zde nazรฝvรก poddotaz, protoลพe je vnoลen do klauzule WHERE. Poddotaz vrรกtรญ hodnoty DepartmentId, kterรฉ pouลพije operรกtor NOT EXISTS.
Tento dotaz vรกm poskytne:
Ve vรฝลกe uvedenรฉm dotazu jsme vybrali katedru, na kterรฉ nenรญ zapsรกn ลพรกdnรฝ student. Coลพ je tady "matematickรฉ" oddฤlenรญ.
sada Operations โ UNION,Intersect
SQLite podporuje nรกsledujรญcรญ operace SET:
UNION & UNION Vล ECHNY
Kombinuje jednu nebo vรญce sad vรฝsledkลฏ (skupina ลรกdkลฏ) vrรกcenรฝch z vรญce pลรญkazลฏ SELECT do jednรฉ sady vรฝsledkลฏ.
UNION vrรกtรญ odliลกnรฉ hodnoty. UNION ALL vลกak nebude a bude obsahovat duplikรกty.
Vลกimnฤte si, ลพe nรกzev sloupce bude nรกzev sloupce zadanรฝ v prvnรญm pลรญkazu SELECT.
Pลรญklad UNION
V nรกsledujรญcรญm pลรญkladu zรญskรกme seznam DepartmentId z tabulky studentลฏ a seznam DepartmentId z tabulky departments ve stejnรฉm sloupci:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION SELECT DepartmentId FROM Departments;
To vรกm dรก:
Dotaz vrรกtรญ pouze 5 ลรกdkลฏ, coลพ jsou odliลกnรฉ hodnoty ID oddฤlenรญ. Vลกimnฤte si prvnรญ hodnoty, kterรก je nulovou hodnotou.
SQLite UNION ALL Pลรญklad
V nรกsledujรญcรญm pลรญkladu zรญskรกme seznam DepartmentId z tabulky studentลฏ a seznam DepartmentId z tabulky departments ve stejnรฉm sloupci:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION ALL SELECT DepartmentId FROM Departments;
To vรกm dรก:
Dotaz vrรกtรญ 14 ลรกdkลฏ, 10 ลรกdkลฏ z tabulky studentลฏ a 4 z tabulky oddฤlenรญ. Vลกimnฤte si, ลพe vrรกcenรฉ hodnoty jsou duplikรกty. Vลกimnฤte si takรฉ, ลพe nรกzev sloupce byl ten, kterรฝ byl zadรกn v prvnรญm pลรญkazu SELECT.
Nynรญ se podรญvejme, jak UNION all poskytne rลฏznรฉ vรฝsledky, pokud nahradรญme UNION ALL za UNION:
SQLite PROSรT
Vrรกtรญ hodnoty, kterรฉ existujรญ v obou kombinovanรฝch sadฤ vรฝsledkลฏ. Hodnoty, kterรฉ existujรญ v jednรฉ z kombinovanรฉ sady vรฝsledkลฏ, budou ignorovรกny.
Pลรญklad
V nรกsledujรญcรญm dotazu vybereme hodnoty DepartmentId, kterรฉ existujรญ v tabulkรกch Students a Departments ve sloupci DepartmentId:
SELECT DepartmentId FROM Students Intersect SELECT DepartmentId FROM Departments;
To vรกm dรก:
Dotaz vracรญ pouze tลi hodnoty 1, 2 a 3. Coลพ jsou hodnoty, kterรฉ existujรญ v obou tabulkรกch.
Hodnoty null a 4 vลกak nebyly zahrnuty, protoลพe hodnota null existuje pouze v tabulce studentลฏ a nikoli v tabulce oddฤlenรญ. A hodnota 4 existuje v tabulce oddฤlenรญ a ne v tabulce studentลฏ.
To je dลฏvod, proฤ byly hodnoty NULL i 4 ignorovรกny a nebyly zahrnuty do vrรกcenรฝch hodnot.
Aลฝ NA
Pลedpoklรกdejme, ลพe pokud mรกte dva seznamy ลรกdkลฏ, seznam1 a seznam2, a chcete ลรกdky pouze ze seznamu1, kterรฝ v seznamu2 neexistuje, mลฏลพete pouลพรญt klauzuli โEXCEPTโ. Klauzule EXCEPT porovnรก dva seznamy a vrรกtรญ ty ลรกdky, kterรฉ existujรญ v seznamu1 a neexistujรญ v seznamu2.
Pลรญklad
V nรกsledujรญcรญm dotazu vybereme hodnoty DepartmentId, kterรฉ existujรญ v tabulce oddฤlenรญ a neexistujรญ v tabulce studentลฏ:
SELECT DepartmentId FROM Departments EXCEPT SELECT DepartmentId FROM Students;
To vรกm dรก:
Dotaz vrรกtรญ pouze hodnotu 4. Coลพ je jedinรก hodnota, kterรก existuje v tabulce oddฤlenรญ a neexistuje v tabulce studentลฏ.
Zpracovรกnรญ NULL
Hodnota โNULLโ je speciรกlnรญ hodnota v SQLitePouลพรญvรก se k reprezentaci neznรกmรฉ nebo chybฤjรญcรญ hodnoty. Vลกimnฤte si, ลพe hodnota null je zcela odliลกnรก od hodnoty โ0โ nebo prรกzdnรฉ hodnoty โโ. Protoลพe 0 a prรกzdnรก hodnota jsou znรกmรฉ hodnoty, je hodnota null neznรกmรก.
Hodnoty NULL vyลพadujรญ speciรกlnรญ zpracovรกnรญ SQLite, nynรญ uvidรญme, jak zachรกzet s hodnotami NULL.
Hledejte hodnoty NULL
K vyhledรกnรญ hodnot null nemลฏลพete pouลพรญt normรกlnรญ operรกtor rovnosti (=). Napลรญklad nรกsledujรญcรญ dotaz hledรก studenty, kteลรญ majรญ nulovou hodnotu DepartmentId:
SELECT * FROM Students WHERE DepartmentId = NULL;
Tento dotaz nepลinese ลพรกdnรฝ vรฝsledek:
Protoลพe hodnota NULL se nerovnรก ลพรกdnรฉ jinรฉ hodnotฤ vฤetnฤ samotnรฉ hodnoty null, proto nevrรกtila ลพรกdnรฝ vรฝsledek.
Aby vลกak dotaz fungoval, musรญte k vyhledรกvรกnรญ hodnot NULL pouลพรญt operรกtor โIS NULLโ takto:
SELECT * FROM Students WHERE DepartmentId IS NULL;
To vรกm dรก:
Dotaz vrรกtรญ ty studenty, kteลรญ majรญ nulovou hodnotu DepartmentId.
Pokud chcete zรญskat hodnoty, kterรฉ nejsou null, musรญte pouลพรญt operรกtor โIS NOT NULLโ takto:
SELECT * FROM Students WHERE DepartmentId IS NOT NULL;
To vรกm dรก:
Dotaz vrรกtรญ ty studenty, kteลรญ nemajรญ hodnotu NULL DepartmentId.
Podmรญnฤnรฉ vรฝsledky
Pokud mรกte seznam hodnot a chcete vybrat kteroukoli z nich na zรกkladฤ urฤitรฝch podmรญnek. Za tรญmto รบฤelem by podmรญnka pro tuto konkrรฉtnรญ hodnotu mฤla bรฝt pravdivรก, aby mohla bรฝt vybrรกna.
Vรฝraz CASE vyhodnotรญ tento seznam podmรญnek pro vลกechny hodnoty. Pokud je podmรญnka pravdivรก, vrรกtรญ tuto hodnotu.
Mรกte-li napลรญklad sloupec Znรกmka a chcete vybrat textovou hodnotu na zรกkladฤ hodnoty stupnฤ takto:
โ โVรฝbornฤโ, pokud je znรกmka vyลกลกรญ neลพ 85.
โ โVelmi dobลeโ, pokud je znรกmka mezi 70 a 85.
โ โDobrรฝโ, pokud je znรกmka mezi 60 a 70.
Pak k tomu mลฏลพete pouลพรญt vรฝraz CASE.
To lze pouลพรญt k definovรกnรญ urฤitรฉ logiky v klauzuli SELECT, abyste mohli vybrat urฤitรฉ vรฝsledky v zรกvislosti na urฤitรฝch podmรญnkรกch, jako je napลรญklad pลรญkaz if.
Operรกtor CASE lze definovat s rลฏznรฝmi syntaxemi takto:
Mลฏลพete pouลพรญt rลฏznรฉ podmรญnky:
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 WHEN condition3 THEN result3 โฆ ELSE resultn END
Nebo mลฏลพete pouลพรญt pouze jeden vรฝraz a vloลพit rลฏznรฉ moลพnรฉ hodnoty na vรฝbฤr:
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 WHEN value3 THEN result3 โฆ ELSE restuln END
Vลกimnฤte si, ลพe klauzule ELSE je volitelnรก.
Pลรญklad
V nรกsledujรญcรญm pลรญkladu pouลพijeme vรฝraz CASE s hodnotou NULL ve sloupci ID oddฤlenรญ v tabulce Studenti k zobrazenรญ textu โลฝรกdnรฉ oddฤlenรญโ takto:
SELECT StudentName, CASE WHEN DepartmentId IS NULL THEN 'No Department' ELSE DepartmentId END AS DepartmentId FROM Students;
- Operรกtor CASE zkontroluje hodnotu DepartmentId, zda je nulovรก nebo ne.
- Pokud se jednรก o hodnotu NULL, vybere doslovnou hodnotu 'No Department' namรญsto hodnoty DepartmentId.
- Pokud hodnota nenรญ nulovรก, vybere se hodnota sloupce DepartmentId.
Tรญm zรญskรกte vรฝstup, jak je znรกzornฤno nรญลพe:
Bฤลพnรฝ tabulkovรฝ vรฝraz
Bฤลพnรฉ tabulkovรฉ vรฝrazy (CTE) jsou poddotazy, kterรฉ jsou definovรกny uvnitล pลรญkazu SQL s danรฝm nรกzvem.
Oproti poddotazลฏm mรก vรฝhodu, protoลพe je definovรกna z pลรญkazลฏ SQL a usnadลuje ฤtenรญ, รบdrลพbu a pochopenรญ dotazลฏ.
Spoleฤnรฝ tabulkovรฝ vรฝraz lze definovat umรญstฤnรญm klauzule WITH pลed pลรญkazy SELECT takto:
WITH CTEname AS ( SELECT statement ) SELECT, UPDATE, INSERT, or update statement here FROM CTE
โNรกzev CTEโ je libovolnรฝ nรกzev, kterรฝ mลฏลพete CTE pลiลadit a kterรฝ mลฏลพete pouลพรญt k pozdฤjลกรญmu odkazovรกnรญ. Upozorลujeme, ลพe pro CTE mลฏลพete definovat pลรญkazy SELECT, UPDATE, INSERT nebo DELETE.
Nynรญ se podรญvejme na pลรญklad, jak pouลพรญt CTE v klauzuli SELECT.
Pลรญklad
V nรกsledujรญcรญm pลรญkladu definujeme CTE z pลรญkazu SELECT a pozdฤji jej pouลพijeme v jinรฉm dotazu:
WITH AllDepartments AS ( SELECT DepartmentId, DepartmentName FROM Departments ) SELECT s.StudentId, s.StudentName, a.DepartmentName FROM Students AS s INNER JOIN AllDepartments AS a ON s.DepartmentId = a.DepartmentId;
V tomto dotazu jsme definovali CTE a pojmenovali ho โVลกechna oddฤlenรญโ. Toto CTE bylo definovรกno z dotazu SELECT:
SELECT DepartmentId, DepartmentName FROM Departments
Potรฉ, co jsme definovali CTE, jsme jej pouลพili v dotazu SELECT, kterรฝ nรกsleduje po nฤm.
Vลกimnฤte si, ลพe bฤลพnรฉ tabulkovรฉ vรฝrazy neovlivลujรญ vรฝstup dotazu. Je to zpลฏsob, jak definovat logickรฝ pohled nebo poddotaz, aby bylo moลพnรฉ je znovu pouลพรญt ve stejnรฉm dotazu. Bฤลพnรฉ tabulkovรฉ vรฝrazy jsou jako promฤnnรก, kterou deklarujete a znovu ji pouลพijete jako poddotaz. Pouze pลรญkaz SELECT ovlivลuje vรฝstup dotazu.
Tento dotaz vรกm poskytne:
Pokroฤilรฉ dotazy
Pokroฤilรฉ dotazy jsou ty dotazy, kterรฉ obsahujรญ komplexnรญ spojenรญ, poddotazy a nฤkterรฉ agregรกty. V nรกsledujรญcรญ ฤรกsti uvidรญme pลรญklad pokroฤilรฉho dotazu:
Kde zรญskรกme,
- Jmรฉna oddฤlenรญ se vลกemi studenty pro kaลพdรฉ oddฤlenรญ
- Jmรฉno studentลฏ oddฤlenรฉ ฤรกrkou a
- Ukazuje, ลพe oddฤlenรญ mรก alespoล tลi studenty
SELECT d.DepartmentName, COUNT(s.StudentId) StudentsCount, GROUP_CONCAT(StudentName) AS Students FROM Departments AS d INNER JOIN Students AS s ON s.DepartmentId = d.DepartmentId GROUP BY d.DepartmentName HAVING COUNT(s.StudentId) >= 3;
Pลidali jsme klauzuli JOIN pro zรญskรกnรญ nรกzvu oddฤlenรญ (DepartmentName) z tabulky Departments. Potรฉ jsme pลidali klauzuli GROUP BY se dvฤma agregaฤnรญmi funkcemi:
- โPOฤETโ pro sฤรญtรกnรญ studentลฏ pro kaลพdou skupinu oddฤlenรญ.
- GROUP_CONCAT pro zลetฤzenรญ studentลฏ pro kaลพdou skupinu s ฤรกrkami oddฤlenรฝmi v jednom ลetฤzci.
Po GROUP BY jsme pomocรญ klauzule HAVING filtrovali katedry a vybrali pouze ta katedry, kterรก majรญ alespoล 3 studenty.
Vรฝsledek bude nรกsledujรญcรญ:




















































