Modern SQL
Writing SQL query in 21th century
Cédric Krier
B2CK
http://www.b2ck.com/
2
Cédric Krier @ B2CK
●
Tryton (ERP)
●
python-sql
3
Structured Query Language
●
Domain Specific Language
– Data Query Language (SELECT)
– Data Definition Language (CREATE TABLE)
– Data Control Language (GRANT)
– Data Manipulation Language
(INSERT / UPDATE / DELETE)
●
Relational Database Management System
4
Standard
●
SQL-86 SQL-89 SQL-92
●
SQL:1999 (SQL3)
– Common Table Expression
– GROUPING SETS, ROLLUP and CUBE
●
SQL:2003
– Window Function
– Filter
●
SQL:2006 (XML) SQL:2008 SQL:2011 (Temporal)
SQL:2016 (JSON, LISTAGG)
5
Interoperability
●
PostgreSQL
●
Mimer SQL
6
Data Query Language
SELECT <expression>, …
FROM <table>, …
WHERE <condition>, …
GROUP BY <grouping>, …
HAVING <expression>, …
ORDER BY <expression> ASC|DESC, …
7
GROUPING SETS, ROLLUP and CUBE
GROUP BY GROUPING SETS
((<expression>, …), (…))
8
GROUPING SETS, ROLLUP and CUBE
Example
9
GROUPING SETS, ROLLUP and CUBE
GROUP BY ROLLUP (<e1>, <e2>, <e3>, …)
=
GROUP BY GROUPING SETS (
(<e1>, <e2>, <e3>, …),
(<e1>, <e2>),
(<e1>),
())
10
GROUPING SETS, ROLLUP and CUBE
Example
11
GROUPING SETS, ROLLUP and CUBE
GROUP BY CUBE (<e1>, <e2>, …)
=
GROUP BY GROUPING SETS (
(<e1>, <e2>),
(<e1>),
(<e2>, <e1>),
(<e2>)
(),
)
12
GROUPING SETS, ROLLUP and CUBE
Example
13
GROUPING SETS, ROLLUP and CUBE:
compatibility
●
DB2 ✔
●
MySQL ✘ (WITH ROLLUP)
●
Oracle ✔
●
PostgreSQL ✔
●
SQL Server ✔
●
SQLite ✘
14
FILTER
SUM(<expression>) FILTER ( WHERE <condition> )
15
FILTER
Example
16
Filter: compatibility
●
DB2 ✘
●
MySQL ✘
●
Oracle ✔ (using WITHIN GROUP)
●
PostgreSQL ✔
●
SQL Server ✘
●
SQLite ✘
17
Filter: Alternative
SUM(CASE WHEN <condition>
THEN <expression> END)
⚠ NULL: OK for most aggregate
18
Filter: Alternative COUNT(*)
COUNT(CASE WHEN <condition> THEN 1 END)
19
Window Function: PARTITION BY
SUM(<expression>)
OVER ( PARTITION BY <expression> )
PARTITION divides rows in groups with the same
value
20
Window Function: PARTITION BY
Example
21
Window Function: ORDER BY
RANK() OVER ( ORDER BY <expression> )
rows from the start up through the current row
22
Window Function: ORDER BY
Example
23
Window Function:
PARTITION BY ORDER BY
Example
24
Window Function: compatibility
●
DB2 ✔
●
MySQL ✔
●
Oracle ✔
●
PostgreSQL ✔
●
SQL Server ✔
●
SQLite ✘
25
Window Function: naming
SELECT
SUM(<expression>) OVER <name>,
AVG(<expression) OVER <name>
FROM <table>
WINDOW <name> AS (
PARTITION BY <expression>
ORDER BY <expression> )
26
Window Function: BETWEEN
SUM(<expression>)
OVER ( <RANGE|ROWS>
BETWEEN <start> AND <end> )
27
Window Function: BETWEEN
●
UNBOUNDED PRECEDING
●
<value> PRECEDING
●
CURRENT ROW
●
<value> FOLLOWING
●
UNBOUNDED FOLLOWING
28
Window Function: BETWEEN ROW
CURRENT ROW
UNBOUNDED PRECEDING UNBOUNDED FOLLOWING
3 PRECEDING 2 FOLLOWING
1 PRECEDING 1 FOLLOWING
1 2 3 4 5 6 7 8 9
29
Window Function: BETWEEN RANGE
CURRENT ROW
UNBOUNDED PRECEDING
UNBOUNDED FOLLOWING
1 2 3 4 5 6 7 8 9
10 15 20 25 25 25 25 30 40
30
Window Function: BETWEEN
Default:
RANGE BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW
31
Window Function: RANGE | ROWS
●
RANGE:
– CURRENT ROW:
●
<start>: first row of peer rows (from ORDER BY)
●
<end>: last row of peer rows (from ORDER BY)
– No <value> PRECEDING | FOLLOWING
●
ROWS:
– CURRENT ROW:
●
Always current row
32
Window Function: BETWEEN
Example
33
Common Table Expression
WITH <name> (<column>,…) AS
(SELECT …)
SELECT …
34
Common Table Expression: multiple
WITH name1 AS(
SELECT …),
WITH name2 AS (
SELECT …
FROM name1)
SELECT …
35
Common Table Expression: compatibility
●
DB2 ✔ (no subquery)
●
MySQL ✔ (> MySQL 8.0 & MariaDB 10.2)
●
Oracle ✔
●
PostgreSQL ✔
●
SQL Server ✔ (no subquery, insert)
●
SQLite ✔
36
CTE Recursive
WITH RECURSIVE <name> (<column>, …) AS (
SELECT …
UNION ALL
SELECT … FROM <name> …
)
SELECT …
37
CTE Recursive
Example
38
CTE Recursive: compatibility
●
DB2 ✔
●
MySQL ✔ (> MySQL 8.0 & MariaDB 10.2)
●
Oracle ✔
●
PostgreSQL ✔
●
SQL Server ✔
●
SQLite ✔
39
Questions?
40
Links
●
https://www.postgresql.org/docs/
●
https://modern-sql.com/

Modern sql