2481 lines
73 KiB
Markdown
2481 lines
73 KiB
Markdown
|
# 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 |
|
|||
|
+------------+------+----------------+------------+
|
|||
|
```
|
|||
|
|