Intro a SQL y MySQL - Ejercicio 1 - Ejercicio resuelto con 1 tabla

Vamos a aplicar buena parte de lo que conocemos para hacer un ejercicio de repaso que haga distintas manipulaciones a una única tabla. Será una tabla que contenga datos de productos: código, nombre, precio y fecha de alta, para que podamos trabajar con datos de texto, numéricos y de tipo fecha.

Los pasos que realizaremos (por si alguien se atreve a intentarlo antes de ver la solución) serán:

 


 

Damos por sentado que MySQL está instalado. El primer paso es crear la base de datos:

CREATE DATABASE productos1;

Y comenzar a usarla:

USE productos1;

Para crear la tabla haríamos:

CREATE TABLE productos (
  codigo varchar(3),
  nombre varchar(30),
  precio decimal(6,2),
  fechaalta date,
  PRIMARY KEY (codigo)
);

Para introducir varios datos de ejemplo:

INSERT INTO productos VALUES ('a01','Afilador', 2.50, '2007-11-02');
INSERT INTO productos VALUES ('s01','Silla mod. ZAZ', 20, '2007-11-03');
INSERT INTO productos VALUES ('s02','Silla mod. XAX', 25, '2007-11-03');

Podemos ver todos los datos para comprobar que son correctos:

SELECT * FROM productos;

y deberíamos obtener

+--------+----------------+--------+------------+
| codigo | nombre         | precio | fechaalta  |
+--------+----------------+--------+------------+
| a01    | Afilador       |   2.50 | 2007-11-02 |
| s01    | Silla mod. ZAZ |  20.00 | 2007-11-03 |
| s02    | Silla mod. XAX |  25.00 | 2007-11-03 |
+--------+----------------+--------+------------+

Para ver qué productos se llaman "Afilador":

SELECT * FROM productos WHERE nombre='Afilador';

+--------+----------+--------+------------+
| codigo | nombre   | precio | fechaalta  |
+--------+----------+--------+------------+
| a01    | Afilador |   2.50 | 2007-11-02 |
+--------+----------+--------+------------+

Si queremos saber cuales comienzan por S:

SELECT * FROM productos WHERE nombre LIKE 'S%';

+--------+----------------+--------+------------+
| codigo | nombre         | precio | fechaalta  |
+--------+----------------+--------+------------+
| s01    | Silla mod. ZAZ |  20.00 | 2007-11-03 |
| s02    | Silla mod. XAX |  25.00 | 2007-11-03 |
+--------+----------------+--------+------------+

Si queremos ver cuales tienen un precio superior a 22, y además no deseamos ver todos los campos, sino sólo el nombre y el precio:

SELECT nombre, precio FROM productos WHERE precio > 22;

+----------------+--------+
| nombre         | precio |
+----------------+--------+
| Silla mod. XAX |  25.00 |
+----------------+--------+

Precio medio de las sillas:

SELECT avg(precio) FROM productos WHERE LEFT(nombre,5) = 'Silla';

+-------------+
| avg(precio) |
+-------------+
|   22.500000 |
+-------------+

Esto de mirar las primeras letras para saber si es una silla o no... quizá no sea la mejor opción. Parece más razonable añadir un nuevo dato: la "categoría". Vamos a modificar la estructura de la tabla para hacerlo:

ALTER TABLE productos ADD categoria varchar(10);

Comprobamos qué ha ocurrido con un "select" que muestre todos los datos:

SELECT * FROM productos;

+--------+----------------+--------+------------+-----------+
| codigo | nombre         | precio | fechaalta  | categoria |
+--------+----------------+--------+------------+-----------+
| a01    | Afilador       |   2.50 | 2007-11-02 | NULL      |
| s01    | Silla mod. ZAZ |  20.00 | 2007-11-03 | NULL      |
| s02    | Silla mod. XAX |  25.00 | 2007-11-03 | NULL      |
+--------+----------------+--------+------------+-----------+

Ahora mismo, todas las categorías tienen el valor NULL, y eso no es muy útil. Vamos a dar el valor "utensilio" a la categoría de todos los productos existentes

UPDATE productos SET categoria='utensilio';

Y ya que estamos, modificaremos los productos que comienza por la palabra "Silla", para que su categoría sea "silla"

UPDATE productos SET categoria='silla' WHERE LEFT(nombre,5) = 'Silla';

+--------+----------------+--------+------------+-----------+
| codigo | nombre         | precio | fechaalta  | categoria |
+--------+----------------+--------+------------+-----------+
| a01    | Afilador       |   2.50 | 2007-11-02 | utensilio |
| s01    | Silla mod. ZAZ |  20.00 | 2007-11-03 | silla     |
| s02    | Silla mod. XAX |  25.00 | 2007-11-03 | silla     |
+--------+----------------+--------+------------+-----------+

Para ver la lista categorías (sin que aparezcan datos duplicados), deberemos usar la palabra "distinct"

SELECT DISTINCT categoria FROM productos;

+-----------+
| categoria |
+-----------+
| utensilio |
| silla     |
+-----------+

Finalmente, para ver la cantidad de productos que tenemos en cada categoría, deberemos usar "count" y agrupar los datos con "group by", así:

SELECT categoria, count(*) FROM productos GROUP BY categoria;

+-----------+----------+
| categoria | count(*) |
+-----------+----------+
| silla     |        2 |
| utensilio |        1 |
+-----------+----------+