Caracteristicas Avanzadas SQL
Caracteristicas Avanzadas SQL
Caracteristicas Avanzadas SQL
§ 2
El Problema ?
§ 3
La Solución
§ 4
Construcción
1:
Cláusula
With
en
SQL
• With
Clause
en
sentencias
Select
WITH
– Sólo
se
puede
usar
en
sentencias
query_name1(alias11,
alias12,..)
AS
SELECT
(Select
subquery1)
– Datos
pre-‐construidos
para
una
query_name2
(alias21,
alias22,..)
AS
consulta
compleja
(Select
subquery2)
– Crea
y
trabaja
en
un
conjunto
de
SELECT
col1,
col2,..
resultados
FROM
query_name1,
query_name2
– Referencia
el
conjunto
de
WHERE
<join
condi1on>;
resultados
varias
veces
§ Beneficios
– Eliminar
tablas
de
paso
y
escrituras
relacionadas
– Excelente
alterna1va
a
tablas
temporales
globales
– Mejora
el
rendimiento
– Usado
en
consultas
adhoc
en
grandes
bases
de
datos
§ 5
Construcción
1:
Cláusula
With
en
SQL
WITH a1 AS – definir subquery, salario por departamento y job type
( select department_id,job_title,sum(salary) salary
from employees, jobs
where a.job_id=b.job_id
group by department_id,job_title),
b1 AS -- definir subquery, departamentos y sus países
(select department_id, country_name
from departments a, locations b, countries c
where a.location_id=b.location_id
and b.country_id=c.country_id)
SELECT country_name, job_title, sum(salary) -- seleccionar a partir de los resultados
FROM a1, b1
WHERE a1.department_id=b1.department_id
GROUP BY country_name, job_title
§ 6
Construcción
1:
Cláusula
With
en
SQL
§ 7
Construcción
1:
Cláusula
With
en
SQL
§ 8
Construcción
1:
Cláusula
With
en
SQL
Matriz de Compatibilidad
§ 9
Construcción
2:
Insert
MulEtabla
• Insert
Mul1-‐tabla
INSERT ALL
INTO TABLE1 (values….)
– Inserta
datos
en
muchas
tablas
INTO TABLE2 (values…)
a
la
vez
INTO TABLE3 (values…)
– Insert
condicionales
SELECT col1, col2,..
• Beneficios
FROM table1, table2, …
– En
una
sola
sentencia
inserta
WHERE <join condition>;
los
datos
actuales,
de
auditoria
INSERT
ALL
e
históricos
WHEN
<condiEon>
THEN
– Una
sola
pasada
al
compilador
INTO
TABLE1
(values..)
– Mejora
al
menos
50%
el
WHEN <condition> THEN
rendimiento
dependiendo
del
INTO TABLE2 (values..)
número
de
tablas
SELECT
col1,
col2,..
FROM table1, table2, …
WHERE
<join
condi1on>;
§ 10
Construcción
2:
Insert
MulEtabla
INSERT ALL -- Inserta en 3 tablas condicionalmente
WHEN (SALARY >15000) THEN
INTO EMP_HIGH_SALARY
WHEN (SALARY>5000 AND SALARY<=15000) THEN
INTO EMP_MED_SALARY
ELSE
INTO EMP_LOW_SALARY
SELECT * FROM EMPLOYEES;
§ 11
CaracterísEca
2:
Insert
MulEtabla
Matriz de Compatibilidad
§ 12
CaracterísEca
3:
Funciones
AnalíEcas
Avanzadas
• Funciones
Analí1cas
– Comparar
filas
dentro
de
la
misma
tabla
o
result
set
SELECT
– Aplicar
par1ciones
y
ventanas
analyEc_funcEon(arg1)
para
la
comparación
over
(parEEon
by
expr
-‐-‐par%%on
clause
– Rangos
y
percen1les,
Análisis
order
by
expr
)
-‐-‐order
by
clause
Primero/Ul1mo,
Análisis
lag/
rows
between
<rows>
-‐-‐
windowing
clause
lead
FROM table1, table2, . . .
– Top-‐N,
Movimientos
agregados
WHERE <join condition>;
• Beneficios
– Elimina
los
self
joins
– Mejora
el
rendimiento
– Más
fácil
de
codificar
– No
requiere
afinamiento!
§ 13
CaracterísEca
3:
Funciones
AnalíEcas
Avanzadas
§ Sintaxis
§ Analytic-Function(<Argument>,<Argument>,...)
OVER (
<Query-Partition-Clause>
<Order-By-Clause>
<Windowing-Clause>
)
§ PARTITION BY – divide los datos en grupos
§ 14
CaracterísEca
3:
Funciones
AnalíEcas
Avanzadas
Filas
Proceso Analítico
Evaluación Ordenamiento
Evaluación Agrupamiento
HAVING Intermedio
WHERE
Función
Analítica
ORDER BY
Final
Resultado
§ 15
CaracterísEca
3:
Funciones
AnalíEcas
Avanzadas
§ RANK() y DENSE_RANK()
SELECT ROW_NUMBER() OVER(ORDER BY sal DESC) rownumber
,RANK() OVER(ORDER BY sal DESC) rank
,DENSE_RANK() OVER(ORDER BY sal DESC) denserank
,sal
,ename
FROM emp
ORDER BY sal DESC,ename;
ROWNUMBER RANK DENSERANK SAL ENAME
--------- ---- ---------- ----- ------
1 1 1 5000 KING
2 2 2 3000 FORD
3 2 2 3000 SCOTT
4 4 3 2975 JONES
5 5 4 2850 BLAKE
6 6 5 2450 CLARK
7 7 6 1600 ALLEN
8 8 7 1500 TURNER
9 9 8 1300 MILLER
10 10 9 1250 MARTIN
11 10 9 1250 WARD
12 12 10 1100 ADAMS
13 13 11 950 JAMES
14 14 12 800 SMITH
§ 16
ParEcionamiento
§ Las funciones analíticas pueden aplicarse a grupos lógicos dentro del conjunto de
resultados
§ Partitions
... OVER(PARTITION BY mgr ORDER BY sal DESC)
§ 17
Particionamiento en funciones analíticas
§ 19
Agregación:
La
cláusula
OVER
SELECT deptno
,AVG(sal)
FROM emp SELECT deptno
GROUP BY deptno; ,AVG(sal) OVER (PARTITION BY deptno) avg_dept
,AVG(sal) OVER () avg_all
DEPTNO AVG(SAL) FROM emp;
---------- ----------
30 1566.66667 DEPTNO AVG_DEPT AVG_ALL No subclause
20 2175 ---------- ---------- ----------
10 2916.66667 10 2916.66667 2073.21429
10 2916.66667 2073.21429
10 2916.66667 2073.21429
20 2175 2073.21429
20 2175 2073.21429
20 2175 2073.21429
20 2175 2073.21429 Agregaciones
20 2175 2073.21429
30 1566.66667 2073.21429
analíticas
30 1566.66667 2073.21429 no reducen el
30 1566.66667 2073.21429
30 1566.66667 2073.21429
número de filas
30 1566.66667 2073.21429
30 1566.66667 2073.21429
§ 20
AnalyEcs
vs
SQL
convencional
Si se requiere datos a distintos niveles de agrupación
Salario promedio
por departamento
ENAME SAL DEPTNO AVG_DEPT AVG_ALL
------ ---- ------ ---------- ----------
CLARK 2450 10 2916.66667 2073.21429
KING 5000 10 2916.66667 2073.21429
MILLER 1300 10 2916.66667 2073.21429 Salario promedio
JONES 2975 20 2175 2073.21429 total
FORD 3000 20 2175 2073.21429
ADAMS 1100 20 2175 2073.21429
SMITH 800 20 2175 2073.21429
SCOTT 3000 20 2175 2073.21429
WARD 1250 30 1566.66667 2073.21429
TURNER 1500 30 1566.66667 2073.21429
ALLEN 1600 30 1566.66667 2073.21429
JAMES 950 30 1566.66667 2073.21429
BLAKE 2850 30 1566.66667 2073.21429
MARTIN 1250 30 1566.66667 2073.21429
§ 21
Performance
del
SQL
convencional
SELECT r.ename,r.sal,g.deptno,g.ave_dept,a.ave_all
FROM emp r
,(SELECT deptno,AVG(sal) ave_dept
FROM emp GROUP BY deptno) g
,(SELECT AVG(sal) ave_all
FROM emp) a
WHERE g.deptno = r.deptno
ORDER BY r.deptno;
-----------------------------------------------
| Id | Operation | Name | Rows |
-----------------------------------------------
| 0 | SELECT STATEMENT | | 15 |
| 1 | MERGE JOIN | | 15 |
| 2 | SORT JOIN | | 3 | 1M de empleados
| 3 | NESTED LOOPS | | 3 | 48.35 segundos
| 4 | VIEW | | 1 |
| 5 | SORT AGGREGATE | | 1 |
| 6 | TABLE ACCESS FULL| EMP | 14 |
| 7 | VIEW | | 3 |
| 8 | SORT GROUP BY | | 3 |
| 9 | TABLE ACCESS FULL| EMP | 14 |
|* 10 | SORT JOIN | | 14 |
| 11 | TABLE ACCESS FULL | EMP | 14 |
-----------------------------------------------
§ 22
Performance
del
SQL
analíEco
SELECT ename,sal,deptno
,AVG(sal) OVER (PARTITION BY deptno) ave_dept
,AVG(sal) OVER () ave_all
FROM emp;
-------------------------------------------
| Id | Operation | Name | Rows |
-------------------------------------------
| 0 | SELECT STATEMENT | | 14 |
| 1 | WINDOW SORT | | 14 | 1M de empleados
| 2 | TABLE ACCESS FULL| EMP | 14 | 21.20 segundos
-------------------------------------------
§ 23
CaracterísEca
3:
Funciones
AnalíEcas
Avanzadas
SELECT first_name, department_id, salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC ) RANK, --function Rank()
LAG(salary) OVER (PARTITION BY department_id ORDER BY salary DESC ) PREV_HIGH_SAL
-- function Lag()
FROM employees
WHERE department_id IN (10, 20,30,40)
ORDER BY 2, RANK;
§ 24
Ventana
en
expansión
Primera Partición (o todas las filas) OVER (ORDER BY col_name)
ROWS BETWEEN UNBOUNDED
Ventana
PRECEDING AND CURRENT ROW
Segunda Partición
§ 25
Ventana
deslizante
Primera Partición (o todas las filas) OVER (ORDER BY col_name)
Segunda Partición
§ 26
CaracterísEca
3:
Funciones
AnalíEcas
Avanzadas
SELECT first_name, department_id, salary,
AVG(salary) OVER (PARTITION BY department_id ORDER BY hire_date -- function AVG
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as AVG_SAL_PREV_NEXT_ROW
-- Window (additional partitioning)
FROM employees
WHERE department_id IN (10, 20,30,40)
ORDER BY department_id,manager_id;
§ 27
CaracterísEca
3:
Funciones
AnalíEcas
LAG
and
LEAD
§ Para comparar valores entre filas
§ LAG permite acceder una fila que se encuentra desplazada cierto número
de posiciones antes de la fila actual.
§ LEAD permite acceder una fila que se encuentra desplazada cierto
número de posiciones después de la fila actual.
{LAG | LEAD} ( value_expr [, offset] [, default] )
OVER ( [query_partition_clause] order_by_clause )
§ 28
CaracterísEca
3:
Funciones
AnalíEcas
LAG
and
LEAD
SELECT hiredate
,sal AS salary
,LAG(sal,1) OVER (ORDER BY hiredate) AS LAG1
,LEAD(sal,1) OVER (ORDER BY hiredate) AS LEAD1
FROM emp;
HIREDATE SALARY LAG1 LEAD1
--------- ---------- ---------- ----------
17-DEC-80 800 1600
20-FEB-81 1600 800 1250
22-FEB-81 1250 1600 2975 Comparación de salarios
02-APR-81 2975 1250 2850 entre empleados
01-MAY-81 2850 2975 2450
contratados alrededor de la
09-JUN-81 2450 2850 1500
08-SEP-81 1500 2450 1250 misma fecha
28-SEP-81 1250 1500 5000
17-NOV-81 5000 1250 950
03-DEC-81 950 5000 3000
03-DEC-81 3000 950 1300
23-JAN-82 1300 3000 3000
09-DEC-82 3000 1300 1100
12-JAN-83 1100 3000
§ 29
CaracterísEca
3:
Funciones
AnalíEcas
Avanzadas
Matriz de Compatibilidad
§ 30
CaracterísEca
4:
Funciones
de
Agrupación
Avanzadas
SELECT col1, col2,
• Agregar
a
diferentes
niveles
de
SUM(col3), COUNT(col4),…
granularidad
FROM table1, table2, …
• Group
by
Cube,
Rollup,
Grouping
WHERE <join condition>
Sets
GROUP BY ... {CUBE | ROLLUP|
GROUPING SETS}
• Agrupar
strings
usando
HAVING GROUPING (..)
delimitadores
con
LISTAGG
• Beneficios
– Reduce
número
bloques
leídos
SELECT
col1,
col2,
– Mayor
rendimiento
LISTAGG(expr)
– Simplificación
del
código
WITHIN
GROUP
(ORDER
BY
COL)
– No
necesita
afinamiento
OVER(PARTITION
BY
COL)
FROM table1, table2, …
WHERE <join condition>
§ 31
CaracterísEca
4:
Funciones
de
Agrupación
Avanzadas
–
LISTAGG
Ejemplo: listar los nombres de los empleados por departamento,
agregando los nombres de cada departamento en una sola fila
DEPTNO ENAME
--------- ----------
10 CLARK
10 KING
10 MILLER
20 ADAMS SQL> SELECT deptno, LISTAGG(ename, ',')
20 FORD WITHIN GROUP (ORDER BY ename) AS
20 JONES employees
20 SCOTT FROM emp
20 SMITH GROUP BY deptno;
30 ALLEN
30 BLAKE DEPTNO EMPLOYEES
30 JAMES ---------- ------------------------------
30 MARTIN 10 CLARK,KING,MILLER
30 TURNER 20 ADAMS,FORD,JONES,SCOTT,SMITH
30 WARD 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
3 rows selected.
§ 32
CaracterísEca
4:
Funciones
de
Agrupación
Avanzadas
–
LISTAGG
Ejemplo: listar en orden las columnas que forman parte de un índice
§ 33
CaracterísEca
4:
Funciones
de
Agrupación
Avanzadas
–
LISTAGG
Ejemplo: listar en orden las columnas que forman parte de un índice
SELECT table_name
,index_name
,LISTAGG(column_name,’;’) WITHIN GROUP (
ORDER BY column_position) “Column List”
FROM user_ind_columns
GROUP BY table_name
,index_name;
§ 34
CaracterísEca
4:
Funciones
de
Agrupación
Avanzadas
Group
by
tradicional
SELECT department_name, job_title, sum(salary)
FROM employees a, jobs b, departments c
WHERE a.job_id=b.job_id
AND a.department_id=c.department_id
AND c.department_name in ('Sales','IT')
GROUP BY department_name,job_title --aggregate by deptno and job
HAVING sum(salary)>25000
ORDER BY1,2
Un sólo
registro por
grupo
§ 35
CaracterísEca
4:
Funciones
de
Agrupación
Avanzadas
–
CUBE
y
ROLLUP
§ 36
El
operador
CUBE
City_id
Product_id
Sum_a
City1
product1
520
SELECT
city_id,
product_id,
City1
product2
230
SUM(amount)
as
sum_a
City1
product3
100
FROM
SALES
GROUP
BY
CUBE
(city_id,
product_id)
City1
ALL
850
City2
Product
1
10
City2
product2
15
City2
product3
10
§ Parte del SQL estándar, implementación de
City2
ALL
35
City3
Product
1
1000
ROLAP (Relational Online analytical Processing)
City3
product2
1200
City3
product3
1000
City3
ALL
3200
ALL
Product
1
1530
ALL
product2
1445
ALL
product3
1110
ALL
ALL
4085
El
operador
ROLLUP
City_id
Product_id
Sum_a
City1
Product
1
520
City1
product2
230
SELECT
city_id,
product_id,
City1
product3
100
SUM(amount)
as
sum_a
City1
ALL
850
FROM
SALES
City2
Product
1
10
GROUP
BY
ROLLUP
(city_id,
product_id)
City2
product2
15
City2
product3
10
City2
ALL
35
City3
Product
1
1000
City3
product2
1200
City3
product3
1000
City3
ALL
3200
ALL
ALL
4085
CaracterísEca
4:
Funciones
de
Agrupación
Avanzadas
-‐
Rollup
§ Para obtener subtotales por cada uno de las columnas en el Group by
§ 39
CaracterísEca
4:
Funciones
de
Agrupación
Avanzadas
Matriz de Compatibilidad
40
Resumen
§ 41