Course
Introducción a las uniones SQL
Durante tu análisis de datos en SQL, a menudo necesitarás consultar varias tablas y unirlas para obtener los resultados deseados. Unir tablas para analizar datos también es una habilidad necesaria para un científico de datos. En este tutorial, conocerás los distintos tipos de uniones que puedes realizar en PostgreSQL. Primero estudiarás los conceptos preliminares de las uniones en SQL, y después aprenderás sobre los distintos tipos de uniones y cuáles son sus sintaxis en PostgreSQL. Terminarás este tutorial ejecutando varios tipos de consultas de unión utilizando dos tablas. Para poder seguirlo, debes estar familiarizado con los fundamentos de SQL y con la forma de escribir consultas sencillas en PostgreSQL. Si buscas recursos para aprenderlos, los siguientes pueden ser útiles -
- Guía de PostgreSQL para principiantes
- Curso de Introducción a SQL para la Ciencia de Datos por DataCamp
Comencemos.
Configurar el entorno de la base de datos en PostgreSQL
Antes de estudiar los fundamentos de las uniones SQL, sería una buena idea crear algunas tablas para tus análisis. Necesitarás al menos dos tablas que tengan al menos una columna en común. Aunque puedes ejecutar consultas autounidas en la misma tabla, vamos a ignorar este hecho por el momento.
Puedes realizar todas las operaciones SQL en una herramienta llamada pgAdmin
que generalmente viene con la instalación de PostgreSQL. Abramos pgAdmin
y creemos una base de datos (ponle el nombre que quieras) para crear las tablas si no tienes una base de datos existente con la que proceder. A continuación, puedes crear las dos tablas siguientes con las especificaciones dadas -
- student_name (id, name)
- student_stream (id, stream)
Observa que ambas tablas tienen en común la columna id
. Puedes utilizar las siguientes sentencias CREATE
para crear las tablas -
- Para nombre_alumno -
CREATE TABLE student_name ( id smallint, name "char"[] );
- Para corriente_estudiante -
CREATE TABLE student_stream ( id smallint, stream "char"[] );
Ahora vamos a insertar algunos registros en las tablas.
- Para nombre_alumno -
INSERT INTO student_name(id, name) VALUES (1, 'Sayak');
INSERT INTO student_name(id, name) VALUES (2, 'Alex');
INSERT INTO student_name(id, name) VALUES (3, 'Sameer');
INSERT INTO student_name(id, name) VALUES (4, 'Rick');
- Para corriente_estudiante -
INSERT INTO student_stream(id, stream) VALUES (1, 'CS');
INSERT INTO student_stream(id, stream) VALUES (1, 'IT');
INSERT INTO student_stream(id, stream) VALUES (2, 'ECE');
INSERT INTO student_stream(id, stream) VALUES (9, 'ECE');
Las entradas de la tabla deberían ser como las siguientes en caso de que hayas ejecutado las consultas anteriores sin cambiar nada -
Ya tienes listas dos tablas sencillas. Pasemos ahora a estudiar los fundamentos de las uniones SQL.
Uniones SQL - Conceptos básicos
Las uniones SQL te permiten unir dos o más tablas (a veces sólo una) utilizando identificadores comunes. Toma como ejemplo las dos tablas anteriores que has creado: ambas tablas tienen en común la columna id
. Puedes cuestionarte la necesidad de unir en SQL. Discutámoslo brevemente.
Debido a las restricciones de normalización, puede que no tengas toda la información necesaria presente en una sola tabla. La normalización no sólo es deseable, sino también necesaria para mantener la coherencia, reducir la redundancia y evitar varias inserciones y anomalías de actualización. Considera de nuevo las dos tablas anteriores. Supongamos que quieres averiguar las ramas en las que se ha matriculado Sayak
. Para obtener la respuesta a esta pregunta, tendrás que unir las dos tablas (también se pueden utilizar subconsultas, pero no lo consideremos ahora) y luego proceder en consecuencia.
Para que dos tablas se unan tiene que haber algo en común entre ambas. ¿Significa esto que ambas tablas tienen que tener al menos una columna con el mismo nombre? ¿O qué es exactamente esta afección?
Puede que las tablas que quieras unir no tengan una columna con el mismo nombre, pero lógicamente deben ser iguales, es decir, sus tipos de datos deben ser los mismos. No puedes unir dos tablas que tengan una columna con el mismo nombre pero diferentes tipos de datos. Estudiemos ahora los distintos tipos de uniones SQL.
Diferentes tipos de uniones SQL
En esta sección, estudiarás varios tipos de Uniones SQL -
- INNER JOIN
- Autounión
- OUTER JOIN
- LEFT JOIN
- UNIÓN A LA DERECHA
- JOIN COMPLETO
- CROSS JOIN
- Semi-unión y Anti-unión
PostgreSQL proporciona palabras clave independientes para los tipos de uniones mencionados en mayúsculas. Estudiemos cada una de ellas una por una. Para ello, primero estudiarás las uniones visualmente, y luego ejecutarás las respectivas consultas de unión en PostgreSQL.
INNER JOIN
Echa un vistazo al siguiente diagrama para comprender visualmente INNER JOIN
-
En el ejemplo anterior, la columna considerada es la columna id
. INNER JOIN
ignorará el resto de columnas cuyos valores no sean comunes en ambas tablas. Ahora vamos a ejecutar una consulta en PostgreSQL que realizaría INNER JOIN
entre las dos tablas: nombre_alumno y flujo_alumno.
Al ejecutar la siguiente consulta, obtendrás el resultado que se muestra en la figura anterior -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
INNER JOIN student_stream AS s2
ON s1.id = s2.id;
s1
y s2
son los alias de las dos tablas. Has utilizado la palabra clave ON
junto con INNER JOIN
. La consulta también puede ejecutarse utilizando la palabra clave USING
-
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
INNER JOIN student_stream AS s2
USING (id);
La Autounión te permite realizar uniones de la misma tabla. Pero, ¿dónde puede ser una buena opción? Supongamos que tienes una tabla formada por las siguientes columnas -
- País
- Continente
Ahora quieres alistar dos países de forma que sus continentes sean iguales. La siguiente figura debería darte una idea de los resultados esperados -
OUTER JOIN
OUTER JOIN
pueden dividirse a su vez en tres tipos -
JOIN IZQUIERDO o JOIN exterior izquierdo: El siguiente diagrama te da una idea aproximada de LEFT JOIN
en SQL -
Ten en cuenta que, a diferencia de INNER JOIN
, LEFT JOIN
te trae los registros de la tabla izquierda (según el orden que especifiques en tu consulta) para los que no había ninguna entrada coincidente en la tabla derecha. Esto, a su vez, te indica que Sameer
y Rick
no se han inscrito en ninguna corriente. La consulta correspondiente será -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
LEFT JOIN student_stream AS s2
ON s1.id = s2.id;
RIGHT JOIN o Right Outer JOIN : RIGHT JOIN
es exactamente lo contrario de LEFT JOIN
-
RIGHT JOIN
puede ayudarte a encontrar la(s) corriente(s) en la(s) que no se ha matriculado ningún estudiante. La consulta para esto sería -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
RIGHT JOIN student_stream AS s2
ON s1.id = s2.id;
FULL JOIN o FULL Outer JOIN: FULL JOIN
te permite combinar LEFT JOIN
y RIGHT JOIN
en una única compilación -
La consulta correspondiente sería -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
FULL JOIN student_stream AS s2
ON s1.id = s2.id;
Ten en cuenta que puedes ejecutar todas las consultas anteriores de OUTER JOIN
utilizando la palabra clave USING
. Estudiemos ahora CROSS JOIN
.
CROSS JOIN
CROSS JOIN
es esencialmente el producto cartesiano entre dos elementos expresados mediante SQL. Supón que necesitas tener todas las combinaciones posibles entre dos tablas o incluso en una sola tabla. Necesitarás CROSS JOIN
para hacerlo. La siguiente figura presenta visualmente este concepto -
Ya tienes dos tablas para probarlo. Para disponer de todas las combinaciones posibles entre las columnas id
de las tablas student_name
y student_stream
, puedes ejecutar la siguiente consulta -
SELECT s1.id, s2.id
FROM student_name AS s1
CROSS JOIN student_stream AS s2;
Y obtienes el siguiente resultado -
Veamos ahora los otros dos tipos de unión para los que PostgreSQL no proporciona ninguna palabra clave directa.
Semi-unión y Anti-unión
Consideremos las tablas que creaste anteriormente en el tutorial:
Semi Join
Las consultas se ejecutan generalmente en forma de subconsultas en las que se recogen filas de la primera tabla con respecto a una condición (o un conjunto de condiciones) que coincide en la segunda tabla. Supongamos que la tabla de la izquierda es la primera tabla, y la tabla de la derecha es la segunda tabla.
Anti Join
las consultas son exactamente lo contrario. En Anti Join
, se recogen filas de la primera tabla con respecto a una condición (o un conjunto de condiciones) que no coincide en la segunda tabla. Aquí tienes un diagrama para que lo entiendas visualmente -
La consulta para realizar la Semi Join
sería -
select id, name
from student_name
where id IN
(select id from student_stream where stream
IN ('CS', 'IT', 'ECE'));
Del mismo modo, la consulta que realiza Anti Join
, en este caso, sería -
select id, name
from student_name
where id NOT IN
(select id from student_stream where stream
IN ('CS', 'IT', 'ECE'));
Observa el uso de NOT
en la consulta anterior.
Lleva tu destreza con las uniones SQL al siguiente nivel
Eso es todo por este tutorial. En este tutorial has estudiado un montón de tipos diferentes de Uniones SQL y también te has familiarizado con sus sintaxis PostgreSQL. Si quieres practicar algunos ejercicios desafiantes de Unir datos en SQL, deberías seguir el curso Unir datos en SQL de DataCamp. De hecho, se utilizaron materiales del curso como referencia para hacer este tutorial.
Hazme llegar tus preguntas en la sección Comments
.
Cursos de SQL
Course
Introducción a SQL
Course