This commit is contained in:
2024-03-20 13:43:42 +01:00
parent 2f48dbdb45
commit 06fc0ee834
3 changed files with 298 additions and 26 deletions

View File

@@ -0,0 +1,114 @@
--COMBINAR DATOS DE DISTINTAS TABLAS
--JOIN se utilizan para combinar filas de dos o más tablas en función de una condición relacionada.
--empleados
| id_empleado | nombre | id_departamento |
|-------------|----------|-----------------|
| 1 | Juan | 1 |
| 2 | María | 1 |
| 3 | Pedro | 2 |
| 4 | Ana | 3 |
--departamentos
| id_departamento | nombre |
|-----------------|-------------|
| 1 | Ventas |
| 2 | Recursos Hum|
| 4 | Taller |
******************************************
--INNER JOIN solo las filas que tienen un valor común en ambas tablas(solo JOIN)
--ON condicion de unión
SELECT e.*, d.nombre AS nombre_departamento
FROM empleados e
INNER JOIN departamentos d ON e.id_departamento = d.id_departamento;
| id_empleado | nombre | id_departamento | nombre_departamento |
|-------------|--------|-----------------|--------------------|
| 1 | Juan | 1 | Ventas |
| 2 | María | 1 | Ventas |
| 3 | Pedro | 2 | Recursos Hum |
--**** Tienda
SELECT * FROM clientes
JOIN usuarios
ON clientes.cliente_id = usuarios.cliente_id;
--Tres tablas (orden de JOIN)
SELECT *
FROM clientes
INNER JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id
INNER JOIN detalles_pedido ON pedidos.pedido_id = detalles_pedido.pedido_id;
-- Devuelve los pedidos que tienen tanto información del cliente como detalles del pedido.
--Agrupando para obtener el total por pedido
SELECT clientes.nombre, pedidos.pedido_id, SUM(detalles_pedido.cantidad * detalles_pedido.precio_unitario) AS total
FROM clientes
INNER JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id
INNER JOIN detalles_pedido ON pedidos.pedido_id = detalles_pedido.pedido_id
GROUP BY pedidos.pedido_id;
************************************
--LEFT JOIN (o LEFT OUTER JOIN): Devuelve todas las filas de la tabla izquierda (primera tabla mencionada) y las filas coincidentes de la tabla derecha (segunda tabla mencionada). Si no hay coincidencias en la tabla derecha, se devuelven NULL en las columnas correspondientes.
SELECT e.*, d.nombre AS nombre_departamento
FROM empleados e
LEFT JOIN departamentos d ON e.id_departamento = d.id_departamento;
| id_empleado | nombre | id_departamento | nombre_departamento |
|-------------|--------|-----------------|--------------------|
| 1 | Juan | 1 | Ventas |
| 2 | María | 1 | Ventas |
| 3 | Pedro | 2 | Recursos Hum |
| 4 | Ana | 3 | null |
--**** Tienda
SELECT *
FROM clientes
LEFT JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id
LEFT JOIN detalles_pedido ON pedidos.pedido_id = detalles_pedido.pedido_id;
--Devolverá todos los clientes, incluso si no tienen ningún pedido registrado.
***********************************
--RIGHT JOIN (o RIGHT OUTER JOIN): Devuelve todas las filas de la tabla derecha (segunda tabla mencionada) y las filas coincidentes de la tabla izquierda (primera tabla mencionada). Si no hay coincidencias en la tabla izquierda, se devuelven NULL en las columnas correspondientes.
SELECT e.*, d.nombre AS nombre_departamento
FROM empleados e
RIGHT JOIN departamentos d ON e.id_departamento = d.id_departamento;
| id_empleado | nombre | id_departamento | nombre_departamento |
|-------------|--------|-----------------|--------------------|
| 1 | Juan | 1 | Ventas |
| 2 | María | 1 | Ventas |
| 3 | Pedro | 2 | Recursos Hum |
|null | null | 4 | Taller |
--**** Tienda
SELECT *
FROM clientes
RIGHT JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id
--Devolverá todos los pedidos, incluso si no están asociados con ningún cliente.
**************************************
--FULL JOIN (No soportado en MySQL): Devuelve todas las filas de ambas tablas, combinando las filas de ambas tablas donde sea posible. Si no hay coincidencias, se devuelven NULL en las columnas correspondientes.
SELECT e.*, d.nombre AS nombre_departamento
FROM empleados e
FULL JOIN departamentos d ON e.id_departamento = d.id_departamento;
| id_empleado | nombre | id_departamento | nombre_departamento |
|-------------|--------|-----------------|--------------------|
| 1 | Juan | 1 | Ventas |
| 2 | María | 1 | Ventas |
| 3 | Pedro | 2 | Recursos Hum |
| 4 | Ana | 3 | null |
|null | null | 4 | Taller |
--**** Tienda
SELECT *
FROM clientes
LEFT JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id
LEFT JOIN detalles_pedido ON pedidos.pedido_id = detalles_pedido.pedido_id
UNION
SELECT *
FROM clientes
RIGHT JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id
RIGHT JOIN detalles_pedido ON pedidos.pedido_id = detalles_pedido.pedido_id;