SELECT
je téměř bezpochyby nejběžněji používaným příkazem v SQL.
SELECT
výpis slouží pro získávání dat z databáze. Můžete určit, které řádky chcete vrátit a které sloupce.
Příklad
Zde je příklad demonstrující SELECT
prohlášení.
SELECT *
FROM Pets;
Výsledek:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
V tomto příkladu jsme použili hvězdičku (*
) zástupný znak pro vrácení všech sloupců. Také jsme použili FROM
klauzule k určení, ze které tabulky se mají získat data.
Tento dotaz tedy vrátí všechny řádky a všechny sloupce z Pets
tabulka.
Určete sloupce
Můžete určit sloupce, které chcete vrátit.
Chcete-li to provést, nahraďte zástupný znak hvězdičkou názvy sloupců, každý oddělený čárkou, v pořadí, v jakém je chcete vrátit.
SELECT PetId, PetName, DOB
FROM Pets;
Výsledek:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 2 | Fetch | 2019-08-16 | | 3 | Scratch | 2018-10-01 | | 4 | Wag | 2020-03-15 | | 5 | Tweet | 2020-11-28 | | 6 | Fluffy | 2020-09-17 | | 7 | Bark | NULL | | 8 | Meow | NULL | +---------+-----------+------------+
Obecně se považuje za dobrou praxi to udělat tímto způsobem a vrátit pouze ty sloupce, které skutečně potřebujete. Použití zástupného znaku hvězdička k vrácení všech sloupců může mít nepříznivý dopad na výkon, zejména ve větších databázích.
Určete řádky
Existuje mnoho způsobů, jak filtrovat výsledky pouze na ty řádky, které vás zajímají. Nejběžnějším způsobem je použití WHERE
doložka. Tato klauzule vám umožňuje zadat podmínku, kterou musí řádek splňovat, aby se kvalifikoval.
Zde je příklad k demonstraci.
SELECT PetId, PetName, DOB
FROM Pets
WHERE PetName = 'Fluffy';
Výsledek:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 6 | Fluffy | 2020-09-17 | +---------+-----------+------------+
V našem případě byly dva řádky, které splnily naši podmínku vyhledávání.
Naše vyhledávací podmínka používá operátor rovná se (=
), abyste určili, že hodnota PetName
sloupec musí odpovídat zadané hodnotě (Fluffy
) přesně.
Existuje mnoho dalších operátorů, které můžete použít ve svých podmínkách vyhledávání. Můžete například použít LIKE
operátor vrátí domácí mazlíčky, jejichž jméno začíná F
nebo Fluff
nebo cokoli jiného.
Do WHERE
můžete přidat další podmínky klauzule pomocí operátorů, jako je AND
a OR
operátory.
Zde je příklad.
SELECT PetId, PetName, DOB
FROM Pets
WHERE PetName = 'Fluffy'
OR DOB < '2020-01-01';
Výsledek:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 2 | Fetch | 2019-08-16 | | 3 | Scratch | 2018-10-01 | | 6 | Fluffy | 2020-09-17 | +---------+-----------+------------+
V tomto příkladu jsme vrátili všechny řádky, kde je jméno mazlíčka Fluffy nebo kde je datum narození zvířete (uvedené v DOB
sloupec) je kratší než určité datum. Použili jsme operátor menší než (<
), abyste to upřesnili.
Vracení netabulkových dat
SELECT
lze také použít k vrácení dat, která nejsou uložena v tabulce. Například je naprosto legální udělat toto:
SELECT 'Hey there!';
Výsledek:
+--------------------+ | (No column name) | |--------------------| | Hey there! | +--------------------+
Všimněte si, že když to uděláme, sloupec nemá žádný název. Můžeme použít alias k pojmenování výsledného pole.
Zde je několik dalších příkladů výběru netabulkových dat a poskytnutí aliasu každému vrácenému poli:
SELECT
2 + 3 AS "2 + 3",
'Fluffy' + ' ' + 'Smith' AS FullName,
SYSDATETIME() AS "Date/time";
Výsledek:
+---------+--------------+-----------------------------+ | 2 + 3 | FullName | Date/time | |---------+--------------+-----------------------------| | 5 | Fluffy Smith | 2020-12-04 23:58:55.8483734 | +---------+--------------+-----------------------------+
Zde je rychlý přehled:
- První sloupec jednoduše přidal dvě čísla.
- Druhý sloupec spojil tři řetězce (včetně mezery). V případě potřeby můžete řetězce také zřetězit s čísly.
- Třetí sloupec používal
SYSDATETIME()
funkce pro vrácení aktuálního data a času. Tato funkce je dostupná na serveru SQL Server. Ostatní DBMS mají své vlastní funkce data a času. Seznam funkcí data a času dostupných v těchto DBMS najdete v části Funkce data/času SQLite, funkce data/času serveru SQL Server a funkce data/času PostgreSQL.
Poddotazy
Je možné mít více SELECT
příkazy v jednom dotazu. Můžeme to udělat pomocí dílčího dotazu.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Výsledek:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
V tomto příkladu jsme použili IN
operátor k zadání poddotazu. Tento dílčí dotaz vybral data z jiné tabulky a IN
operátor jej přiřadil zpět k vnějšímu dotazu.
Pořadí výsledků
Můžete použít ORDER BY
klauzule k řazení výsledků.
Předchozí výsledky bychom mohli například seřadit podle PetTypeId
sloupec v sestupném pořadí:
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets )
ORDER BY PetTypeId DESC;
Výsledek:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 3 | Dog | | 2 | Cat | | 1 | Bird | +-------------+-----------+
Viz SQL ORDER BY
Doložka pro začátečníky pro více příkladů a podrobné vysvětlení.
Pokročilejší SELECT
Prohlášení
SELECT
příkaz je velmi jednoduchý příkaz, ale lze jej použít k vytvoření velmi složitých dotazů.
Zde je dotaz, který je o něco složitější než předchozí.
SELECT
PetTypes.PetType,
COUNT(Pets.PetTypeId) AS Count
FROM Pets
LEFT JOIN PetTypes
ON Pets.PetTypeId = PetTypes.PetTypeId
GROUP BY PetTypes.PetType
ORDER BY Count DESC;
Výsledek:
+-----------+---------+ | PetType | Count | |-----------+---------| | Dog | 4 | | Cat | 3 | | Bird | 1 | +-----------+---------+
Ve světě SQL dotazů je to stále docela jednoduché, nicméně obsahuje mnoho prvků, které se často vyskytují ve složitějších dotazech.
Tento dotaz například používá spojení k načtení dat z více tabulek. Používá také GROUP BY
klauzule k rozdělení řádků do skupin.
Viz SQL GROUP BY
Doložka pro začátečníky pro další příklady GROUP BY
doložka.
Podívejte se na SQL Joins Tutorial, kde se dozvíte, jak načíst data z více tabulek a vrátit je jako jednu sadu výsledků.
SELECT INTO
Prohlášení
Některé DBMS podporují SELECT INTO
prohlášení. To se mírně liší od předchozích příkladů v tom, že to ovlivňuje data v databázi.
SELECT INTO
příkaz vytvoří novou tabulku a vloží do ní data z jiné tabulky.
V zásadě to vypadá takto:
SELECT * INTO Table2
FROM Table1;
V tomto příkladu vytvoříme novou tabulku s názvem Table2
a vložte všechna data z Table1
do toho. Table2
bude mít stejnou definici jako Table1
.
Viz SQL SELECT INTO
Prohlášení pro další příklady.
Jak jsem již zmínil, ne všechny DBMS toto tvrzení podporují. Pokud váš DBMS nepodporuje SELECT INTO
zkuste použít CREATE TABLE ... AS SELECT
místo toho prohlášení.
Tyto příkazy vytvoří novou tabulku jako součást své operace. Chcete-li vložit data do tabulky, která již existuje, zkuste použít INSERT INTO ... SELECT
místo toho prohlášení.