Continuando con el post anterior, vamos a código:
CONSULTAS MÚLTIPLES CON UNION Y UNION ALL
Este tipo de consultas nos permite unir los datos de dos o más tablas, con las únicas condiciones de que estas tengan la misma cantidad de columnas y que estas tengan los mismos tipos de datos. En este caso tenemos dos tablas de canciones de diferente genero musical:
canciones_rock
+------------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+--------------+------+-----+---------+-------+
| nombre_cancion | varchar(200) | YES | | NULL | |
| banda | varchar(200) | YES | | NULL | |
| reproducciones_cancion | int | YES | | NULL | |
+------------------------+--------------+------+-----+---------+-------+
y canciones_trap
+------------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+--------------+------+-----+---------+-------+
| nombre_cancion | varchar(200) | YES | | NULL | |
| artisa_cancion | varchar(200) | YES | | NULL | |
| reproducciones_cancion | int | YES | | NULL | |
+------------------------+--------------+------+-----+---------+-------+
Como vemos tienen tablas parecidas, pero no son exactamente iguales. Lo único que es es igual es el número de columnas y los tipos de datos aceptados, por lo que podemos hacer consultas con union:
SELECT * FROM canciones_trap UNION SELECT * FROM canciones_rock;
RESULTADO:
+----------------+-----------------+------------------------+
| nombre_cancion | artista_cancion | reproducciones_cancion |
+----------------+-----------------+------------------------+
| Colocao | Nicki Nicole | 2600334 |
| Bounce | Cazzu | 844334 |
| Atrevido | Trueno | 3454334 |
| Seek & Destroy | Metallica | 1888 |
| Breaking Away | Sumo | 102634 |
| London Calling | The Clash | 452634 |
| Control | Joy Division | 2252634 |
+----------------+-----------------+------------------------+
El único problema de usar solo UNION es que si queremos ver los datos en su totalidad(repetidos) no los va a mostrar, pero para eso tenemos la sentencia UNION ALL
SELECT * FROM canciones_trap UNION ALL SELECT * FROM canciones_rock;
RESULTADO:
+----------------+-----------------+------------------------+
| nombre_cancion | artista_cancion | reproducciones_cancion |
+----------------+-----------------+------------------------+
| Colocao | Nicki Nicole | 2600334 |
| Bounce | Cazzu | 844334 |
| Atrevido | Trueno | 3454334 |
| Colocao | Nicki Nicole | 2600334 |
| Seek & Destroy | Metallica | 1888 |
| Breaking Away | Sumo | 102634 |
| London Calling | The Clash | 452634 |
| Control | Joy Division | 2252634 |
+----------------+-----------------+------------------------+
CONSULTAS MULTITABLA CON JOIN
JOIN nos permite asociar y hacer consultas multitabla entre dos o más tablas a través de un campo en común como requisito.
Veamos unos ejemplos, tenemos la tabla usuarios que contiene los usuarios registrados en el sistema, y también tenemos la tabla pedidos que corresponde a los pedidos que hacen los usuarios a diferentes comercios(simulación de aplicacion tipo Rappi, PedidosYa, etc..)
Las dos tablas están relacionadas por un campo, en este caso es el campo de id del usuario, id en tabla usuarios y id_usuario en tabla de pedidos:
usuarios
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| nombre | varchar(30) | YES | | NULL | |
| apellido | varchar(30) | YES | | NULL | |
| edad | int | YES | | NULL | |
| id | int | NO | PRI | NULL | auto_increment |
+----------+-------------+------+-----+---------+----------------+
pedidos
+-----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+----------------+
| producto_pedido | varchar(200) | YES | | NULL | |
| comercio | varchar(200) | YES | | NULL | |
| id_usuario | int | YES | | NULL | |
| id | int | NO | PRI | NULL | auto_increment |
+-----------------+--------------+------+-----+---------+----------------+
Entonces nosotros queremos obtener los pedidos que hicieron los usuarios hasta ahora, tendríamos que hacerlo de la siguiente manera:
SELECT nombre, producto_pedido, comercio, id_usuario FROM usuarios INNER JOIN pedidos ON usu
arios.id = pedidos.id_usuario;
Primero seleccionamos los campos a los que queremos acceder(Puede ser de uno o más tablas), luego seleccionamos las tablas a las que vamos a pedir estos datos y con INNER JOIN seleccionamos la segunda tabla, por último a través de ON vamos a indicar cual es la columna con la que se relacionan las tablas.
RESULTADO:
+----------+---------------------+-----------------------+------------+
| nombre | producto_pedido | comercio | id_usuario |
+----------+---------------------+-----------------------+------------+
| Nahuel | Pepsi | KiosKito | 1 |
| Javier | Milanesa con papas | El rey de la milanesa | 3 |
| Nahuel | Papas Lays | 26HS | 1 |
| Francisco | Papas Lays | 26HS | 6 |
| Leticia | Pizza de Muzzarella | Pizza Vegana | 4 |
| Melisa | Cerveza Patagonia | Cervecera Lacerv | 8 |
+----------+---------------------+-----------------------+------------+
También podemos abreviar las tablas de la siguiente manera y obtener el mismo resultado:
SELECT nombre, producto_pedido, comercio, id_usuario FROM usuarios u INNER JOIN pedidos p ON u.id = p.id_usuario;
LEFT JOIN: Left join nos permite hacer una consulta entre dos tablas o más, y en el caso de que no exista datos o coincidencias entre la tabla izquierda(la primera que declaramos) y la tabla derecha(la segunda) mantendrá los datos de la tabla izquierda y mostrará null en todos o en algunos campos en los que no haya coincidencia, acá podemos ver una imagen que representa su funcionalidad:
SELECT nombre,producto_pedido, comercio, id_usuario FROM usuarios LEFT JOIN pedidos ON usuarios.id = pedidos.id_usuario;
RESULTADO:
+----------+---------------------+-----------------------+------------+
| nombre | producto_pedido | comercio | id_usuario |
+----------+---------------------+-----------------------+------------+
| Nahuel | Papas Lays | 26HS | 1 |
| Nahuel | Pepsi | KiosKito | 1 |
| Kevin | NULL | NULL | NULL |
| Javier | Milanesa con papas | El rey de la milanesa | 3 |
| Leticia | Pizza de Muzzarella | Pizza Vegana | 4 |
| Lorena | NULL | NULL | NULL |
| Francisco | Papas Lays | 26HS | 6 |
| Franco | NULL | NULL | NULL |
| Melisa | Cerveza Patagonia | Cervecera Lacerv | 8 |
+----------+---------------------+-----------------------+------------+
Como podemos ver nuestra consulta mantuvo todos los nombres de los usuarios(tabla izquierda), y nos trajo los datos del pedido con valores null, esto quiere decir que esos usuarios no realizaron pedidos
RIGHT JOIN: Funciona de la misma manera que LEFT JOIN pero invertido, mantenemos todas las columnas de la tabla derecha y si hay coincidencias con la tabla izquierda se van a mostrar, en el caso de que no la haya se mostrarán los valores de ese campo como null, al igual que con LEFT JOIN, abajo una imagen que muestra como funciona:
SELECT nombre,producto_pedido, comercio, id_usuario FROM usuarios RIGHT JOIN pedidos ON usuarios.id = pedidos.id_usuario;
RESULTADO:
+----------+---------------------+-----------------------+------------+
| nombre | producto_pedido | comercio | id_usuario |
+----------+---------------------+-----------------------+------------+
| Nahuel | Pepsi | KiosKito | 1 |
| Javier | Milanesa con papas | El rey de la milanesa | 3 |
| Nahuel | Papas Lays | 26HS | 1 |
| Francisco | Papas Lays | 26HS | 6 |
| Leticia | Pizza de Muzzarella | Pizza Vegana | 4 |
| Melisa | Cerveza Patagonia | Cervecera Lacerv | 8 |
+----------+---------------------+-----------------------+------------+
Como se puede ver, mantenemos todos los datos de la tabla derecha y cada pedido coincide con un nombre, por lo que solo van a salir los pedidos realizados.
Top comments (0)