Jak napsat SQL dotaz: praktický průvodce s příklady
Jak napsat SQL dotaz: praktický průvodce s příklady
Structured Query Language (SQL) je univerzální způsob komunikace s relačními databázemi, ale napsání efektivního dotazu není jen spojení několika klíčových slov. Je to proces, který kombinuje logiku, jasné porozumění vašim datům a povědomí o tom, jak databáze fungují. Tento průvodce vám poskytne znalosti potřebné k psaní SQL dotazů, které budou nejen korektní, ale také efektivní, čitelné a udržovatelné, bez ohledu na váš systém řízení databází.
Co se naučíte
Na konci tohoto průvodce budete schopni vytvářet SQL dotazy od nuly, přesně filtrovat, řadit a agregovat data. Pochopíte důležitost pořadí provádění dotazu a získáte jasný plán pro psaní složitých SQL příkazů, které se stanou vaší profesionální výhodou. Napsání SQL dotazu je strukturovaný proces, ve kterém se klauzule zapisují v určitém pořadí, které se liší od toho, jak je provádí jádro databáze.
Základ: příkaz SELECT
Základem získávání dat je příkaz SELECT. Ten databázi sděluje, jaké přesně informace chcete vidět a kde je najít. Nejjednodušší forma dotazu se skládá z klauzulí SELECT a FROM.
SELECT column1, column2
FROM table_name;
Například pro získání klíčů a příjmení zaměstnanců z dimenzionální tabulky můžete použít:
SELECT EmployeeKey, LastName
FROM DimEmployee;
Ačkoli se SELECT * může zdát pohodlné pro rychlý náhled všech sloupců, v produkčním kódu je to považováno za špatnou praxi, protože může vracet nepotřebná data, ovlivňovat výkon a narušovat fungování aplikací při změně schématu tabulky. Vždy uvádějte pouze potřebné sloupce.
Budování logiky pomocí klauzule WHERE
Pro filtrování dat a získání pouze požadovaných řádků se používá klauzule WHERE. Ta definuje vyhledávací podmínku, kterou musí řádky splňovat, aby byly zahrnuty do výsledků. Klauzule WHERE následuje za FROM ve struktuře vašeho dotazu.
Můžete použít různé operátory k vytvoření výkonných vyhledávacích podmínek. Například pro nalezení konkrétního zaměstnance s příjmením "Smith" můžete použít jednoduché porovnání na rovnost:
SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE LastName = 'Smith';
Pro složitější filtry můžete použít operátor LIKE pro vyhledávání podle vzoru. Následující dotaz najde všechny zaměstnance, jejichž příjmení obsahuje vzor "Smi":
SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE LastName LIKE '%Smi%';
Logické operátory, jako jsou AND a OR, umožňují kombinovat více podmínek. AND se používá, když musí být splněny všechny podmínky, zatímco OR se používá, když stačí splnění kterékoli z nich. Například pro nalezení řádků odpovídajících více kritériím můžete napsat:
SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE EmployeeKey <= 500
AND LastName LIKE '%Smi%';
Je důležité poznamenat, že klauzule WHERE filtruje jednotlivé řádky a nemůže filtrovat agregované výsledky. Operátor IN je stručný způsob, jak zkontrolovat, zda hodnota odpovídá některé z položek v seznamu, a BETWEEN se používá pro vyhledávání hodnot v daném rozsahu.
-- Použití IN
SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE LastName IN ('Smith', 'Godfrey', 'Johnson');
-- Použití BETWEEN
SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE EmployeeKey BETWEEN 100 AND 200;
Podle dokumentace společnosti Microsoft není počet predikátů ve vyhledávací podmínce omezen, což umožňuje vytvářet velmi přesné a složité logické filtry.
Formování a organizace výsledků
Po filtrování dat je často potřeba je seřadit pro lepší čitelnost nebo provést výpočty. Klauzule ORDER BY třídí výslednou sadu podle jednoho nebo více sloupců. Následuje za příkazem SELECT a může určovat řazení vzestupně (ASC, výchozí) nebo sestupně (DESC). Pro odstranění duplicitních řádků z výsledné sady se používá klíčové slovo DISTINCT hned za SELECT.
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
Klauzule GROUP BY je výkonný nástroj pro agregaci dat. Seskupuje řádky se stejnými hodnotami v určených sloupcích, což umožňuje provádět souhrnné operace, jako jsou SUM, AVG, COUNT, MAX a MIN. Například pro nalezení celkové částky každé prodejní objednávky můžete seskupit data podle SalesOrderID a sečíst mezisoučty řádků:
SELECT SalesOrderID,
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
Když je potřeba filtrovat výsledky GROUP BY, je nutné použít klauzuli HAVING. Na rozdíl od WHERE, která filtruje jednotlivé řádky před seskupením, HAVING filtruje skupiny po provedení agregace.
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5;
Pořadí psaní těchto klauzulí je zásadní. Standardní SQL dotaz se řídí touto strukturou: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY.
Pokročilé techniky: spojení a poddotazy
Data jsou často uložena ve více tabulkách a pro jejich spojení se používají klauzule JOIN. INNER JOIN získává záznamy ze dvou tabulek, kde je splněna podmínka spojení. Například můžete spojit tabulku Product s SalesOrderDetail, abyste získali informace o produktu spolu s údaji o prodejích.
Poddotazy neboli vnořené dotazy jsou dotazy uvnitř jiného dotazu. Jsou užitečné pro manipulaci s daty a analýzu, která závisí na výsledcích jiné operace. Korelovaný poddotaz je obzvláště složitý typ, kde vnitřní dotaz závisí na vnějším pro získání svých hodnot a je prováděn opakovaně pro každý zpracovávaný řádek. Klíčové slovo EXISTS se často používá s korelovanými poddotazy pro kontrolu existence řádků v poddotazu.
Psaní čitelného SQL
Napsat funkční SQL je jen polovina úspěchu; napsat udržovatelné SQL je profesionální nutnost. Dodržujte tato doporučení, aby vaše dotazy byly nástrojem pro spolupráci, nikoli zdrojem zmatku:
- Pište klíčová slova velkými písmeny: Používejte velká písmena pro klíčová slova SQL, jako jsou
SELECT,FROM,WHEREaJOIN. To je odděluje od názvů sloupců a tabulek, což usnadňuje čtení dotazu. - Používejte zalomení řádků a odsazení: Umístěte každou hlavní klauzuli na nový řádek a použijte odsazení pro zobrazení struktury poddotazů nebo spojení. Tato vizuální hierarchie objasňuje složitou logiku.
- Přidávejte smysluplné komentáře: Používejte
--pro přidání komentářů, které vysvětlují proč jste dotaz napsali tak, jak je, nikoli co dělá. To je neocenitelné pro vás v budoucnu i pro vaše kolegy. - Používejte popisné aliasy: Při přejmenovávání sloupců pomocí
ASnebo zkracování názvů tabulek volte smysluplné aliasy. Vyhněte se nejasným názvům jakot1neboa.
Zdroje
- WHERE (Transact-SQL) — SQL Server
- T-SQL Tutorial: Write Transact-SQL Statements
- SELECT Examples (Transact-SQL)
- PostgreSQL: Documentation: 17: 2.5. Querying a Table
- Data Management with SQL for Ecologists: Accessing Data With Queries
- EXISTS (Transact-SQL) — SQL Server
- Transact-SQL Syntax Conventions (Transact-SQL)
- How to Write SQL Queries Anyone Can Understand
— Editorial Team
Zatím žádné komentáře.