SQLite Dotaz: Select, Where, LIMIT, OFFSET, Count, Group By
Chcete-li psรกt dotazy SQL 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 Tento poฤรญtaฤ a pลejdฤte do nรกsledujรญcรญho adresรกลe โC:\sqlite" a
- Potรฉ otevลete โsqlite3.exe"
Krok 2) Otevลรญt databรกzi"NรกvodySampleDB.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 stรกle โJmรฉno studentaโ; sloupec StudentName je stรกle stejnรฝ, nemฤnรญ se aliasem.
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 Studenti jsme dali alias โsโ a tabulce oddฤlenรญ pลezdรญvku โdโ.
- Potom jsme mรญsto nรกzvu celรฉ tabulky pouลพili jejich aliasy, abychom na nฤ odkazovali.
- INNER JOIN spojรญ dvฤ nebo vรญce tabulek dohromady pomocรญ podmรญnky. V naลกem pลรญkladu jsme spojili tabulku Students s tabulkou Departments se sloupcem DepartmentId. Existuje takรฉ podrobnรฉ vysvฤtlenรญ pro INNER JOIN v โSQLite Vรฝukovรฝ program Joins.
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รญ sady vรฝsledkลฏ vrรกcenรฉ pomocรญ SQL dotaz. Takto funguje klauzule WHERE:
- 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;
To se zลetฤzรญ do novรฉho aliasu โStudentIdWithName"
- Hodnota doslovnรฉho ลetฤzce "ID s nรกzvem: "
- s hodnotou โStudentIdโ sloupec a
- s hodnotou od โJmรฉno studentaโ
SQLite Operรกtor CAST:
Operรกtor CAST se pouลพรญvรก k pลevodu hodnoty z datovรฉho typu na jinรฝ datovรฝ typ.
Pokud mรกte napลรญklad ฤรญselnou hodnotu uloลพenou jako ลetฤzcovou hodnotu, jako je tato โ '12.5' โ a chcete ji pลevรฉst na ฤรญselnou hodnotu, mลฏลพete k tomu pouลพรญt operรกtor CAST takto โCAST( '12.5' JAKO SKUTEฤNOST)โ. Nebo pokud mรกte desetinnou hodnotu jako 12.5 a potลebujete zรญskat pouze celoฤรญselnou ฤรกst, mลฏลพete ji pลetypovat na celรฉ ฤรญslo, jako je toto โ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:
|
Pลรญklad:
V nรกsledujรญcรญm pลรญkladu vyzkouลกรญme pฤt aritmetickรฝch operรกtorลฏ s doslovnรฝmi ฤรญselnรฝmi hodnotami
vybrat klauzuli:
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ฤ:
|
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ลฏ. Pouลพitรญm "Likeโ, mลฏลพete hledat 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, Jmรฉno studenta LIKE '%a%' โ toto vyhledรก jmรฉna studentลฏ, kterรก obsahujรญ pรญsmeno โaโ na libovolnรฉ pozici ve sloupci Jmรฉno studenta.
- Zaฤรญnรก se vzorem. Napลรญklad, "Jmรฉno studenta LIKE 'a%'โ โ vyhledรก jmรฉna studentลฏ zaฤรญnajรญcรญ pรญsmenem โaโ.
- Konฤรญ vzorem. Napลรญklad, "Jmรฉno studenta LIKE '%a'โ โ Vyhledejte jmรฉna studentลฏ, kterรก konฤรญ pรญsmenem โaโ.
- Shoda libovolnรฉho jednotlivรฉho znaku v ลetฤzci pomocรญ podtrลพรญtka โ_โ. Napลรญklad, "Jmรฉno studenta LIKE 'J___'โ โ Vyhledejte jmรฉna studentลฏ o dรฉlce 4 znakลฏ. Musรญ zaฤรญnat pรญsmenem โJโ a po pรญsmenu โJโ mลฏลพe mรญt dalลกรญ tลi 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 ekvivalentnรญ operรกtoru LIKE, ale GLOB na rozdรญl od operรกtoru LIKE rozliลกuje velkรก a malรก pรญsmena. 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
BETWEEN se pouลพรญvรก k vรฝbฤru tฤch hodnot, kterรฉ jsou v rozsahu dvou hodnot. Napลรญklad, "X MEZI Y A Zโ vrรกtรญ true (1), pokud je hodnota X mezi dvฤma hodnotami Y a Z. V opaฤnรฉm pลรญpadฤ vrรกtรญ false (0). โX MEZI Y A Zโ je ekvivalentnรญ โX >= Y A 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).
Takhle: "col IN(x, y, z)โ. To je ekvivalentnรญ โ (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. "WHERE StudentId IN(2; 4; 6; 8)โje ekvivalentnรญโ 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. Ale se stejnou syntaxรญ; trvรก jeden operand a seznam operandลฏ. Vrรกtรญ hodnotu true, pokud se hodnota prvnรญho operandu nerovnรก hodnotฤ jednoho z operandลฏ ze seznamu. tj. vrรกtรญ true (0), pokud seznam operandลฏ neobsahuje prvnรญ operand. Takhle: โcol NOT IN(x, y, z)โ. To je ekvivalentnรญ โ(sloupec<>x) AND (sloupec<>y) AND (sloupec<>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รก:
Pouze tลi oddฤlenรญโIT, fyzika a umฤnรญโ bude vrรกceno. A nรกzev oddฤlenรญ"matematikaโ nebude vrรกceno, protoลพe v danรฉm oddฤlenรญ nenรญ ลพรกdnรฝ student, takลพe ID oddฤlenรญ v tabulce studentลฏ neexistuje. Proto operรกtor EXISTS ignoroval โmatematika" oddฤlenรญ.
SQLite NENร
Revvymaลพe 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:
Pouze oddฤlenรญ"matematika โ bude vrรกceno. Protoลพe "matematikaโ katedra je jedinรก katedra, 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 vybrat konkrรฉtnรญ poฤet ลรกdkลฏ poฤรญnaje urฤitou pozicรญ pomocรญ klauzule OFFSET. Napลรญklad, "LIMIT 4 OFFSET 4โ bude ignorovat prvnรญ 4 ลรกdky a vrรกtรญ 4 ลรกdky poฤรญnaje pรกtรฝmi ลรกdky, takลพe dostanete ลรกdky 5,6,7, 8, XNUMX a XNUMX.
Vลกimnฤte si, ลพe klauzule OFFSET je volitelnรก, mลฏลพete ji napsat jako โLIMIT 4โ a poskytne vรกm 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รกลก dotaz SQL vracรญ duplicitnรญ hodnoty, mลฏลพete pouลพรญt โDISTINCTโ klรญฤovรฉ slovo k odstranฤnรญ tฤchto duplikรกtลฏ a vrรกcenรญ odliลกnรฝch hodnot. Po prรกci s klรกvesou 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ลกลกรญ znรกmky a nejniลพลกรญ znรกmky z โZnรกmky" stลฏl:
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 SUM a total k zรญskรกnรญ souฤtu vลกech znรกmek v โZnรกmkyโ tabulky:
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
"NULLโ hodnota je speciรกlnรญ hodnota v SQLite. Pouลพรญvรก se k vyjรกdลenรญ hodnoty, kterรก je neznรกmรก nebo chybรญ. Vลกimnฤte si, ลพe hodnota null je รบplnฤ jinรก neลพ โ0โ nebo prรกzdnรก hodnota โโ. Protoลพe 0 a prรกzdnรก hodnota je znรกmรก hodnota, je vลกak 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 pouลพรญt โJE NULLโ operรกtor k vyhledรกnรญ hodnot null nรกsledovnฤ:
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 โNENร NULLโ operรกtor 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 CASE vรฝraz s NULL hodnotu ve sloupci ID oddฤlenรญ v tabulce Studenti zobrazรญ text 'ลฝรก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 jakรฝkoli nรกzev, kterรฝ mลฏลพete zadat pro CTE, mลฏลพete jej pouลพรญt k pozdฤjลกรญmu odkazovรกnรญ. Vลกimnฤte si, ลพe na 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 dali mu nรกzev โVลกechna oddฤlenรญโ. Tento CTE byl definovรกn 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 a REGISTRACE klauzule k zรญskรกnรญ 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รญ:
Shrnutรญ
To byl รบvod do psanรญ SQLite dotazy a zรกklady dotazovรกnรญ databรกze a jak mลฏลพete filtrovat vrรกcenรก data. Nynรญ mลฏลพete, napiลกte si vlastnรญ SQLite dotazy.




















































