Oracle_One-Alura_Latam/011_mysql/consultas_sql.md
2023-10-29 03:55:17 -03:00

2481 lines
74 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Consultas SQL
Avanzando en SQL con MySQL
### Importar tablas de ejemplo
[alura-repo](https://github.com/alura-es-cursos/1827-consultas-sql-avanzando-en-sql-con-my-sql.git)
> **WARNING:** Cambiar `COLLATE` de `utf8mb4_0900_ai_ci` a `uca1400_as_ci`
```sql
USE jugos_ventas;
```
## Consutas
```sql
DESC tabla_de_clientes;
+---------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+-------+
| DNI | varchar(11) | NO | PRI | NULL | |
| NOMBRE | varchar(100) | YES | | NULL | |
| DIRECCION_1 | varchar(150) | YES | | NULL | |
| DIRECCION_2 | varchar(150) | YES | | NULL | |
| BARRIO | varchar(50) | YES | | NULL | |
| CIUDAD | varchar(50) | YES | | NULL | |
| ESTADO | varchar(2) | YES | | NULL | |
| CP | varchar(8) | YES | | NULL | |
| FECHA_DE_NACIMIENTO | date | YES | | NULL | |
| EDAD | smallint(6) | YES | | NULL | |
| SEXO | varchar(1) | YES | | NULL | |
| LIMITE_DE_CREDITO | float | YES | | NULL | |
| VOLUMEN_DE_COMPRA | float | YES | | NULL | |
| PRIMERA_COMPRA | bit(1) | YES | | NULL | |
+---------------------+--------------+------+-----+---------+-------+
14 rows in set (0.005 sec)
```
### Consultar todos los datos
```sql
SELECT dni, nombre, direccion_1, direccion_2, barrio, ciudad, estado, cp,
fecha_de_nacimiento, edad, sexo, limite_de_credito, volumen_de_compra,
primera_compra
```
El equivalente sería `SELECT * FROM tabla_de_clientes;`
### Consultar algunos datos
```sql
SELECT dni, nombre FROM tabla_de_clientes;
SELECT dni AS Identificacion, nombre AS Cliente FROM tabla_de_clientes;
SELECT * FROM tabla_de_productos WHERE SABOR = 'Uva';
SELECT * FROM tabla_de_productos WHERE precio_de_lista < 16;
SELECT * FROM tabla_de_productos WHERE precio_de_lista > 16;
SELECT * FROM tabla_de_productos WHERE precio_de_lista BETWEEN 16 AND 16.02;
```
## Consultas condicionales
[Operadores SQL](https://www.tutorialspoint.com/sql/sql-operators.htm)
### Operadores lógicos
| Operator | Description |
| - | - |
| `ALL` | TRUE if all of a set of comparisons are TRUE |
| `AND` | TRUE if all the conditions separated by AND are TRUE |
| `ANY` | TRUE if any one of a set of comparisons are TRUE |
| `BETWEEN` | TRUE if the operand lies within the range of comparisons |
| `EXISTS` | TRUE if the subquery returns one or more records |
| `IN` | TRUE if the operand is equal to one of a list of expressions |
| `LIKE` | TRUE if the operand matches a pattern specially with wildcard |
| `NOT` | Reverses the value of any other Boolean operator |
| `OR` | TRUE if any of the conditions separated by OR is TRUE
| `IS NULL` | TRUE if the expression value is NULL |
| `SOME` | TRUE if some of a set of comparisons are TRUE |
| `UNIQUE` | The UNIQUE operator searches every row of a specified table for uniqueness (no duplicates) |
- **Operación OR**: El resultado de la operación es verdadero si **alguna** de
sus condiciones es verdadera
- **Operación AND**: El resultado de la operación es verdadero si **todas** sus
condiciones es verdadera
- **Operación NOR(NOT OR)**: Negación de la operación **OR**
- **Operación NAND(NOT AND)**: Negación de la operación **AND**
| Verdadero | Falso |
| :-: | :-: |
| 1 | 0 |
| A | B | OR | AND | NOR | NAND |
| :-: | :-: | :-: | :-: | :-: | :-: |
| 0 | 0 | 0 | 0 | 1 | 1 |
| 0 | 1 | 1 | 0 | 0 | 1 |
| 1 | 0 | 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 | 0 | 0 |
### Operadores de comparación
| Operadores | Descripción |
| - | - |
| `=` | Equal to |
| `!=` | Not equal |
| `<>` | Not equal |
| `>` | Greater than |
| `<` | Less than |
| `>=` | Greater than or equal to |
| `<=` | Less than or equal to |
| `!<` | Not less than |
| `!>` | Not greater than |
### Ejemplo
| A | B | A=B | A<=B |
| :-: | :-: | :-: | :-: |
| 3 | 5 | 0 | 1 | 0 | 1 |
| 5 | 23 | 0 | 1 | 0 | 1 |
| 7 | 7 | 1 | 1 | 1 | 1 |
| 2 | 70 | 0 | 1 | 0 | 1 |
| 87 | 85 | 0 | 0 | 0 | 0 |
| 69 | 43 | 0 | 0 | 0 | 0 |
| 21 | 1 | 0 | 0 | 0 | 0 |
| 4 | 2 | 0 | 0 | 0 | 0 |
| 9 | 9 | 1 | 1 | 1 | 1 |
```txt
NOT ((V AND F) OR NOT (F OR F))
NOT ((F) OR NOT (F))
NOT (F OR V)
NOT (V)
F
```
¿La sgte. expresión es Falsa o Verdadera?
```txt
(NOT ((3 > 2) OR (4 >= 5)) AND (5 > 4) ) OR (9 > 0)
```
Respuesta
```txt
(NOT ((3 > 2) OR (4 >= 5)) AND (5 > 4) ) OR (9 > 0)
(NOT ((V) OR (F)) AND (V) ) OR (V)
(NOT V AND V ) OR V
(NOT F) OR V
V OR V
V
```
### Creación de consultas condicionales
```sql
SELECT * FROM tabla_de_productos WHERE sabor='mango' AND tamano='470 ml';
```
```txt
+---------+--------+--------+-------+-------------------+------+
| 1078680 | Verano | 470 ml | Mango | Botella de Vidrio | 5.18 |
+---------+--------+--------+-------+-------------------+------+
```
```sql
SELECT * FROM tabla_de_productos WHERE sabor='mango' OR tamano='470 ml';
```
```txt
+---------------------+---------------------+------------+---------+-------------------+-----------------+
| CODIGO_DEL_PRODUCTO | NOMBRE_DEL_PRODUCTO | TAMANO | SABOR | ENVASE | PRECIO_DE_LISTA |
+---------------------+---------------------+------------+---------+-------------------+-----------------+
| 1051518 | Verano | 470 ml | Limón | Botella de Vidrio | 3.3 |
| 1078680 | Verano | 470 ml | Mango | Botella de Vidrio | 5.18 |
| 1086543 | Refrescante | 1 Litro | Mango | Botella PET | 11.01 |
...
```
```sql
SELECT * FROM tabla_de_productos WHERE NOT(sabor='mango') OR tamano='470 ml';
```
```txt
+---------------------+---------------------+------------+-----------------+-------------------+-----------------+
| CODIGO_DEL_PRODUCTO | NOMBRE_DEL_PRODUCTO | TAMANO | SABOR | ENVASE | PRECIO_DE_LISTA |
+---------------------+---------------------+------------+-----------------+-------------------+-----------------+
| 1000889 | Sabor da Montaña | 700 ml | Uva | Botella de Vidrio | 6.31 |
| 1002334 | Línea Citrus | 1 Litro | Lima/Limón | Botella PET | 7 |
| 1002767 | Vida del Campo | 700 ml | Cereza/Manzana | Botella de Vidrio | 8.41 |
| 1004327 | Vida del Campo | 1,5 Litros | Sandía | Botella PET | 19.51 |
...
```
```sql
SELECT * FROM tabla_de_productos WHERE NOT(sabor='mango' OR tamano='470 ml');
```
```txt
+---------------------+---------------------+------------+-----------------+-------------------+-----------------+
| CODIGO_DEL_PRODUCTO | NOMBRE_DEL_PRODUCTO | TAMANO | SABOR | ENVASE | PRECIO_DE_LISTA |
+---------------------+---------------------+------------+-----------------+-------------------+-----------------+
| 1000889 | Sabor da Montaña | 700 ml | Uva | Botella de Vidrio | 6.31 |
| 1002334 | Línea Citrus | 1 Litro | Lima/Limón | Botella PET | 7 |
| 1002767 | Vida del Campo | 700 ml | Cereza/Manzana | Botella de Vidrio | 8.41 |
| 1004327 | Vida del Campo | 1,5 Litros | Sandía | Botella PET | 19.51 |
...
```
```sql
SELECT * FROM tabla_de_productos WHERE NOT(sabor='mango' AND tamano='470 ml');
```
```txt
+---------------------+---------------------+------------+-----------------+-------------------+-----------------+
| CODIGO_DEL_PRODUCTO | NOMBRE_DEL_PRODUCTO | TAMANO | SABOR | ENVASE | PRECIO_DE_LISTA |
+---------------------+---------------------+------------+-----------------+-------------------+-----------------+
| 1000889 | Sabor da Montaña | 700 ml | Uva | Botella de Vidrio | 6.31 |
| 1002334 | Línea Citrus | 1 Litro | Lima/Limón | Botella PET | 7 |
| 1002767 | Vida del Campo | 700 ml | Cereza/Manzana | Botella de Vidrio | 8.41 |
| 1004327 | Vida del Campo | 1,5 Litros | Sandía | Botella PET | 19.51 |
| 1013793 | Vida del Campo | 2 Litros | Cereza/Manzana | Botella PET | 24.01 |
...
```
```sql
SELECT * FROM tabla_de_productos WHERE sabor='mango' AND NOT (tamano='470 ml');
```
```txt
+---------------------+---------------------+------------+-------+-------------------+-----------------+
| CODIGO_DEL_PRODUCTO | NOMBRE_DEL_PRODUCTO | TAMANO | SABOR | ENVASE | PRECIO_DE_LISTA |
+---------------------+---------------------+------------+-------+-------------------+-----------------+
| 1086543 | Refrescante | 1 Litro | Mango | Botella PET | 11.01 |
| 1096818 | Refrescante | 700 ml | Mango | Botella de Vidrio | 7.71 |
| 235653 | Verano | 350 ml | Mango | Lata | 3.86 |
| 326779 | Refrescante | 1,5 Litros | Mango | Botella PET | 16.51 |
+---------------------+---------------------+------------+-------+-------------------+-----------------+
```
### IN
```sql
SELECT * FROM tabla_de_productos WHERE sabor IN ('mango', 'uva');
```
```
+---------------------+---------------------+------------+-------+-------------------+-----------------+
| CODIGO_DEL_PRODUCTO | NOMBRE_DEL_PRODUCTO | TAMANO | SABOR | ENVASE | PRECIO_DE_LISTA |
+---------------------+---------------------+------------+-------+-------------------+-----------------+
| 1000889 | Sabor da Montaña | 700 ml | Uva | Botella de Vidrio | 6.31 |
| 1078680 | Verano | 470 ml | Mango | Botella de Vidrio | 5.18 |
| 1086543 | Refrescante | 1 Litro | Mango | Botella PET | 11.01 |
| 1096818 | Refrescante | 700 ml | Mango | Botella de Vidrio | 7.71 |
| 235653 | Verano | 350 ml | Mango | Lata | 3.86 |
| 326779 | Refrescante | 1,5 Litros | Mango | Botella PET | 16.51 |
+---------------------+---------------------+------------+-------+-------------------+-----------------+
```
```sql
SELECT nombre, direccion_1, ciudad, fecha_de_nacimiento as nacimiento, edad
FROM tabla_de_clientes
WHERE ciudad IN ('ciudad de México', 'Guadalajara')
AND (edad BETWEEN 20 AND 25);
```
```txt
+----------------+-----------------------------+-------------------+------------+------+
| NOMBRE | DIRECCION_1 | CIUDAD | NACIMIENTO | EDAD |
+----------------+-----------------------------+-------------------+------------+------+
| Abel Pintos | Carr. México-Toluca 1499 | Ciudad de México | 1995-06-11 | 25 |
| Joana Olivera | Pachuca 75 | Ciudad de México | 1995-02-14 | 25 |
| Luis Silva | Prol. 16 de Septiembre 1156 | Ciudad de México | 1995-04-07 | 25 |
| Edson Calisaya | Sta Úrsula Xitla | Ciudad de México | 1995-01-07 | 25 |
+----------------+-----------------------------+-------------------+------------+------+
```
## LIKE
```sql
SELECT * FROM tb WHERE campo LIKE ´%<condición´;
```
- `<condición>` el texto utilizado
- `%` Representa cualquier registro genérico antes de la condición (comodín)
### Ejemplo
| NOMBRE |
| :- |
| Miguel Suárez Diaz |
| Raul José Suárez |
| Manuela Diaz Avendaño |
| Mario García Rojas |
| Carlos Santiago Pérez |
| Daniela Suárez |
| Pedro González |
| Pablo Restrepo Villa |
| José Manuel Sánchez |
```sql
SELECT * FROM tb WHERE campo LIKE ´%suárez%´;
```
Retornaría: `Miguel Suárez Diaz`, `Raul José Suárez` y `Daniela Suárez`
```sql
SELECT * FROM tb WHERE campo LIKE ´%suárez´;
```
Retornaría: `Raul José Suárez` y `Daniela Suárez`
```sql
SELECT * FROM tabla_de_productos WHERE sabor LIKE '%manzana%' AND envase = 'botella pet';
```
```sql
+---------------------+---------------------+------------+----------------+-------------+-----------------+
| CODIGO_DEL_PRODUCTO | NOMBRE_DEL_PRODUCTO | TAMANO | SABOR | ENVASE | PRECIO_DE_LISTA |
+---------------------+---------------------+------------+----------------+-------------+-----------------+
| 1013793 | Vida del Campo | 2 Litros | Cereza/Manzana | Botella PET | 24.01 |
| 520380 | Pedazos de Frutas | 1 Litro | Manzana | Botella PET | 12.01 |
| 788975 | Pedazos de Frutas | 1,5 Litros | Manzana | Botella PET | 18.01 |
+---------------------+---------------------+------------+----------------+-------------+-----------------+
```
## DISTINCT
Devuelve solo registros con valores diferentes
| CAMPO_1 | CAMPO_2 |
| :-: | :-: |
| A | B |
| Z | C |
| Z | Q |
| A | B |
| E | R |
| T | E |
| Z | C |
| Z | Q |
| T | E |
```sql
SELECT DISTINCT * FROM tb;
```
Retorna:
| CAMPO_1 | CAMPO_2 |
| :-: | :-: |
| A | B |
| Z | C |
| Z | Q |
| E | R |
| T | E |
```sql
SELECT DISTINCT envase, tamano FROM tabla_de_productos;
```
```txt
+-------------------+------------+
| envase | tamano |
+-------------------+------------+
| Botella de Vidrio | 700 ml |
| Botella PET | 1 Litro |
| Botella PET | 1,5 Litros |
| Botella PET | 2 Litros |
| Lata | 350 ml |
| Botella de Vidrio | 470 ml |
+-------------------+------------+
```
```sql
SELECT DISTINCT envase, tamano, sabor FROM tabla_de_productos
-> WHERE sabor = 'naranja';
```
```txt
+-------------------+------------+---------+
| envase | tamano | sabor |
+-------------------+------------+---------+
| Botella PET | 2 Litros | Naranja |
| Botella de Vidrio | 470 ml | Naranja |
| Botella PET | 1 Litro | Naranja |
| Lata | 350 ml | Naranja |
| Botella PET | 1,5 Litros | Naranja |
+-------------------+------------+---------+
```
## LIMIT
Limita el númeo de registros devueltos
Ejm. limitar a 3 resultados
```sql
SELECT * FROM tb LIMIT 3;
```
Ejm. limitar a 3 resultados, a partir de indice 2
```sql
SELECT * FROM tb LIMIT 2,2;
```
```sql
SELECT codigo_del_producto, nombre_del_producto, tamano, sabor
FROM tabla_de_productos
LIMIT 5;
```
```txt
+---------------------+---------------------+------------+----------------+
| CODIGO_DEL_PRODUCTO | NOMBRE_DEL_PRODUCTO | TAMANO | SABOR |
+---------------------+---------------------+------------+----------------+
| 1000889 | Sabor da Montaña | 700 ml | Uva |
| 1002334 | Línea Citrus | 1 Litro | Lima/Limón |
| 1002767 | Vida del Campo | 700 ml | Cereza/Manzana |
| 1004327 | Vida del Campo | 1,5 Litros | Sandía |
| 1013793 | Vida del Campo | 2 Litros | Cereza/Manzana |
+---------------------+---------------------+------------+----------------+
```
```sql
SELECT codigo_del_producto, nombre_del_producto, tamano, sabor
FROM tabla_de_productos
LIMIT 2,5;
```
```txt
+---------------------+---------------------+------------+----------------+
| CODIGO_DEL_PRODUCTO | NOMBRE_DEL_PRODUCTO | TAMANO | SABOR |
+---------------------+---------------------+------------+----------------+
| 1002767 | Vida del Campo | 700 ml | Cereza/Manzana |
| 1004327 | Vida del Campo | 1,5 Litros | Sandía |
| 1013793 | Vida del Campo | 2 Litros | Cereza/Manzana |
| 1022450 | Festival de Sabores | 2 Litros | Asái |
| 1037797 | Clean | 2 Litros | Naranja |
+---------------------+---------------------+------------+----------------+
```
```sql
SELECT * FROM facturas WHERE fecha_venta = '2017/01/01' LIMIT 10;
```
```txt
+-------------+-----------+-------------+--------+----------+
| DNI | MATRICULA | FECHA_VENTA | NUMERO | IMPUESTO |
+-------------+-----------+-------------+--------+----------+
| 9283760794 | 00235 | 2017-01-01 | 54476 | 0.12 |
| 50534475787 | 00237 | 2017-01-01 | 54477 | 0.12 |
| 492472718 | 00235 | 2017-01-01 | 54478 | 0.12 |
| 3623344710 | 00235 | 2017-01-01 | 54479 | 0.12 |
| 94387575700 | 00236 | 2017-01-01 | 54480 | 0.1 |
| 94387575700 | 00235 | 2017-01-01 | 54481 | 0.12 |
| 9283760794 | 00237 | 2017-01-01 | 54482 | 0.1 |
| 2600586709 | 00235 | 2017-01-01 | 54483 | 0.1 |
| 9283760794 | 00235 | 2017-01-01 | 54484 | 0.1 |
| 5576228758 | 00237 | 2017-01-01 | 54485 | 0.12 |
+-------------+-----------+-------------+--------+----------+
```
## ORDER BY
```sql
SELECT codigo_del_producto AS codigo,
nombre_del_producto AS nombre,
precio_de_lista AS precio
FROM tabla_de_productos
ORDER BY precio_de_lista DESC
DESC LIMIT 10;
```
```txt
+---------+---------------------+--------+
| codigo | nombre | precio |
+---------+---------------------+--------+
| 1022450 | Festival de Sabores | 38.01 |
| 695594 | Festival de Sabores | 28.51 |
| 1013793 | Vida del Campo | 24.01 |
| 746596 | Light | 19.51 |
| 1004327 | Vida del Campo | 19.51 |
| 788975 | Pedazos de Frutas | 18.01 |
| 326779 | Refrescante | 16.51 |
| 1037797 | Clean | 16.01 |
| 231776 | Festival de Sabores | 13.31 |
| 838819 | Clean | 12.01 |
+---------+---------------------+--------+
```
```sql
SELECT codigo_del_producto AS codigo,
nombre_del_producto AS nombre,
precio_de_lista AS precio
FROM tabla_de_productos
ORDER BY precio_de_lista ASC,
nombre_del_producto DESC
DESC LIMIT 10;
```
```txt
+---------+-------------------+--------+
| codigo | nombre | precio |
+---------+-------------------+--------+
| 544931 | Verano | 2.46 |
| 812829 | Clean | 2.81 |
| 1051518 | Verano | 3.3 |
| 479745 | Clean | 3.77 |
| 235653 | Verano | 3.86 |
| 229900 | Pedazos de Frutas | 4.21 |
| 290478 | Vida del Campo | 4.56 |
| 1040107 | Light | 4.56 |
| 1041119 | Línea Citrus | 4.9 |
| 1042712 | Línea Citrus | 4.9 |
+---------+-------------------+--------+
```
***¿Cuál (o cuáles) fue (fueron) la(s) mayor(es) venta(s) del producto
“Refrescante, 1 Litro, Frutilla/Limón”, en cantidad?***
```sql
SELECT numero, codigo_del_producto, cantidad, precio, cantidad*precio as total
FROM items_facturas WHERE codigo_del_producto IN (
SELECT codigo_del_producto
FROM tabla_de_productos
WHERE nombre_del_producto = 'refrescante'
AND tamano = '1 litro'
AND sabor = 'frutilla/limón'
)
ORDER BY total DESC LIMIT 10;
```
```txt
+--------+---------------------+----------+---------+--------------------+
| numero | codigo_del_producto | cantidad | precio | total |
+--------+---------------------+----------+---------+--------------------+
| 83710 | 1101035 | 99 | 10.6324 | 1052.6075563430786 |
| 85301 | 1101035 | 99 | 10.6324 | 1052.6075563430786 |
| 87424 | 1101035 | 99 | 10.6324 | 1052.6075563430786 |
| 84674 | 1101035 | 99 | 10.6324 | 1052.6075563430786 |
| 85905 | 1101035 | 99 | 10.6324 | 1052.6075563430786 |
| 83818 | 1101035 | 99 | 10.6324 | 1052.6075563430786 |
| 84389 | 1101035 | 99 | 10.6324 | 1052.6075563430786 |
| 87209 | 1101035 | 99 | 10.6324 | 1052.6075563430786 |
| 81740 | 1101035 | 99 | 10.6324 | 1052.6075563430786 |
| 81765 | 1101035 | 98 | 10.6324 | 1041.9751567840576 |
+--------+---------------------+----------+---------+--------------------+
```
Analisis de la query
```sql
ANALYZE SELECT numero, codigo_del_producto, cantidad, precio, cantidad*precio as total
FROM items_facturas WHERE codigo_del_producto IN (
SELECT codigo_del_producto
FROM tabla_de_productos
WHERE nombre_del_producto = 'refrescante'
AND tamano = '1 litro'
AND sabor = 'frutilla/limón'
)
ORDER BY total DESC LIMIT 10;
+------+-------------+--------------------+------+---------------------+---------------------+---------+-----------------------------------------------------+------+---------+----------+------------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | r_rows | filtered | r_filtered | Extra |
+------+-------------+--------------------+------+---------------------+---------------------+---------+-----------------------------------------------------+------+---------+----------+------------+----------------------------------------------+
| 1 | PRIMARY | tabla_de_productos | ALL | PRIMARY | NULL | NULL | NULL | 35 | 35.00 | 100.00 | 2.86 | Using where; Using temporary; Using filesort |
| 1 | PRIMARY | items_facturas | ref | CODIGO_DEL_PRODUCTO | CODIGO_DEL_PRODUCTO | 42 | jugos_ventas.tabla_de_productos.CODIGO_DEL_PRODUCTO | 2743 | 7103.00 | 100.00 | 100.00 | |
+------+-------------+--------------------+------+---------------------+---------------------+---------+-----------------------------------------------------+------+---------+----------+------------+----------------------------------------------+
```
```sql
DESCRIBE SELECT numero, codigo_del_producto, cantidad, precio, cantidad*precio as total
FROM items_facturas WHERE codigo_del_producto IN (
SELECT codigo_del_producto
FROM tabla_de_productos
WHERE nombre_del_producto = 'refrescante'
AND tamano = '1 litro'
AND sabor = 'frutilla/limón'
)
ORDER BY total DESC LIMIT 10;
+------+-------------+--------------------+------+---------------------+---------------------+---------+-----------------------------------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+--------------------+------+---------------------+---------------------+---------+-----------------------------------------------------+------+----------------------------------------------+
| 1 | PRIMARY | tabla_de_productos | ALL | PRIMARY | NULL | NULL | NULL | 35 | Using where; Using temporary; Using filesort |
| 1 | PRIMARY | items_facturas | ref | CODIGO_DEL_PRODUCTO | CODIGO_DEL_PRODUCTO | 42 | jugos_ventas.tabla_de_productos.CODIGO_DEL_PRODUCTO | 2743 | |
+------+-------------+--------------------+------+---------------------+---------------------+---------+-----------------------------------------------------+------+----------------------------------------------+
```
## GROUP BY
| X | Y |
| :-: | :-: |
| A | 3 |
| Z | 5 |
| Z | 1 |
| A | 1 |
| E | 4 |
| T | 3 |
| Z | 8 |
| Z | 2 |
| T | 1 |
```sql
SELECT x, SUM(y) FROM tb GROUP BY X;
```
| X | Y |
| :-: | :-: |
| A | 4 |
| E | 4 |
| T | 4 |
| Z | 16 |
```sql
SELECT x, SUM(y) FROM tb;
28
```
### Funciones
Omitiendo el campo de agregación la operación se realiza sobre toda la tabla
| Funcion | Operación |
| - | - |
| `SUM()` | Suma |
| `MAX()` | Máximo |
| `MIN()` | Mínimo |
| `AVG()` | Promedio |
| `COUNT()` | Contador |
#### MAX
```sql
SELECT x, MAX(y) FROM tb GROUP BY X;
```
| X | Y |
| :-: | :-: |
| A | 3 |
| E | 4 |
| T | 3 |
| Z | 8 |
```sql
SELECT x, MAX(y) FROM tb;
8
```
#### MIN
```sql
SELECT x, MIN(y) FROM tb GROUP BY X;
```
| X | Y |
| :-: | :-: |
| A | 1 |
| E | 4 |
| T | 1 |
| Z | 1 |
```sql
SELECT x, MIN(y) FROM tb;
1
```
#### AVG
```sql
SELECT x, AVG(y) FROM tb GROUP BY X;
```
| X | Y |
| :-: | :-: |
| A | 2 |
| E | 4 |
| T | 2 |
| Z | 4 |
```sql
SELECT x, AVG(y) FROM tb GROUP BY X;
3.111
```
#### COUNT
```sql
SELECT x, COUNT(y) FROM tb GROUP BY X;
```
| X | Y |
| :-: | :-: |
| A | 2 |
| E | 1 |
| T | 2 |
| Z | 4 |
```sql
SELECT x, COUNT(y) FROM tb;
9
```
### Pruebas en la BD
```sql
SELECT estado, SUM(limite_de_credito) AS limite_total
FROM tabla_de_clientes
GROUP BY estado;
```
```txt
+--------+--------------+
| estado | limite_total |
+--------+--------------+
| EM | 1495000 |
| JC | 285000 |
+--------+--------------+
```
```sql
SELECT envase, MAX(precio_de_lista) AS precio_mayor
FROM tabla_de_productos
GROUP BY envase;
```
```txt
+-------------------+--------------+
| envase | precio_mayor |
+-------------------+--------------+
| Botella de Vidrio | 13.31 |
| Botella PET | 38.01 |
| Lata | 4.56 |
+-------------------+--------------+
```
```sql
SELECT envase, COUNT(*)
FROM tabla_de_productos
GROUP BY envase;
```
```txt
+-------------------+----------+
| envase | COUNT(*) |
+-------------------+----------+
| Botella de Vidrio | 13 |
| Botella PET | 16 |
| Lata | 6 |
+-------------------+----------+
```
```sql
SELECT barrio, SUM(limite_de_credito) AS limite
FROM tabla_de_clientes
WHERE ciudad = 'ciudad de méxico'
GROUP BY barrio;
```
```txt
+-------------------------+--------+
| barrio | limite |
+-------------------------+--------+
| Barrio del Niño Jesús | 150000 |
| Carola | 120000 |
| Condesa | 70000 |
| Contadero | 110000 |
| Cuajimalpa | 170000 |
| Del Valle | 420000 |
| Ex Hacienda Coapa | 60000 |
| Floresta Coyoacán | 200000 |
| Héroes de Padierna | 120000 |
| Locaxco | 75000 |
+-------------------------+--------+
```
```sql
SELECT estado, barrio, MAX(limite_de_credito) AS limite, edad
FROM tabla_de_clientes
WHERE edad >= 20
GROUP BY estado, barrio
ORDER BY edad;
```
```txt
+--------+-------------------------+--------+------+
| estado | barrio | limite | edad |
+--------+-------------------------+--------+------+
| EM | Contadero | 110000 | 25 |
| EM | Condesa | 70000 | 25 |
| EM | Cuajimalpa | 170000 | 25 |
| EM | Barrio del Niño Jesús | 150000 | 25 |
| JC | Barragán Hernández | 120000 | 26 |
| EM | Locaxco | 75000 | 26 |
| JC | Oblatos | 75000 | 26 |
| EM | Carola | 120000 | 29 |
| EM | Héroes de Padierna | 120000 | 29 |
| EM | Del Valle | 170000 | 30 |
| EM | Ex Hacienda Coapa | 60000 | 31 |
| EM | Floresta Coyoacán | 200000 | 37 |
+--------+-------------------------+--------+------+
```
***¿ Cuantas facturas existen que tengan la mayor cantidad del producto '1101035' ?***
```sql
SELECT COUNT(*) FROM items_facturas
WHERE cantidad=(
SELECT MAX(CANTIDAD)
FROM items_facturas
WHERE codigo_del_producto = '1101035'
)
and codigo_del_producto='1101035';
```
```txt
+----------+
| COUNT(*) |
+----------+
| 79 |
+----------+
```
## HAVING
Filtro que se aplica sobre el resultado de una agregación
| X | Y |
| :-: | :-: |
| A | 3 |
| Z | 5 |
| Z | 1 |
| A | 1 |
| E | 4 |
| T | 3 |
| Z | 8 |
| Z | 2 |
| T | 1 |
```sql
SELECT x, SUM(y) FROM tb
GROUP BY x
HAVING SUM(y)>4;
```
| X | Y |
| :-: | :-: |
| Z | 16 |
```sql
SELECT estado, SUM(limite_de_credito) AS limite_total
FROM tabla_de_clientes
GROUP BY estado
HAVING limite_total>500000;
```
```txt
+--------+--------------+
| estado | limite_total |
+--------+--------------+
| EM | 1495000 |
+--------+--------------+
```
```sql
SELECT envase, MAX(precio_de_lista) AS precio_mayor,
MIN(precio_de_lista) AS precio_menor
FROM tabla_de_productos
GROUP BY envase
HAVING SUM(precio_de_lista)>80;
```
```txt
+-------------------+--------------+--------------+
| envase | precio_mayor | precio_menor |
+-------------------+--------------+--------------+
| Botella de Vidrio | 13.31 | 3.3 |
| Botella PET | 38.01 | 7 |
+-------------------+--------------+--------------+
```
```sql
SELECT envase, MAX(precio_de_lista) AS precio_mayor,
MIN(precio_de_lista) AS precio_menor,
ROUND(SUM(precio_de_lista), 2)
FROM tabla_de_productos
GROUP BY envase
HAVING SUM(precio_de_lista)>80;
```
```txt
+-------------------+--------------+--------------+-------------+
| envase | precio_mayor | precio_menor | suma_precio |
+-------------------+--------------+--------------+-------------+
| Botella de Vidrio | 13.31 | 3.3 | 85.13 |
| Botella PET | 38.01 | 7 | 256.64 |
+-------------------+--------------+--------------+-------------+
```
```sql
SELECT envase, MAX(precio_de_lista) AS precio_mayor,
MIN(precio_de_lista) AS precio_menor,
ROUND(SUM(precio_de_lista), 2)
FROM tabla_de_productos
GROUP BY envase
HAVING SUM(precio_de_lista)>=80
AND precio_mayor >=38;
```
```txt
+-------------+--------------+--------------+-------------+
| envase | precio_mayor | precio_menor | suma_precio |
+-------------+--------------+--------------+-------------+
| Botella PET | 38.01 | 7 | 256.64 |
+-------------+--------------+--------------+-------------+
```
***¿ Cuales fueron los clientes que hicieron mas de 2000 compras en el 2016 ?***
```sql
SELECT dni, COUNT(*) FROM facturas
WHERE YEAR(fecha_venta) = 2016
GROUP BY dni
HAVING COUNT(*)>2000;
```
```txt
+-------------+----------+
| dni | COUNT(*) |
+-------------+----------+
| 3623344710 | 2012 |
| 492472718 | 2008 |
| 50534475787 | 2037 |
+-------------+----------+
```
## CASE
```sql
CASE
WHEN <condicion_1> THEN <valor_1>
WHEN <condicion_2> THEN <valor_2>
...
WHEN <condicion_n> THEN <valor_n>
ELSE <valor_por_defecto>
```
ej. Tabla `tb`
| X | Y |
| :-: | :-: |
| Cliente_1 | 8 |
| Cliente_2 | 6 |
| Cliente_3 | 3 |
| Cliente_4 | 10 |
| Cliente_5 | 5 |
| Cliente_6 | 7 |
| Cliente_7 | 1 |
| Cliente_8 | 2 |
| Cliente_9 | 1 |
```sql
CASE
WHEN y>=8 AND Y<=10 THEN 'Muy bueno'
WHEN y>=7 AND Y<8 THEN 'Bueno'
WHEN y>=5 AND Y<7 THEN 'Regular'
ELSE 'Inferior'
END
FROM tb;
```
Resultado:
| X | Y |
| :-: | :-: |
| Cliente_1 | Muy bueno |
| Cliente_2 | Regular |
| Cliente_3 | Inferior |
| Cliente_4 | Muy bueno |
| Cliente_5 | Regular |
| Cliente_6 | Bueno |
| Cliente_7 | Inferior |
| Cliente_8 | Inferior |
| Cliente_9 | Inferior |
```sql
SELECT nombre_del_producto, precio_de_lista,
CASE
WHEN precio_de_lista >= 12 THEN 'Caro'
WHEN precio_de_lista >= 5 AND precio_de_lista < 12 THEN 'Asequible'
ELSE 'Barato'
END as precio
FROM tabla_de_productos;
```
```txt
+---------------------+-----------------+-----------+
| nombre_del_producto | precio_de_lista | precio |
+---------------------+-----------------+-----------+
| Sabor da Montaña | 6.31 | Asequible |
| Línea Citrus | 7 | Asequible |
| Vida del Campo | 8.41 | Asequible |
| Vida del Campo | 19.51 | Caro |
| Vida del Campo | 24.01 | Caro |
| Festival de Sabores | 38.01 | Caro |
| Clean | 16.01 | Caro |
| Light | 4.56 | Barato |
| Línea Citrus | 4.9 | Barato |
...
```
```sql
SELECT envase, sabor,
CASE
WHEN precio_de_lista >= 12 THEN 'Caro'
WHEN precio_de_lista >= 5 AND precio_de_lista < 12 THEN 'Asequible'
ELSE 'Barato'
END as precio, MIN(precio_de_lista) AS precio_minimo
FROM tabla_de_productos
WHERE tamano = '700 ml'
GROUP BY envase,
CASE
WHEN precio_de_lista >= 12 THEN 'Caro'
WHEN precio_de_lista >= 5 AND precio_de_lista < 12 THEN 'Asequible'
ELSE 'Barato'
END
ORDER BY envase;
```
```txt
+-------------------+-------------+-----------+---------------+
| envase | sabor | precio | precio_minimo |
+-------------------+-------------+-----------+---------------+
| Botella de Vidrio | Uva | Asequible | 6.31 |
| Botella de Vidrio | Lima/Limón | Barato | 4.9 |
| Botella de Vidrio | Asaí | Caro | 13.31 |
+-------------------+-------------+-----------+---------------+
```
***Registrar el año de nacimiento de los clientes y clasifícar según:***
- Nacidos antes de 1990 = Mayores
- Nacidos entre 1990 y 1995= Adultos
- Nacidos después de 1995 = Jovenes
***Listar el nombre del cliente y la clasificación***
```sql
SELECT nombre,
CASE
WHEN YEAR(fecha_de_nacimiento) < 1990 THEN 'Mayor'
WHEN YEAR(fecha_de_nacimiento) >= 1990
AND YEAR(fecha_de_nacimiento) <= 1995 THEN 'Adulto'
ELSE 'Joven'
END AS rango_etario
FROM tabla_de_clientes;
```
```txt
+--------------------+--------------+
| nombre | rango_etario |
+--------------------+--------------+
| Erica Carvajo | Adulto |
| Marcos Rosas | Adulto |
| Jorge Castro | Adulto |
| Abel Pintos | Adulto |
| Joana Olivera | Adulto |
| Paolo Mendez | Adulto |
| Gabriel Roca | Mayor |
| Marcelo Perez | Adulto |
| Luis Silva | Adulto |
| Carlos Santivañez | Mayor |
| Alberto Rodriguez | Adulto |
| Edson Calisaya | Adulto |
| María Jimenez | Adulto |
| Walter Soruco | Mayor |
| Ximena Gómez | Adulto |
+--------------------+--------------+
```
## JOIN
Permite unir dos o más tablas a través de un campo en común
### Tabla A
| Nombre | Id |
| :-: | :-: |
| Alejandro | 2 |
| Zaida | 7 |
| Ximena | 8 |
| Elías | 10 |
| Tatiana | 15 |
| Penélope | 9 |
### Tabla B
| Id | Hobby |
| :-: | :-: |
| 4 | Lectura |
| 5 | Futbol |
| 6 | Tenis |
| 7 | Alpinismo |
| 8 | Fotografía |
| 9 | Hípica |
### INNER JOIN
Devuelve únicamente los registros con llaves correspondientes
```sql
SELECT A.nombre, B.hobby FROM tabla_izq A
INNER JOIN
tabla_der B
ON A.id = B.id
```
| Nombre | Hobby |
| :-: | :-: |
| Zaida | Alpinismo |
| Ximena | Fotografía |
| Penélope | Hípica |
### LEFT JOIN
Maniene todos los registros de la tabla izquierda **A** y devuelve únicamente
los correspondientes con la tabla de la derecha **B**
```sql
SELECT A.nombre, B.hobby FROM tabla_izq A
LEFT JOIN
tabla_der B
ON A.id = B.id
```
| Nombre | Hobby |
| :-: | :-: |
| Alejandro | `NULL` |
| Zaida | Alpinismo |
| Ximena | Fotografía |
| Elías | `NULL` |
| Tatiana | `NULL` |
| Penélope | Hípica |
### RIGHT JOIN
Maniene todos los registros de la tabla derecha **B** y devuelve únicamente los
correspondientes con la tabla de la izquierda **A**
```sql
SELECT A.nombre, B.hobby FROM tabla_izq A
RIGHT JOIN
tabla_der B
ON A.id = B.id
```
| Nombre | Hobby |
| :-: | :-: |
| `NULL`| Lectura |
| `NULL` | Futbol |
| `NULL` | Tenis |
| Zaida | Alpinismo |
| Ximena | Fotografía |
| Penélope | Hípica |
### FULL JOIN
Maniene todos los registros de las tablas
```sql
SELECT A.nombre, B.hobby FROM tabla_izq A
FULL JOIN
tabla_der B
ON A.id = B.id
```
| Nombre | Hobby |
| :-: | :-: |
| `NULL`| Lectura |
| `NULL` | Futbol |
| `NULL` | Tenis |
| Zaida | Alpinismo |
| Ximena | Fotografía |
| Penélope | Hípica |
| Alejandro | `NULL` |
| Elías | `NULL` |
| Tatiana | `NULL` |
### CROSS JOIN
Devuelve el prodcuto cartesiano de los registros de las tablas
```sql
SELECT A.nombre, B.hobby FROM tabla_izq A, tabla_der B
```
Devuelve 36 registros con todas las combinaciónes de todos los hobbies y nombres
| Nombre | Hobby |
| :-: | :-: |
| Alejandro | Lectura |
| Zaida | Lectura |
| Ximena | Lectura |
| Elías | Lectura |
| Tatiana | Lectura |
| Penélope | Lectura |
| Alejandro | Futbol |
| Zaida | Futbol |
| Ximena | Futbol |
| ... | ... |
### Prácticas JOIN
#### Práctica INNER JOIN
```sql
SELECT A.nombre, B.matricula, COUNT(*)
FROM tabla_de_vendedores A
INNER JOIN
facturas B
ON A.matricula = B.matricula
GROUP BY A.nombre, B.matricula;
```
```txt
+----------------------+-----------+----------+
| nombre | matricula | COUNT(*) |
+----------------------+-----------+----------+
| Claudia Morales | 00236 | 29375 |
| Concepción Martinez | 00237 | 29113 |
| Miguel Pavón Silva | 00235 | 29389 |
+----------------------+-----------+----------+
```
***Obtén la facturación anual de la empresa. Ten en cuenta que el valor
financiero de las ventas consiste en multiplicar la cantidad por el precio.***
Tablas y campos de interes
- `facturas`: `fecha_venta` y `numero`
- `items_facturas`: `numero`, `cantidad` y `precio`
```sql
SELECT YEAR(fecha_venta) as Periodo,
ROUND(SUM(cantidad*precio), 3) AS Facturacion
FROM facturas F
INNER JOIN
items_facturas IFa
ON F.numero = IFa.numero
GROUP BY Periodo
ORDER BY Periodo DESC;
```
```txt
+---------+--------------+
| Periodo | Facturacion |
+---------+--------------+
| 2018 | 11022282.826 |
| 2017 | 44359013.133 |
| 2016 | 42362119.436 |
| 2015 | 39848262.063 |
+---------+--------------+
```
#### Práctica LEFT y RIGHT JOIN
Clientes con compras con INNER JOIN
```sql
SELECT DISTINCT A.dni, A.nombre, B.dni
FROM tabla_de_clientes A
INNER JOIN
facturas B
ON A.dni = B.dni;
```
```txt
+-------------+--------------------+-------------+
| dni | nombre | dni |
+-------------+--------------------+-------------+
| 1471156710 | Erica Carvajo | 1471156710 |
| 3623344710 | Marcos Rosas | 3623344710 |
| 492472718 | Jorge Castro | 492472718 |
| 50534475787 | Abel Pintos | 50534475787 |
| 5576228758 | Joana Olivera | 5576228758 |
| 5648641702 | Paolo Mendez | 5648641702 |
| 5840119709 | Gabriel Roca | 5840119709 |
| 7771579779 | Marcelo Perez | 7771579779 |
| 8502682733 | Luis Silva | 8502682733 |
| 8719655770 | Carlos Santivañez | 8719655770 |
| 9283760794 | Edson Calisaya | 9283760794 |
| 94387575700 | María Jimenez | 94387575700 |
+-------------+--------------------+-------------+
```
Clientes con compras con **LEFT JOIN** y condición para encontrar clientes sin
compras
```sql
SELECT DISTINCT A.dni, A.nombre, B.dni
FROM tabla_de_clientes A
LEFT JOIN
facturas B
ON A.dni = B.dni;
WHERE B.dni IS NULL;
```
```txt
+-------------+-------------------+------+
| dni | nombre | dni |
+-------------+-------------------+------+
| 9275760794 | Alberto Rodriguez | NULL |
| 94387591700 | Walter Soruco | NULL |
| 95939180787 | Ximena Gómez | NULL |
+-------------+-------------------+------+
```
Clientes con compras con **RIGHT JOIN** y condición para encontrar clientes sin
compras
```sql
SELECT DISTINCT A.dni, B.dni, B.nombre
FROM facturas A
RIGHT JOIN tabla_de_clientes B
ON A.dni = B.dni
WHERE A.dni IS NULL;
```
```txt
+------+-------------+-------------------+
| dni | dni | nombre |
+------+-------------+-------------------+
| NULL | 9275760794 | Alberto Rodriguez |
| NULL | 94387591700 | Walter Soruco |
| NULL | 95939180787 | Ximena Gómez |
+------+-------------+-------------------+
```
#### Práctica CROSS e INNER JOIN
```sql
SELECT A.nombre, B.matricula, COUNT(*)
FROM tabla_de_vendedores A, facturas B
WHERE A.matricula = B.matricula
GROUP BY A.nombre, B.matricula;
```
```txt
+----------------------+-----------+----------+
| nombre | matricula | COUNT(*) |
+----------------------+-----------+----------+
| Claudia Morales | 00236 | 29375 |
| Concepción Martinez | 00237 | 29113 |
| Miguel Pavón Silva | 00235 | 29389 |
+----------------------+-----------+----------+
```
```sql
SELECT tabla_de_clientes.nombre AS nombre_cliente,
tabla_de_clientes.barrio as barrio_cliente,
tabla_de_vendedores.nombre as nombre_vendedor,
tabla_de_vendedores.barrio as barrio_vendedor
FROM tabla_de_clientes
INNER JOIN
tabla_de_vendedores
ON tabla_de_clientes.barrio = tabla_de_vendedores.barrio;
```
```txt
+-------------------+----------------+---------------------+-----------------+
| nombre_cliente | barrio_cliente | nombre_vendedor | barrio_vendedor |
+-------------------+----------------+---------------------+-----------------+
| Erica Carvajo | Del Valle | Claudia Morales | Del Valle |
| Marcos Rosas | Del Valle | Claudia Morales | Del Valle |
| Joana Olivera | Condesa | Miguel Pavón Silva | Condesa |
| Gabriel Roca | Del Valle | Claudia Morales | Del Valle |
| Luis Silva | Contadero | Concepción Martinez | Contadero |
| Alberto Rodriguez | Oblatos | Patricia Sánchez | Oblatos |
+-------------------+----------------+---------------------+-----------------+
```
**CROSS JOIN** utilizando `+0` para representar los **BIT**
```sql
SELECT tabla_de_clientes.nombre, tabla_de_clientes.ciudad, tabla_de_clientes.barrio,
tabla_de_vendedores.nombre, tabla_de_vendedores.vacaciones+0 AS vacaciones
FROM tabla_de_clientes, tabla_de_vendedores
WHERE tabla_de_clientes.barrio = tabla_de_vendedores.barrio;
```
```txt
+-------------------+------------------+-----------+---------------------+------------+
| nombre | ciudad | barrio | nombre | vacaciones |
+-------------------+------------------+-----------+---------------------+------------+
| Erica Carvajo | Ciudad de México | Del Valle | Claudia Morales | 1 |
| Marcos Rosas | Ciudad de México | Del Valle | Claudia Morales | 1 |
| Joana Olivera | Ciudad de México | Condesa | Miguel Pavón Silva | 0 |
| Gabriel Roca | Ciudad de México | Del Valle | Claudia Morales | 1 |
| Luis Silva | Ciudad de México | Contadero | Concepción Martinez | 1 |
| Alberto Rodriguez | Guadalajara | Oblatos | Patricia Sánchez | 0 |
+-------------------+------------------+-----------+---------------------+------------+
```
## UNION
Permite unir dos o más tablas (implícitamente ejecuta DISTINCT)
El número de campos en las tabls de ser iguales (mismos campos y tipos)
ej.
| Id | Hobby |
| :-: | :-: |
| 4 | Lectura |
| 5 | Futbol |
| 6 | Tenis |
| 7 | Alpinismo |
| Id | Hobby |
| :-: | :-: |
| 8 | Fotografía |
| 9 | Hípica |
| 5 | Futbol |
| 11 | Trote |
### Estructura UNION
```sql
<consulta_1>
UNION
<consulta_2>;
```
Retorna:
| Id | Hobby |
| :-: | :-: |
| 4 | Lectura |
| 5 | Futbol |
| 6 | Tenis |
| 7 | Alpinismo |
| 8 | Fotografía |
| 9 | Hípica |
| 11 | Trote |
### Estructura UNION ALL
```sql
<consulta_1>
UNION ALL
<consulta_2>;
```
Retorna:
| Id | Hobby |
| :-: | :-: |
| 4 | Lectura |
| 5 | Futbol |
| 6 | Tenis |
| 7 | Alpinismo |
| 8 | Fotografía |
| 9 | Hípica |
| 5 | Futbol |
| 11 | Trote |
### Práctica UNION
```sql
SELECT BARRIO FROM tabla_de_clientes
UNION
SELECT BARRIO FROM tabla_de_vendedores;
```
```txt
+-------------------------+
| BARRIO |
+-------------------------+
| Del Valle |
| Locaxco |
| Cuajimalpa |
| Condesa |
| Héroes de Padierna |
| Carola |
| Contadero |
| Floresta Coyoacán |
| Oblatos |
| Barrio del Niño Jesús |
| Barragán Hernández |
| Ex Hacienda Coapa |
| Alcalde Barranquitas |
+-------------------------+
```
```sql
SELECT barrio FROM tabla_de_clientes
UNION ALL
SELECT barrio FROM tabla_de_vendedores;
```
```txt
+-------------------------+
| BARRIO |
+-------------------------+
| Del Valle |
| Del Valle |
| Locaxco |
| Cuajimalpa |
| Condesa |
| Héroes de Padierna |
| Del Valle |
| Carola |
| Contadero |
| Floresta Coyoacán |
| Oblatos |
| Barrio del Niño Jesús |
| Barragán Hernández |
| Ex Hacienda Coapa |
| Alcalde Barranquitas |
| Condesa |
| Del Valle |
| Contadero |
| Oblatos |
+-------------------------+
```
```sql
SELECT barrio, nombre, 'Cliente' AS tipo, dni FROM tabla_de_clientes
UNION ALL
SELECT barrio, nombre, 'Vendedor' AS tipo, matricula FROM tabla_de_vendedores;
```
```txt
+-------------------------+----------------------+----------+-------------+
| barrio | nombre | tipo | dni |
+-------------------------+----------------------+----------+-------------+
| Del Valle | Erica Carvajo | Cliente | 1471156710 |
| Del Valle | Marcos Rosas | Cliente | 3623344710 |
| Locaxco | Jorge Castro | Cliente | 492472718 |
| Cuajimalpa | Abel Pintos | Cliente | 50534475787 |
| Condesa | Joana Olivera | Cliente | 5576228758 |
| Héroes de Padierna | Paolo Mendez | Cliente | 5648641702 |
| Del Valle | Gabriel Roca | Cliente | 5840119709 |
| Carola | Marcelo Perez | Cliente | 7771579779 |
| Contadero | Luis Silva | Cliente | 8502682733 |
| Floresta Coyoacán | Carlos Santivañez | Cliente | 8719655770 |
| Oblatos | Alberto Rodriguez | Cliente | 9275760794 |
| Barrio del Niño Jesús | Edson Calisaya | Cliente | 9283760794 |
| Barragán Hernández | María Jimenez | Cliente | 94387575700 |
| Ex Hacienda Coapa | Walter Soruco | Cliente | 94387591700 |
| Alcalde Barranquitas | Ximena Gómez | Cliente | 95939180787 |
| Condesa | Miguel Pavón Silva | Vendedor | 00235 |
| Del Valle | Claudia Morales | Vendedor | 00236 |
| Contadero | Concepción Martinez | Vendedor | 00237 |
| Oblatos | Patricia Sánchez | Vendedor | 00238 |
+-------------------------+----------------------+----------+-------------+
```
```sql
SELECT tabla_de_clientes.nombre, tabla_de_clientes.ciudad, tabla_de_clientes.barrio,
tabla_de_vendedores.nombre, vacaciones
FROM tabla_de_clientes
LEFT JOIN
tabla_de_vendedores
ON tabla_de_clientes.barrio = tabla_de_vendedores.barrio
UNION
SELECT tabla_de_clientes.nombre, tabla_de_clientes.ciudad, tabla_de_clientes.barrio,
tabla_de_vendedores.nombre, tabla_de_vendedores.vacaciones+0 AS vacaciones
FROM tabla_de_clientes
RIGHT JOIN
tabla_de_vendedores
ON tabla_de_clientes.barrio = tabla_de_vendedores.barrio;
```
```txt
+--------------------+-------------------+-------------------------+----------------------+------------+
| nombre | ciudad | barrio | nombre | vacaciones |
+--------------------+-------------------+-------------------------+----------------------+------------+
| Joana Olivera | Ciudad de México | Condesa | Miguel Pavón Silva | 0 |
| Erica Carvajo | Ciudad de México | Del Valle | Claudia Morales | 1 |
| Marcos Rosas | Ciudad de México | Del Valle | Claudia Morales | 1 |
| Gabriel Roca | Ciudad de México | Del Valle | Claudia Morales | 1 |
| Luis Silva | Ciudad de México | Contadero | Concepción Martinez | 1 |
| Alberto Rodriguez | Guadalajara | Oblatos | Patricia Sánchez | 0 |
| Jorge Castro | Ciudad de México | Locaxco | NULL | NULL |
| Abel Pintos | Ciudad de México | Cuajimalpa | NULL | NULL |
| Paolo Mendez | Ciudad de México | Héroes de Padierna | NULL | NULL |
| Marcelo Perez | Ciudad de México | Carola | NULL | NULL |
| Carlos Santivañez | Ciudad de México | Floresta Coyoacán | NULL | NULL |
| Edson Calisaya | Ciudad de México | Barrio del Niño Jesús | NULL | NULL |
| María Jimenez | Guadalajara | Barragán Hernández | NULL | NULL |
| Walter Soruco | Ciudad de México | Ex Hacienda Coapa | NULL | NULL |
| Ximena Gómez | Guadalajara | Alcalde Barranquitas | NULL | NULL |
+--------------------+-------------------+-------------------------+----------------------+------------+
```
## Subconsultas
Realizar una consulta al interior de otra
| X | Y |
| :-: | :-: |
| A | 3 |
| Z | 5 |
| Z | 1 |
| A | 1 |
| E | 4 |
| T | 3 |
| Z | 8 |
| Z | 2 |
| T | 1 |
| Y |
| :-: | :-: |
| 1 |
| 2 |
```sql
SELECT x, y FROM tb1
WHERE y IN (
SELECT Y FROM tb2
)
```
| X | Y |
| :-: | :-: |
| A | 3 |
| Z | 1 |
| A | 1 |
| T | 3 |
| Z | 2 |
| T | 1 |
```sql
SELECT x, SUM(y) AS new_y
FROM tb1 GROUP BY X
```
| X | NEW_Y |
| :-: | :-: |
| A | 4 |
| E | 4 |
| T | 4 |
| Z | 16 |
```sql
SELECT z.x, z.new_y FROM
(SELECT x SUM(y) AS new_y
FROM tb1 GROUP BY x) z
WHERE z.new_y = 4
```
| X | NEW_Y |
| :-: | :-: |
| A | 4 |
| E | 4 |
| T | 4 |
### Práctica Subconsultas
```sql
SELECT *, primera_compra+0 FROM tabla_de_clientes
WHERE barrio IN(
SELECT DISTINCT barrio FROM tabla_de_vendedores
);
```
```txt
+------------+-------------------+---------------------------------+-----------+-------------------+--------+----------+---------------------+------+------+-------------------+-------------------+------------------+
| DNI | NOMBRE | DIRECCION_1 | BARRIO | CIUDAD | ESTADO | CP | FECHA_DE_NACIMIENTO | EDAD | SEXO | LIMITE_DE_CREDITO | VOLUMEN_DE_COMPRA | primera_compra+0 |
+------------+-------------------+---------------------------------+-----------+-------------------+--------+----------+---------------------+------+------+-------------------+-------------------+------------------+
| 1471156710 | Erica Carvajo | Heriberto Frías 1107 | Del Valle | Ciudad de México | EM | 80012212 | 1990-03-01 | 30 | F | 170000 | 245000 | 1 |
| 3623344710 | Marcos Rosas | Av. Universidad | Del Valle | Ciudad de México | EM | 22002012 | 1995-05-13 | 26 | M | 110000 | 220000 | 0 |
| 5576228758 | Joana Olivera | Pachuca 75 | Condesa | Ciudad de México | EM | 88192029 | 1995-02-14 | 25 | F | 70000 | 160000 | 0 |
| 5840119709 | Gabriel Roca | Eje Central Lázaro Cárdenas 911 | Del Valle | Ciudad de México | EM | 80010221 | 1985-06-16 | 36 | M | 140000 | 210000 | 0 |
| 8502682733 | Luis Silva | Prol. 16 de Septiembre 1156 | Contadero | Ciudad de México | EM | 82122020 | 1995-04-07 | 25 | M | 110000 | 190000 | 1 |
| 9275760794 | Alberto Rodriguez | Circunvalación Oblatos 690 | Oblatos | Guadalajara | JC | 44700000 | 1991-12-28 | 26 | M | 75000 | 95000 | 1 |
+------------+-------------------+---------------------------------+-----------+-------------------+--------+----------+---------------------+------+------+-------------------+-------------------+------------------+
```
```sql
SELECT x.envase, x.precio_maximo
FROM (
SELECT envase, MAX(precio_de_lista) AS precio_maximo
FROM tabla_de_productos
GROUP BY envase
) x
WHERE x.precio_maximo >=10;
```
```txt
+-------------------+---------------+
| envase | precio_maximo |
+-------------------+---------------+
| Botella de Vidrio | 13.31 |
| Botella PET | 38.01 |
+-------------------+---------------+
```
***¿ Como hacer esta query usando subconsultas ?***
```sql
SELECT DNI, COUNT(*) FROM facturas
WHERE YEAR(FECHA_VENTA) = 2016
GROUP BY DNI
HAVING COUNT(*) > 2000;
```
```txt
+-------------+----------+
| DNI | COUNT(*) |
+-------------+----------+
| 3623344710 | 2012 |
| 492472718 | 2008 |
| 50534475787 | 2037 |
+-------------+----------+
```
```sql
SELECT X.DNI, X.CONTADOR
FROM (
SELECT DNI, COUNT(*) AS CONTADOR FROM facturas
WHERE YEAR(FECHA_VENTA) = 2016
GROUP BY DNI
) X WHERE X.CONTADOR > 2000;
```
## VIEWS
Una ***View*** es una tabla lógica que resulta de una consulta que puede ser
usada posteriormente en cualquier otra consulta.
La vista tiene un costo de procesamiento, cada vez que es invocada se ejecuta
su consulta.
| X | Y |
| :-: | :-: |
| A | 3 |
| Z | 5 |
| Z | 1 |
| A | 1 |
| E | 4 |
| T | 3 |
| Z | 8 |
| Z | 2 |
| T | 1 |
```sql
CREATE VIEW VW_VIEW AS
SELECT x, SUM(Y) AS new_Y
FROM tb1 GROUP BY x
```
VW_VIEW
| X | Y |
| :-: | :-: |
| A | 4 |
| E | 4 |
| T | 4 |
| Z | 16 |
Al almacenar una consulta, se crea una **VIEW**, en este caso llamada
**VW_VIEW**
tb3
| W | Y |
| :-: | :-: |
| F | 4 |
| H | 4 |
| H | 5 |
| G | 6 |
| F | 5 |
| P | 16 |
| L | 7 |
| M | 15 |
| N | 6 |
```sql
SELECT VW_VIEW.x, tb3.w FROM VW_VIEW
INNER JOIN
tb3 ON VW_VIEW.new_y = tb3.y
WHERE tb3.y = 16;
```
| X | W |
| :-: | :-: |
| Z | P |
### Prácticas VIEW
Creando la vista
```sql
CREATE VIEW vw_envases_grandes AS
SELECT envase, MAX(precio_de_lista) AS precio_maximo
FROM tabla_de_productos
GROUP BY envase;
SELECT * FROM vw_envases_grandes;
```
```txt
+-------------------+---------------+
| envase | precio_maximo |
+-------------------+---------------+
| Botella de Vidrio | 13.31 |
| Botella PET | 38.01 |
| Lata | 4.56 |
+-------------------+---------------+
```
Usando la vista
```sql
SELECT x.envase, x.precio_maximo
FROM vw_envases_grandes x
WHERE precio_maximo >=10;
```
```txt
+-------------------+---------------+
| envase | precio_maximo |
+-------------------+---------------+
| Botella de Vidrio | 13.31 |
| Botella PET | 38.01 |
+-------------------+---------------+
```
```sql
SELECT a.nombre_del_producto, a.envase, a.precio_de_lista,
b.precio_maximo
FROM tabla_de_productos a
INNER JOIN
vw_envases_grandes b
ON a.envase = b.envase;
```
```txt
+---------------------+-------------------+-----------------+---------------+
| nombre_del_producto | envase | precio_de_lista | precio_maximo |
+---------------------+-------------------+-----------------+---------------+
| Sabor da Montaña | Botella de Vidrio | 6.31 | 13.31 |
| Línea Citrus | Botella PET | 7 | 38.01 |
| Vida del Campo | Botella de Vidrio | 8.41 | 13.31 |
| Vida del Campo | Botella PET | 19.51 | 38.01 |
| Vida del Campo | Botella PET | 24.01 | 38.01 |
| Festival de Sabores | Botella PET | 38.01 | 38.01 |
| Clean | Botella PET | 16.01 | 38.01 |
...
```
```sql
SELECT a.nombre_del_producto, a.envase,
((a.precio_de_lista/b.precio_maximo)-1)*100 AS variacion_percent
FROM tabla_de_productos a
INNER JOIN
vw_envases_grandes b
ON a.envase = b.envase;
```
```txt
+---------------------+-------------------+---------------------+
| nombre_del_producto | envase | variacion_percent |
+---------------------+-------------------+---------------------+
| Sabor da Montaña | Botella de Vidrio | -52.59203798761971 |
| Línea Citrus | Botella PET | -81.58379292525673 |
| Vida del Campo | Botella de Vidrio | -36.81442838260782 |
...
```
## FUNCIONES
- MySQL Functions & Operators
[Doc](https://dev.mysql.com/doc/refman/8.0/en/built-in-function-reference.html)
- MySQL Functions en
[W3Schools](https://www.w3schools.com/mysql/mysql_ref_functions.asp)
- MariaDB [Functions](https://mariadb.com/kb/en/built-in-functions/) List
- MariaDB Functions & Operators
[Doc](https://mariadb.com/kb/en/function-and-operator-reference/)
- Diferencias entre funciones MySQL y
[MariaDB](https://mariadb.com/kb/en/function-differences-between-mariadb-11-1-and-mysql-8-0/)
### LTRIM
```sql
SELECT LTRIM(" TRIM IZQUIERDO ") AS LTRIM;
SELECT RTRIM(" TRIM DERECHO ") AS RTRIM;
SELECT TRIM(" TRIM GENERAL ") AS TRIM;
```
```txt
+---------------------+
| LTRIM |
+---------------------+
| TRIM IZQUIERDO |
+---------------------+
+------------------+
| RTRIM |
+------------------+
| TRIM DERECHO |
+------------------+
+--------------+
| TRIM |
+--------------+
| TRIM GENERAL |
+--------------+
```
### CONCAT
```sql
SELECT CONCAT("MySQL es entretenido,", " no lo crees?") AS CONCAT;
```
```txt
+------------------------------------+
| CONCAT |
+------------------------------------+
| MySQL es entretenido, no lo crees? |
+------------------------------------+
```
### UPPER, LOWER
```sql
SELECT UPPER("MySQL es entretenido") AS UPPER;
SELECT LOWER("MYSQL ES ENTRETENIDO") AS LOWER;
```
```txt
+----------------------+
| UPPER |
+----------------------+
| MYSQL ES ENTRETENIDO |
+----------------------+
+----------------------+
| LOWER |
+----------------------+
| mysql es entretenido |
+----------------------+
```
### SUBSTRING
```sql
SELECT SUBSTRING("MySQL es entretenido e interesante, bastante que aprender", 24, 11)
AS SUBSTRING;
```
```txt
+-------------+
| SUBSTRING |
+-------------+
| interesante |
+-------------+
```
### Práctica funciones
```sql
SELECT CONCAT(nombre, " ", dni) AS nombre_dni
FROM tabla_de_clientes;
```
```txt
+-------------------------------+
| nombre_dni |
+-------------------------------+
| Erica Carvajo 1471156710 |
| Marcos Rosas 3623344710 |
| Jorge Castro 492472718 |
| Abel Pintos 50534475787 |
| Joana Olivera 5576228758 |
...
```
***Crear una consulta listando nombre y dirección de cliente, con el detalle***
***de calle, barrio, ciudad y estado***
```sql
SELECT nombre, CONCAT(direccion_1, " ", barrio, " ", ciudad, " ", estado)
AS direccion
FROM tabla_de_clientes;
```
```txt
+---------------+--------------------------------------------------------+
| nombre | direccion |
+---------------+--------------------------------------------------------+
| Erica Carvajo | Heriberto Frías 1107 Del Valle Ciudad de México EM |
| Marcos Rosas | Av. Universidad Del Valle Ciudad de México EM |
| Jorge Castro | Federal México-Toluca 5690 Locaxco Ciudad de México EM |
...
```
## DATE FUNCTIONS
### ADDDATE, CURDATE
```sql
SELECT ADDDATE(CURDATE(), INTERVAL 5 YEAR);
```
```txt
+-------------------------------------+
| ADDDATE(CURDATE(), INTERVAL 5 YEAR) |
+-------------------------------------+
| 2028-10-16 |
+-------------------------------------+
```
### CURRENT_TIMESTAMP
```sql
SELECT CURRENT_TIMESTAMP();
```
```txt
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2023-10-16 14:47:58 |
+---------------------+
```
### DATE DATEDIFF
```sql
SELECT DATE("2023-10-16");
SELECT DATEDIFF("2025-12-02", CURDATE());
```
```txt
+--------------------+
| DATE("2023-10-16") |
+--------------------+
| 2023-10-16 |
+--------------------+
+-----------------------------------+
| DATEDIFF("2025-12-02", CURDATE()) |
+-----------------------------------+
| 778 |
+-----------------------------------+
```
### DATES NAMES
```sql
SELECT MONTHNAME(CURDATE()), DAYNAME(CURDATE()), TIME_TO_SEC(CURRENT_TIME());
```
```txt
+----------------------+--------------------+-----------------------------+
| MONTHNAME(CURDATE()) | DAYNAME(CURDATE()) | TIME_TO_SEC(CURRENT_TIME()) |
+----------------------+--------------------+-----------------------------+
| October | Monday | 53946 |
+----------------------+--------------------+-----------------------------+
```
```sql
SELECT CONCAT("Fecha y hora actual: ",
DATE_FORMAT(CURRENT_TIMESTAMP(), "%W, %d/%m/%Y, %T")) AS FECHA;
```
```txt
+---------------------------------------------------+
| FECHA |
+---------------------------------------------------+
| Fecha y hora actual: Monday, 16/10/2023, 15:49:02 |
+---------------------------------------------------+
```
### Práctica DATE FUNCTIONS
```sql
SELECT DISTINCT fecha_venta,
DAYNAME(fecha_venta) AS DIA,
MONTHNAME(fecha_venta) AS MES,
YEAR(fecha_venta) AS AÑO
FROM facturas;
```
```txt
+-------------+-----------+---------+------+
| fecha_venta | DIA | MES | AÑO |
+-------------+-----------+---------+------+
| 2015-01-01 | Thursday | January | 2015 |
| 2015-01-02 | Friday | January | 2015 |
| 2015-01-03 | Saturday | January | 2015 |
...
```
***Crear una consulta que muestre el nombre y la edad actual del cliente***
```sql
SELECT nombre, TIMESTAMPDIFF(YEAR, fecha_de_nacimiento, CURDATE()) AS edad
FROM tabla_de_clientes;
```
```txt
+--------------------+------+
| nombre | edad |
+--------------------+------+
| Erica Carvajo | 33 |
| Marcos Rosas | 28 |
| Jorge Castro | 28 |
...
```
## Funciones Matemáticas
### CEIL, FLOOR, ROUND
```sql
SELECT CEIL(25.01), FLOOR(25.99), ROUND(25.5), ROUND(25.456789, 2);
```
```txt
+-------------+--------------+-------------+---------------------+
| CEIL(25.01) | FLOOR(25.99) | ROUND(25.5) | ROUND(25.456789, 2) |
+-------------+--------------+-------------+---------------------+
| 26 | 25 | 26 | 25.46 |
+-------------+--------------+-------------+---------------------+
```
***Calcular el valor del impuesto pago en el año de 2016 redondeando al menor entero.***
Considerar:
- tabla de facturas -> impuesto
- tabla items_facturas -> cantidad y facturación
```sql
SELECT YEAR(fecha_venta) AS AÑO,
FLOOR(SUM(impuesto * (cantidad * precio))) AS TOTAL_IMPUESTOS
FROM facturas F
INNER JOIN items_facturas IFa ON F.numero = IFa.numero
WHERE YEAR(fecha_venta) = 2016
GROUP BY AÑO;
```
```txt
+------+-----------------+
| AÑO | TOTAL_IMPUESTOS |
+------+-----------------+
| 2016 | 4656937 |
+------+-----------------+
```
## CONVERT
- [MariaDB](https://mariadb.com/kb/en/convert/)
- [MySQL](https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_convert)
```sql
SELECT SUBSTRING(CONVERT(23.45, CHAR),3,1) AS RESULTADO;
```
```txt
+-----------+
| RESULTADO |
+-----------+
| . |
+-----------+
```
***Crear consulta que retorne el sgte. resultado por cliente***
`El cliente <nombre> compró <cantidad> en el año 2016`
```sql
SELECT CONCAT('El cliente ', TC.NOMBRE, ' compró $',
CONVERT(SUM(IFa.CANTIDAD * IFa.precio), CHAR(20))
, '.- el año ', CONVERT(YEAR(F.FECHA_VENTA), CHAR(20))) AS FRASE
FROM facturas F
INNER JOIN items_facturas IFa ON F.NUMERO = IFa.NUMERO
INNER JOIN tabla_de_clientes TC ON F.DNI = TC.DNI
WHERE YEAR(FECHA_VENTA) = 2016
GROUP BY TC.NOMBRE, YEAR(FECHA_VENTA);
```
```txt
+--------------------------------------------------------------------------+
| FRASE |
+--------------------------------------------------------------------------+
| El cliente Abel Pintos compró $3111017.9194583893.- el año 2016 |
| El cliente Carlos Santivañez compró $2827179.4774594307.- el año 2016 |
| El cliente Edson Calisaya compró $3076894.2775964737.- el año 2016 |
...
```
## Informes
### Compras por cliente, detalle DNI, MES-AÑO y COMPRAS
```sql
SELECT F.dni,
DATE_FORMAT(F.fecha_venta, "%m-%Y") AS mes_año,
I.cantidad
FROM facturas F
INNER JOIN
items_facturas I
ON F.numero = I.numero
ORDER BY cantidad;
```
```txt
+-------------+----------+----------+
| dni | mes_año | cantidad |
+-------------+----------+----------+
| 7771579779 | 01-2015 | 63 |
| 7771579779 | 01-2015 | 26 |
| 7771579779 | 01-2015 | 67 |
...
```
### Compras mensuales por cliente
```sql
SELECT F.dni,
DATE_FORMAT(F.fecha_venta, "%m-%Y") AS mes_año,
SUM(I.cantidad) AS VENTAS
FROM facturas F
INNER JOIN
items_facturas I
ON F.numero = I.numero
GROUP BY F.dni mes_año
ORDER BY mes_año;
```
```txt
+-------------+----------+--------+
| dni | mes_año | VENTAS |
+-------------+----------+--------+
| 50534475787 | 01-2015 | 23176 |
| 1471156710 | 01-2015 | 24316 |
| 5576228758 | 01-2015 | 21563 |
...
```
***Listar clientes con ventas inválidas y calcular diferencia entre el límite
de venta máximo y la cantidad vendida en porcentaje.***
```sql
SELECT
A.DNI, A.NOMBRE, A.MES_AÑO,
A.CANTIDAD_VENDIDA - A.CANTIDAD_MAXIMA AS DIFERENCIA,
CASE
WHEN (A.CANTIDAD_VENDIDA - A.CANTIDAD_MAXIMA) <= 0 THEN 'Venta Válida'
ELSE 'Venta Inválida'
END
AS STATUS_VENTA,
ROUND((1 - (A.CANTIDAD_MAXIMA/A.CANTIDAD_VENDIDA)) * 100,2) AS PORCENTAJE
FROM(
SELECT F.DNI,
TC.NOMBRE,
DATE_FORMAT(F.FECHA_VENTA, "%m - %Y") AS MES_AÑO,
SUM(IFa.CANTIDAD) AS CANTIDAD_VENDIDA,
MAX(VOLUMEN_DE_COMPRA)/10 AS CANTIDAD_MAXIMA
FROM facturas F
INNER JOIN
items_facturas IFa
ON F.NUMERO = IFa.NUMERO
INNER JOIN
tabla_de_clientes TC
ON TC.DNI = F.DNI
GROUP BY
F.DNI, TC.NOMBRE, DATE_FORMAT(F.FECHA_VENTA, "%m - %Y"))A
WHERE (A.CANTIDAD_MAXIMA - A.CANTIDAD_VENDIDA) < 0;
```
```txt
+-------------+--------------------+-----------+------------+-----------------+------------+
| DNI | NOMBRE | MES_AÑO | DIFERENCIA | STATUS_VENTA | PORCENTAJE |
+-------------+--------------------+-----------+------------+-----------------+------------+
| 1471156710 | Erica Carvajo | 05 - 2015 | 1885 | Venta Inválida | 7.14 |
| 1471156710 | Erica Carvajo | 06 - 2016 | 542 | Venta Inválida | 2.16 |
| 1471156710 | Erica Carvajo | 07 - 2017 | 1715 | Venta Inválida | 6.54 |
| 1471156710 | Erica Carvajo | 08 - 2015 | 426 | Venta Inválida | 1.71 |
| 3623344710 | Marcos Rosas | 01 - 2016 | 2876 | Venta Inválida | 11.56 |
...
```
***Listar solo clientes con ventas inválidas en el año 2018 excediendo más
del 50% de su límite permitido por mes.
Calcular el porcentaje de diferencia entre el límite de venta máximo y la
cantidad vendida.***
```sql
SELECT A.DNI, A.NOMBRE, A.MES_AÑO,
A.CANTIDAD_VENDIDA - A.CANTIDAD_MAXIMA AS DIFERENCIA,
CASE
WHEN (A.CANTIDAD_VENDIDA - A.CANTIDAD_MAXIMA) <= 0 THEN 'Venta Válida'
ELSE 'Venta Inválida'
END AS
STATUS_VENTA,
ROUND((1 - (A.CANTIDAD_MAXIMA/A.CANTIDAD_VENDIDA)) * 100,2) AS PORCENTAJE
FROM(
SELECT F.DNI,
TC.NOMBRE,
DATE_FORMAT(F.FECHA_VENTA, "%m - %Y") AS MES_AÑO,
SUM(IFa.CANTIDAD) AS CANTIDAD_VENDIDA,
MAX(VOLUMEN_DE_COMPRA)/10 AS CANTIDAD_MAXIMA
FROM facturas F
INNER JOIN
items_facturas IFa
ON F.NUMERO = IFa.NUMERO
INNER JOIN
tabla_de_clientes TC
ON TC.DNI = F.DNI
GROUP BY
F.DNI, TC.NOMBRE, DATE_FORMAT(F.FECHA_VENTA, "%m - %Y")) A
WHERE (A.CANTIDAD_MAXIMA - A.CANTIDAD_VENDIDA) < 0
AND ROUND((1 - (A.CANTIDAD_MAXIMA/A.CANTIDAD_VENDIDA)) * 100,2) > 50
AND A.MES_AÑO LIKE "%2018";
```
```txt
+-----------+--------------+-----------+------------+-----------------+------------+
| DNI | NOMBRE | MES_AÑO | DIFERENCIA | STATUS_VENTA | PORCENTAJE |
+-----------+--------------+-----------+------------+-----------------+------------+
| 492472718 | Jorge Castro | 02 - 2018 | 11219 | Venta Inválida | 54.15 |
| 492472718 | Jorge Castro | 03 - 2018 | 10789 | Venta Inválida | 53.18 |
+-----------+--------------+-----------+------------+-----------------+------------+
```
### Informe de ventas por sabor en el 2016
```sql
SELECT P.SABOR, SUM(I.CANTIDAD) AS TOTAL, YEAR(F.FECHA_VENTA) AS AÑO
FROM tabla_de_productos P
INNER JOIN items_facturas I
ON P.codigo_del_producto = I.codigo_del_producto
INNER JOIN facturas F
ON F.NUMERO = I.NUMERO
WHERE YEAR(F.FECHA_VENTA) = 2016
GROUP BY P.SABOR, YEAR(F.FECHA_VENTA)
ORDER BY SUM(I.CANTIDAD) DESC;
```
```txt
+-----------------+--------+------+
| SABOR | TOTAL | AÑO |
+-----------------+--------+------+
| Mango | 613309 | 2016 |
| Sandía | 487625 | 2016 |
| Naranja | 483663 | 2016 |
| Manzana | 363166 | 2016 |
| Maracuyá | 245456 | 2016 |
| Lima/Limón | 239634 | 2016 |
| Frutilla/Limón | 238118 | 2016 |
| Cereza/Manzana | 236535 | 2016 |
| Asaí | 235660 | 2016 |
| Asái | 121615 | 2016 |
| Uva | 120597 | 2016 |
| Cereza | 120478 | 2016 |
| Frutilla | 120384 | 2016 |
+-----------------+--------+------+
```
```sql
SELECT VENTAS_SABOR.SABOR,
VENTAS_SABOR.AÑO,
VENTAS_SABOR.CANTIDAD_TOTAL,
ROUND((VENTAS_SABOR.CANTIDAD_TOTAL/VENTA_TOTAL.CANTIDAD_TOTAL)*100,2)
AS PORCENTAJE
FROM (
SELECT P.SABOR,
SUM(IFa.CANTIDAD) AS CANTIDAD_TOTAL,
YEAR(F.FECHA_VENTA) AS AÑO
FROM tabla_de_productos P
INNER JOIN items_facturas IFa
ON P.CODIGO_DEL_PRODUCTO = IFa.CODIGO_DEL_PRODUCTO
INNER JOIN facturas F
ON F.NUMERO = IFa.NUMERO
WHERE YEAR(F.FECHA_VENTA) = 2016
GROUP BY P.SABOR, YEAR(F.FECHA_VENTA)
ORDER BY SUM(IFa.CANTIDAD) DESC
) VENTAS_SABOR
INNER JOIN (
SELECT SUM(IFa.CANTIDAD) AS CANTIDAD_TOTAL,
YEAR(F.FECHA_VENTA) AS AÑO
FROM tabla_de_productos P
INNER JOIN items_facturas IFa
ON P.CODIGO_DEL_PRODUCTO = IFa.CODIGO_DEL_PRODUCTO
INNER JOIN facturas F
ON F.NUMERO = IFa.NUMERO
WHERE YEAR(F.FECHA_VENTA) = 2016
GROUP BY YEAR(F.FECHA_VENTA)
) VENTA_TOTAL
ON VENTA_TOTAL.AÑO = VENTAS_SABOR.AÑO
ORDER BY VENTAS_SABOR.CANTIDAD_TOTAL DESC;
```
```txt
+-----------------+------+----------------+------------+
| SABOR | AÑO | CANTIDAD_TOTAL | PORCENTAJE |
+-----------------+------+----------------+------------+
| Mango | 2016 | 613309 | 16.91 |
| Sandía | 2016 | 487625 | 13.45 |
| Naranja | 2016 | 483663 | 13.34 |
| Manzana | 2016 | 363166 | 10.01 |
| Maracuyá | 2016 | 245456 | 6.77 |
| Lima/Limón | 2016 | 239634 | 6.61 |
| Frutilla/Limón | 2016 | 238118 | 6.57 |
| Cereza/Manzana | 2016 | 236535 | 6.52 |
| Asaí | 2016 | 235660 | 6.50 |
| Asái | 2016 | 121615 | 3.35 |
| Uva | 2016 | 120597 | 3.33 |
| Cereza | 2016 | 120478 | 3.32 |
| Frutilla | 2016 | 120384 | 3.32 |
+-----------------+------+----------------+------------+
```
El mismo ranking pero por tamaño
```sql
SELECT
VENTAS_TAMANO.TAMANO,
VENTAS_TAMANO.AÑO,
VENTAS_TAMANO.CANTIDAD_TOTAL,
ROUND((VENTAS_TAMANO.CANTIDAD_TOTAL/VENTA_TOTAL.CANTIDAD_TOTAL)*100,2)
AS PORCENTAJE
FROM (
SELECT P.TAMANO,
SUM(IFa.CANTIDAD) AS CANTIDAD_TOTAL,
YEAR(F.FECHA_VENTA) AS AÑO
FROM tabla_de_productos P
INNER JOIN items_facturas IFa
ON P.CODIGO_DEL_PRODUCTO = IFa.CODIGO_DEL_PRODUCTO
INNER JOIN facturas F
ON F.NUMERO = IFa.NUMERO
WHERE YEAR(F.FECHA_VENTA) = 2016
GROUP BY P.TAMANO, YEAR(F.FECHA_VENTA)
ORDER BY SUM(IFa.CANTIDAD) DESC
) VENTAS_TAMANO
INNER JOIN (
SELECT
SUM(IFa.CANTIDAD) AS CANTIDAD_TOTAL,
YEAR(F.FECHA_VENTA) AS AÑO
FROM tabla_de_productos P
INNER JOIN items_facturas IFa
ON P.CODIGO_DEL_PRODUCTO = IFa.CODIGO_DEL_PRODUCTO
INNER JOIN facturas F
ON F.NUMERO = IFa.NUMERO
WHERE YEAR(F.FECHA_VENTA) = 2016
GROUP BY YEAR(F.FECHA_VENTA)
) VENTA_TOTAL
ON VENTA_TOTAL.AÑO = VENTAS_TAMANO.AÑO
ORDER BY VENTAS_TAMANO.CANTIDAD_TOTAL DESC;
```
```txt
+------------+------+----------------+------------+
| TAMANO | AÑO | CANTIDAD_TOTAL | PORCENTAJE |
+------------+------+----------------+------------+
| 700 ml | 2016 | 1072577 | 29.58 |
| 1,5 Litros | 2016 | 728225 | 20.08 |
| 350 ml | 2016 | 615021 | 16.96 |
| 1 Litro | 2016 | 605779 | 16.71 |
| 2 Litros | 2016 | 360030 | 9.93 |
| 470 ml | 2016 | 244608 | 6.75 |
+------------+------+----------------+------------+
```