Machete MySQL(Cheatsheet) level 2
Published: 2020-08-27 23:58:07

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

```sql
+------------------------+--------------+------+-----+---------+-------+
| 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

```sql 
+------------------------+--------------+------+-----+---------+-------+
| 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:

```sql
SELECT * FROM canciones_trap UNION SELECT * FROM canciones_rock;
```

RESULTADO:
```sql
+----------------+-----------------+------------------------+
| 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

```sql
SELECT * FROM canciones_trap UNION ALL  SELECT * FROM canciones_rock;
```

RESULTADO:
```sql
+----------------+-----------------+------------------------+
| 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
```sql
+----------+-------------+------+-----+---------+----------------+
| 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
```sql
+-----------------+--------------+------+-----+---------+----------------+
| 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:
```sql
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:

```sql
+----------+---------------------+-----------------------+------------+
| 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:
```sql
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:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/m96i68e1c0wpyl29p4sz.png)


```sql
SELECT nombre,producto_pedido, comercio, id_usuario FROM usuarios LEFT JOIN pedidos ON usuarios.id = pedidos.id_usuario;
```
RESULTADO:
```sql
+----------+---------------------+-----------------------+------------+
| 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:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/suommy9k1nrppnqs9yk8.png)

```sql
SELECT nombre,producto_pedido, comercio, id_usuario FROM usuarios RIGHT JOIN pedidos ON usuarios.id = pedidos.id_usuario;
```

RESULTADO: 
```sql
+----------+---------------------+-----------------------+------------+
| 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.