1 Kurz Databáze Zpracování dat Doc. Ing. Radim Farana, CSc. Obsah Druhy dotazů, tvorba dotazu, prostředí QBE (Query by Example). Realizace základních relačních operací selekce, projekce a spojení. Agregace dat, virtuální pole, parametry. Výkonné dotazy. SQL dotazy. Poddotazy. Dotazovací jazyk SQL (Structured Query Language). strana 1 Dotazy Jaké jsou druhy dotazů a k čemu slouží? výběrové dotazy - výběr požadovaných dat (selekce, projekce a spojení), virtuální položky, řazení, agregované výpočty, výkonné dotazy - vytvoření tabulky, hromadná změna dat, přidání a rušení záznamů, SQL dotazy - vše co umí jazyk SQL, speciálně UNION. Spojení dat z více tabulek Projekce výběr zobrazených polí Selekce - výběr zobrazených záznamů strana 2
2 Výběrové dotazy Spojení dat z více tabulek Projekce - výběr zobrazených polí Selekce - výběr zobrazených záznamů Řazení záznamů strana 3 Parametry dotazů Datový typ Parametr Zadání hodnoty včetně kontroly strana 4 Virtuální pole Formát pole PARAMETERS [Fill in the machine number] Long; SELECT tbloperations.opeid, tbloperations.opeworker, tbloperations.opemachine, IIf(IsNull([opeStop]),Now(),[opeStop])-[opeStart] AS opelength FROM tbloperations WHERE (((tbloperations.opemachine)=[fill in the machine number])) Pojmenování pole ORDER BY tbloperations.opeid; strana 5
3 Agregační dotazy Pojmenování položky TOP n (TOP n PERCENT) DISTINCT DISTINCTROW WITH OWNERACCESS OPTION IN Definice skupin Operace Podmínka strana 6 Agregační funkce Volba Výsledek Datový typ pole Sum Součet hodnot v Číslo, Datum/Čas, Měna a Automatické číslo Avg Průměr hodnot v Číslo, Datum/Čas, Měna a Automatické číslo Min Nejnižší hodnota v Text, Číslo, Datum/Čas, Měna a Automatické číslo Max Nejvyšší hodnota v Text, Číslo, Datum/Čas, Měna a Automatické číslo Count Počet hodnot v, Text, Memo, Číslo, hodnoty Null (prázdné) se nepočítají Datum/Čas, Měna a Automatické číslo, Ano/Ne a objekt OLE StDev Směrodatná odchylka hodnot v Var Rozptyl hodnot v First První ze skupiny Volba Výsledek Last Poslední ze skupiny Group By Definice skupin, s nimiž se provádějí výpočty. Expression Vytvoření vypočítaného pole, které zahrnuje agregační funkci ve svém výrazu. Vypočítané pole se používá obvykle tehdy, když má být ve výrazu několik funkcí. Where Zadání kritérií pro pole, která se nepoužívají k definici seskupení. Číslo, Datum/Čas, Měna a Automatické číslo Číslo, Datum/Čas, Měna a Automatické číslo strana 7 Křížový dotaz TRANSFORM Sum(qryWorkersWithExpensiveSteps.stpPrice) AS SumOfstpPrice SELECT qryworkerswithexpensivesteps.wrkpn, qryworkerswithexpensivesteps.wrksurname, qryworkerswithexpensivesteps.wrkname, Sum(qryWorkersWithExpensiveSteps.stpPrice) AS TotalOfstpPrice FROM qryworkerswithexpensivesteps GROUP BY qryworkerswithexpensivesteps.wrkpn, qryworkerswithexpensivesteps.wrksurname, qryworkerswithexpensivesteps.wrkname PIVOT qryworkerswithexpensivesteps.opemachine; strana 8
4 Vytvářecí dotaz SELECT tbloperations.*, qryoperationsfinished.stppricetotal INTO tbloperationsfinished FROM qryoperationsfinished INNER JOIN tbloperations ON qryoperationsfinished.opeid = tbloperations.opeid; strana 9 Aktualizační dotaz Způsob zobrazení Druh dotazu Provedení dotazu Přidání zdroje Vlastnosti dotazu UPDATE tblsteps SET tblsteps.stpname = [New step name] WHERE (((tblsteps.stpname)=[previous step name])); strana 10 Přidávací dotaz INSERT INTO tbloperationsfinished ( stppricetotal ) SELECT tbloperations.*, qryoperationsfinished.stppricetotal FROM tbloperations INNER JOIN qryoperationsfinished ON tbloperations.opeid = qryoperationsfinished.opeid; strana 11
5 Odstraňovací dotaz DELETE tbloperations.opestop FROM tbloperations WHERE (((tbloperations.opestop) Is Not Null)); strana 12 Sjednocovací dotaz TABLE tbloperationsfinished UNION SELECT tbloperations.*, qryoperationsfinished.stppricetotal FROM tbloperations INNER JOIN qryoperationsfinished ON tbloperations.opeid = qryoperationsfinished.opeid ORDER BY opeworker; Způsob řazení strana 13 Definiční dotazy Vytvoření tabulky: CREATE TABLE NewTableName (Prijmeni TEXT (50) NOT NULL, Jmeno TEXT (50), Datum DATETIME, Pocet INTEGER CONSTRAINT JednoduchyKlic PRIMARY KEY, Noname TEXT); Vytvoření indexu (složeného): Vytvoření primárního klíče CREATE INDEX NewIndex ON NewTableName (Prijmeni ASC, Jmeno ASC, Plat DESC) WITH DISALLOW NULL; Určení způsobu řazení Změna definice tabulky (přidání položky): ALTER TABLE NewTableName ADD COLUMN Plat CURRENCY NOT NULL; Změna definice tabulky (přidání indexu): ALTER TABLE NewTableName ADD CONSTRAINT SlozenyKey UNIQUE (Prijmeni, Jmeno); Změna definice tabulky (zrušení položky): ALTER TABLE NewTableName DROP COLUMN Plat; Změna definice tabulky (zrušení indexu): ALTER TABLE NewTableName DROP CONSTRAINT SlozenyKey; Zrušení indexu: DROP INDEX NewIndex ON NewTableName; Zrušení tabulky: DROP TABLE NewTableName; strana 14
6 Průvodce tvorbou dotazů Křížový dotaz Hledání duplicit Hledání chybějících podřízených záznamů strana 15 Chybějící podřízené záznamy SELECT tbloperations.* FROM tbloperations LEFT JOIN tblsteps ON tbloperations.opeid = tblsteps.stpoperation WHERE (((tblsteps.stpid) Is Null)) ORDER BY tbloperations.opeworker; strana 16 Duplicitní záznamy strana 17
7... SELECT tblsteps.stpoperation, tblsteps.stpid, tblsteps.stpname, tblsteps.stpprice FROM tblsteps WHERE (((tblsteps.stpoperation) In (SELECT [stpoperation] FROM [tblsteps] As Tmp GROUP BY [stpoperation] HAVING Count(*)>1 ))) ORDER BY tblsteps.stpoperation; strana 18 Poddotazy Průměrná cena všech kroků (skalární hodnota) SELECT tblsteps.* FROM tblsteps WHERE (((tblsteps.stpprice)>(select Avg(stpPrice) as stppriceavg FROM tblsteps;))); strana 19 Propojení poddotazu SELECT tblsteps.* FROM tblsteps WHERE (((tblsteps.stpprice)> (SELECT Avg(stpPrice) as stppriceavg FROM tblsteps as Pom WHERE tblsteps.stpoperation=pom.stpoperation;))); Přejmenování zdroje v poddotazu Propojení s hlavním dotazem strana 20
Testování více hodnot Testování existence v seznamu (EXISTS, NOT EXISTS). Porovnání hodnoty se seznamem vrácených hodnot: IN - nachází se v seznamu, ANY - podmínka platí alespoň pro jednu hodnotu v seznamu, ALL - podmínka platí pro všechny hodnoty v seznamu. WHERE Adresy.DatumNarozeni IN (SELECT Adresy.DatumNarozeni FROM Adresy WHERE Adresy.Prijmeni= Novak ) vrátí všechny osoby, které se narodily stejný den jako některý z Nováků WHERE Adresy.DatumNarozeni <ANY (SELECT Adresy.DatumNarozeni FROM Adresy WHERE Adresy.Prijmeni= Novak ) vrátí všechny osoby, které se narodily dříve něž některý z Nováků WHERE Adresy.DatumNarozeni <ALL (SELECT Adresy.DatumNarozeni FROM Adresy WHERE Adresy.Prijmeni= Novak ) vrátí jen osoby, které se narodily dříve něž všichni Nováci strana 21 Dotaz jako součást výrazu SELECT tblsteps.*, [stpprice]/(select Sum(stpPrice) FROM tblsteps;) AS stpperc FROM tblsteps; Dotaz vrací skalární hodnotu (jeden záznam s jednou položkou) strana 22 Dotazovací jazyk SQL Structured Query Language neprocedurální jazyk 1984 - SEQUEL ANSI standard 1986 ISO standard 1987 rozšíření ISO 1989 ANSI standard 1992 (SQL92) jazyk pro definici dat interaktivní jazyk pro manipulaci s daty jazyk pro manipulaci s daty v hostitelské verzi možnost definice pohledů (virtuální tabulka) možnost definice přístupových práv možnost definice integritních omezení jazyk modulů řízení transakcí DDL (Data Definition Language), DML (Data Manipulation Language), DCL (Data Control Language) strana 23 8
9 Datové typy SQL Typ dat: Popis: SMALLINT Celá čísla v délce až šesti číslic (včetně znaménka). Rozpětí povolených hodnot je od -32,768 do 32,767. Velikost: 2 Byte. INTEGER Celá čísla v délce až 11 číslic (včetně znaménka). Rozpětí povolených hodnot je interval od - 2,147,483,648 až do 2,147,483,647. Velikost: 4 Byte. DECIMAL(x,y) Čísla s pevnou řádovou čárkou se znaménkem celkem s x číslicemi a y desetinnými místy, x je implicitně 30 a y se implicitně rovná 6. Velikost: proměnná. NUMERIC(x,y) Obdobně jako DECIMAL(x,y). Velikost: proměnná. FLOAT(x) Čísla v pohyblivé řádové čárce. Rozpětí čísel sahá od 2.22507385850720160*10-308 až k 1.79769313486231560*10 +308. Velikost: 8 Byte. CHAR(n) Znakové řetězce v délce n znaků. Povolené rozpětí pro n je interval od 1 do 32767. Bez určení n je (CHARAKTER (n)) implicitně rovno 1. Velikost : n znaků. VARCHAR(n) Umožňuje používat řetězců proměnné délky. Dovoluje ukládat řetězce různé délky v jednotlivých (VARYING řádcích. Stanovuje se horní maximálně možná délka řetězce. Jinak podobně jako u CHAR(n). Velikost: n CHARAKTER) znaků. LONG VARCHAR Řetězec libovolného počtu znaků. Maximální velikost je omezena maximálně dovolenou velikostí databázového souboru. DATE Datum ve formátu dle nastavení: yyyy/mm/dd. Velikost: 4 Byte. TIMESTAMP Stejně jako datum plus hodina, minuta, vteřina a zlomek vteřiny (na 6 míst): yyyy/mm/dd hh-mmss.ffffff. Velikost: 8 Byte. TIME Časový okamžik dne. Ve formátu hodina/minuta/vteřina. Velikost: 4 Byte. DOUBLE Obdobně jako FLOAT. Velikost: 8 Byte. REAL Reálná čísla s vědeckotechnickým formátem. Rozpětí čísel sahá od 1.175494351*10-38 až do 3.402823466*10 38. Velikost: 4 Byte. BINARY(n) Binární data celkové délky n Byte. Implicitně je size = 1 Byte. Max. délka je 32767 Byte. Velikost: n Byte. LONG BINARY Binární datový typ libovolné délky. Omezení jako u LONG VARCHAR. strana 24 Příkazy SQL Příkazy pro definici datových struktur (DDL) Klauzule CREATE DATABASE Klauzule CREATE TABLE Klauzule DROP TABLE Klauzule ALTER TABLE Klauzule CREATE VIEW Klauzule DROP VIEW Klauzule ALTER DOMAIN Klauzule DROP DOMAIN Příkazy pro získávání dat Klauzule SELECT a FROM Příkaz DECLARE CURSOR Příkaz OPEN Příkaz FETCH Příkaz CLOSE Příkazy pro manipulaci s daty (DML) Klauzule INSERT Klauzule DELETE Klauzule UPDATE Příkazy pro kontrolu přístupu dat (DCL) Klauzule GRANT Klauzule REVOKE Klauzule CONNECT Příkazy pro řízení transakcí Klauzule COMMIT Klauzule ROLLBACK Příkazy pro specifikaci nastavení Klauzule SET NAMES Klauzule SET TRANSACTION strana 25 http://www.fs.vsb.cz/books/sqlreference/index.htm strana 26