Sei sulla pagina 1di 11

“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;

4. Genera las siguientes tablas:

FABRICANTES
NOMBRE DE COLUMNA TIPO DE DATO
Clave Principal Clave_fabricante Int
Nombre Varchar(30)

CREATE TABLE FABRICANTES (Clave_fabricante INT


NOT NULL, Nombre VARCHAR(30), PRIMARY KEY
(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
CREATE TABLE ARTICULOS (Clave_articulo INT NOT NULL,
Nombre VARCHAR(30), Precio INT, Clave_fabricante INT,
PRIMARY KEY (Clave_articulo), FOREIGN
KEY(Clave_fabricante) REFERENCES FABRICANTES
(Clave_fabricante));

5. Muestra las tablas de la Base de datos TIENDA


SHOW TABLES;

6. Muestra los atributos de la tabla ARTICULOS;


DESCRIBE ARTICULOS;

Página 1 de 11
7. Introduce los siguientes datos en cada tabla:

TABLA: FABRICANTES
CLAVE_FABRICANT NOMBRE
E
1 Kingston
2 Adata
3 Logitech
4 Lexar
5 Seagate

INSERT INTO FABRICANTES VALUES ( 1 , ‘Kingston’);

TABLA: ARTICULOS
PRECI CLAVE_FABRICANT
CLAVE_ARTICULO NOMBRE
O E
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 ARTICULOS;

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;
Página 2 de 11
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;

Página 3 de 11
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

Página 4 de 11
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

Página 5 de 11
Trabajar con tablas relacionadas

Muchos habréis tenido problemas al crear tablas relacionadas con


MySql, pero de verdad que es bastante sencillo, solo hay que tener
en cuenta una serie de premisas:

 Las tablas que se van a relacionar tienen que ser tipo InnoDb(InnoDB es
el primer tipo de tabla que permite definir estricciones de claves foráneas
para garantizar la integridad de los datos).

 Usar sintaxis FOREIGN KEY (campo_fk) REFERENCES


nombre_tabla(nombre_campo)

 Crear un gndice en el campo que ha sido declarado claveforánea

Es necesario el uso de índices para que la verificación de las claves


foráneas sea más rápida. Vamos a ver un ejemplo de una
definición de 2 tablas relacionadas. Clientes y privilegios:

PLAIN TEXT
MySQL:

1. CREATE TABLE clientes

2. (

3. id_cliente INT NOT NULL AUTO_INCREMENT,

4. nombre VARCHAR(30),

5. PRIMARY KEY (id_cliente)

6. ) TYPE = INNODB;

7.

8. CREATE TABLE privilegios

9. (

10. id_privilegio INT NOT NULL AUTO_INCREMENT,

11. id_cliente INT NOT NULL,

12. privilegio INT(2),

13. PRIMARY KEY(id_privilegio),


Página 6 de 11
14. INDEX (id_cliente),

15. FOREIGN KEY (id_cliente) REFERENCES clientes(id_client


e)

16. ) TYPE = INNODB;

De esta manera estamos relacionando la tabla clientes y privilegios


por el campo id_cliente.

La clave foránea (FOREIGN KEY) y la Referenciada tienen que tener


tipos de datos similares para que puedan ser comparadas sin la
necesidad de hacer una conversión de tipos.

Ahora ya tenemos las tablas relacionadas y seguro que os haceis la


siguiente pregunta:

Página 7 de 11
"¿Coó mo inserto registros en las tablas que tengan claves foraó neas (FOREIGN
KEYS)?"

Bueno, esta pregunta realmente nos la podemos hacer para cuando


se inserta un registro, se borra o se actualiza, ya que en las tres lo
tendremos que tener en cuenta.

Ahora vamos a insertar algún registro para verificar que todo está
correcto:

PLAIN TEXT
MySQL:

1. INSERT INTO clientes VALUES (1, 'Pedro Picapiedras');

2. INSERT INTO clientes VALUES (2, 'Pablo Marmol');

3. INSERT INTO clientes VALUES (3, 'Ana Botella');

PLAIN TEXT
MySQL:

1. INSERT INTO privilegios VALUES (1,1,10);

2. INSERT INTO privilegios VALUES (2,3,05);

3. INSERT INTO privilegios VALUES (3,2,01);

Hasta ahora ha ido todo bien, pero ¿que pasaría si intentamos


insertar un registro en la tabla "privilegios" en el que nos refiramos
a un cliente que no exista en la tabla clientes?, vamos a probarlo:

PLAIN TEXT
MySQL:

1. INSERT INTO privilegios VALUES (4,5,10);

Pues sí nos tiene que devolver un error tal como este:

"ERROR 1216: Cannot add or update a child row: a foreign key constraint fails"

La razón es bastante evidente, estamos intentando insertar un


registro en la tabla privilegios sobre un cliente "id_cliente=5", y
hasta el momento no existe.

Página 8 de 11
Ahora vamos a intentar eliminar un registro de la tabla clientes:

PLAIN TEXT
MySQL:

1. DELETE FROM clientes WHERE id_cliente=3;

Debido a que tenemos la restricción de la clave foránea no


permitirá eliminar el registro puesto que se hace referencia a él en
la tabla "privilegios", por lo tanto Mysql nos devolvería el siguiente
error:

"ERROR 1217: Cannot delete or update a parent row: a foreign key constraint
fails"

Para eliminar este tipo de registros con claves foráneas existe lo


que se llama eliminación en CASCADA, en la que todos los
registros relacionados se eliminan según las relaciones de claves
foráneas.

Para llevar a cabo una eliminación de todos los registros


relacionados por las claves foráneas en distintas tablas se usa la
función "ON DELETE CASCADE".

Si se especifica ON DELETE CASCADE, y una fila en la tabla padre es


eliminada, entonces se eliminarán las filas de la tabla hijo cuya clave foránea
sea igual al valor de la clave referenciada en la tabla padre. Esta acción
siempre ha estado disponible en MySQL. Fuente: Mysql-hispano.org

Veamos un ejemplo de eliminación en cascada:

PLAIN TEXT
MySQL:

1. ALTER TABLE privilegios ADD FOREIGN KEY(id_cliente)

2. REFERENCES clientes(id_cliente) ON DELETE CASCADE;

Con esta sentencia, ya tendremos dispuesta la tabla para que se


pueda eliminar en cascada. Por lo tanto si queremos eliminar
ahora al cliente "Ana Botella", tan sólo tendríamos que ejecutar lo
sisguiente:

Página 9 de 11
PLAIN TEXT
MySQL:

1. DELETE FROM cliente WHERE id_cliente=3;

Si haceis una consulta ahora en las dos bases de datos, "clientes" y


"privilegios", veréis como se ha eliminado "Ana Botella" de las dos
tablas.

Al igual que la eliminación también podemos actuar en cascada


con las actualizaciones con la sentencia "ON UPDATE CASCADE".

Página 10 de 11
Página 11 de 11