Databáze SQL SELECT David Hoksza http://siret.cz/hoksza
Osnova Úvod do SQL Základní dotazování v SQL Cvičení základní dotazování v SQL
Structured Query Language (SQL) SQL napodobuje jednoduché anglické věty jazyk pro dotazování nad RDBMS původní název SEQUEL (Structured English Query Language) Structured Query Language 1970s SEQUEL IBM, Donald D. Chamberlin a Raymond F. Boyce v sedmdesátých letech implementován firmou Relational Software Inc. (později Oracle) krátce na to Oracle V2 a IBM System/38 Založen na relační algebře (relace, jejich sjednocení a průniky,..) SQL je množinově orientovaný jazyk Normy SQL-86, SQL-92, SQL:1999, SQL:2003, SQL 2008 každá norma je víceméně nadmnožinou předchozí normy s přidanými standardizovanými konstrukty rychlý vývoj DBS způsobil předbíhání norem nestandardizované konstrukty v předních RDBMS Většina DBS je SQL-92 compliant na entry-úrovni CASE-insensitive
Rozdělení SQL DDL Data Definition Language CREATE, ALTER, DROP, TRUNCATE, DML - Data Manipulation Language SELECT, INSERT, DELETE, UPDATE, DCL - Data Control Language GRANT, REVOKE TCL Transaction Control Language COMMIT, ROLLBACK,
Schéma AdventureWorksLT
SQL konstrukt SELECT selekce seznam sloupců oddělených čárkami FROM definice zdroje dat (může jít o jednu tabulku, nebo spojení/join tabulek) WHERE restrikce omezení řádků zdroje ORDER BY setřídění výsledku GROUP BY seskupení řádků HAVING restrikce na úrovni skupin definovaných GROUP BY
SELECT SELECT * FROM Products vyber všechny produkty
SELECT - selekce SELECT name, productnumber FROM Products vyber jména a názvy všech produktů SELECT DISTINCT(ShipMethod)FROM SalesOrderHeader DISTINCT odstranění duplicit z výsledku vyber způsob dodání objednávky
SELECT WHERE (restrikce) SELECT * FROM products WHERE weight < 1000 vyber produkty s váhou menší než 1000 SELECT * FROM products WHERE color = Red vyber produkty s červenou barvou SELECT * FROM products WHERE color = Red AND weight > 1000 vyber produkty s červenou barvou a váhou větší než 1000
SELECT predikát WHERE Logické spojky AND, OR, NOT Operátory >, <, >=, <=, =, <>, BETWEEN, LIKE, SELECT * FROM products WHERE weight >= 1000 AND weight <= 2000 SELECT * FROM products WHERE weight BETWEEN 1000 AND 2000 SELECT * FROM products WHERE name LIKE %socks% Produkty, které mají v názvu slovo socks SELECT * FROM products WHERE name LIKE socks% Produkty, jejichž název začíná na socks SELECT * FROM products WHERE name LIKE %socks Produkty, jejichž název končí na socks
NULL hodnota NULL značí neznámou hodnotu (UNKNOWN) tříhodnotová logika 3VL logic
Predikát IS NULL SELECT * FROM product WHERE size = NULL SELECT * FROM product WHERE size IS NULL SELECT * FROM product WHERE size IS NOT NULL
SELECT ORDER BY (třídění) SELECT * FROM product ORDER BY weight ASC SELECT * FROM product ORDER BY weight DESC
SELECT - spojení ve FROM klauzuli se může vyskytovat více tabulek/pohledů/vnořených dotazů typicky spojení přes cizí klíče (není pravidlem) spojení zdroj := tabulka pohled vnořený dotaz (SELECT) možnosti spojení zdroj1 [LEFT RIGHT FULL] [OUTER ] JOIN zdroj2 [ JOIN ] ON (podmínka) zdroj1, zdroj2 [, ] WHERE (podmínka) další možnosti zahrnují NATURAL JOIN, USING, (v MS SQL Serveru nepodporováno)
Vnitřní spojení SELECT * FROM Product JOIN ProductCategory ON (Product.ProductCategoryID = ProductCategory.ProductCategoryID) seznam produktů a příslušných kategorií SELECT * FROM Product AS p JOIN ProductCategory AS pc ON (p.productcategoryid = pc.productcategoryid) alternativní zápis předchozího dotazu s použití tzv. ALIASů při použití alisů je v MSSQL nutné je použít i v ON klauzuli klíčové slovo AS lze v aliasu vynechat SELECT p.*, pc.name FROM Product AS p JOIN ProductCategory AS pc ON (p.productcategoryid = pc.productcategoryid) využití restrikce k získání informací o všech produktech a ke každému navíc pouze název kategorie SELECT p.*, pc.name FROM Product AS p, ProductCategory AS pc WHERE p.productcategoryid = pc.productcategoryid Alternativní zápis předchozího dotazu
Vnitřní spojení SELECT p.name, soh.salesordernumber, soh.orderdate, soh.taxamt FROM Product p JOIN SalesOrderDetail sod ON (p.productid= sod.productid) JOIN SalesOrderHeader soh ON (sod.salesorderid = soh.salesorderid) ORDER BY p.name
Vnější spojení SELECT p.name, sod.productid FROM Product p LEFT JOIN SalesOrderDetail sod ON (p.productid= sod.productid) vybere všechny produkty, které se účastní nějaké objednávky a navíc ty, které se žádné neúčastní - takové doplní NULL hodnotami pokud řádek zdroje v levé části spojení nemá podle spojovací podmínky partnera, vyplní se příslušné sloupce NULL hodnotami analogicky RIGHT JOIN a OUTER JOIN (spojení RIGHT A LEFT JOINu)
Agregační operátory Agregační operátory dokáží agregovat hodnoty sloupců výsledku Skutečná síla spočívá až v kombinaci s klauzulí GROUP BY (příští přednáška) základní agregační operátory COUNT, AVG, MIN, MAX, SUM SELECT COUNT(*), MAX(ListPrice) FROM product Počet prodáváných produktů a maximum jejich cen SELECT SUM(ListPrice) FROM product Suma cen produktů, které prodáváme
Vnořené dotazy Vnořené dotazy se píší do závorky a lze je místo libovolného zdroje, nebo hodnoty (v případě, že vnořený dotaz vrací jeden řádek a jeden sloupec) SELECT name, ListPrice FROM Product WHERE ListPrice = (SELECT MAX(ListPrice) FROM Product) Název produktu s maximální cenou a jeho hodnota Takovéto použití je často méně efektivní než použití GROUP BY SELECT name, (SELECT COUNT(*) FROM SalesOrderDetail sod WHERE sod.productid = p.productid) FROM Product p Seznam produktů a počet objednávek každého z nich Efektivnější bude s použitím GROUP BY (příště)