DEV Community

Nahuel Segovia
Nahuel Segovia

Posted on • Edited on

2

Machete MySQL(Cheatsheet) level 2

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    |       |
+------------------------+--------------+------+-----+---------+-------+
Enter fullscreen mode Exit fullscreen mode

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    |       |
+------------------------+--------------+------+-----+---------+-------+
Enter fullscreen mode Exit fullscreen mode

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;
Enter fullscreen mode Exit fullscreen mode

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 |
+----------------+-----------------+------------------------+
Enter fullscreen mode Exit fullscreen mode

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;
Enter fullscreen mode Exit fullscreen mode

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 |
+----------------+-----------------+------------------------+
Enter fullscreen mode Exit fullscreen mode

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 |
+----------+-------------+------+-----+---------+----------------+
Enter fullscreen mode Exit fullscreen mode

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 |
+-----------------+--------------+------+-----+---------+----------------+
Enter fullscreen mode Exit fullscreen mode

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;
Enter fullscreen mode Exit fullscreen mode

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 |
+----------+---------------------+-----------------------+------------+
Enter fullscreen mode Exit fullscreen mode

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;
Enter fullscreen mode Exit fullscreen mode

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:

Alt Text

SELECT nombre,producto_pedido, comercio, id_usuario FROM usuarios LEFT JOIN pedidos ON usuarios.id = pedidos.id_usuario;
Enter fullscreen mode Exit fullscreen mode

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 |
+----------+---------------------+-----------------------+------------+
Enter fullscreen mode Exit fullscreen mode

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:

Alt Text

SELECT nombre,producto_pedido, comercio, id_usuario FROM usuarios RIGHT JOIN pedidos ON usuarios.id = pedidos.id_usuario;
Enter fullscreen mode Exit fullscreen mode

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 |
+----------+---------------------+-----------------------+------------+
Enter fullscreen mode Exit fullscreen mode

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)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay