DB - SQL Select & SQL For Analytics
DB - SQL Select & SQL For Analytics
SELECT
[Link]
Tooling de ejercitación
[Link]
SENTENCIA SELECT
❏ La sentencia SELECT se
utiliza para seleccionar datos
de una base de datos.
❏ Los datos devueltos se
almacenan en una tabla de
resultados, denominada
[Link]
result-set.
TABLAS DE EJEMPLO
Empleado Departamento
SELECT *
FROM empleado;
SELECT nro_emp
, nombre
, puesto
FROM empleado;
[Link]
SELECT
ORDER BY
❏ Cuando utilizamos la sentencia SELECT el orden en que aparecen
las filas resultantes puede no ser el esperado.
❏ En algunos casos, las filas que aparecen en el resultado están en el
orden en que se almacenan físicamente en la tabla. Sin embargo,
en caso de que el optimizador de consultas utilice un índice para
procesar la consulta, las filas aparecerán tal como están
almacenadas en el orden de la clave del índice. Por esta razón, el
orden de las filas en el conjunto de resultados es indeterminado o
impredecible.
❏ Para especificar exactamente el orden de las filas en el conjunto de
resultados, agregue una cláusula ORDER BY.
[Link]
SELECT
ORDER BY
SELECT [<nombre_columna>]
FROM <nombre_tabla>
ORDER BY [<nombre_columna> ASC|DESC]
SELECT *
FROM empleado
ORDER BY nombre, nro_emp;
SELECT nro_emp
, nombre
, puesto
FROM empleado
[Link]
SELECT [<nombre_columna>]
FROM <nombre_tabla>
LIMIT <cantidad_de_filas> OFFSET <filas_a_omitir>
[Link]
SELECT * FROM tabla
LIMIT 4 OFFSET 3;
OFFSET 3 LIMIT 4
…
1
7
SELECT * FROM tabla;
SELECT
LIMIT
[Link]
SELECT
LIMIT
SELECT *
FROM empleado
LIMIT 3;
SELECT *
FROM empleado
ORDER BY nombre
LIMIT 3;
SELECT *
FROM empleado
[Link]
SELECT [<nombre_columna>]
FROM <nombre_tabla>
WHERE <condicion>
[Link]
SELECT
OPERADORES DE COMPARACIÓN
❏ La forma más básica de filtrar datos es utilizar operadores
de comparación
Operador Significado
= Igual
!= Distinto
> Mayor
< Menor
SELECT *
FROM empleado
WHERE nombre != ‘Carlos’
SELECT *
FROM empleado
WHERE nro_emp != nro_depto
[Link]
SELECT
OPERADORES LÓGICOS
❏ Los operadores de comparación permiten filtrar datos según una
condición, aunque es probable que también queramos filtrar datos
mediante varias condiciones, posiblemente con más frecuencia de
la que desea filtrar por una sola condición. Los operadores lógicos
le permiten utilizar varios operadores de comparación en una
consulta.
Operador Significado
SELECT *
FROM empleado
WHERE nro_emp = 1 OR nombre != ‘Carlos’
SELECT *
FROM empleado
WHERE nro_emp = 1 OR nombre != ‘Carlos’ AND nombre != ‘Miguel’
[Link]
SELECT
BETWEEN
❏ El operador BETWEEN le permite seleccionar solo filas dentro de un
cierto rango, retornando verdadero si el valor está dentro del rango,
incluyendo los extremos.
❏ Los valores pueden ser números o fechas
SELECT *
FROM empleado
WHERE nro_emp BETWEEN 2 AND 6
[Link]
SELECT
IN
❏ El operador IN permite comparar un valor con un conjunto de
valores, retornando verdadero si el valor está dentro del conjunto de
valores.
<nombre_columna> IN ([<valor>])
SELECT *
FROM empleado
WHERE nro_depto IN (10, 20, 30)
[Link]
SELECT
LIKE
❏ El operador LIKE prueba si una expresión coincide con un patrón
específico.
❏ Si la expresión coincide con el patrón, el operador LIKE devuelve
verdadero. De lo contrario, devuelve falso.
❏ Para construir un patrón, usa dos caracteres comodín SQL:
❏ % el signo de porcentaje coincide con cero, uno o más
caracteres
❏ _ El signo de subrayado coincide con un solo carácter.
Expresión Sentido
LIKE '%are_' Contiene 'are', comienza con cualquier número de caracteres y termina con un
carácter
[Link]
LIKE '_are%' Contiene 'are', comienza con un carácter y termina con cualquier número de
caracteres
SELECT
WHERE - LIKE
SELECT *
FROM empleado
WHERE nombre LIKE ‘C%’
SELECT *
FROM empleado
WHERE nombre LIKE ‘%s’
SELECT *
FROM empleado
WHERE nombre LIKE ‘%_ar%’
[Link]
SELECT
NOT
❏ Para invertir el resultado de cualquier expresión booleana, utilice el
operador NOT.
NOT <expresion>
SELECT *
FROM empleado
WHERE nombre NOT LIKE ‘C%’
SELECT *
[Link]
FROM empleado
WHERE nro_depto NOT IN (10, 20, 30)
SELECT
IS NULL / IS NOT NULL
❏ Los valores nulos se tratan de forma diferente a otros valores. Null
se utiliza como marcador de valores desconocidos o inaplicables.
❏ Null != Null o Null != X? ⟹ Desconocido.
❏ Null = Null o Null = X? ⟹ Desconocido.
❏ Dado que los operadores devuelven desconocido al comparar
cualquier cosa con Nulo, SQL proporciona dos predicados de
comparación específicos de nulo: IS NULL y IS NOT NULL prueba si
los datos son o no nulos.
<nombre_columna> IS NULL
[Link]
SELECT [<nombre_tabla>.<nombre_columna>]
FROM <nombre_tabla>, <nombre_tabla>
SELECT Nro_Emp
1
Nro_Depto
10
PRODUCTO CARTESIANO 1 20
1 30
1 40
SELECT empleado.nro_emp 2 10
, departamento.nro_depto 2 20
2 40
3 10
Empleado Departamento
3 20
Nro_Emp … Nro_Depto …
1 ... 10 ... ⟹ 3
3
30
40
2 ... 20 ...
4 10
3 ... 30 ...
[Link]
4 20
4 ... 40 ...
4 30
4 40
SELECT
JOIN
❏ La palabra clave JOIN se usa en una instrucción SQL para consultar
datos de dos o más tablas, en función de una relación entre ciertas
columnas de estas tablas.
❏ INNER JOIN: Devuelve filas cuando hay al menos una coincidencia
en ambos tablas
❏ OUTER JOIN: Devuelve filas cuando hay una coincidencia en una de
las tablas
❏ LEFT OUTER JOIN: Devuelve todas las filas de la tabla de la izquierda,
incluso si no hay coincidencias en la tabla de la derecha.
❏ RIGHT OUTER JOIN: Devuelve todas las filas de la tabla derecha,
incluso si no hay coincidencias en la tabla de la izquierda.
❏
[Link]
FULL OUTER JOIN: Devuelve filas cuando hay una coincidencia en una
de las tablas.
SELECT
INNER JOIN
❏ La cláusula INNER JOIN aparece después de la cláusula FROM. La
condición para coincidir entre la tabla A y la tabla B se especifica
después de la palabra clave ON. Esta condición se llama condición
de unión, es decir, B.n = A.n
❏ La cláusula INNER JOIN puede unir tres o más tablas siempre que
tengan relaciones.
SELECT [<nombre_tabla>.<nombre_columna>]
FROM <nombre_tabla>
JOIN <nombre_tabla> ON <condicion_de_union>
[Link]
SELECT
INNER JOIN
[Link]
[Link]
SELECT
INNER JOIN
3
Bernardo
Carlos
...
...
30
10
20
30
I+D
Ventas
…
…
⟹ Bernardo
Carlos
Ventas
Contabilidad
[Link]
SELECT [<nombre_tabla>.<nombre_columna>]
FROM <nombre_tabla>
LEFT JOIN <nombre_tabla> ON <condicion_de_union>
SELECT [<nombre_tabla>.<nombre_columna>]
FROM <nombre_tabla>
RIGHT JOIN <nombre_tabla> ON <condicion_de_union>
SELECT [<nombre_tabla>.<nombre_columna>]
FROM <nombre_tabla>
[Link]
[Link]
SELECT
OUTER JOIN - FULL JOIN
[Link]
[Link]
SELECT
OUTER JOIN
SELECT [Link] nombre_depto
, [Link] nombre_emp
FROM departamento d
LEFT JOIN empleado e ON d.nro_depto = e.nro_depto
ORDER BY [Link], [Link]
Result set
Departamento Empleado
nombre_depto nombre_emp
Nro_Depto Nombre … Nro_emp Nombre … Nro_Depto
Contabilidad Alicia
10 Contabilidad … 1 Alicia ... 10
20
30
I+D
Ventas
…
…
2
3
Bernardo
Carlos
...
...
30
10
⟹ Contabilidad
I+D
Carlos
Miguel
[Link]
Operaciones NULL
40 Operaciones … 4 Miguel ... 20
Ventas Bernardo
SELECT
OUTER JOIN
SELECT [Link] nombre_depto
, [Link] nombre_emp
FROM empleado e
RIGHT JOIN departamento d ON e.nro_depto = d.nro_depto
ORDER BY [Link], [Link]
Result set
Empleado Departamento
nombre_depto nombre_emp
Nro_emp Nombre … Nro_Depto Nro_Depto Nombre …
Contabilidad Alicia
1 Alicia ... 10 10 Contabilidad …
3
Bernardo
Carlos
...
...
30
10
20
30
I+D
Ventas
…
…
⟹ Contabilidad
I+D
Carlos
Miguel
[Link]
Operaciones NULL
4 Miguel ... 20 40 Operaciones …
Ventas Bernardo
SELECT
CROSS JOIN
SELECT [<nombre_tabla>.<nombre_columna>]
FROM <nombre_tabla>
CROSS JOIN <nombre_tabla>
[Link]
SELECT
CROSS JOIN
[Link]
[Link]
SELECT
UNION
❏ El operador UNION combina conjuntos de resultados de dos o más
sentencias SELECT en un único conjunto de resultados, sin
repeticiones.
❏ Cada instrucción SELECT dentro de UNION debe tener el mismo
número de columnas. Las columnas también deben tener tipos de
datos similares. Además, las columnas de cada instrucción
SELECT deben estar en el mismo orden.
SELECT [<nombre_tabla>.<nombre_columna>]
FROM <nombre_tabla>
UNION
[Link]
SELECT [<nombre_tabla>.<nombre_columna>]
FROM <nombre_tabla>
SELECT
UNION
[Link]
[Link]
SELECT
INTERSECT
❏ El operador INTERSECT combina dos declaraciones de selección y
devuelve solo el conjunto de datos que es común en ambas
declaraciones. En pocas palabras, actúa como una intersección
matemática.
❏ Cada instrucción SELECT dentro de INTERSECT debe tener el
mismo número de columnas. Las columnas también deben tener
tipos de datos similares. Además, las columnas de cada
instrucción SELECT deben estar en el mismo orden.
SELECT [<nombre_tabla>.<nombre_columna>]
FROM <nombre_tabla>
INTERSECT
[Link]
SELECT [<nombre_tabla>.<nombre_columna>]
FROM <nombre_tabla>
SELECT
INTERSECT
[Link]
SELECT
EXCEPT
❏ El operador EXCEPT devuelve las distintas filas que están
presentes en el conjunto de resultados de la primera consulta pero
no en el conjunto de resultados de la segunda consulta. También se
le conoce como operador de diferencia de conjuntos.
❏ Cada instrucción SELECT dentro de EXCEPT debe tener el mismo
número de columnas. Las columnas también deben tener tipos de
datos similares. Además, las columnas de cada instrucción
SELECT deben estar en el mismo orden.
SELECT [<nombre_tabla>.<nombre_columna>]
FROM <nombre_tabla>
EXCEPT
[Link]
SELECT [<nombre_tabla>.<nombre_columna>]
FROM <nombre_tabla>
SELECT
FUNCIONES DE AGREGACIÓN
❏ Las funciones agregadas de SQL devuelve un solo valor,
calculado a partir de los valores en una columna.
❏ Las funciones de agregación más utilizadas son:
❏ AVG(): devuelve el valor promedio
❏ COUNT(): devuelve el número de filas
❏ MAX(): devuelve el valor más grande
❏ MIN(): devuelve el valor más pequeño
❏ SUM(): devuelve la suma de los valores
SELECT <funcion_agregacion>(<nombre_columna>)
FROM <nombre_tabla>
[Link]
[Link]
SELECT
AGRUPACIÓN - GROUP BY
❏ GROUP BY permite separar los datos en grupos, permitiendo
agregar independientemente unos de otros
❏ Por tanto, un conjunto de agrupación es un conjunto de columnas
por las que se agrupa mediante la cláusula GROUP BY.
GROUP BY nro_depto
SELECT
AGRUPACIÓN - GROUP BY
[Link]
[Link]
SELECT
AGRUPACIÓN - GROUP BY + HAVING
❏ Para agregar condiciones a las agrupaciones se agregó la cláusula
HAVING, la cual nos permite generar condiciones sobre la
agrupación utilizando funciones de agregación.
GROUP BY nro_depto
HAVING count(nro_emp) = 1
SELECT
AGRUPACIÓN - GROUP BY CUBE
❏ GROUP BY CUBE es similar al GROUP BY, pero nos permite obtener
los resultados agregados por cada columna de agrupación
❏
[Link]
El resultado nos traerá el total de empleados por cada departamento y puesto de trabajo, el total de
empleados por cada departamento, el total por cada puesto de trabajo, y el total de empleados.
SELECT
AGRUPACIÓN - GROUP BY ROLLUP
❏ GROUP BY ROLLUP es similar al GROUP BY, pero nos permite
obtener los resultados agregados por cada columna de agrupación
jerárquicamente.
❏
[Link]
El resultado nos traerá el total de empleados por cada departamento y puesto de trabajo, el total de
empleados por cada departamento, y el total de empleados.
SUBCONSULTA
[Link]
SELECT
SUBCONSULTA - COMPARACIÓN
[Link]
[Link]
SELECT
SUBCONSULTA - IN
[Link]
[Link]
SELECT
WITH
❏ La cláusula SQL WITH le permite dar un nombre a una subconsulta (un proceso
también llamado refactorización de subconsulta), al que se puede hacer
referencia en varios lugares dentro de la consulta SQL principal.
❏ La cláusula se utiliza para definir una relación temporal de modo que la salida
de esta relación temporal esté disponible y la utilice la consulta asociada a la
cláusula WITH.
❏ Las consultas que tienen una cláusula WITH asociada también se pueden
escribir mediante subconsultas anidadas, pero al hacerlo agrega más
complejidad para leer/depurar la consulta SQL.
WITH departamento_nombre AS (
SELECT nro_depto, nombre
FROM departamento
)
SELECT [Link] nombre_empleado, [Link] nombre_departamento
FROM employee e
[Link]
SELECT [<nombre_columna>]
FROM <nombre_tabla>
WHERE EXISTS <subconsulta>
SELECT e.*
FROM empleado e
WHERE EXISTS (SELECT 1
FROM departamento d
WHERE e.nro_depto = d.nro_depto)
[Link]
SELECT
CASE
❏ La declaración CASE es la forma en que SQL maneja la lógica si /
entonces (IF/THEN). La declaración CASE es seguida por al menos
un par de declaraciones WHEN y THEN.
❏ Puede utilizar la expresión CASE en instrucciones como SELECT ,
DELETE y UPDATE o en cláusulas como SELECT, ORDER BY y
HAVING.
∑ ∑
[Link]
SELECT
FUNCIONES DE VENTANA
<funcion_de_agregacion>(<expresion>)
OVER (PARTITION BY <nombre_columna>
ORDER BY <nombre_columna>
ROWS/RANGE <rango>)
❏ La cláusula OVER define las particiones de las ventanas para formar los grupos de
filas y especifica el orden de las filas en una partición.
❏ La cláusula PARTITION BY especifica cómo se dividen las filas en las que se
aplica la función de ventana (simil group by).
❏ La cláusula ORDER BY especifica el órden de las filas en una partición en la que
opera la función de ventana.
❏ La cláusula ROWS especifica el rango de filas (frame) en la que se aplicará la
función de ventana.
[Link]
Partición
Unbounded preceding
N preceding
Current row
M filas
/valores RANGE BETWEEN <primera_valor> AND <ultimo_valor>
M following
[Link]
Unbounded following
SELECT
FUNCIONES DE VENTANA
SELECT 'Day'
, 'Mile Driving'
, SUM('Miles Driving') OVER (ORDER BY 'Day') 'Running Total'
FROM 'Running total mileage visual';
[Link]
[Link]
SELECT
FUNCIONES DE VENTANA
SELECT 'Day'
, 'Daily Revenue'
, AVG('Daily Revenue') OVER (ORDER BY 'Day' ROWS 2 PRECEDING) '3 Day Average'
FROM 'Running Average Example';
[Link]
[Link]
SELECT
FUNCIONES DE VENTANA
SELECT 'Day'
, 'Weekend'
, 'Daily Revenue'
, SUM('Daily Revenue') OVER (PARTITION BY 'Weekend') 'Total'
FROM 'Partitioned Total Example';
[Link]
[Link]
SELECT
FUNCIONES DE VENTANA
❏ FIRST_VALUE(): devuelve el primer valor en un conjunto ordenado de valores
❏ LAG(): proporciona acceso a una fila en un desplazamiento físico específico
que viene antes de la fila actual
❏ LAST_VALUE(): devuelve el último valor en un conjunto ordenado de valores.
❏ LEAD(): proporciona acceso a una fila en un desplazamiento físico específico
que sigue a la fila actual.
❏ CUME_DIST(): calcula la distribución acumulada de valor dentro de un conjunto
de valores. Es decir, calcula la posición relativa de un valor en un grupo de
valores
❏ DENSE_RANK(): asigna filas a las filas de las particiones sin huecos en los
valores de clasificación. Si dos o más filas en cada partición tienen los mismos
valores, reciben el mismo rango. La siguiente fila tiene el rango aumentado en
[Link]
uno.
SELECT
FUNCIONES DE VENTANA
❏ NTILE(): permite dividir el conjunto de resultados en un número específico de
grupos aproximadamente iguales o buckets. Asigna a cada grupo un número de
bucket empezando por uno. Para cada fila de un grupo, la función NTILE()
asigna un número de bucket que representa el grupo al que pertenece la fila.
❏ PERCENT_RANK(): calcula el percentil rango de filas de un conjunto de
resultados.
❏ RANK(): asigna un ranking a cada fila en la partición de un conjunto de
resultados. El ranking de una fila está determinado por uno más el número de
ranking anteriores.
❏ ROW_NUMBER(): asigna un número entero secuencial para cada fila de
conjunto de resultados de la consulta.
[Link]
SELECT
FUNCIONES DE SQL - Character
Significado Campo
EXTRACT (<campo> FROM <expresion>)
Año YEAR
Mes MONTH
Hora HOUR
Minutos MINUTE
Segundos SECOND
[Link]
century hour
decade minute
DATE_TRUNC (‘day’, fecha_nacimiento)
year second
quarter millisecond
[Link]
month microsendond
week
SELECT
FUNCIONES DE SQL - Data type
❏ CAST: la función convierte un valor (de cualquier tipo) en un tipo de datos
especificado