SlideShare a Scribd company logo
1 of 72
Download to read offline
SQL
#15
16. 5. 2017
Prague Data Management Meetup
Agenda
• Prague Data Management Meetup
• SQL
Prague Data Management Meetup
Data Management
Získávaní dat
Ukládání dat
Zpracování dat
Interpretace dat
Použití dat
• Otevřená profesionální zájmová
skupina
• Každý je vítán (ať už v pasivní
nebo aktivní roli)
• Témat není nikdy dost
• Snaha o pravidelné měsíční
setkávání
• Setkávání od září 2015
Historie
# Datum Téma
1 10. 9. 2015 Data Management
2 14. 10. 2015 Data Lake
3 23. 11. 2015 Dark Data (without Dark Energy and Dark Force)
4 12. 1. 2016 Data Lake (znova)
5 7. 3. 2016 Sad Stories About DW Modeling (sad stories only)
6 23. 3. 2016 Self-service BI Street Battle
7 27. 4. 2016 Let's explore the new Microsoft PowerBI!
8 22. 9. 2016 Data Management pro začátečníky
# Datum Téma
9 17. 10. 2016 Small Big Data
10 22. 11. 2016 Základy modelování DW
11 23.1.2017 Komponenty datových skladů
12 28.2.2017 Operational Data Store
13 28.3.2017 Metadata v DW/BI
14 25.4.2017 Jak se stát DW/BI konzultantem
15 16.5.2017 SQL
16 29.5.2017 From IoT to AI: Applications of time series data
with Rudradeb Mitra
Data Management
SQL
Základy
SQL je mocné 4GL
Jazyk pro práci
s množinami
Jazyk pro
dotazování
Jazyk pro
definici
struktur
Jazyk pro
manipulaci s
daty
Jazyk pro
řízení
zpracování
Jazyk pro
řízení přístupů
k datům
Jazyk relační
databázi
Jazyk query
enginů
Jazyk s
procedurální
nadstavbou
Jazyk
integrovatelný
do 3GL
Relační algebra = Teoretický základ SQL
• Množinové operátory
• Rozdíl => minus
• Sjednocení => union
• Průnik => intersect
• Symetrická diference
• Projekce
• Výběr sloupců z tabulky
• Selekce
• Where
• Výběr řádků z tabulek
• Přejmenování => alias
• Agregace
• Dělení
• Spojení
• Cross join
• Kartézký produkt
• Natural Join
• Stejné názvy sloupců
• Thetajoin Equijoin
• Inner join
• Semijoin
• Antijoin
• Outer join
• Right Outer Join
• Full outer join
Structured Query Language (SQL)
• Otevřený programovací jazyk 4. generace
(další jsou např. QBE, JQuery ….)
• Silný teoretický základ – relační algebra
• Množinová orientace
• Silný deklarativní vývoj
• Až na výjimky při práci s texy není nutné
rozlišovat malá a velká písmena
• Jazyk pro práci s daty v relačních
databázích
• Čtení dat
• Zapisování dat
• Procedurální úlohy
• Ostatní úlohy
• Původní název SEQUEL
• Hawker Siddley trademark -> vynucená
změna názvu
• Standard ISO/IEC 9075
• Řada standardů (ANSI/ISO/IEC) a
„lokálních“ dialektů
• IBM DB2, Oracle DB, MySQL, MS SQL,
PostgreSQL…
• Historické milníky
• 1974 - vznik v laboratořích IBM
• 1979 - 1. komerční implementace Oracle V2
• 1986 – 1. standardizace (SQL-86)
• 1999 – dokončení nejdůležitějších částí SQL
(SQL:1999)
• 2011 – poslední rozšíření a standardizace
(SQL:2011)
SQL Dialects
SQL Dialect Common name Full name
ANSI/ISO Standard SQL/PSM SQL/Persistent Stored Modules
Interbase / Firebird PSQL Procedural SQL
IBM DB2 SQL PL SQL Procedural Language (implements SQL/PSM)
IBM Informix SPL Stored Procedural Language
IBM Netezza NZPLSQL [2] (based on Postgres PL/pgSQL)
Microsoft / Sybase T-SQL Transact-SQL
Mimer SQL SQL/PSM SQL/Persistent Stored Module (implements SQL/PSM)
MySQL SQL/PSM SQL/Persistent Stored Module (implements SQL/PSM)
MonetDB SQL/PSM SQL/Persistent Stored Module (implements SQL/PSM)
NuoDB SSP Starkey Stored Procedures
Oracle PL/SQL Procedural Language/SQL (based on Ada)
PostgreSQL PL/pgSQL Procedural Language/PostgreSQL Structured Query Language (implements SQL/PSM)
Sybase Watcom-SQL SQL Anywhere Watcom-SQL Dialect
Teradata SPL Stored Procedural Language
SAP SAP HANA SQL Script
SQL standardy vs. verze Oracle DB
ANSI SQL-
86
ANSI SQL-
89
ANSI SQL-
92
ANSI
SQL:1999
ANSI
SQL:2003
ANSI
SQL:2006
ANSI
SQL:2008
ANSI
SQL:2011
ANSI
SQL:2016
…
Oracle DB
10.1
Oracle DB
10.2
Oracle DB
11.1
Oracle DB
11.2
Oracle DB
12.1
SQL, databáze a tabulky
• SQL = jazyk pro práci s (nejen) relačními databázemi
• Relační databáze = databáze využívající relační uložení dat (relační algebra)
• Relační databáze = sada relačních tabulek
• Relační tabulka = skupina řádku (rows) s jasně definovanou strukturou
sloupců (columns)
A B C D E F G
1
2
3
4
5
6
7
DATABASE
TABLES
columns
rows
Instance Party
INST_PT
Unified Party
UNI_PT
Instance Address
INST_ADDR
Product Instance
PROD_INST
Product Instance Party Role
PROD_INST_PT_ROLE
Product Instance Fact
PROD_INST_FACT
Business Product Type
BUS_PROD_TP
Big Table
BIG_TABLE
Business Product Class
BUS_PROD_CLASS
Party Type
PT_TP
Instance Party History
INST_PT_H
Party Role Type
PT_ROLE_TP
Demo model
Product Instance History
PROD_INST_H
UNI_PT_KEY
PT_TP_KEY
BUS_PROD_CLASS_KEYPROD_INST_KEY
INST_PT_KEY
INST_PT_KEY
PROD_INST_KEY
PROD_INST_KEY
PT_ROLE_TP_KEY
BUS_PROD_TP_KEY
INST_PT_KEY
Instance Party
INST_PT
Product Instance
PROD_INST
Product Instance Party Role
PROD_INST_PT_ROLE
Party Type
PT_TP
Relational Data Model vs. SQL
Select *
from
INST_PT
inner join PT_TP on PT_TP.PT_TP_KEY =
INST_PT.PT_TP_KEY
inner join PROD_INST_PT_ROLE on
PROD_INST_PT_ROLE.INST_PT_KEY = INST_PT.INST_PT_KEY
inner join PROD_INST on
PROD_INST_PT_ROLE.PROD_INST_KEY =
PROD_INST.PROD_INST_KEY
PT_TP_KEY
PROD_INST_KEY
INST_PT_KEY
SQL
DDL DML DCL TCL
21
SQL Structure
Data Definition Language (DDL). DDL statements create, modify, and remove database objects such as tables,
indexes, and users. Common DDL statements are:
• CREATE
• ALTER
• DROP
Data Manipulation Language (DML). DML is used to manipulate data within a table. Common DML statements
are:
• SELECT
• INSERT
• UPDATE
• DELETE
• MERGE
Data Control Language (DCL). DCL is used to control access to data stored in a database.
• GRANT
• REVOKE
SQL Structure
Transaction Control Statements (TCL)
• COMMIT
• ROLLBACK
• SAVEPOINT
• SET TRANSACTION
Session Control Statements (SCS)
• ALTER SESSION
• ALTER SYSTEM KILL SESSION ‘12’
Embedded SQL Statements
• DECLARE CURSOR
• OPEN
• CLOSE
• FETCH
• EXECUTE IMMEDIATE…
DDL - Data Definition Language
• to create objects in the databaseCREATE
• alters the structure of the databaseALTER
• delete objects from the databaseDROP
• remove all records from a table, including all spaces allocated for
the records are removed
TRUNCATE
• add comments to the data dictionaryCOMMENT
• rename an objectRENAME
Autocommit!
DML – Data Manipulation Language
• retrieve data from the a databaseSELECT
• insert data into a tableINSERT
• updates existing data within a tableUPDATE
• deletes all records from a table, the space for the records remainDELETE
• UPSERT operation (insert or update)MERGE
• call a PL/SQL or Java subprogramCALL/EXEC
• explain access path to the dataEXPLAIN PLAN
• controls concurrencyLOCK TABLE
No autocommit!
DCL - Data Control Language
• gives user's access privileges to databaseGRANT
• withdraw access privileges given with the
GRANT commandREVOKE
TCL - Transaction Control
• save work doneCOMMIT
• identify a point in a transaction to which you can later roll
backSAVEPOINT
• undo the modification made since the last COMMITROLLBACK
• Change transaction options like isolation level and what
rollback segment to useSET TRANSACTION
• set the current active rolesSET ROLE
Transaction Control prakticky
SET
TRANSACTION
NAME 'Update
INST_PT';
UPDATE
INST_PT SET
RC_NUM =
‘XIN’ WHERE
RC_NUM =
‘XER’ ;
SAVEPOINT
before_update;
UPDATE
INST_PT
SET RC_NUM =
‘XER’
WHERE
RC_NUM =
‘XIN’
ROLLBACK TO
SAVEPOINT
before_update;
UPDATE
INST_PT
SET RC_NUM =
‘XNA’
WHERE
RC_NUM =
‘XER’ ;
COMMIT
COMMENT
'Updated
INST_PT';
Oracle SQL Vision
• The Language of Relational Databases
• Productive
• Simple syntax: SELECT, INSERT, UPDATE, DELETE, DROP, ALTER, GRANT
• Set based language – don’t write code to iterate
• Easy to relate sets of data using joins
• Separation of logical and physical
• Data independence – don’t code physical references
• Optimizers – don’t specify access methods because we can do it better
• Capabilities
• Transaction isolation and control
• Row level locking and concurrency
• Multi version read consistency
• Referential integrity
• Stored procedures (PL/SQL) and triggers
Plná syntaxe SELECT pro Oracle DB
Vybrané zjednodušené syntaxe selectu
• Všechny sloupce z tabulky / view
• Select *
from
<tabulka>
• Vybrané sloupce z tabulky / view
• Select <seznam sloupců/výrazů>
from
<tabulka>
• Všechny sloupce ze skupiny tabulek / view
• Select *
from
<tabulka 1 propojení tabulka 2 propojení …>
• Vybrané sloupce ze skupiny tabulek / view
• Select <seznam sloupců/výrazů z tabulky 1, sloupců z tabulky 2>
from
<tabulka 1 propojení tabulka 2 propojení …>
• Všechny sloupce z tabulky / view pouze s řádky splňující
podmínky
• Select *
from
<tabulka>
where
<podmínky>
• Vybrané agregované sloupce z tabulky / view
• Select
<seznam sloupců/výrazů a agregačních funkcí>
from
<tabulka>
group by <seznam sloupců/výrazů>
• Všechny sloupce z tabulky / view v pořadí dle seznamu
sloupců
• select *
from
<tabulka/view>
order by
<seznam sloupců/výrazů>
• Select všech sloupců ze selectu s podmínkou
• Select *
from
(
select … from …
)
where
<podmínky>
Tabulka DUAL
• Speciální jednořádková a jednosloupcová tabulka
• Sloupec DUMMY varchar2(1) s hodnotou X
• Vždy existuje
• Příklady využití dualu:
Select * from dual;
Select sysdate from dual;
Select systimestamp from dual;
Select user from dual;
Select rownum from dual
connect by level < 4;
Select rownum from dual connect by
level < 4;
Select 1 from dual
union
select 2 dual
union
select 3 from dual;
select * from
(Select 1 from dual
Group by cube (1,1))
where rownum <= 3;
Alternativně
Select 1
Komentáře
• Řádkový komentář „-- komentář“
• Select *
-- komentář
from dual -- tabulka dual
• Blokový komentář „/* komentář */“
• Select * /* komentář
komentář
komentář */ from
dual
• Hinty se píší podobně „/*+ */“, funkce zcela jiná!
• Select /*+ FIRST_ROWS(5) */ *
from dual
Aliasy
• V SQL lze dočasně pojmenovávat tabulky, sloupce, výrazy i selecty
• Ve většině případů aliasy pouze zlepšují čitelnost
• V některých případech aliasy zajišťuji syntaktickou správnost a proveditelnost dotazu (upřesňují zdroje)
• Příklady:
• Alias tabulky
Select * from PROD_INST SRC;
• Alias sloupce
Select DESCR POPIS, DESCR "Popis"
from PT_ROLE_TP;
• Alias výrazu
Select 1+3 AS ROVNA_SE from dual;
• Alias selectu
Select SRC.DESCR
from (select PT_TP.DESCR from PT_TP) SRC;
Projekce
• Projekce zajišťuje výběr sloupce nebo výrazu z tabulky, view, skupiny
tabulek, selectu
• U projekcí z více tabulek je nutno důsledně uvádět zdroje
• Příklady
• Select PT_TP_KEY,
SRC_ID,
DESCR
from PT_TP;
• Select PT_TP.PT_TP_KEY,
PT_TP.SRC_ID,
PT_TP.DESCR
from PT_TP;
Podmínky
• SQL podmínky umožňují filtrovat data dle stanovených kritérií jako jsou rovnosti, nerovnosti nebo třeba i
podobnosti
• SQL podmínkách lze využívat SQL funkce, matematické a logické operátory
• V selectu lze podmínky zapsat
• Obecně za klausuly WHERE
• Při použití agregačních funkcí (GROUP BY) za klauzuly HAVING
• Do podmínek pro spojení (join) tabulek
• Příklady:
•Select PT_TP_KEY, ID, SRC_ID, DESCR
from PT_TP
where SRC_ID = 'FO';
•Select * from PT_TP
where 1+1 = 2
and trunc(sysdate) = trunc(sysdate);
Pokročilé řízení podmínek
• Někdy nutno zajistit řízení postupného vyhodnocování celé hierarchie podmínek v jednom výrazu
• Obdoba konstrukce „If then else “
•CASE
WHEN výraz1 THEN výsledek1
WHEN výraz2THEN výsledek2
…
ELSE výsledek3
END
Case
•CASE výraz
WHEN hodnota1 THEN výsledek1
WHEN hodnota 2 THEN výsledek2
…
ELSE výsledek3
END
Case
• DECODE(výraz,hodnota1,výsledek1,hodnota2, výsledek2,…,
výsledek3)Decode
NULL v SQL
NULL • je nic, ale není to nula
NULL v Oraclu
• není roven ničemu
• ani sám sobě
Vždy FALSE: • NULL = NULL
Pokud se zjišťuje
rovnost nullů
• NULL IS NULL
• column IS NULL (negace IS NOT NULL)
Lze ho dělit nulou! • select null / 0 from dual vrací null
Výjimka je SQL
funkce DECODE
• null s rovná se funguje
• DECODE(A,NULL,’PRAVDA’,’NEPRAVDA’)
Platí primárně pro Oracle DB, v jiných DB může být popsané chování jiné
Příklady:
Select * from INST_PT where RC_NUM is null;
Select * from INST_PT where RC_NUM is not null;
NVL
• Základní SQL funkce k eliminaci null (existují i další složitější)
• Syntaxe
• NVL(<sloupec nebo výraz>, <náhradní hodnota>);
• Příklady:
Select RC_NUM, ICO_NUM,
NVL( RC_NUM,ICO_NUM)
AS ID,
NVL(RC_NUM,'NONE ' ‚)
AS RC_NUM2
from INST_PT;
41
• Zástupné znaky umožňují jednoduché podobnostní prohledávání
textových řetězců pomocí operátoru LIKE
Zástupné znaky (wildcards)
• SELECT *
FROM inst_pt
WHERE family_name LIKE 'Nov_k';
Jeden znak
• SELECT *
FROM inst_pt
WHERE family_name LIKE 'N%k';
Více znaků
• SELECT *
FROM inst_pt
WHERE family_name LIKE '_o%k';
Kombinace jednoho
a více znaků
• SELECT *
FROM inst_pt
WHERE family_name LIKE '%o%';
Komplexní
prohledávání
• SELECT *
FROM inst_pt
WHERE family_name LIKE '%o_v%' escape '' ;
Escapování
zástupných znaků
Operátory pro tvorby podmínek a výrazů
Aritmetické operace +
-
/
*
Spojování textových
řetězců
||
Příklady:
Select 158/6 from dual;
Select 3*8 from dual;
Select 'A' || 'B' from dual;
Operátory pro tvorby podmínek a výrazů
Porovnání
> , >=
=<. <
=
ANY/SOME „ve výčtu – ANSI“
IN/NOT IN „ve výčtu - Oracle“
BETWEEN/NOT BETWEEN „mezi“
LIKE/NOT LIKE
EXISTS „ve výčtu“
IS (NOT) NULL
Logické
operátory
NOT „negace“
AND
OR
Příklady:
Select * from INST_PT where INST_PT_KEY >= 3 or INST_PT_KEY in (-1,-2);
Select * from INST_PT where INST_PT_KEY between 1 and 5;
Pořadí vyhodnocování operátorů
Unární operátory + -
PRIOR operator
* / [aritmetické operátory]
Binární operátory + - , || [spojení textů]
Porovnání
NOT
Distinct
• Tento sloupcový operátor zajistí deduplikaci řádků pro uvedenou kombinaci sloupců
• Dvě možná klíčová slova:
• DISTINCT – Oracle
• UNIQUE - ANSI
• Syntaxe
• SELECT DISTINCT <seznam sloupců>
FROM <tabulka>;
• SELECT UNIQUE <seznam sloupců>
FROM <tabulka>;
• Příklad
• Select distinct RC_NUM, FAMILY_NAME, FIRST_NAME from INST_PT;
• Poznámka
• K deduplikaci musí DB udělat třídění – potenciálně velmi náročná operace
Subdotazy
• Pro select lze použít i jiný select jako podmínku
• Základní klíčová slova
• IN / NOT IN
• EXISTS / NOT EXISTS
• SOME / NOT SOME
• ANY / NOT ANY
• Ekvivalentní příklady:
• Select * from INST_PT where INST_PT_KEY in
(select INST_PT_KEY from PROD_INST_PT_ROLE);
• SELECT inst_pt_key FROM inst_pt
• WHERE EXISTS
• (SELECT 1 FROM PROD_INST_PT_ROLE
• WHERE inst_pt.inst_pt_key =prod_inst_pt_role.inst_pt_key);
50
Subdotazy
• In / Exists / Any / Some jsou zaměnitelné
• IN je z Oracle SQL
• EXISTS z ANSI
• NOT IN a NOT EXISTS se liší => NOT IN je null sensitive
• Data vrátí:
• SELECT inst_pt_key
• FROM inst_pt
• WHERE inst_pt_key NOT IN (1, 2);
• Data nevrátí
• SELECT inst_pt_key
• FROM inst_pt
• WHERE inst_pt_key NOT IN (1, 2, NULL);
• Srovnání NOT IN a NOT EXISTS:
• SELECT inst_pt_key FROM inst_pt WHERE NOT EXISTS (select 1 from INST_PT FILTER where FILTER.RC_NUM =
INST_PT.ICO_NUM);
• Vrátí nějaké řádky
• select inst_pt_key from inst_pt WHERE ICO_NUM not in (select RC_NUM from INST_PT where RC_NUM is not null);
• Nic nevrátí
Funkce
• Funkce jsou vestavěné předpisy pro transformaci vstupních dat
• Typy funkcí:
• Skalární - pro jeden řádek vrací jednu hodnotu
• substr - vyberte část řetězce z celého řetězce
• to_date - převede řetězec na datum
• round - zaokrouhlí číslo
• Skupinové – pro více řádků vrací jednu hodnotu
• max - vybere maximální hodnotu ze skupiny
• avg - vybere průměrnou hodnotu ze skupiny
• Funkce lze používat pro
• Definování výrazů sloužící jako výstupní sloupce ze selectu
• Definování filtrovacích podmínek ve where
• Definovaní joinů mezi tabulkami
Vybrané skalární funkce
• sysdate - vypíše aktuální datum a čas
• Select sysdate from dual;
• to_date – převede řetězec na datum
• Select to_date ('10.2.2015', 'DD.MM.YYYY') from dual;
• to_char – převede hodnotu na řetězec
• Select to_char(sysdate, 'YYYYMM') from dual;
• to_number – převede řetězec na číslo (pozor na vliv NLS)
• Select to_number('0001,1') from dual;
• round - zaokrouhlí číslo
• Select round(2.2548494,1) from dual;
• cast – převede vstupní hodnotu na zvolený datový typ
• Select cast (sysdate as timestamp) from dual;
• trunc - ořízne vstupní hodnotu
• Select trunc (sysdate, 'YYYY') from dual;
• Select trunc(10/3) from dual;
Vybrané skalární funkce
• substr - vybere část řetězce
• Select substr('abcdef',3,2) from dual;
• Instr - prohledá řetězec a najde počátek subřetězce
• Select instr('abcdef', 'c') from dual;
• trim - ořízne vstupní řetězec o mezery na konci a začátku
• Select trim(' 458A ') from dual;
• lpad - doplní řetězec o úvodní znaky
• Select lpad('abcdef',10,'x') from dual;
• replace - nahradí textový řetězec jiným řetězcem
• Select replace('abcdef', 'de', 'yz') from dual;
• months_between – vypočítá rozdíl mezi dvěma datumy
• Select months_between(sysdate, date '2010-5-15') from dual;
• last_day - datum převede na poslední datum v měsíci
• Select last_day(sysdate) from dual;
Vybrané skupinové funkce
• Avg - vypočítá ze skupiny průměr
• Min - vypočítá ze skupiny minimum
• Max - vypočítá ze skupiny maximum
• Median - vypočítá ze skupiny medián
• Count - vypočítá ze skupiny počet řádků
• Sum - vypočítá ze skupiny sumu
SELECT avg(num_val) avg ,
median(num_val) med,
min(date_val) min,
max(date_val) max,
count(*) cnt,
sum(num _val) sum
FROM big_table;
Množinové operátory
• Spojení dvou množin řádků
• Defaultně deduplikace zdvojených řádků
• ALL => vypnutí deduplikace
UNION [ALL]
Průnik dvou množin řádků
Defaultně deduplikace zdvojených řádkůINTERSECT
• Výběr řádků, které jsou pouze v první množině, ale nejsou ve
druhéMINUS
Poznámka: ORDER BY lze použít za posledním
Graphical Depiction of Matching Values
OfferNo CourseNo
1234 IS320
4321 IS320
Offering
StdNo OfferNo
123-45-6789 1234
234-56-7890 1234
123-45-6789 4321
124-56-7890 4321
Enrollment
StdNo StdLastName
123-45-6789 WELLS
124-56-7890 KENDALL
234-56-7890 NORBERT
Student
Join = spojení více tabulek do jedné
INNER JOIN
• obě strany
povinné
LEFT OUTER
JOIN
• jedna strana
nepovinná
RIGHT
OUTER JOIN
• jedna strana
nepovinná
FULL OUTER
JOIN
• obě strany
nepovinné
CROSS JOIN
• kartézský
součin
NATURAL
JOIN
• typ inner
joinu
• Syntaxe
• ANSI JOIN
• ORACLE JOIN
Inner join / join
Table_1 Table_2
select *
from Table_1 inner join Table_2 on Table_1.Column_1 =
Table_2.Column_2;
select *
from Table_1 join Table_2 on Table_1.Column_1 =
Table_2.Column_2;
select *
from Table_1, Table_2 where Table_1.Column_1 = Table_2.Column_2;
Left outer join / left join
Table_1 Table_2
select *
from Table_1 left outer join Table_2 on Table_1.Column_1 =
Table_2.Column_2;
select *
from Table_1 left join Table_2 on Table_1.Column_1 =
Table_2.Column_2;
select *
from Table_1, Table_2 where Table_1.Column_1 = Table_2.Column_2
(+);
Right outer join / right join
Table_2Table_1
select *
from Table_1 right outer join Table_2 on Table_1.Column_1 =
Table_2.Column_2;
select *
from Table_1 right join Table_2 on Table_1.Column_1 =
Table_2.Column_2;
select *
from Table_1, Table_2 where Table_1.Column_1 (+) =
Table_2.Column_2;
Full outer join / full join
Table_1 Table_2
select *
from Table_1 full outer join Table_2 on Table_1.Column_1 =
Table_2.Column_2;
select *
from Table_1 full join Table_2 on Table_1.Column_1 =
Table_2.Column_2;
Nelze přímo, nutno řešit jako union mezi left a right joinem
A
B
C
Cross join
A
B
C
select *
from Table_1 cross join Table_2;;
select *
from Table_1, Table_2;
Občas záměrné,
občas potenciální chyba…
Self inner join
Table_1 Table_1
select *
from Table_1 Alias_1inner join Table_1 Alias_2 on
Alias_1.Column_1 = Alias_2.Column_2;
select *
from Table_1 Alias_1, Table_1 Alias_2where
Alias_1.Column_1 = Alias_2.Column_2;
Natural join
Table_1 Table_2
select *
from Table_1
natural join Table_2;
Specifický inner join
Spojení dle všech stejně
pojmenovaných sloupců
bez ohledu na obsah
Použítí using v joinech
• Zjednodušení joinování při stejných názvech sloupců v tabulkách
• Omezení v použití sloupce
• Nelze použít univerzálně *
• Sloupec z usingu je ve výstupu pouze jednou
• Syntaxe
SELECT <joinovací sloupce>, <ostatní sloupce>
FROM <table_1> <zvolený typ joinu> <table_2> USING
(<joinovací sloupce oddělené čárkou>);
Semijoin
• Souvztažné selecty = výsledek jednoho joinu řídí výsledek druhého
• Lze použít:
• EXISTS
• IN
• Běžný JOIN v kombinaci s řízenou deduplikací
Select *
from INST_PT
where (INST_PT_KEY,SRC_SYS_ID) in
(select INST_PT_KEY, SRC_SYS_ID
from PROD_INST_PT_ROLE)
Select *
from INST_PT
where EXISTS (
Select 1
from PROD_INST_PT_ROLE
where
PROD_INST_PT_ROLE.INST_PT_KEY =
INST_PT.INST_PT_KEY
and PROD_INST_PT_ROLE.SRC_SYS_ID =
INST_PT.SRC_SYS_ID
)
Antijoin
SELECT inst_pt.inst_pt_key FROM
inst_pt , prod_inst_pt_role WHERE
inst_pt.inst_pt_key =
prod_inst_pt_role.inst_pt_key (+)
AND prod_inst_pt_role.prod_inst_key
IS NULL;
SELECT inst_pt_key FROM inst_pt
WHERE inst_pt_key NOT IN (SELECT
inst_pt_key FROM prod_inst_pt_role);
SELECT inst_pt_key
FROM inst_pt
WHERE NOT EXISTS ( SELECT 1 FROM
prod_inst_pt_role
WHERE
prod_inst_pt_role.inst_pt_key =
inst_pt.inst_pt_key);
SELECT inst_pt.inst_pt_key
FROM inst_pt
LEFT OUTER JOIN prod_inst_pt_role
ON
inst_pt.inst_pt_key =
prod_inst_pt_role.inst_pt_key WHERE
prod_inst_pt_role.prod_inst_key IS
NULL;
Pozor na null v NOT IN!!!! (nevrátí se pak nic)
Full outer join vs. minus
• Select INST_PT_KEY
from INST_PT
minus
Select INST_PT_KEY
from PROD_INST_PT_ROLE;
• Select INST_PT.INST_PT_KEY, PROD_INST_PT_ROLE.PROD_INST_KEY
from INST_PT
full outer join PROD_INST_PT_ROLE
on INST_PT.INST_PT_KEY = PROD_INST_PT_ROLE.INST_PT_KEY
where PROD_INST_PT_ROLE.INST_PT_KEY is null ;
• Výkon většinou srovnatelný
• Dostupnost všech klíčů u full outer joinu narozdíl od minusu
• Minus lze vnitřně provést jako minus nebo jako většinou rychlejší antijoin
• 11g defaultně vypnutý v důsledku chyby v hashovaní
Group by
GROUP BY
GROUP BY
CUBE
GROUP BY
HAVING
GROUP BY
ROLLUP
GROUP BY
GROUPING
SET
Funkce pro „zlepšení popis“ výstupu
GROUPING GROUPING_ID GROUP_ID
SELECT <column_name>, <aggregating_operation>
FROM <table_name>
GROUP BY <column_name>
HAVING <aggregating_op_result> <condition> <value>;
• Group by a jeho varianty umožňují agregovat
skupiny řádků do jednoho výsledného
• S group by lze použít agregační funkce
• Having funguje velmi podobně jako where
Agregační funkce
• PrůměrAVG()
• Počet unikátních prvkůCOUNT(DISTINCT)
• PočetCOUNT()
• MaximumMAX()
• MinimumMIN()
• SumaSUM()
• Standardní odchylkaSTD()
• RozptylVARIANCE()
Příklad agregace pomocí group by
77
ID GRP AMT
1 A 2
2 A 4
3 A 4
4 B 8
DUMMY_TAB
GRP Max(AMT) Min(AMT) Avg(AMT) Sum(AMT) Count(*)
A 4 2 3,33333 10 3
B 8 8 8 8 1
Select
GRP,
max(AMT),
min(AMT),
avg(AMT),
sum(AMT),
count(*)
From
DUMMY_TAB
Group by GRP
Příklad agregace pomocí group by having
78
ID GRP AMT
1 A 2
2 A 4
3 A 4
4 B 8
DUMMY_TAB
GRP Max(AMT) Min(AMT) Avg(AMT) Sum(AMT) Count(*)
A 4 2 3,33333 10 3
Select
GRP,
max(AMT),
min(AMT),
avg(AMT),
sum(AMT),
count(*)
From
DUMMY_TAB
Group by GRP
Having count(*) > 1
Order by
Order umožňuje určit pořadí v jakém jsou záznamy na
výstupu ze selectu
ASC
Vzestupné třídění
ASC je default.
DESC
Sestupné třídění.
NULLS FIRST
Nully jsou uvedené
jako první až poté
následují setříděná
data
NULLS LAST
Nully jsou uvedené
jako poslední po
setříděných datech
Pořadí exekuce jednotlivých částí selectu
JOIN &
WHERE
GROUP BY
& HAVING
ANALYTIC
FUNCTION
ORDER BY
Analytické funkce
Funkce v SQL dotazu umožňující zohlednit
ostatní řádky výsledkové sady
•Vyšší efektivita dotazu
•Větší čitelnost řešení
SQL> select
A
from testRM;
A
----------
1
2
3
4
5
6
6
SQL> select
sum(A)
from testRM;
SUM(A)
----------
33
SQL> select
A,sum(A)over(order by A)
from testRM;
A SUM(A)OVER(ORDERBYA)
---------- --------------------
1 1
2 3
3 6
4 10
5 15
6 27
6 33
Agregační
funkce
Analytická funkce pro
kumulativní součet
bez logické partition
Obecná syntaxe analytických funkcí
Analytické funkce - příklad
Najít datumy konce platnosti záznamů v SCD2
SQL> desc TAB_A
Název Typ
------------ -------------
REC_KEY NUMBER
REC_ID VARCHAR2(30)
REC_DESC VARCHAR2(400)
DT_FROM DATE
DT_TO DATE
SQL> select * from TAB_A;
REC_KEY REC_ID REC_DESC DT_FROM DT_TO
---------- ----- ------------------------------ -------- --------
1 AAA Prodejna AAA 21.11.05
2 AAA Prodejna Petřiny 28.11.05
3 AAA Prodejna Petřiny, Dusíkova 05.12.05
4 BBB Prodejna BBB 22.11.05
5 BBB Prodejna Dejvická 05.12.05
SQL> select rec_key, rec_id,rec_desc,dt_from,
lead(dt_from-1)over(partition by rec_id order by dt_from)
from TAB_A;
REC_KEY REC_ID REC_DESC DT_FROM LEAD(DT_
---------- ----- ------------------------------ -------- --------
1 AAA Prodejna AAA 21.11.05 27.11.05
2 AAA Prodejna Petřiny 28.11.05 04.12.05
3 AAA Prodejna Petřiny, Dusíkova 05.12.05
4 BBB Prodejna BBB 22.11.05 04.12.05
5 BBB Prodejna Dejvická 05.12.05
Analytické funkce
AVG, MIN, MAX, COUNT,
SUM
LAG, LEAD
FIRST_VALUE,
LAST_VALUE
ROW_NUMBER
RANK, DENSE_RANK,
PERCENT_RANK
NTILE, CUME_DIST,
RATIO_TO_REPORT
CORR COVAR_POP
VARIANCE, VAR_POP,
VAR_SAMP
STTDEV, STTDEV_POP,
STDDEV_SAMP
REGR_COUNT, REGR_P2,
REGR_AVGX, REGR_AVGY,
REGR_SXX, REGR_SXY,
REGR_SYY, REGR_SLOPE,
REGR_INTERCEPT
LIST_AGG, NTH
Row Limiting
• Od 12c lze omezovat výstup z selectu pouze na první řadky bez nutnosti aplikaci analytických
funkcí nebo rownum
• Prvních pět řádků:
• SELECT employee_id, last_name FROM employees ORDER BY employee_id FETCH FIRST 5 ROWS ONLY;
• Šestý až desátý řádek:
• SELECT employee_id, last_name FROM employees ORDER BY employee_id OFFSET 5 ROWS FETCH NEXT 5 ROWS
ONLY;
• Prvních 5% řádků:
• SELECT employee_id, last_name, salary FROM employees ORDER BY salary FETCH FIRST 5 PERCENT ROWS ONLY;
• Prvních 5% řádků plus všechny ty, které mají stejnou hodnotu salary jako poslední řádek z původní
množiny
• SELECT employee_id, last_name, salary FROM employees ORDER BY salary FETCH FIRST 5 PERCENT ROWS WITH
TIES;
89
Regulární výrazy
• POSIX
• REGEXP_LIKE
• REGEXP_SUBSTR
• REGEXP_REPLACE
• REGEXP_COUNT
• SELECT REGEXP_SUBSTR('One|Two|Three|Four|Five','[^|]+', 1,3) FROM dual;
• select REGEXP_SUBSTR('One|Two|Three|Four|Five','[^|]{1,}',1,level) from (select 'One|Two|Three|Four|Five'
text, regexp_count ('One|Two|Three|Four|Five','[^|]{1,}') cnt from dual) connect by level <= cnt
Příklady
• SELECT REGEXP_REPLACE('500 Oracle Parkway, Redwood Shores, CA', '( ){2,}', ' ') RESULT
FROM DUAL;
• 500 Oracle Parkway, Redwood Shores, CA
• SELECT REGEXP_REPLACE('George McGovern', '([[:lower:]])([[:upper:]])', '1 2') CITY
FROM DUAL;
• George Mc Govern
• SELECT REGEXP_REPLACE('We are trying to make the subject easier.','.',' for you.') REGEXT_SAMPLE
FROM DUAL;
• We are trying to make the subject easier for you.
• SELECT REGEXP_SUBSTR('500 Oracle Parkway, Redwood Shores, CA', ',[^,]+,') RESULT
FROM DUAL;
• , Redwood Shores,
• SELECT REGEXP_SUBSTR('Go to http://www.oracle.com/products and click on database',
'http://([[:alnum:]]+.?){3,4}/?') RESULT
FROM DUAL;
• http://www.oracle.com/
Chuck Norris
dokáže přečíst
data ze selectu bez
toho, aby ho
spustil

More Related Content

Similar to Prague data management meetup 2017-05-16

Talend Open Studio DQ
Talend Open Studio DQTalend Open Studio DQ
Talend Open Studio DQdpejcoch
 
Novinky Oracle db 12c
Novinky Oracle db 12cNovinky Oracle db 12c
Novinky Oracle db 12cTomas Solar
 
Technické výpočty (kombinované studium)
Technické výpočty (kombinované studium)Technické výpočty (kombinované studium)
Technické výpočty (kombinované studium)352
 
Prague data management meetup 2016-09-22
Prague data management meetup 2016-09-22Prague data management meetup 2016-09-22
Prague data management meetup 2016-09-22Martin Bém
 
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)Péhápkaři
 
Co přináší Oracle Database 12c Release 2
Co přináší Oracle Database 12c Release 2Co přináší Oracle Database 12c Release 2
Co přináší Oracle Database 12c Release 2MarketingArrowECS_CZ
 
Xm lfunctionality inpostgresql
Xm lfunctionality inpostgresqlXm lfunctionality inpostgresql
Xm lfunctionality inpostgresqlkillteck
 
Architektura databáze Oracle
Architektura databáze OracleArchitektura databáze Oracle
Architektura databáze OracleTomas Solar
 
Czech Sun Training Day 2008 - Java Enterprise System
Czech Sun Training Day 2008 - Java Enterprise SystemCzech Sun Training Day 2008 - Java Enterprise System
Czech Sun Training Day 2008 - Java Enterprise SystemMartin Cerveny
 
NoSQL databáze, MongoDB
NoSQL databáze, MongoDBNoSQL databáze, MongoDB
NoSQL databáze, MongoDBLukas Korous
 
Výkonnostní archeologie
Výkonnostní archeologieVýkonnostní archeologie
Výkonnostní archeologieTomas Vondra
 
INPTP Rekapitulace
INPTP Rekapitulace INPTP Rekapitulace
INPTP Rekapitulace Jan Hřídel
 
Odborná snídaně: Datový sklad jako Perpetuum Mobile
Odborná snídaně: Datový sklad jako Perpetuum MobileOdborná snídaně: Datový sklad jako Perpetuum Mobile
Odborná snídaně: Datový sklad jako Perpetuum MobileProfinit
 
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQueryData Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQueryTaste
 

Similar to Prague data management meetup 2017-05-16 (20)

Talend Open Studio DQ
Talend Open Studio DQTalend Open Studio DQ
Talend Open Studio DQ
 
Novinky Oracle db 12c
Novinky Oracle db 12cNovinky Oracle db 12c
Novinky Oracle db 12c
 
Technické výpočty (kombinované studium)
Technické výpočty (kombinované studium)Technické výpočty (kombinované studium)
Technické výpočty (kombinované studium)
 
Django
DjangoDjango
Django
 
Prague data management meetup 2016-09-22
Prague data management meetup 2016-09-22Prague data management meetup 2016-09-22
Prague data management meetup 2016-09-22
 
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
 
Co přináší Oracle Database 12c Release 2
Co přináší Oracle Database 12c Release 2Co přináší Oracle Database 12c Release 2
Co přináší Oracle Database 12c Release 2
 
Clean code
Clean codeClean code
Clean code
 
Ms access
Ms accessMs access
Ms access
 
Xm lfunctionality inpostgresql
Xm lfunctionality inpostgresqlXm lfunctionality inpostgresql
Xm lfunctionality inpostgresql
 
Architektura databáze Oracle
Architektura databáze OracleArchitektura databáze Oracle
Architektura databáze Oracle
 
Czech Sun Training Day 2008 - Java Enterprise System
Czech Sun Training Day 2008 - Java Enterprise SystemCzech Sun Training Day 2008 - Java Enterprise System
Czech Sun Training Day 2008 - Java Enterprise System
 
CSAS_v06
CSAS_v06CSAS_v06
CSAS_v06
 
NoSQL databáze, MongoDB
NoSQL databáze, MongoDBNoSQL databáze, MongoDB
NoSQL databáze, MongoDB
 
Výkonnostní archeologie
Výkonnostní archeologieVýkonnostní archeologie
Výkonnostní archeologie
 
INPTP Rekapitulace
INPTP Rekapitulace INPTP Rekapitulace
INPTP Rekapitulace
 
Odborná snídaně: Datový sklad jako Perpetuum Mobile
Odborná snídaně: Datový sklad jako Perpetuum MobileOdborná snídaně: Datový sklad jako Perpetuum Mobile
Odborná snídaně: Datový sklad jako Perpetuum Mobile
 
R85 Designer Tcl
R85 Designer TclR85 Designer Tcl
R85 Designer Tcl
 
R85 Designer
R85 DesignerR85 Designer
R85 Designer
 
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQueryData Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
 

More from Martin Bém

Prague data management meetup #30 2019-10-04
Prague data management meetup #30 2019-10-04Prague data management meetup #30 2019-10-04
Prague data management meetup #30 2019-10-04Martin Bém
 
Prague data management meetup #31 2020-01-27
Prague data management meetup #31 2020-01-27Prague data management meetup #31 2020-01-27
Prague data management meetup #31 2020-01-27Martin Bém
 
Pitfalls of Data Warehousing_2019-04-24
Pitfalls of Data Warehousing_2019-04-24Pitfalls of Data Warehousing_2019-04-24
Pitfalls of Data Warehousing_2019-04-24Martin Bém
 
Meetup 2018-10-23
Meetup 2018-10-23Meetup 2018-10-23
Meetup 2018-10-23Martin Bém
 
Prague data management meetup 2018-04-17
Prague data management meetup 2018-04-17Prague data management meetup 2018-04-17
Prague data management meetup 2018-04-17Martin Bém
 
Prague data management meetup 2018-05-22
Prague data management meetup 2018-05-22Prague data management meetup 2018-05-22
Prague data management meetup 2018-05-22Martin Bém
 
Prague data management meetup 2018-03-27
Prague data management meetup 2018-03-27Prague data management meetup 2018-03-27
Prague data management meetup 2018-03-27Martin Bém
 
Prague data management meetup 2018-02-27
Prague data management meetup 2018-02-27Prague data management meetup 2018-02-27
Prague data management meetup 2018-02-27Martin Bém
 
Prague data management meetup 2018-01-30
Prague data management meetup 2018-01-30Prague data management meetup 2018-01-30
Prague data management meetup 2018-01-30Martin Bém
 
Prague data management meetup 2017-11-21
Prague data management meetup 2017-11-21Prague data management meetup 2017-11-21
Prague data management meetup 2017-11-21Martin Bém
 
Prague data management meetup 2017-09-26
Prague data management meetup 2017-09-26Prague data management meetup 2017-09-26
Prague data management meetup 2017-09-26Martin Bém
 
Prague data management meetup 2017-03-28
Prague data management meetup 2017-03-28Prague data management meetup 2017-03-28
Prague data management meetup 2017-03-28Martin Bém
 
Prague data management meetup 2017-04-25
Prague data management meetup 2017-04-25Prague data management meetup 2017-04-25
Prague data management meetup 2017-04-25Martin Bém
 
Prague data management meetup 2017-02-28
Prague data management meetup 2017-02-28Prague data management meetup 2017-02-28
Prague data management meetup 2017-02-28Martin Bém
 
Prague data management meetup 2017-01-23
Prague data management meetup 2017-01-23Prague data management meetup 2017-01-23
Prague data management meetup 2017-01-23Martin Bém
 
Prague data management meetup 2016-11-22
Prague data management meetup 2016-11-22Prague data management meetup 2016-11-22
Prague data management meetup 2016-11-22Martin Bém
 
Prague data management meetup 2016-10-17
Prague data management meetup 2016-10-17Prague data management meetup 2016-10-17
Prague data management meetup 2016-10-17Martin Bém
 
Prague data management meetup 2016-03-07
Prague data management meetup 2016-03-07Prague data management meetup 2016-03-07
Prague data management meetup 2016-03-07Martin Bém
 
Prague data management meetup 2016-01-12 pub
Prague data management meetup 2016-01-12 pubPrague data management meetup 2016-01-12 pub
Prague data management meetup 2016-01-12 pubMartin Bém
 
Prague data management meetup 2015 11-23
Prague data management meetup 2015 11-23Prague data management meetup 2015 11-23
Prague data management meetup 2015 11-23Martin Bém
 

More from Martin Bém (20)

Prague data management meetup #30 2019-10-04
Prague data management meetup #30 2019-10-04Prague data management meetup #30 2019-10-04
Prague data management meetup #30 2019-10-04
 
Prague data management meetup #31 2020-01-27
Prague data management meetup #31 2020-01-27Prague data management meetup #31 2020-01-27
Prague data management meetup #31 2020-01-27
 
Pitfalls of Data Warehousing_2019-04-24
Pitfalls of Data Warehousing_2019-04-24Pitfalls of Data Warehousing_2019-04-24
Pitfalls of Data Warehousing_2019-04-24
 
Meetup 2018-10-23
Meetup 2018-10-23Meetup 2018-10-23
Meetup 2018-10-23
 
Prague data management meetup 2018-04-17
Prague data management meetup 2018-04-17Prague data management meetup 2018-04-17
Prague data management meetup 2018-04-17
 
Prague data management meetup 2018-05-22
Prague data management meetup 2018-05-22Prague data management meetup 2018-05-22
Prague data management meetup 2018-05-22
 
Prague data management meetup 2018-03-27
Prague data management meetup 2018-03-27Prague data management meetup 2018-03-27
Prague data management meetup 2018-03-27
 
Prague data management meetup 2018-02-27
Prague data management meetup 2018-02-27Prague data management meetup 2018-02-27
Prague data management meetup 2018-02-27
 
Prague data management meetup 2018-01-30
Prague data management meetup 2018-01-30Prague data management meetup 2018-01-30
Prague data management meetup 2018-01-30
 
Prague data management meetup 2017-11-21
Prague data management meetup 2017-11-21Prague data management meetup 2017-11-21
Prague data management meetup 2017-11-21
 
Prague data management meetup 2017-09-26
Prague data management meetup 2017-09-26Prague data management meetup 2017-09-26
Prague data management meetup 2017-09-26
 
Prague data management meetup 2017-03-28
Prague data management meetup 2017-03-28Prague data management meetup 2017-03-28
Prague data management meetup 2017-03-28
 
Prague data management meetup 2017-04-25
Prague data management meetup 2017-04-25Prague data management meetup 2017-04-25
Prague data management meetup 2017-04-25
 
Prague data management meetup 2017-02-28
Prague data management meetup 2017-02-28Prague data management meetup 2017-02-28
Prague data management meetup 2017-02-28
 
Prague data management meetup 2017-01-23
Prague data management meetup 2017-01-23Prague data management meetup 2017-01-23
Prague data management meetup 2017-01-23
 
Prague data management meetup 2016-11-22
Prague data management meetup 2016-11-22Prague data management meetup 2016-11-22
Prague data management meetup 2016-11-22
 
Prague data management meetup 2016-10-17
Prague data management meetup 2016-10-17Prague data management meetup 2016-10-17
Prague data management meetup 2016-10-17
 
Prague data management meetup 2016-03-07
Prague data management meetup 2016-03-07Prague data management meetup 2016-03-07
Prague data management meetup 2016-03-07
 
Prague data management meetup 2016-01-12 pub
Prague data management meetup 2016-01-12 pubPrague data management meetup 2016-01-12 pub
Prague data management meetup 2016-01-12 pub
 
Prague data management meetup 2015 11-23
Prague data management meetup 2015 11-23Prague data management meetup 2015 11-23
Prague data management meetup 2015 11-23
 

Prague data management meetup 2017-05-16

  • 1. SQL #15 16. 5. 2017 Prague Data Management Meetup
  • 2. Agenda • Prague Data Management Meetup • SQL
  • 3. Prague Data Management Meetup Data Management Získávaní dat Ukládání dat Zpracování dat Interpretace dat Použití dat • Otevřená profesionální zájmová skupina • Každý je vítán (ať už v pasivní nebo aktivní roli) • Témat není nikdy dost • Snaha o pravidelné měsíční setkávání • Setkávání od září 2015
  • 4. Historie # Datum Téma 1 10. 9. 2015 Data Management 2 14. 10. 2015 Data Lake 3 23. 11. 2015 Dark Data (without Dark Energy and Dark Force) 4 12. 1. 2016 Data Lake (znova) 5 7. 3. 2016 Sad Stories About DW Modeling (sad stories only) 6 23. 3. 2016 Self-service BI Street Battle 7 27. 4. 2016 Let's explore the new Microsoft PowerBI! 8 22. 9. 2016 Data Management pro začátečníky # Datum Téma 9 17. 10. 2016 Small Big Data 10 22. 11. 2016 Základy modelování DW 11 23.1.2017 Komponenty datových skladů 12 28.2.2017 Operational Data Store 13 28.3.2017 Metadata v DW/BI 14 25.4.2017 Jak se stát DW/BI konzultantem 15 16.5.2017 SQL 16 29.5.2017 From IoT to AI: Applications of time series data with Rudradeb Mitra
  • 7. SQL je mocné 4GL Jazyk pro práci s množinami Jazyk pro dotazování Jazyk pro definici struktur Jazyk pro manipulaci s daty Jazyk pro řízení zpracování Jazyk pro řízení přístupů k datům Jazyk relační databázi Jazyk query enginů Jazyk s procedurální nadstavbou Jazyk integrovatelný do 3GL
  • 8. Relační algebra = Teoretický základ SQL • Množinové operátory • Rozdíl => minus • Sjednocení => union • Průnik => intersect • Symetrická diference • Projekce • Výběr sloupců z tabulky • Selekce • Where • Výběr řádků z tabulek • Přejmenování => alias • Agregace • Dělení • Spojení • Cross join • Kartézký produkt • Natural Join • Stejné názvy sloupců • Thetajoin Equijoin • Inner join • Semijoin • Antijoin • Outer join • Right Outer Join • Full outer join
  • 9. Structured Query Language (SQL) • Otevřený programovací jazyk 4. generace (další jsou např. QBE, JQuery ….) • Silný teoretický základ – relační algebra • Množinová orientace • Silný deklarativní vývoj • Až na výjimky při práci s texy není nutné rozlišovat malá a velká písmena • Jazyk pro práci s daty v relačních databázích • Čtení dat • Zapisování dat • Procedurální úlohy • Ostatní úlohy • Původní název SEQUEL • Hawker Siddley trademark -> vynucená změna názvu • Standard ISO/IEC 9075 • Řada standardů (ANSI/ISO/IEC) a „lokálních“ dialektů • IBM DB2, Oracle DB, MySQL, MS SQL, PostgreSQL… • Historické milníky • 1974 - vznik v laboratořích IBM • 1979 - 1. komerční implementace Oracle V2 • 1986 – 1. standardizace (SQL-86) • 1999 – dokončení nejdůležitějších částí SQL (SQL:1999) • 2011 – poslední rozšíření a standardizace (SQL:2011)
  • 10. SQL Dialects SQL Dialect Common name Full name ANSI/ISO Standard SQL/PSM SQL/Persistent Stored Modules Interbase / Firebird PSQL Procedural SQL IBM DB2 SQL PL SQL Procedural Language (implements SQL/PSM) IBM Informix SPL Stored Procedural Language IBM Netezza NZPLSQL [2] (based on Postgres PL/pgSQL) Microsoft / Sybase T-SQL Transact-SQL Mimer SQL SQL/PSM SQL/Persistent Stored Module (implements SQL/PSM) MySQL SQL/PSM SQL/Persistent Stored Module (implements SQL/PSM) MonetDB SQL/PSM SQL/Persistent Stored Module (implements SQL/PSM) NuoDB SSP Starkey Stored Procedures Oracle PL/SQL Procedural Language/SQL (based on Ada) PostgreSQL PL/pgSQL Procedural Language/PostgreSQL Structured Query Language (implements SQL/PSM) Sybase Watcom-SQL SQL Anywhere Watcom-SQL Dialect Teradata SPL Stored Procedural Language SAP SAP HANA SQL Script
  • 11. SQL standardy vs. verze Oracle DB ANSI SQL- 86 ANSI SQL- 89 ANSI SQL- 92 ANSI SQL:1999 ANSI SQL:2003 ANSI SQL:2006 ANSI SQL:2008 ANSI SQL:2011 ANSI SQL:2016 … Oracle DB 10.1 Oracle DB 10.2 Oracle DB 11.1 Oracle DB 11.2 Oracle DB 12.1
  • 12. SQL, databáze a tabulky • SQL = jazyk pro práci s (nejen) relačními databázemi • Relační databáze = databáze využívající relační uložení dat (relační algebra) • Relační databáze = sada relačních tabulek • Relační tabulka = skupina řádku (rows) s jasně definovanou strukturou sloupců (columns) A B C D E F G 1 2 3 4 5 6 7 DATABASE TABLES columns rows
  • 13. Instance Party INST_PT Unified Party UNI_PT Instance Address INST_ADDR Product Instance PROD_INST Product Instance Party Role PROD_INST_PT_ROLE Product Instance Fact PROD_INST_FACT Business Product Type BUS_PROD_TP Big Table BIG_TABLE Business Product Class BUS_PROD_CLASS Party Type PT_TP Instance Party History INST_PT_H Party Role Type PT_ROLE_TP Demo model Product Instance History PROD_INST_H UNI_PT_KEY PT_TP_KEY BUS_PROD_CLASS_KEYPROD_INST_KEY INST_PT_KEY INST_PT_KEY PROD_INST_KEY PROD_INST_KEY PT_ROLE_TP_KEY BUS_PROD_TP_KEY INST_PT_KEY
  • 14. Instance Party INST_PT Product Instance PROD_INST Product Instance Party Role PROD_INST_PT_ROLE Party Type PT_TP Relational Data Model vs. SQL Select * from INST_PT inner join PT_TP on PT_TP.PT_TP_KEY = INST_PT.PT_TP_KEY inner join PROD_INST_PT_ROLE on PROD_INST_PT_ROLE.INST_PT_KEY = INST_PT.INST_PT_KEY inner join PROD_INST on PROD_INST_PT_ROLE.PROD_INST_KEY = PROD_INST.PROD_INST_KEY PT_TP_KEY PROD_INST_KEY INST_PT_KEY
  • 15. SQL DDL DML DCL TCL 21
  • 16. SQL Structure Data Definition Language (DDL). DDL statements create, modify, and remove database objects such as tables, indexes, and users. Common DDL statements are: • CREATE • ALTER • DROP Data Manipulation Language (DML). DML is used to manipulate data within a table. Common DML statements are: • SELECT • INSERT • UPDATE • DELETE • MERGE Data Control Language (DCL). DCL is used to control access to data stored in a database. • GRANT • REVOKE
  • 17. SQL Structure Transaction Control Statements (TCL) • COMMIT • ROLLBACK • SAVEPOINT • SET TRANSACTION Session Control Statements (SCS) • ALTER SESSION • ALTER SYSTEM KILL SESSION ‘12’ Embedded SQL Statements • DECLARE CURSOR • OPEN • CLOSE • FETCH • EXECUTE IMMEDIATE…
  • 18. DDL - Data Definition Language • to create objects in the databaseCREATE • alters the structure of the databaseALTER • delete objects from the databaseDROP • remove all records from a table, including all spaces allocated for the records are removed TRUNCATE • add comments to the data dictionaryCOMMENT • rename an objectRENAME Autocommit!
  • 19. DML – Data Manipulation Language • retrieve data from the a databaseSELECT • insert data into a tableINSERT • updates existing data within a tableUPDATE • deletes all records from a table, the space for the records remainDELETE • UPSERT operation (insert or update)MERGE • call a PL/SQL or Java subprogramCALL/EXEC • explain access path to the dataEXPLAIN PLAN • controls concurrencyLOCK TABLE No autocommit!
  • 20. DCL - Data Control Language • gives user's access privileges to databaseGRANT • withdraw access privileges given with the GRANT commandREVOKE
  • 21. TCL - Transaction Control • save work doneCOMMIT • identify a point in a transaction to which you can later roll backSAVEPOINT • undo the modification made since the last COMMITROLLBACK • Change transaction options like isolation level and what rollback segment to useSET TRANSACTION • set the current active rolesSET ROLE
  • 22. Transaction Control prakticky SET TRANSACTION NAME 'Update INST_PT'; UPDATE INST_PT SET RC_NUM = ‘XIN’ WHERE RC_NUM = ‘XER’ ; SAVEPOINT before_update; UPDATE INST_PT SET RC_NUM = ‘XER’ WHERE RC_NUM = ‘XIN’ ROLLBACK TO SAVEPOINT before_update; UPDATE INST_PT SET RC_NUM = ‘XNA’ WHERE RC_NUM = ‘XER’ ; COMMIT COMMENT 'Updated INST_PT';
  • 23. Oracle SQL Vision • The Language of Relational Databases • Productive • Simple syntax: SELECT, INSERT, UPDATE, DELETE, DROP, ALTER, GRANT • Set based language – don’t write code to iterate • Easy to relate sets of data using joins • Separation of logical and physical • Data independence – don’t code physical references • Optimizers – don’t specify access methods because we can do it better • Capabilities • Transaction isolation and control • Row level locking and concurrency • Multi version read consistency • Referential integrity • Stored procedures (PL/SQL) and triggers
  • 24. Plná syntaxe SELECT pro Oracle DB
  • 25. Vybrané zjednodušené syntaxe selectu • Všechny sloupce z tabulky / view • Select * from <tabulka> • Vybrané sloupce z tabulky / view • Select <seznam sloupců/výrazů> from <tabulka> • Všechny sloupce ze skupiny tabulek / view • Select * from <tabulka 1 propojení tabulka 2 propojení …> • Vybrané sloupce ze skupiny tabulek / view • Select <seznam sloupců/výrazů z tabulky 1, sloupců z tabulky 2> from <tabulka 1 propojení tabulka 2 propojení …> • Všechny sloupce z tabulky / view pouze s řádky splňující podmínky • Select * from <tabulka> where <podmínky> • Vybrané agregované sloupce z tabulky / view • Select <seznam sloupců/výrazů a agregačních funkcí> from <tabulka> group by <seznam sloupců/výrazů> • Všechny sloupce z tabulky / view v pořadí dle seznamu sloupců • select * from <tabulka/view> order by <seznam sloupců/výrazů> • Select všech sloupců ze selectu s podmínkou • Select * from ( select … from … ) where <podmínky>
  • 26. Tabulka DUAL • Speciální jednořádková a jednosloupcová tabulka • Sloupec DUMMY varchar2(1) s hodnotou X • Vždy existuje • Příklady využití dualu: Select * from dual; Select sysdate from dual; Select systimestamp from dual; Select user from dual; Select rownum from dual connect by level < 4; Select rownum from dual connect by level < 4; Select 1 from dual union select 2 dual union select 3 from dual; select * from (Select 1 from dual Group by cube (1,1)) where rownum <= 3; Alternativně Select 1
  • 27. Komentáře • Řádkový komentář „-- komentář“ • Select * -- komentář from dual -- tabulka dual • Blokový komentář „/* komentář */“ • Select * /* komentář komentář komentář */ from dual • Hinty se píší podobně „/*+ */“, funkce zcela jiná! • Select /*+ FIRST_ROWS(5) */ * from dual
  • 28. Aliasy • V SQL lze dočasně pojmenovávat tabulky, sloupce, výrazy i selecty • Ve většině případů aliasy pouze zlepšují čitelnost • V některých případech aliasy zajišťuji syntaktickou správnost a proveditelnost dotazu (upřesňují zdroje) • Příklady: • Alias tabulky Select * from PROD_INST SRC; • Alias sloupce Select DESCR POPIS, DESCR "Popis" from PT_ROLE_TP; • Alias výrazu Select 1+3 AS ROVNA_SE from dual; • Alias selectu Select SRC.DESCR from (select PT_TP.DESCR from PT_TP) SRC;
  • 29. Projekce • Projekce zajišťuje výběr sloupce nebo výrazu z tabulky, view, skupiny tabulek, selectu • U projekcí z více tabulek je nutno důsledně uvádět zdroje • Příklady • Select PT_TP_KEY, SRC_ID, DESCR from PT_TP; • Select PT_TP.PT_TP_KEY, PT_TP.SRC_ID, PT_TP.DESCR from PT_TP;
  • 30. Podmínky • SQL podmínky umožňují filtrovat data dle stanovených kritérií jako jsou rovnosti, nerovnosti nebo třeba i podobnosti • SQL podmínkách lze využívat SQL funkce, matematické a logické operátory • V selectu lze podmínky zapsat • Obecně za klausuly WHERE • Při použití agregačních funkcí (GROUP BY) za klauzuly HAVING • Do podmínek pro spojení (join) tabulek • Příklady: •Select PT_TP_KEY, ID, SRC_ID, DESCR from PT_TP where SRC_ID = 'FO'; •Select * from PT_TP where 1+1 = 2 and trunc(sysdate) = trunc(sysdate);
  • 31. Pokročilé řízení podmínek • Někdy nutno zajistit řízení postupného vyhodnocování celé hierarchie podmínek v jednom výrazu • Obdoba konstrukce „If then else “ •CASE WHEN výraz1 THEN výsledek1 WHEN výraz2THEN výsledek2 … ELSE výsledek3 END Case •CASE výraz WHEN hodnota1 THEN výsledek1 WHEN hodnota 2 THEN výsledek2 … ELSE výsledek3 END Case • DECODE(výraz,hodnota1,výsledek1,hodnota2, výsledek2,…, výsledek3)Decode
  • 32. NULL v SQL NULL • je nic, ale není to nula NULL v Oraclu • není roven ničemu • ani sám sobě Vždy FALSE: • NULL = NULL Pokud se zjišťuje rovnost nullů • NULL IS NULL • column IS NULL (negace IS NOT NULL) Lze ho dělit nulou! • select null / 0 from dual vrací null Výjimka je SQL funkce DECODE • null s rovná se funguje • DECODE(A,NULL,’PRAVDA’,’NEPRAVDA’) Platí primárně pro Oracle DB, v jiných DB může být popsané chování jiné Příklady: Select * from INST_PT where RC_NUM is null; Select * from INST_PT where RC_NUM is not null;
  • 33. NVL • Základní SQL funkce k eliminaci null (existují i další složitější) • Syntaxe • NVL(<sloupec nebo výraz>, <náhradní hodnota>); • Příklady: Select RC_NUM, ICO_NUM, NVL( RC_NUM,ICO_NUM) AS ID, NVL(RC_NUM,'NONE ' ‚) AS RC_NUM2 from INST_PT; 41
  • 34. • Zástupné znaky umožňují jednoduché podobnostní prohledávání textových řetězců pomocí operátoru LIKE Zástupné znaky (wildcards) • SELECT * FROM inst_pt WHERE family_name LIKE 'Nov_k'; Jeden znak • SELECT * FROM inst_pt WHERE family_name LIKE 'N%k'; Více znaků • SELECT * FROM inst_pt WHERE family_name LIKE '_o%k'; Kombinace jednoho a více znaků • SELECT * FROM inst_pt WHERE family_name LIKE '%o%'; Komplexní prohledávání • SELECT * FROM inst_pt WHERE family_name LIKE '%o_v%' escape '' ; Escapování zástupných znaků
  • 35. Operátory pro tvorby podmínek a výrazů Aritmetické operace + - / * Spojování textových řetězců || Příklady: Select 158/6 from dual; Select 3*8 from dual; Select 'A' || 'B' from dual;
  • 36. Operátory pro tvorby podmínek a výrazů Porovnání > , >= =<. < = ANY/SOME „ve výčtu – ANSI“ IN/NOT IN „ve výčtu - Oracle“ BETWEEN/NOT BETWEEN „mezi“ LIKE/NOT LIKE EXISTS „ve výčtu“ IS (NOT) NULL Logické operátory NOT „negace“ AND OR Příklady: Select * from INST_PT where INST_PT_KEY >= 3 or INST_PT_KEY in (-1,-2); Select * from INST_PT where INST_PT_KEY between 1 and 5;
  • 37. Pořadí vyhodnocování operátorů Unární operátory + - PRIOR operator * / [aritmetické operátory] Binární operátory + - , || [spojení textů] Porovnání NOT
  • 38. Distinct • Tento sloupcový operátor zajistí deduplikaci řádků pro uvedenou kombinaci sloupců • Dvě možná klíčová slova: • DISTINCT – Oracle • UNIQUE - ANSI • Syntaxe • SELECT DISTINCT <seznam sloupců> FROM <tabulka>; • SELECT UNIQUE <seznam sloupců> FROM <tabulka>; • Příklad • Select distinct RC_NUM, FAMILY_NAME, FIRST_NAME from INST_PT; • Poznámka • K deduplikaci musí DB udělat třídění – potenciálně velmi náročná operace
  • 39. Subdotazy • Pro select lze použít i jiný select jako podmínku • Základní klíčová slova • IN / NOT IN • EXISTS / NOT EXISTS • SOME / NOT SOME • ANY / NOT ANY • Ekvivalentní příklady: • Select * from INST_PT where INST_PT_KEY in (select INST_PT_KEY from PROD_INST_PT_ROLE); • SELECT inst_pt_key FROM inst_pt • WHERE EXISTS • (SELECT 1 FROM PROD_INST_PT_ROLE • WHERE inst_pt.inst_pt_key =prod_inst_pt_role.inst_pt_key); 50
  • 40. Subdotazy • In / Exists / Any / Some jsou zaměnitelné • IN je z Oracle SQL • EXISTS z ANSI • NOT IN a NOT EXISTS se liší => NOT IN je null sensitive • Data vrátí: • SELECT inst_pt_key • FROM inst_pt • WHERE inst_pt_key NOT IN (1, 2); • Data nevrátí • SELECT inst_pt_key • FROM inst_pt • WHERE inst_pt_key NOT IN (1, 2, NULL); • Srovnání NOT IN a NOT EXISTS: • SELECT inst_pt_key FROM inst_pt WHERE NOT EXISTS (select 1 from INST_PT FILTER where FILTER.RC_NUM = INST_PT.ICO_NUM); • Vrátí nějaké řádky • select inst_pt_key from inst_pt WHERE ICO_NUM not in (select RC_NUM from INST_PT where RC_NUM is not null); • Nic nevrátí
  • 41. Funkce • Funkce jsou vestavěné předpisy pro transformaci vstupních dat • Typy funkcí: • Skalární - pro jeden řádek vrací jednu hodnotu • substr - vyberte část řetězce z celého řetězce • to_date - převede řetězec na datum • round - zaokrouhlí číslo • Skupinové – pro více řádků vrací jednu hodnotu • max - vybere maximální hodnotu ze skupiny • avg - vybere průměrnou hodnotu ze skupiny • Funkce lze používat pro • Definování výrazů sloužící jako výstupní sloupce ze selectu • Definování filtrovacích podmínek ve where • Definovaní joinů mezi tabulkami
  • 42. Vybrané skalární funkce • sysdate - vypíše aktuální datum a čas • Select sysdate from dual; • to_date – převede řetězec na datum • Select to_date ('10.2.2015', 'DD.MM.YYYY') from dual; • to_char – převede hodnotu na řetězec • Select to_char(sysdate, 'YYYYMM') from dual; • to_number – převede řetězec na číslo (pozor na vliv NLS) • Select to_number('0001,1') from dual; • round - zaokrouhlí číslo • Select round(2.2548494,1) from dual; • cast – převede vstupní hodnotu na zvolený datový typ • Select cast (sysdate as timestamp) from dual; • trunc - ořízne vstupní hodnotu • Select trunc (sysdate, 'YYYY') from dual; • Select trunc(10/3) from dual;
  • 43. Vybrané skalární funkce • substr - vybere část řetězce • Select substr('abcdef',3,2) from dual; • Instr - prohledá řetězec a najde počátek subřetězce • Select instr('abcdef', 'c') from dual; • trim - ořízne vstupní řetězec o mezery na konci a začátku • Select trim(' 458A ') from dual; • lpad - doplní řetězec o úvodní znaky • Select lpad('abcdef',10,'x') from dual; • replace - nahradí textový řetězec jiným řetězcem • Select replace('abcdef', 'de', 'yz') from dual; • months_between – vypočítá rozdíl mezi dvěma datumy • Select months_between(sysdate, date '2010-5-15') from dual; • last_day - datum převede na poslední datum v měsíci • Select last_day(sysdate) from dual;
  • 44. Vybrané skupinové funkce • Avg - vypočítá ze skupiny průměr • Min - vypočítá ze skupiny minimum • Max - vypočítá ze skupiny maximum • Median - vypočítá ze skupiny medián • Count - vypočítá ze skupiny počet řádků • Sum - vypočítá ze skupiny sumu SELECT avg(num_val) avg , median(num_val) med, min(date_val) min, max(date_val) max, count(*) cnt, sum(num _val) sum FROM big_table;
  • 45. Množinové operátory • Spojení dvou množin řádků • Defaultně deduplikace zdvojených řádků • ALL => vypnutí deduplikace UNION [ALL] Průnik dvou množin řádků Defaultně deduplikace zdvojených řádkůINTERSECT • Výběr řádků, které jsou pouze v první množině, ale nejsou ve druhéMINUS Poznámka: ORDER BY lze použít za posledním
  • 46. Graphical Depiction of Matching Values OfferNo CourseNo 1234 IS320 4321 IS320 Offering StdNo OfferNo 123-45-6789 1234 234-56-7890 1234 123-45-6789 4321 124-56-7890 4321 Enrollment StdNo StdLastName 123-45-6789 WELLS 124-56-7890 KENDALL 234-56-7890 NORBERT Student
  • 47. Join = spojení více tabulek do jedné INNER JOIN • obě strany povinné LEFT OUTER JOIN • jedna strana nepovinná RIGHT OUTER JOIN • jedna strana nepovinná FULL OUTER JOIN • obě strany nepovinné CROSS JOIN • kartézský součin NATURAL JOIN • typ inner joinu • Syntaxe • ANSI JOIN • ORACLE JOIN
  • 48. Inner join / join Table_1 Table_2 select * from Table_1 inner join Table_2 on Table_1.Column_1 = Table_2.Column_2; select * from Table_1 join Table_2 on Table_1.Column_1 = Table_2.Column_2; select * from Table_1, Table_2 where Table_1.Column_1 = Table_2.Column_2;
  • 49. Left outer join / left join Table_1 Table_2 select * from Table_1 left outer join Table_2 on Table_1.Column_1 = Table_2.Column_2; select * from Table_1 left join Table_2 on Table_1.Column_1 = Table_2.Column_2; select * from Table_1, Table_2 where Table_1.Column_1 = Table_2.Column_2 (+);
  • 50. Right outer join / right join Table_2Table_1 select * from Table_1 right outer join Table_2 on Table_1.Column_1 = Table_2.Column_2; select * from Table_1 right join Table_2 on Table_1.Column_1 = Table_2.Column_2; select * from Table_1, Table_2 where Table_1.Column_1 (+) = Table_2.Column_2;
  • 51. Full outer join / full join Table_1 Table_2 select * from Table_1 full outer join Table_2 on Table_1.Column_1 = Table_2.Column_2; select * from Table_1 full join Table_2 on Table_1.Column_1 = Table_2.Column_2; Nelze přímo, nutno řešit jako union mezi left a right joinem
  • 52. A B C Cross join A B C select * from Table_1 cross join Table_2;; select * from Table_1, Table_2; Občas záměrné, občas potenciální chyba…
  • 53. Self inner join Table_1 Table_1 select * from Table_1 Alias_1inner join Table_1 Alias_2 on Alias_1.Column_1 = Alias_2.Column_2; select * from Table_1 Alias_1, Table_1 Alias_2where Alias_1.Column_1 = Alias_2.Column_2;
  • 54. Natural join Table_1 Table_2 select * from Table_1 natural join Table_2; Specifický inner join Spojení dle všech stejně pojmenovaných sloupců bez ohledu na obsah
  • 55. Použítí using v joinech • Zjednodušení joinování při stejných názvech sloupců v tabulkách • Omezení v použití sloupce • Nelze použít univerzálně * • Sloupec z usingu je ve výstupu pouze jednou • Syntaxe SELECT <joinovací sloupce>, <ostatní sloupce> FROM <table_1> <zvolený typ joinu> <table_2> USING (<joinovací sloupce oddělené čárkou>);
  • 56. Semijoin • Souvztažné selecty = výsledek jednoho joinu řídí výsledek druhého • Lze použít: • EXISTS • IN • Běžný JOIN v kombinaci s řízenou deduplikací Select * from INST_PT where (INST_PT_KEY,SRC_SYS_ID) in (select INST_PT_KEY, SRC_SYS_ID from PROD_INST_PT_ROLE) Select * from INST_PT where EXISTS ( Select 1 from PROD_INST_PT_ROLE where PROD_INST_PT_ROLE.INST_PT_KEY = INST_PT.INST_PT_KEY and PROD_INST_PT_ROLE.SRC_SYS_ID = INST_PT.SRC_SYS_ID )
  • 57. Antijoin SELECT inst_pt.inst_pt_key FROM inst_pt , prod_inst_pt_role WHERE inst_pt.inst_pt_key = prod_inst_pt_role.inst_pt_key (+) AND prod_inst_pt_role.prod_inst_key IS NULL; SELECT inst_pt_key FROM inst_pt WHERE inst_pt_key NOT IN (SELECT inst_pt_key FROM prod_inst_pt_role); SELECT inst_pt_key FROM inst_pt WHERE NOT EXISTS ( SELECT 1 FROM prod_inst_pt_role WHERE prod_inst_pt_role.inst_pt_key = inst_pt.inst_pt_key); SELECT inst_pt.inst_pt_key FROM inst_pt LEFT OUTER JOIN prod_inst_pt_role ON inst_pt.inst_pt_key = prod_inst_pt_role.inst_pt_key WHERE prod_inst_pt_role.prod_inst_key IS NULL; Pozor na null v NOT IN!!!! (nevrátí se pak nic)
  • 58. Full outer join vs. minus • Select INST_PT_KEY from INST_PT minus Select INST_PT_KEY from PROD_INST_PT_ROLE; • Select INST_PT.INST_PT_KEY, PROD_INST_PT_ROLE.PROD_INST_KEY from INST_PT full outer join PROD_INST_PT_ROLE on INST_PT.INST_PT_KEY = PROD_INST_PT_ROLE.INST_PT_KEY where PROD_INST_PT_ROLE.INST_PT_KEY is null ; • Výkon většinou srovnatelný • Dostupnost všech klíčů u full outer joinu narozdíl od minusu • Minus lze vnitřně provést jako minus nebo jako většinou rychlejší antijoin • 11g defaultně vypnutý v důsledku chyby v hashovaní
  • 59. Group by GROUP BY GROUP BY CUBE GROUP BY HAVING GROUP BY ROLLUP GROUP BY GROUPING SET Funkce pro „zlepšení popis“ výstupu GROUPING GROUPING_ID GROUP_ID SELECT <column_name>, <aggregating_operation> FROM <table_name> GROUP BY <column_name> HAVING <aggregating_op_result> <condition> <value>; • Group by a jeho varianty umožňují agregovat skupiny řádků do jednoho výsledného • S group by lze použít agregační funkce • Having funguje velmi podobně jako where
  • 60. Agregační funkce • PrůměrAVG() • Počet unikátních prvkůCOUNT(DISTINCT) • PočetCOUNT() • MaximumMAX() • MinimumMIN() • SumaSUM() • Standardní odchylkaSTD() • RozptylVARIANCE()
  • 61. Příklad agregace pomocí group by 77 ID GRP AMT 1 A 2 2 A 4 3 A 4 4 B 8 DUMMY_TAB GRP Max(AMT) Min(AMT) Avg(AMT) Sum(AMT) Count(*) A 4 2 3,33333 10 3 B 8 8 8 8 1 Select GRP, max(AMT), min(AMT), avg(AMT), sum(AMT), count(*) From DUMMY_TAB Group by GRP
  • 62. Příklad agregace pomocí group by having 78 ID GRP AMT 1 A 2 2 A 4 3 A 4 4 B 8 DUMMY_TAB GRP Max(AMT) Min(AMT) Avg(AMT) Sum(AMT) Count(*) A 4 2 3,33333 10 3 Select GRP, max(AMT), min(AMT), avg(AMT), sum(AMT), count(*) From DUMMY_TAB Group by GRP Having count(*) > 1
  • 63. Order by Order umožňuje určit pořadí v jakém jsou záznamy na výstupu ze selectu ASC Vzestupné třídění ASC je default. DESC Sestupné třídění. NULLS FIRST Nully jsou uvedené jako první až poté následují setříděná data NULLS LAST Nully jsou uvedené jako poslední po setříděných datech
  • 64. Pořadí exekuce jednotlivých částí selectu JOIN & WHERE GROUP BY & HAVING ANALYTIC FUNCTION ORDER BY
  • 65. Analytické funkce Funkce v SQL dotazu umožňující zohlednit ostatní řádky výsledkové sady •Vyšší efektivita dotazu •Větší čitelnost řešení SQL> select A from testRM; A ---------- 1 2 3 4 5 6 6 SQL> select sum(A) from testRM; SUM(A) ---------- 33 SQL> select A,sum(A)over(order by A) from testRM; A SUM(A)OVER(ORDERBYA) ---------- -------------------- 1 1 2 3 3 6 4 10 5 15 6 27 6 33 Agregační funkce Analytická funkce pro kumulativní součet bez logické partition
  • 67. Analytické funkce - příklad Najít datumy konce platnosti záznamů v SCD2 SQL> desc TAB_A Název Typ ------------ ------------- REC_KEY NUMBER REC_ID VARCHAR2(30) REC_DESC VARCHAR2(400) DT_FROM DATE DT_TO DATE SQL> select * from TAB_A; REC_KEY REC_ID REC_DESC DT_FROM DT_TO ---------- ----- ------------------------------ -------- -------- 1 AAA Prodejna AAA 21.11.05 2 AAA Prodejna Petřiny 28.11.05 3 AAA Prodejna Petřiny, Dusíkova 05.12.05 4 BBB Prodejna BBB 22.11.05 5 BBB Prodejna Dejvická 05.12.05 SQL> select rec_key, rec_id,rec_desc,dt_from, lead(dt_from-1)over(partition by rec_id order by dt_from) from TAB_A; REC_KEY REC_ID REC_DESC DT_FROM LEAD(DT_ ---------- ----- ------------------------------ -------- -------- 1 AAA Prodejna AAA 21.11.05 27.11.05 2 AAA Prodejna Petřiny 28.11.05 04.12.05 3 AAA Prodejna Petřiny, Dusíkova 05.12.05 4 BBB Prodejna BBB 22.11.05 04.12.05 5 BBB Prodejna Dejvická 05.12.05
  • 68. Analytické funkce AVG, MIN, MAX, COUNT, SUM LAG, LEAD FIRST_VALUE, LAST_VALUE ROW_NUMBER RANK, DENSE_RANK, PERCENT_RANK NTILE, CUME_DIST, RATIO_TO_REPORT CORR COVAR_POP VARIANCE, VAR_POP, VAR_SAMP STTDEV, STTDEV_POP, STDDEV_SAMP REGR_COUNT, REGR_P2, REGR_AVGX, REGR_AVGY, REGR_SXX, REGR_SXY, REGR_SYY, REGR_SLOPE, REGR_INTERCEPT LIST_AGG, NTH
  • 69. Row Limiting • Od 12c lze omezovat výstup z selectu pouze na první řadky bez nutnosti aplikaci analytických funkcí nebo rownum • Prvních pět řádků: • SELECT employee_id, last_name FROM employees ORDER BY employee_id FETCH FIRST 5 ROWS ONLY; • Šestý až desátý řádek: • SELECT employee_id, last_name FROM employees ORDER BY employee_id OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY; • Prvních 5% řádků: • SELECT employee_id, last_name, salary FROM employees ORDER BY salary FETCH FIRST 5 PERCENT ROWS ONLY; • Prvních 5% řádků plus všechny ty, které mají stejnou hodnotu salary jako poslední řádek z původní množiny • SELECT employee_id, last_name, salary FROM employees ORDER BY salary FETCH FIRST 5 PERCENT ROWS WITH TIES; 89
  • 70. Regulární výrazy • POSIX • REGEXP_LIKE • REGEXP_SUBSTR • REGEXP_REPLACE • REGEXP_COUNT • SELECT REGEXP_SUBSTR('One|Two|Three|Four|Five','[^|]+', 1,3) FROM dual; • select REGEXP_SUBSTR('One|Two|Three|Four|Five','[^|]{1,}',1,level) from (select 'One|Two|Three|Four|Five' text, regexp_count ('One|Two|Three|Four|Five','[^|]{1,}') cnt from dual) connect by level <= cnt
  • 71. Příklady • SELECT REGEXP_REPLACE('500 Oracle Parkway, Redwood Shores, CA', '( ){2,}', ' ') RESULT FROM DUAL; • 500 Oracle Parkway, Redwood Shores, CA • SELECT REGEXP_REPLACE('George McGovern', '([[:lower:]])([[:upper:]])', '1 2') CITY FROM DUAL; • George Mc Govern • SELECT REGEXP_REPLACE('We are trying to make the subject easier.','.',' for you.') REGEXT_SAMPLE FROM DUAL; • We are trying to make the subject easier for you. • SELECT REGEXP_SUBSTR('500 Oracle Parkway, Redwood Shores, CA', ',[^,]+,') RESULT FROM DUAL; • , Redwood Shores, • SELECT REGEXP_SUBSTR('Go to http://www.oracle.com/products and click on database', 'http://([[:alnum:]]+.?){3,4}/?') RESULT FROM DUAL; • http://www.oracle.com/
  • 72. Chuck Norris dokáže přečíst data ze selectu bez toho, aby ho spustil