SQL for Data Science
SQL for Data Science
Lenguaje: Tiene su propia sintaxis (reglas para ser escrito ) y sus propias palabras y
significado de esas palabras. Idioma que utilizamos para comunicarnos con esas bases
de datos.
Consultas: Todas las comunicaciones que vamos a establecer con las bases de datos a
través de su lenguaje estructurado son para hacerle consultas.
Ejemplo: Si queremos saber cuántos libros tienes que hayan sido publicados en 2016. Se
haría una consulta a la base de datos de libros para obtener esa información.
Programas para gestionar bases de datos:
MySQL
PostgreSQL
SQL Server
Base de datos: Colección de daros estructurada
Tipos de bases de datos
Bases de datos relacionales: Se organizan en tablas y se llaman relacionales porque
esas tablas pueden estar relacionadas entre si. Ejemplo: Una tabla de clientes y otra de
pedidos donde cada pedido está relacionado a un cliente en especifico
Bases de datos no relacionales o NoSQL: Bases menos estructuradas y por lo tanto
mucho más flexibles y que pueden almacenar datos en formatos muy distintos
Componentes principales de una base de datos
1. Tablas: Son el componente básico de una base de datos. Cada tabla de una base
de datos contiene datos sobre un tema en especifico como una tabla para datos
de clientes, otra para productos que se venden y otra para los pedidos de cada
compra que han hecho los clientes
2. Filas: Registro de cada caso que existe en una tabla. En una tabla de clientes, en
cada registro se tendría la información de un cliente en especifico
3. Columnas o campos: Atributo o propiedad de los datos, en la tabla de clientes
podemos tener columnas como nombre, apellido, email, teléfono, etc.
4. Claves primarias: Es uno de los campos o columnas de la tabla que sirve para
identificar de manera única cada fila en una tabla. Por ejemplo, en la tabla de
clientes, podría haber 2 registros de clientes llamados Carlos Gomez y esto
confundir, para eso necesitamos una clave principal que podría ser una columna
llamas “ID cliente” que contenga un número único para cada cliente.
¿Dónde vamos a escribir nuestro código SQL para comunicarnos con nuestras
bases de datos?
Los instrumentos que utilizamos para la comunicación con una base de datos
se llaman Sistemas de Gestión de Bases de Datos o DBMS Database
Mnagement System. Este software actúa como intermediario entre los usuarios y bases
de datos y disponen de todas las herramientas para poder crear, leer, actualizar y borrar
datos de manera amigable. Los DBMS más populares en el mercado son MySQL,
PostgreSQL y Oracle Database y Microsoft SQL Server entre otros.
Ahora que ya creamos una base de datos, lo que queremos es crear tablas
Creación de tablas
1. Nos situamos dentro de la opción de tablas en nuestra base de datos, hacemos
click derecho y “Create Table”
Y nos lo va a traducir a código SQL. Ahora ya podemos ver la tabla creada en Schemas
4. Creamos una última tabla llamada “comentarios” con los siguientes contenidos en
sus respectivas columnas. Comment ID, Post ID, User ID, Contenido y
FechaComentario.
Nos aparece el siguiente mensaje, pero solo debemos irnos a UserID que tenemos en
nuestra tabla de comentarios y lo transformamos a un número entero y li mismo con
PostID
5. Después de haber convertido a enteros, estos dos valores, nos regresamos a
Foreign Key y hacemos lo que estábamos intentando antes y ahora si nos dejará y
le damos Apply
6. Ahora agregamos la nueva clave foránea Post ID, relacionada con Publicaciones
y relacionamos PostID con Post ID .
Y ahora podemos hacer una prueba para que nos arroje los resultados de búsqueda que
queramos, como el siguiente ejemplo.
Ahora supongamos que solo queremos obtener EpisodioID, es decir, una sola columna. Y
se haría de la siguiente forma:
SELECT episodio_id FROM netflixdb.episodios
Es muy lógico, pero si quisiéramos expandir la consulta a más de una columna, solo
tenemos que agregar una coma entre las distintas columnas.
SELECT episodio_id, titulo, duracion FROM netflixdb.episodios
Nota: También podemos utilizar las sentencias SELECT, FROM, o las que sean en
minúscula pero por buenas prácticas no lo haremos. Ya que esto nos dará coherencia en
nuestro código y nos ahorrará trabajo al ser organizados en códigos más largos
Si queremos exportar los resultados de nuestra consulta, debemos seleccionar la opción
export y seleccionar donde queremos guardar nuestro archivo.
Clausula DISTICT
DISTICT Nos permite seleccionar valores únicos de una determinada columna. Hasta
ahora solo sabíamos seleccionar columnas completas o tablas completas, pero en
nuestros resultados de las consultas pasadas podíamos observar que los valores se
repetían aunque el resultado ya hubiera arrojado estos. Ejemplo: SELECT genero FROM
series
Y vemos que hay datos repetidos. Pero en el caso que queramos obtener géneros únicos,
debemos utilizar DISTICT y no los duplicados. De la siguiente forma.
SELECT DISCTICT genero FROM netflixdb.series
Y así obtendremos valores únicos de la columna género de la tabla netflixdb
Cláusula ORDER BY
ORDER BY nos ayuda a ordenar los datos que obtenemos a partir de una consulta. A
continuación se muestra una consulta donde se ve que queremos obtener los nombres de
los episodios de las series y su duración en minutos. Mostraremos dos ejemplos, uno sin
utilizar ORDER BY, en el que nos arroja resultados sin un orden y uno con ORDER BY en
el que nos organiza los resultados de mayor a menor duración.
SELECT titulo, duracion FROM netflixdb.episodios
SELECT titulo, duracion FROM netflixdb.episodios ORDER BY duracion DESC
Clausula WHERE
Nos ayuda a filtrar los resultados, es decir, definir una condición para solo obtener los
resultados que cumplan con la condición de que nosotros definamos.
Ejemplo: Queremos hacer una consulta en la tabla Series en la que queremos obtener
todas las series pero del género Drama. Para ese caso utilizaríamos el siguiente código:
SELECT * FROM Series WHERE Genero = ‘Drama’
Otro ejemplo: Queremos obtener datos de series que el año de lanzamiento sea mayor a
2010
SELECT * FROM Series WHERE año_lanzamiento > 2010
Operadores de Comparación
Los operadores de comparación se utilizan para comparar valores en una consulta. Son
fundamentales para establecer condiciones en clausulas como WHERE, permitiendo filtrar
los resultados en una consulta basada en dichas comparaciones, los operadores son los
siguientes:
= Igualdad
<> Desigualdad. Compara que los valores no sean iguales, es decir, tráeme solo
estos resultados si este campo es distinto a este otro campo
< Menor que. Comprueba si el valor de la izquierda es menor al valor de la
derecha
> Mayor que. Lo mismo pero viceversa
<= Menor igual que. Comprueba si el valor de la izquierda es enor o igual al de la
derecha
>= Mayor igual que. Viceversa
Ejemplo: Queremos obtener series que se lanzaron antes del año 2015. El código sería el
siguiente:
SELECT * FROM netflixdb.Series WHERE año_lanzamiento < 2015
Ejercicio: Queremos realizar una consulta en la que nos arroje únicamente título y año de
lanzamiento de Series después del 2020:
SELECT titulo, año_lanzamiento FROM netflixdb.Series WHERE año_lanzamiento > 2020
Operadores Lógicos
En algunos casos vamos a necesitar aplicar más de una sola condición y al mismo tiempo
definir como estas condiciones interactúan entre sí, para eso son los operadores lógicos,
los cuales son los siguientes:
AND: Lo utilizamos cuando queremos que se cumplan dos o más condiciones
Ejemplo: Queremos una consulta que solo nos arroje series que tengan una duración
de capítulos mayor a 30 y el rating de IMDB mayor a 8.
SELECT titulo, duracion, rating_imdb FROM netflixdb.episodios WHERE duracion >
30 AND rating_imdb > 8
OR: Lo utilizamos cuando queremos que se cumpla una u otra condición, no que
se cumplan las dos al mismo tiempo
NOT: Lo utilizamos cuando queremos que una condición no cumpla con ciertas
características
Nota: El comando NOT se utiliza con WHERE para incluir solo filas donde una
condición es verdadera
Ejemplo: Queremos encontrar los episodios que tengan una mayor duración a 45
minutos y un rating IMDB mayor o igual a 9
SELECT titulo, duracion, rating_imdb FROM netflixdb.episodios
WHERE duracion > 45 AND rating_imdb >= 9
Ejemplo 2: Queremos seleccionar series donde el genero sea comedia o animación
SELECT * FROM netflixdb.series
WHERE genero = 'Comedia'
OR genero = 'Animación'
Clausula IN/NOT IN
En SQL muchas veces podemos obtener el mismo resultado a través de caminos
distintos. Por ejemplo, haremos una consulta en la que obtendremos todas las series que
no sean de comedia, pero sin el operador de comparación <> y en cambio utilizando NOT
IN.
SELECT titulo, genero FROM netflixdb.series
WHERE genero NOT IN ('Comedia')
Si queremos obtener el resultado opuesto (solo las series dentro de comedia), debemos
cambiar NOT IN por IN
SELECT titulo, genero FROM netflixdb.series
WHERE genero IN ('Comedia')
Clausula LIKE
Imaginemos que queremos encontrar todas las series que contiene una “the” en su título,
es un escenario donde podemos utilizar LIKE.
La cláusula LIKE te permite utilizar patrones, utilizando caracteres comodín, los cuales
son % y LIKE encuentra esos caracteres en una determinada cadena de texto. Esto se
utiliza muy a menudo para analizar columnas que tengan contenido de texto.
Ejemplo:
SELECT titulo, genero, descripcion FROM netflixdb.series
WHERE titulo LIKE ('%The%')
Nota muy importante: Si solo colocamos un signo de porcentaje al final ‘The%’. SQL va a
seleccionar todas las entradas de la tabla series cuyos títulos comiencen con The.
Por otro lado, si nosotros colocamos el signo únicamente al principio ‘%The’, solamente
seleccionará todas las filas cuyo título terminen en The.
NOT IN hace lo contrario, busca entradas de datos que no contengan aquel carácter que
le estamos pidiendo.
Aquí realizaremos una consulta en la que queremos que nos arroje todos los títulos que
no contengan la letra ‘a’
SELECT titulo, genero, descripcion FROM netflixdb.series
WHERE titulo NOT LIKE ('%a%')
Funciones de Agregado
Son funciones esenciales para todo científico o analista de datos. Estas funciones nos
permiten realizar cálculos sobre un conjunto de valores y devolver un único valor.
Ejemplo: Queremos saber la duración total de contenido que hay en nuestra base de
datos
SELECT SUM(duracion)
FROM netflixdb.episodios
Nota: El título de esta columna se llama “SUM(duración”) poque nunca definimos ningún
nombre o alias a la operación. Pero en caso de que quisiéramos hacerlo, debemos utilizar
la cláusula AS después del SUM
Otro ejemplo: Pondremos una condición en la que cuente las filas en donde Serie id sea 2
SELECT COUNT(*) FROM netflixdb.episodios
WHERE serie_id = 2
Este resultado lo comprobamos quitando el COUNT y viendo como obtenemos 23 filas
como resultado
MAX
Dentro de COUNT también existe MAX, el cual nos ayuda a obtener el valor máximo de
una determinada columna.
Ejemplo: Queremos obtener el valor máximo de duración de los episodios con el id 2
SELECT MAX(duracion) FROM netflixdb.episodios
WHERE serie_id = 2
Otro ejemplo: Queremos obtener el promedio de duración de los episodios con serie_id 1
y2
SELECT AVG(duracion) FROM netflixdb.episodios
WHERE serie_id IN (1,2)
Clausula GROUP BY
Esta función agrupa resultados bajo valores únicos y es fundamental para comprender
como trabajar con datps agregados y proporciona una podetosa herramienta para el
análisis.
Agrupa filas que tienen los mismos valores en filas de resumen como “buscar la cantidad
de episodios de cada serie” .
Ejemplo: Queremos saber el promedio de duración para cada serie con ID 1 y 2 y obtener
el resultado con la leyenda “promedio” y utilizamos la última función aprendida (AVG)
únicamente
SELECT serie_id, AVG(duracion) AS promedio
FROM episodios
WHERE serie_id IN (1,2)
Esto nos arrojará un error y SQL nos dice que estamos corriendo una consulta de
agregación, pero sin agregar una columna de categoría (serie_id)
Aquí es donde entra GROUP BY. Escribiendo esta cláusula, agrupamos los resultados
por serie y vamos a obtener como resultado el promedio de la serie 1 y la serie 2.
Golden Rule: GROUP BY siempre debe estar acompañado del nombre de la columna a la
cual queremos agrupar
Ejemplo 2: Queremos que también nos de la suma
SELECT serie_id, AVG(duracion) AS promedio, SUM(duracion) AS suma_duracion
FROM netflixdb.episodios
WHERE serie_id IN (1,2)
GROUP BY serie_id
Nota super importante: El número que va a lado de GROUP BY, siempre será la columna
que estamos seleccionando. En este caso únicamente escribimos serie_id, por lo que el
número únicamente se puede poner 1. Si tuviera 2 columnas, escribo 1,2 en lugar de solo
2
Ejemplo 4: Queremos contar la cantidad de episodios que hay en cada uno de estas
series
SELECT serie_id, COUNT(episodio_id)
AS count_episodios
FROM netflixdb.episodios GROUP BY serie_id
Este GROUP BY está agrupando los resultados por serie_id, es decir, solamente vamos
a tener un valor único por cada serie existente y vamos a contar cuantos episodios hay en
cada una de estas series.
Podemos no poner el nombre de la columna y únicamente poner 1
SELECT serie_id, COUNT(episodio_id)
AS count_episodios
FROM netflixdb.episodios GROUP BY 1
El 1 hace referencia a la columna
Ejemplo 5: Queremos obtener por serie_id, cual es el valor máximo de duración de cada
una de las series
SELECT serie_id, MAX(duracion)
FROM netflixdb.episodios
GROUP BY 1
Obtuvimos el máximo de cada uno de los series_id.
Nota: Si cualquiera de los códigos de ejemplo que escribimos, no tuviera el GROUP BY,
estos no se podrían correr ya que la expresión que definimos al principio (serie_id) no
está agrupada
Ejercicio: Escribe una consulta SQL que seleccione el año de lanzamiento de las series
en la tabla Series , y cuenta el número de series lanzadas en cada año
Clausula HAVING
Nos permite filtrar datos agrupados en función de condiciones específicas. A diferencia de
WHERE que filtra filas antes de agruparlas, HAVING aplica el filtro después del
agrupamiento
Diferencias:
WHERE: Se puede usar con o sin GROUP BY ya que filtra filas antes de ser agrupadas
HAVING: Debe ir con GROUP BY
Ejemplo: Queremos encontrar todas las series de netflixbd que tienen más de 10
episodios en total
Nota: El WHERE siempre va antes del GROUP BY ya que afecta a las filas previo a
realizar cualquier tipo de agregación. Y solo se utiliza HAVING sobre funciones de
agregación como COUNT en este caso