Naučte se SQL – výukový program s příklady kódování
Syntaxe jazyka SQL je založena na relační algebře, což tento programovací jazyk odlišuje od ostatních jazyků. Seznámení se syntaxí prostřednictvím praktických příkladů vám pomůže efektivně se naučit jazyk SQL.
Co je syntaxe SQL?
V programování se syntaxe vztahuje k tomu, jak je programovací jazyk napsán. Syntaxe určuje základní konstrukce kódu a způsob jejich propojení. Porozumění syntaxi je základním předpokladem pro čtení a psaní kódu v programovacích jazycích.
Nejdůležitějšími syntaktickými konstrukcemi v SQL jsou příkazy SQL, které mohou také obsahovat klauzule. Oba jsou běžně označovány jako „příkazy SQL“, i když z technického hlediska to není zcela přesné. Nejedná se však o jediné syntaktické konstrukce SQL. Níže naleznete tabulku, která vám poskytne přehled syntaktických konstrukcí SQL.
| Termín SQL | Vysvětlení | Příklad |
|---|---|---|
| Příkaz | Nařizuje DBMS provést akci; končí středníkem | CREATE TABLE People;
|
| Klauzule | Upravuje příkaz; může se vyskytovat pouze v rámci příkazů. | WHERE, HAVING
|
| Výraz | Vrací hodnotu při vyhodnocení. | 6 * 7
|
| Identifikátor | Název databázového objektu, proměnné nebo procedury; může být kvalifikovaný nebo nekvalifikovaný. | dbname.tablename / tablename
|
| Predikát | Výraz, jehož výsledkem je TRUE, FALSE nebo UNKNOWN.
|
Age < 42
|
| Dotaz | Speciální příkaz; vrací nalezenou sadu záznamů | SELECT Name FROM People WHERE Age < 42;
|
| Funkce | Zpracovává jednu nebo více hodnot; obvykle vytváří novou hodnotu. | UPPER('text') -- returns 'TEXT'
|
| Komentář | Slouží k komentování kódu SQL; RDBMS jej ignoruje. | -- Comment up to end of line / /*multiline comment if necessary*/
|
Příkazy SQL, jako SELECT a CREATE TABLE, se obvykle píší velkými písmeny. SQL však nerozlišuje velká a malá písmena. Psaní velkých písmen v příkazech je pouze široce používanou konvencí.
Jak se provádí kód SQL?
SQL kód existuje jako zdrojový kód v textových souborech. Kód ožívá pouze ve vhodném prostředí pro jeho spuštění. Zdrojový kód je čten interpretem SQL a převeden na akce RDBMS. Existují dva základní přístupy:
1. Interaktivní spuštění kódu SQLPři tomto přístupu se kódSQLzadává nebo kopíruje přímo do textového okna. Kód SQL se spustí a zobrazí se výsledek. Kód můžete upravit a spustit znovu. Díky rychlé sekvenci manipulace s kódem a zobrazení výsledků je tento přístup nejvhodnější pro učení a vytváření složitých dotazů. 2. Spuštění kódu SQL jakoskriptu Při tomto přístupu se celý soubor zdrojového kódu obsahující kód SQL spustí řádek po řádku. V případě potřeby se zpětná vazba odešle uživateli až na konci spuštění. Tento přístup je nejvhodnější pro automatizaci procesů a pro import záloh databáze MySQL pomocí MySQL dump.
| Rozhraní | Popis | Příklady |
|---|---|---|
| Rozhraní příkazového řádku (CLI) | Textové rozhraní; zadává se a provádí se kód SQL, výsledek se zobrazuje v textové podobě | mysql, psql, mysqlsh |
| Grafické uživatelské rozhraní (GUI) | SQL kód se zadává do textového okna a/nebo se generuje v reakci na interakci uživatele; SQL kód se provádí a výsledek se zobrazuje ve formě tabulek | phpMyAdmin, MySQL Workbench, HeidiSQL |
| Rozhraní pro programování aplikací (API) | Umožňuje přímou komunikaci s RDBMS; kód SQL je zahrnut a spuštěn jako řetězec v kódu programovacího jazyka; výsledky jsou k dispozici jako datové struktury pro další použití | PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API |
Jak nastavit systém správy produktů pomocí SQL
Nejjednodušší způsob, jak se naučit programovací jazyk, je psát a spouštět kód sami. V tomto tutoriálu vytvoříme mini databázi a provedeme na ní dotazy. K tomu použijeme online interpret SQL z webové stránky sql.js. Chcete-li postupovat podle tutoriálu, přejděte na webovou stránku a nahraďte již zadaný kód SQL kódem z našich příkladů. Spouštějte kód po částech, aby se zobrazily výsledky.
Nastavit databázi SQL
V tomto příkladu budeme vytvářet komerční systém pro správu produktů pro obchod. Požadavky jsou následující:
- Máme několik produktů a každý z nich máme na skladě v určitém množství.
- Naše zákaznická základna zahrnuje mnoho klientů a zákazníků.
- Objednávky zákazníků mohou obsahovat několik produktů.
- U každé objednávky ukládáme datum objednávky a údaje o osobě, která objednávku zadala, jakož i objednané produkty a objednané množství.
Tyto požadavky jsou převedeny do abstraktního popisu a poté do kódu SQL:
- Vytvořit model
- Definovat schéma
- Zadání datových záznamů
- Definovat dotazy
Vytvořte model entit a vztahů
První krok se provádí na papíře nebo pomocí speciálních modelovacích nástrojů. Shromažďujeme informace o systému, který má být modelován, abychom odvodili entity a vztahy. Tento krok se často realizuje jako diagram entitních vztahů (ER).
Jaké entity existují a jak spolu souvisejí? Entity jsou třídy věcí. V našem příkladu systému řízení produktů jsou entitami produkty, zákazníci a objednávky. Pro každou entitu je potřeba tabulka. Vzhledem ke specifikům relačního modelu se přidávají další tabulky, aby se modelovaly vztahy. Uznání této skutečnosti a její správná implementace vyžaduje zkušenosti.
Ústřední otázkou, na kterou je třeba odpovědět, je, jak jsou entity vzájemně propojeny. Zde musíme zohlednit oba směry vztahu a rozlišovat mezi jednotným a množným číslem. Zde je příklad s automobily a jejich majiteli:
- Jeden majitel může potenciálně vlastnit několik automobilů.
- Auto může patřit pouze jednomu majiteli.
Mezi těmito dvěma entitami se objevujítři možné vzorce vztahů:
| Vztah | Entity | Zleva | Zprava |
|---|---|---|---|
| Vztah 1:1 | Auto:indikátor | Auto může mít pouze jeden ukazatel. | Blinkr může patřit pouze k jednomu autu. |
| Poměr 1:n | Majitel:auto | Vlastník může mít potenciálně několik automobilů. | Auto může patřit pouze jednomu majiteli. |
| Vztah m:n | Auto:ulice | Auto může jezdit po více silnicích. | Na jedné silnici může jezdit několik aut. |
Implementovat produkty
Nejprve implementujeme tabulku produktů. K tomu musíme definovat schéma, zadat datové záznamy a pro účely testování provést několik jednoduchých dotazů.
Definovat schéma
Hlavním příkazem SQL pro definování databázových tabulek je CREATE TABLE. Tento příkaz umožňuje vytvořit tabulku s názvem a specifikovat vlastnosti sloupců. Současně se definují datové typy a v případě potřeby omezení hodnot, které mají být uloženy:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );sqlPřed definováním tabulky používáme příkaz DROP TABLE IF EXISTS. Ten odstraní všechny existující tabulky a umožní několikrát spustit stejný kód SQL, aniž by došlo k chybovým hlášením.
Přidat datové sady
Nyní vytvoříme několik testovacích záznamů. K vyplnění polí použijeme příkaz SQL INSERT INTO a funkci VALUES:
INSERT INTO Products VALUES (10, 'ABC Product', 74, 1050);
INSERT INTO Products VALUES (20, 'KLM Product', 23, 750);
INSERT INTO Products VALUES (30, 'XYZ Product', 104, 350);sqlDefinujte dotazy
Pro kontrolu stavu tabulky Products napíšeme jednoduchý dotaz. Použijeme příkaz SELECT FROM a vygenerujeme kompletní tabulku:
SELECT * FROM Products;sqlNyní napíšeme o něco složitější dotaz, který vypočítá celkovou hodnotu produktů, které máme na skladě:
SELECT product_name AS 'Name', (stocked * price) AS 'Value' FROM Products;sqlImplementujte další tabulky
Dále vytvoříme zbývající tabulky, které potřebujeme. Postupujeme stejně jako u tabulky Products. Nejprve vytvoříme tabulku Customers:
DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers ( customer_id int, customer_name text, contact text );sqlPoté zadáme datové záznamy pro dva vzorové zákazníky:
INSERT INTO Customers VALUES (100, 'EDC Customer', 'ED@example.com');
INSERT INTO Customers VALUES (200, 'WVU Customer', 'WV@example.com');sqlAbychom ověřili, zda to funguje, zobrazíme tabulku zákazníků:
SELECT * FROM Customers;sqlDalším krokem je vytvoření tabulky Objednávky:
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders ( order_id int, customer_id int, order_date text );sqlNyní zadáme tři vzorové objednávky. První hodnotě záznamů přiřadíme ID jako primární klíč. Druhá hodnota je pro existující ID zákazníků, které fungují jako cizí klíče. Poté uložíme datum objednávky:
INSERT INTO Orders VALUES (1000, 100, '2022-05-03');
INSERT INTO Orders VALUES (1001, 100, '2022-05-04');
INSERT INTO Orders VALUES (1002, 200, '2022-05-08');sqlPro otestování zadáme příkazy:
SELECT * FROM Orders;sqlNakonec potřebujeme tabulku pro produkty v objednávce spolu s jejich množstvím. Jedná se o vztah m:n, protože objednávka může obsahovat více produktů a produkt se může objevit ve více objednávkách. Definujeme tabulku, která obsahuje ID objednávek a produktů jako cizí klíče:
DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems ( orderitem_id int, order_id int, product_id int, count int );sqlNyní zadáme několik objednaných produktů. Vybereme ID objednávek a produktů tak, aby jedna objednávka obsahovala dva produkty a druhá pouze jeden produkt:
INSERT INTO OrderItems VALUES (10001, 1000, 10, 3);
INSERT INTO OrderItems VALUES (10002, 1000, 20, 2);
INSERT INTO OrderItems VALUES (10003, 1002, 30, 12);sqlAbychom to ověřili, vydáme objednané produkty:
SELECT * FROM OrderItems;sqlPsát složité dotazy
Pokud jste provedli všechny dosud uvedené úryvky kódu, měli byste být schopni pochopit strukturu naší testovací databáze. Nyní přejdeme k složitějším dotazům, které demonstrují sílu jazyka SQL. Nejprve napíšeme dotaz, který sloučí data rozložená do více tabulek. K spojení tabulek obsahujících údaje o zákaznících a objednávkách použijeme příkaz SQL JOIN. Při tom pojmenujeme sloupce a jako podmínku JOIN nastavíme odpovídající ID zákazníka. Mějte na paměti, že k rozlišení sloupců obou tabulek používáme kvalifikované identifikátory:
SELECT customers.customer_name as 'Customer', customers.customer_id, orders.order_id, orders.order_date AS 'Date' FROM Customers JOIN Orders ON Orders.customer_id = Customers.customer_id ORDER BY Customers.customer_id;sqlNyní použijeme další příkaz JOIN k výpočtu celkových nákladů na objednané produkty:
SELECT OrderItems.order_id, OrderItems.orderitem_id AS 'Order Item', Products.product_name AS 'Product', Products.price AS 'Unit Price', OrderItems.count AS 'Count', (OrderItems.count * Products.price) AS 'Total' FROM OrderItems JOIN Products ON OrderItems.product_id = Products.product_id;sql