
3.2 Consultas Avanzadas
Las consultas avanzadas permiten extraer y manipular datos que se encuentran en múltiples tablas, aprovechar las relaciones definidas entre ellas y realizar cálculos y filtros complejos. Aquí exploraremos los conceptos de Joins (uniones), Subconsultas, y Operaciones con Varias Tablas.
3.2.1 Joins: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN
Los Joins son la base para combinar datos de dos o más tablas en una consulta SQL. Dependiendo del tipo de Join que uses, puedes controlar cómo se combinan los datos y qué registros se devuelven en el resultado final.
3.2.1.1 INNER JOIN
El INNER JOIN devuelve solo las filas que tienen coincidencias en ambas tablas involucradas en la consulta. Es el tipo de Join más común.
Ejemplo:
Supongamos que tienes una tabla `clientes` y una tabla `pedidos`, y quieres obtener una lista de todos los pedidos junto con el nombre del cliente que los realizó:
SELECT clientes.nombre, pedidos.id, pedidos.fecha, pedidos.total
FROM clientes
INNER JOIN pedidos ON clientes.id = pedidos.id_cliente;
En este ejemplo:
- `INNER JOIN` combina las filas de `clientes` y `pedidos` donde `clientes.id` coincide con `pedidos.id_cliente`.
- Solo se devolverán los registros que tienen coincidencias en ambas tablas.
Resultado Esperado:
3.2.1.2 LEFT JOIN (o LEFT OUTER JOIN)
El LEFT JOIN devuelve todas las filas de la tabla de la izquierda (la primera tabla mencionada), y las filas coincidentes de la tabla de la derecha. Si no hay coincidencias, las columnas de la tabla de la derecha tendrán valores `NULL`.
Ejemplo:
Si quieres obtener una lista de todos los clientes, incluidos aquellos que no han realizado pedidos, puedes usar un `LEFT JOIN`:
SELECT clientes.nombre, pedidos.id, pedidos.fecha, pedidos.total
FROM clientes
LEFT JOIN pedidos ON clientes.id = pedidos.id_cliente;
En este caso:
- Se devuelven todos los registros de `clientes`.
- Si un cliente no tiene pedidos, las columnas relacionadas con `pedidos` serán `NULL`.
Resultado Esperado:
3.2.1.3 RIGHT JOIN (o RIGHT OUTER JOIN)
El RIGHT JOIN es similar al `LEFT JOIN`, pero devuelve todas las filas de la tabla de la derecha (la segunda tabla mencionada), y las filas coincidentes de la tabla de la izquierda. Si no hay coincidencias, las columnas de la tabla de la izquierda tendrán valores `NULL`.
Ejemplo:
Si quieres obtener una lista de todos los pedidos, incluidos aquellos que no tienen un cliente registrado (lo cual es raro, pero posible si hay errores en los datos), usarías un `RIGHT JOIN`:
SELECT clientes.nombre, pedidos.id, pedidos.fecha, pedidos.total
FROM clientes
RIGHT JOIN pedidos ON clientes.id = pedidos.id_cliente;
Resultado Esperado:
3.2.1.4 FULL JOIN (o FULL OUTER JOIN)
El FULL JOIN devuelve todas las filas cuando hay una coincidencia en cualquiera de las tablas. Si no hay coincidencias, se rellenan con `NULL` para las columnas que no tienen correspondencia en la otra tabla. MySQL no soporta nativamente `FULL JOIN`, pero se puede emular usando una combinación de `LEFT JOIN` y `RIGHT JOIN` con una cláusula `UNION`.
Ejemplo:
SELECT clientes.nombre, pedidos.id, pedidos.fecha, pedidos.total
FROM clientes
LEFT JOIN pedidos ON clientes.id = pedidos.id_cliente
UNION
SELECT clientes.nombre, pedidos.id, pedidos.fecha, pedidos.total
FROM clientes
RIGHT JOIN pedidos ON clientes.id = pedidos.id_cliente;
Este ejemplo une los resultados de ambos `LEFT JOIN` y `RIGHT JOIN`, emulando un `FULL JOIN`.
Resultado Esperado:
3.2.2 Subconsultas
Una subconsulta es una consulta anidada dentro de otra consulta. La subconsulta se ejecuta primero, y sus resultados se usan en la consulta exterior.
3.2.2.1 Subconsultas en la Cláusula WHERE
Las subconsultas en la cláusula `WHERE` permiten filtrar resultados basados en una consulta interna.
Ejemplo:
Supongamos que deseas obtener una lista de clientes que realizaron pedidos por más de 100:
SELECT nombre
FROM clientes
WHERE id IN (
SELECT id_cliente
FROM pedidos
WHERE total > 100
);
En este ejemplo:
- La subconsulta selecciona los `id_cliente` de la tabla `pedidos` donde el total del pedido es mayor a 100.
- La consulta externa selecciona los nombres de los clientes cuyos `id` están en el resultado de la subconsulta.
3.2.2.2 Subconsultas en la Cláusula SELECT
Las subconsultas también se pueden usar en la cláusula `SELECT` para calcular valores adicionales.
Ejemplo:
Si quieres listar todos los clientes junto con el total de sus pedidos:
SELECT nombre,
(SELECT SUM(total) FROM pedidos WHERE pedidos.id_cliente = clientes.id) AS total_pedidos
FROM clientes;
En este ejemplo:
- La subconsulta calcula la suma de todos los pedidos realizados por cada cliente y devuelve ese valor como una columna adicional en el resultado.
3.2.3 Operaciones con Varias Tablas
Además de los Joins y las subconsultas, MySQL permite realizar otras operaciones avanzadas cuando trabajas con varias tablas.
3.2.3.1 UNION y UNION ALL
La cláusula `UNION` combina los resultados de dos o más consultas `SELECT` en un solo conjunto de resultados. `UNION` elimina los duplicados por defecto, mientras que `UNION ALL` conserva todos los registros, incluidos los duplicados.
Ejemplo:
Supón que tienes dos tablas `clientes_A` y `clientes_B` y deseas obtener una lista combinada de todos los clientes:
SELECT nombre, email FROM clientes_A
UNION
SELECT nombre, email FROM clientes_B;
Si deseas incluir duplicados:
SELECT nombre, email FROM clientes_A
UNION ALL
SELECT nombre, email FROM clientes_B;
3.2.3.2 Self Join
Un Self Join es una técnica en la que una tabla se une a sí misma. Esto es útil para encontrar relaciones jerárquicas o comparar filas dentro de la misma tabla.
Ejemplo:
Imagina que tienes una tabla `empleados` con una columna `id_supervisor` que almacena el `id` del supervisor de cada empleado. Puedes usar un Self Join para listar los empleados junto con sus supervisores:
SELECT e1.nombre AS empleado, e2.nombre AS supervisor
FROM empleados e1
LEFT JOIN empleados e2 ON e1.id_supervisor = e2.id;
En este ejemplo:
- La tabla `empleados` se une a sí misma.
- `e1` representa al empleado y `e2` al supervisor.
Resumen
El punto 3.2 Consultas Avanzadas cubre técnicas esenciales para extraer y manipular datos en MySQL, especialmente cuando trabajas con múltiples tablas relacionadas. Aprenderás a usar diferentes tipos de Joins para combinar tablas, a aplicar subconsultas para realizar operaciones más complejas y a utilizar técnicas como `UNION` y Self Join para obtener resultados precisos y detallados. Estas habilidades son fundamentales para realizar análisis avanzados y desarrollar aplicaciones robustas que aprovechen al máximo la estructura de una base de datos relacional.
Clic para ver los demas Capitulos : MySQL desde Básico hasta Avanzado
No hay comentarios