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 NULL
product WHERE size IS NOT
SELECT – ORDER BY (třídění) • SELECT * FROM weight ASC
product ORDER BY
• SELECT * FROM weight DESC
product ORDER BY
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ě)