“ LA TIENDA DE INFORMATICA”
INSTRUCCIONES: En
el siguiente ejercicio se describen cada uno de los comandos para llevar a cabo cada una de
las consultas solicitadas, ejecuta cada uno de ellos en el compilador de MySQL.
ACTIVIDADES A
REALIZAR
1.
Crea una base de datos llamada TIENDA
|
CREATE DATABASE TIENDA;
|
2.
Muestra las Bases de datos almacenadas
|
SHOW DATABASES;
|
3.
Habilita la Base de datos TIENDA
|
USE TIENDA;
|
|
CREATE TABLE FABRICANTES (Clave_fabricante
INT NOT NULL, Nombre VARCHAR(30), PRIMARY KEY (Clave_fabricante));
|
4.
Genera las siguientes tablas:
|
FABRICANTES
|
||
|
|
NOMBRE
DE COLUMNA
|
TIPO
DE DATO
|
|
Clave
Principal
|
Clave_fabricante
|
Int
|
|
|
Nombre
|
Varchar(30)
|
|
CREATE TABLE ARTICULOS (Clave_articulo INT
NOT NULL, Nombre VARCHAR(30), Precio INT, Clave_fabricante INT, PRIMARY KEY
(Clave_articulo), FOREING KEY(Clave_fabricante) REFERENCES FABRICANTES
(Clave_fabricante));
|
|
ARTICULOS
|
||
|
|
NOMBRE
DE COLUMNA
|
TIPO
DE DATO
|
|
Clave
Principal
|
Clave_articulo
|
Int
|
|
|
Nombre
|
Varchar(30)
|
|
|
Precio
|
Int
|
|
Clave
Foránea
|
Clave_fabricante
|
Int
|
5. Muestra
las tablas de la Base de datos TIENDA
|
SHOW TABLES;
|
6. Muestra
los atributos de la tabla ARTICULOS;
|
DESCRIBE ARTICULOS;
|
7. Introduce
los siguientes datos en cada tabla:
|
TABLA: FABRICANTES
|
|
|
CLAVE_FABRICANTE
|
NOMBRE
|
|
1
|
Kingston
|
|
2
|
Adata
|
|
3
|
Logitech
|
|
4
|
Lexar
|
|
5
|
Seagate
|
|
INSERT INTO FABRICANTES VALUES ( 2 , ‘Adata’);
INSERT INTO FABRICANTES VALUES ( 3 , ‘Longitech’);
INSERT INTO FABRICANTES VALUES ( 4 , ‘Lexar’);
|
|
TABLA:
ARTICULOS
|
|||
|
CLAVE_ARTICULO
|
NOMBRE
|
PRECIO
|
CLAVE_FABRICANTE
|
|
1
|
Teclado
|
$ 100
|
3
|
|
2
|
Disco duro 300 Gb
|
$ 500
|
5
|
|
3
|
Mouse
|
$ 80
|
3
|
|
4
|
Memoria USB
|
$ 140
|
4
|
|
5
|
Memoria RAM
|
$ 290
|
1
|
|
6
|
Disco duro extraíble 250 Gb
|
$ 650
|
5
|
|
7
|
Memoria USB
|
$ 279
|
1
|
|
8
|
DVD Rom
|
$ 450
|
2
|
|
9
|
CD Rom
|
$ 200
|
2
|
|
10
|
Tarjeta de red
|
$ 180
|
3
|
|
INSERT INTO ARTICULOS
VALUES ( 1 , ‘Teclado’, 100 , 3 );
|
8. Genera
las siguientes consultas:
a)
Obtener todos los datos de los
productos de la tienda
|
SELECT * FROM FABRICANTES;
|
b)
Obtener los nombres de los productos
de la tienda
|
SELECT Nombre FROM ARTICULOS;
|
c)
Obtener los nombres y precio de los
productos de la tienda
|
SELECT Nombre,Precio FROM ARTICULOS;
|
d)
Obtener los nombres de los artículos sin
repeticiones
|
SELECT DISTINCT Nombre
FROM ARTICULOS;
|
e)
Obtener todos los datos del artículo cuya clave de producto es ‘5’
|
SELECT *
FROM ARTICULOS WHERE Clave_articulo=5;
|
f)
Obtener todos los datos del artículo cuyo nombre del producto es
‘’Teclado”
|
SELECT *
FROM ARTICULOS WHERE Nombre=’Teclado’;
|
g)
Obtener todos los datos de la Memoria
RAM y memorias USB
|
SELECT *
FROM ARTICULOS WHERE Nombre=’Memoria RAM’ OR Nombre=’Memoria USB’ ;
|
h)
Obtener todos los datos de los
artículos que empiezan con ‘M’
|
SELECT *
FROM ARTICULOS WHERE Nombre LIKE ‘M%’;
|
i)
Obtener el nombre de los productos
donde el precio sea $ 100
|
SELECT Nombre
FROM ARTICULOS WHERE Precio = 100;
|
j)
Obtener el nombre de los productos
donde el precio sea mayor a $ 200
|
SELECT Nombre
FROM ARTICULOS WHERE Precio > 200;
|
k)
Obtener todos los datos de los artículos
cuyo precio este entre $100 y $350
|
/* OPERADOR AND */
SELECT *
FROM ARTICULOS WHERE Precio >= 100 AND Precio<=350;
/* OPERADOR
BETWEEN */
SELECT *
FROM ARTICULOS WHERE Precio BETWEEN 100 AND 350;
|
l)
Obtener el precio medio de todos los
productos
|
SELECT AVG(Precio) FROM ARTICULOS;
|
m)
Obtener el precio medio de los
artículos cuyo código de fabricante sea 2
|
SELECT AVG(Precio) FROM ARTICULOS WHERE Clave_fabricante=3;
|
n)
Obtener el nombre y precio de los
artículos ordenados por Nombre
|
SELECT Nombre, Precio FROM ARTICULOS ORDER BY Nombre;
|
o)
Obtener todos los datos de los
productos ordenados descendentemente por Precio
|
SELECT * FROM ARTICULOS ORDER BY Precio DESC;
|
p)
Obtener el nombre y precio de los
artículos cuyo precio sea mayor a $ 250 y ordenarlos descendentemente por
precio y luego ascendentemente por nombre
|
SELECT Nombre, Precio FROM ARTICULOS
WHERE Precio >= 250 ORDER BY Precio
DESC, Nombre;
|
q)
Obtener un listado completo de los
productos, incluyendo por cada articulo los datos del articulo y del fabricante
|
SELECT * FROM ARTICULOS, FABRICANTES
WHERE ARTICULOS.Clave_fabricante=FABRICANTES.Clave_fabricante
|
r)
Obtener la clave de producto, nombre
del producto y nombre del fabricante de todos los productos en venta
|
SELECT
ARTICULOS.Clave_articulo, ARTICULOS.Nombre, FABRICANTES.Nombre
FROM ARTICULOS, FABRICANTES
WHERE ARTICULOS.Clave_fabricante=FABRICANTES.Clave_fabricante
|
s)
Obtener el nombre y precio de los
artículos donde el fabricante sea Logitech ordenarlos alfabéticamente por
nombre del producto
|
SELECT
ARTICULOS.Nombre, ARTICULOS.Precio FROM ARTICULOS, FABRICANTES
WHERE FABRICANTES.Nombre=’Logitech’
AND
ARTICULOS.Clave_fabricante=FABRICANTES.Clave_fabricante
ORDER BY ARTICULOS.Nombre;
|
t)
Obtener el nombre, precio y nombre de
fabricante de los productos que son marca Lexar o Kingston ordenados descendentemente
por precio
|
SELECT
ARTICULOS.Nombre, ARTICULOS.Precio, FABRICANTES.Nombre
FROM ARTICULOS, FABRICANTES
WHERE FABRICANTES.Nombre=’Lexar’
OR FABRICANTES.Nombre=’Kingston’
AND ARTICULOS.Clave_fabricante=FABRICANTES.Clave_fabricante
ORDER BY ARTICULOS.Precio DESC;
|
u) Añade
un nuevo producto: Clave del producto 11, Altavoces de $ 120 del fabricante 2
|
INSERT INTO ARTICULOS VALUES (11
,’Altavoces’, 120, 2);
|
v) Cambia
el nombre del producto 6 a ‘Impresora Laser’
|
UPDATE ARTICULOS SET Nombre=’Impresora
Laser’
WHERE Clave_articulo = 8
|
w) Aplicar
un descuento del 10% a todos los productos.
|
UPDATE ARTICULOS SET Precio=Precio
*0.10
|
x) Aplicar
un descuento de $ 10 a todos los productos cuyo precio sea mayor o igual a $
300
|
UPDATE ARTICULOS SET Precio=Precio –
10 WHERE Precio >= 300
|
y) Borra
el producto numero 6
|
DELETE FROM ARTICULOS WHERE Clave_articulo=
6
|
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:
- Crear la base de datos
- Comenzar a usarla
- Introducir 3 datos de ejemplo
- Mostrar todos los datos
- Mostrar los datos que tienen un cierto nombre
- Mostrar los datos que comienzan por una cierta
inicial
- Ver sólo el nombre y el precio de los que
cumplen una condición (precio > 22)
- Ver el precio medio de aquellos cuyo nombre
comienza con "Silla"
- Modificar la estructura de la tabla para
añadir un nuevo campo: "categoría"
- Dar el valor "utensilio" a la
categoría de todos los productos existentes
- Modificar los productos que comienza por la palabra
"Silla", para que su categoría sea "silla"
- Ver la lista categorías (sin que aparezcan
datos duplicados)
- Ver la cantidad de productos que tenemos en
cada categoría
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 |
+-----------+----------+
NOTA :
EJERCICIOS
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| tienda |
+--------------------+
4 rows in set (0.20 sec)
mysql> USE TIENDA;
Database changed
mysql> SHOW TABLES;
+------------------+
| Tables_in_tienda |
+------------------+
| fabricantes |
+------------------+
1 row in set (0.06 sec)
mysql> CREATE TABLE ARTICULOS
(Clave_art
Precio INT, Clave_fabricante INT,
PRIMAR
Query OK, 0 rows affected (0.28 sec)
mysql> INSERT INTO FABRICANTES
VALUES (
Query OK, 1 row affected (0.39 sec)
mysql> INSERT INTO FABRICANTES
VALUES (
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO FABRICANTES
VALUES (
Query OK, 1 row affected (0.03 sec)
mysql> INSERT INTO FABRICANTES
VALUES (
Query OK, 1 row affected (0.05 sec)
mysql>
mysql> SELECT * FROM ARTICULOS;
Empty set (0.00 sec)
mysql> SELECT * FROM FABRICANTES;
+------------------+-----------+
| Clave_fabricante | Nombre |
+------------------+-----------+
| 1 | Kingston |
| 2 | Adata |
| 3 | Longitech |
| 4 | Lexar |
+------------------+-----------+
4 rows in set (0.00 sec)
mysql>
No hay comentarios:
Publicar un comentario