SQL
This commit is contained in:
114
Practicas/Practicas_SQL/codigo/INTRO_SQL_comandos_DML_3_JOIN.sql
Normal file
114
Practicas/Practicas_SQL/codigo/INTRO_SQL_comandos_DML_3_JOIN.sql
Normal 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;
|
||||
Reference in New Issue
Block a user