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,

  1. Otevล™ete Tento poฤรญtaฤ a pล™ejdฤ›te do nรกsledujรญcรญho adresรกล™e โ€œC:\sqlite" a
  2. Potรฉ otevล™ete โ€žsqlite3.exe"

ฤŒtenรญ dat pomocรญ Select

Krok 2) Otevล™รญt databรกzi"NรกvodySampleDB.dbโ€œ pomocรญ nรกsledujรญcรญho pล™รญkazu:

ฤŒtenรญ dat pomocรญ Select

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รญ:

ฤŒtenรญ dat pomocรญ Select

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ลฏ:

ฤŒtenรญ dat pomocรญ Select

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:

ฤŒtenรญ dat pomocรญ Select

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:

Jmรฉna a alias

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:

Jmรฉna a alias

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:

Jmรฉna a alias

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รญโ€œ:

Jmรฉna a alias

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:

Jmรฉna a alias

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 zล™etฤ›zenรญ '||'

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รก:

SQLite OBSAZENร OperaTor

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ล™idรกnรญ "+โ€ โ€“ zadejte souฤet dvou operandลฏ.
  • Odeฤรญtรกnรญ "-โ€ โ€“ odeฤte dva operandy a vรฝsledkem je rozdรญl.
  • Nรกsobenรญ"*โ€œ โ€“ souฤin dvou operandลฏ.
  • Pล™ipomenutรญ (modulo) โ€œ%โ€ โ€“ udรกvรก zbytek, kterรฝ je vรฝsledkem dฤ›lenรญ jednoho operandu druhรฝm operandem.
  • divize"/โ€ โ€“ vrรกtรญ vรฝsledky podรญlu z dฤ›lenรญ levรฉho operandu pravรฝm operandem.

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รก:

SQLite Aritmetickรฝ Operatorลฏ

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ฤ›:

  • "<โ€ โ€“ vrรกtรญ hodnotu true, pokud je levรฝ operand menลกรญ neลพ pravรฝ operand.
  • "<=โ€ โ€“ vrรกtรญ hodnotu true, pokud je levรฝ operand menลกรญ nebo roven pravรฉmu operandu.
  • ">โ€ โ€“ vrรกtรญ hodnotu true, pokud je levรฝ operand vฤ›tลกรญ neลพ pravรฝ operand.
  • ">=โ€ โ€“ vrรกtรญ hodnotu true, pokud je levรฝ operand vฤ›tลกรญ nebo roven pravรฉmu operandu.
  • "="A"==โ€ โ€“ vrรกtรญ 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 si dva operandy nejsou stejnรฉ. 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 Porovnรกnรญ Operatorลฏ

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ลฏ:

  1. Zรญskejte jmรฉna studentลฏ zaฤรญnajรญcรญ pรญsmenem โ€žjโ€œ:
    SELECT StudentName FROM Students WHERE StudentName LIKE 'j%';

    Vรฝsledek:

    SQLite Shoda vzorลฏ Operatorลฏ

  2. Zรญskejte, aby jmรฉna studentลฏ konฤila pรญsmenem โ€žyโ€œ:
    SELECT StudentName FROM Students WHERE StudentName LIKE '%y';

    Vรฝsledek:

    SQLite Shoda vzorลฏ Operatorลฏ

  3. Zรญskejte jmรฉna studentลฏ, kterรก obsahujรญ pรญsmeno โ€žnโ€œ:
    SELECT StudentName FROM Students WHERE StudentName LIKE '%n%';

    Vรฝsledek:

    SQLite Shoda vzorลฏ Operatorลฏ

"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รก:

SQLite Shoda vzorลฏ Operatorลฏ

  • 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%');

SQLite A AUTOMATIZACI OperaTor

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รก:

SQLite OR OperaTor

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 MEZI OperaTor

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:

SQLite IN OperaTor

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 IN OperaTor

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

SQLite NE V OperaTor

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:

SQLite NE V OperaTor

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รก:

SQLite EXISTUJE OperaTor

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:

SQLite NENร OperaTor

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รก:

Omezenรญ a objednรกnรญ

  • 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:

Omezenรญ a objednรกnรญ

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รญ:

Odstranฤ›nรญ duplikรกtลฏ

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รญ:

Odstranฤ›nรญ duplikรกtลฏ

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โ€œ:

Agregรกt:SQLite AVG()

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รก:

Aggregate:COUNT() โ€“ COUNT(X) nebo COUNT(*)

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รก:

Aggregate:GROUP_CONCAT() โ€“ GROUP_CONCAT(X) nebo GROUP_CONCAT(X,Y)

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รก:

Aggregate:GROUP_CONCAT(DISTINCT DepartmentName) Pล™รญklad

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รก:

Aggregate:GROUP_CONCAT(DepartmentName ,'&') Pล™รญklad

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รก:

Agregรกt:SQLite MAX() & MIN()

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รก:

Agregรกt:SQLite SUM(x), Celkem (x)

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รก:

Aggregate: Rozdรญl mezi SUM a TOTAL Pล™รญklad

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 Group BY:HAVING

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รก:

Skupina vytvoล™enรก

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:

SQLite Dotaz a poddotaz: Pouลพitรญ poddotazu v klauzuli FROM

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:

SQLite Dotaz a poddotaz: Pouลพitรญ poddotazu v klauzuli WHERE

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รก:

sada Operations - UNION Pล™รญklad

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รก:

sada Operations - UNION Pล™รญklad

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รก:

sada Operations - INTERSECT

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รก:

sada Operations - KROMฤš

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:

Manipulace s NULL

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รก:

Manipulace s NULL

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รก:

Manipulace s NULL

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:

  1. Mลฏลพete pouลพรญt rลฏznรฉ podmรญnky:
CASE 
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  WHEN condition3 THEN result3
  โ€ฆ
  ELSE resultn
END
  1. 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:

Podmรญnฤ›nรฉ vรฝsledky

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:

Spoleฤnรฝ tabulkovรฝ vรฝraz

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รญ:

Pokroฤilรฉ dotazy

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.

Shrลˆte tento pล™รญspฤ›vek takto: