Está en la página 1de 44

TRABAJO DE CONSULTAS SQL

PRESENTADO POR:

DANA MARIA MONTIEL


VALENTINA FUENTES MEJIA

PRESENTADO A:

RUBEN BAENA

ASIGANATURA:

DISEÑO Y PROGRAMACION DE BASE DE DATOS

DEPARTAMENTO Y FACULTAD DE INGENIERIA


INGENIERIA DE SISTEMAS
UNIVERSIDAD DE CORDOBA

2021

1
Trabajo consultas SQL

1.1.1 Modelo entidad/relación

1.1.2 Base de datos para MySQL

DROP DATABASE IF EXISTS tienda;


CREATE DATABASE tienda CHARACTER SET utf8mb4;
USE tienda;

CREATE TABLE fabricante (


codigo INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL
);

CREATE TABLE producto (


codigo INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,

nombre VARCHAR(100) NOT NULL,


precio DOUBLE NOT NULL,
codigo_fabricante INT UNSIGNED NOT NULL,
FOREIGN KEY (codigo_fabricante) REFERENCES fabricante(codigo)
);

INSERT INTO fabricante VALUES(1, 'Asus');


INSERT INTO fabricante VALUES(2, 'Lenovo');
INSERT INTO fabricante VALUES(3, 'Hewlett-Packard');
INSERT INTO fabricante VALUES(4, 'Samsung');
INSERT INTO fabricante VALUES(5, 'Seagate');
INSERT INTO fabricante VALUES(6, 'Crucial');
INSERT INTO fabricante VALUES(7, 'Gigabyte');
INSERT INTO fabricante VALUES(8, 'Huawei');
INSERT INTO fabricante VALUES(9, 'Xiaomi');

INSERT INTO producto VALUES(1, 'Disco duro SATA3 1TB', 86.99, 5);
INSERT INTO producto VALUES(2, 'Memoria RAM DDR4 8GB', 120, 6);
INSERT INTO producto VALUES(3, 'Disco SSD 1 TB', 150.99, 4); INSERT
INTO producto VALUES(4, 'GeForce GTX 1050Ti', 185, 7);
2
INSERT INTO producto VALUES(5, 'GeForce GTX 1080 Xtreme', 755, 6);
INSERT INTO producto VALUES(6, 'Monitor 24 LED Full HD', 202, 1);
INSERT INTO producto VALUES(7, 'Monitor 27 LED Full HD', 245.99, 1);
INSERT INTO producto VALUES(8, 'Portátil Yoga 520', 559, 2);
INSERT INTO producto VALUES(9, 'Portátil Ideapd 320', 444, 2);
INSERT INTO producto VALUES(10, 'Impresora HP Deskjet 3720', 59.99, 3);
INSERT INTO producto VALUES(11, 'Impresora HP Laserjet Pro M26nw', 180, 3);

3
1.1.3 Consultas sobre una tabla
1. Lista el nombre de todos los productos que hay en la tabla producto.

SELECT nombre FROM product

2. Lista los nombres y los precios de todos los productos de la tabla producto.
SELECT nombre, precio FROM producto

4
3. Lista todas las columnas de la tabla producto.
SELECT *FROM producto

4. Lista el nombre de los productos, el precio en euros y el precio en dólares estadounidenses (USD).

SELECT nombre, precio*1.17, precio FROM producto

5. Lista el nombre de los productos, el precio en euros y el precio en dólares estadounidenses (USD).
Utiliza los siguientes alias para las columnas: nombre de producto, euros, dólares.
SELECT nombre AS 'nombre de
producto', precio AS euros, precio * 1.17 AS dólares FROM producto

5
6. Lista los nombres y los precios de todos los productos de la tabla producto, convirtiendo los nombres
a mayúscula.
SELECT UPPER (nombre), precio FROM producto

7. Lista los nombres y los precios de todos los productos de la tabla producto, convirtiendo los nombres
a minúscula.
SELECT lower(nombre), precio FROM producto

8. Lista el nombre de todos los fabricantes en una columna, y en otra columna obtenga en mayúsculas
los dos primeros caracteres del nombre del fabricante.
SELECT nombre, UPPER (substr(nombre, 1, 2)) FROM fabricante

6
9. Lista los nombres y los precios de todos los productos de la tabla producto, redondeando el valor
del precio.
SELECT nombre, ROUND(precio) FROM producto

10. Lista los nombres y los precios de todos los productos de la tabla producto, truncando el valor del
precio para mostrarlo sin ninguna cifra decimal.
SELECT nombre, truncate(precio,0) FROM producto

11. Lista el código de los fabricantes que tienen productos en la tabla producto.
SELECT codigo_fabricante FROM producto

7
12. Lista el código de los fabricantes que tienen productos en la tabla producto, eliminando los códigos
que aparecen repetidos.
SELECT distinct codigo_fabricante FROM producto

13. Lista los nombres de los fabricantes ordenados de forma ascendente.


SELECT nombre FROM fabricante ORDER BY `fabricante`.`nombre` ASC

14. Lista los nombres de los fabricantes ordenados de forma descendente.


SELECT nombre FROM fabricante ORDER BY nombre DESC

8
15. Lista los nombres de los productos ordenados en primer lugar por el nombre de forma ascendente y
en segundo lugar por el precio de forma descendente.
SELECT nombre, precio FROM producto ORDER BY `producto`.`precio` DESC

16. Devuelve una lista con las 5 primeras filas de la tabla fabricante.
SELECT *FROM fabricante LIMIT 5

17. Devuelve una lista con 2 filas a partir de la cuarta fila de la tabla fabricante. La cuarta fila también
se debe incluir en la respuesta.
SELECT *FROM fabricante LIMIT 3, 2

18. Lista el nombre y el precio del producto más barato. (Utilice solamente las cláusulas ORDER BY y LIMIT)
SELECT nombre, precio FROM producto ORDER BY precio ASC LIMIT 1

19. Lista el nombre y el precio del producto más caro. (Utilice solamente las cláusulas ORDER BY y LIMIT)
SELECT nombre, precio FROM producto ORDER BY precio DESC LIMIT 1

9
20. Lista el nombre de todos los productos del fabricante cuyo código de fabricante es igual a 2.
SELECT nombre FROM producto WHERE codigo_fabricante=2

21. Lista el nombre de los productos que tienen un precio menor o igual a 120€.
SELECT nombre FROM producto WHERE precio <= 120

22. Lista el nombre de los productos que tienen un precio mayor o igual a 400€.

SELECT nombre FROM producto WHERE precio >= 400

23. Lista el nombre de los productos que no tienen un precio mayor o igual a 400€.

SELECT nombre FROM producto WHERE NOT precio >= 400

10
24. Lista todos los productos que tengan un precio entre 80€ y 300€. Sin utilizar el operador BETWEEN.
SELECT *FROM producto WHERE precio >= 80 AND precio <= 300

25. Lista todos los productos que tengan un precio entre 60€ y 200€. Utilizando el operador BETWEEN.
SELECT *FROM producto WHERE precio BETWEEN 60 AND 200

26. Lista todos los productos que tengan un precio mayor que 200€ y que el código de fabricante sea igual a
6.
SELECT *FROM producto WHERE precio >= 200 AND codigo_fabricante=6

27. Lista todos los productos donde el código de fabricante sea 1, 3 o 5. Sin utilizar el operador IN.
SELECT *FROM producto WHERE codigo_fabricante=1 OR codigo_fabricante=3
OR codigo_fabricante=5

11
28. Lista todos los productos donde el código de fabricante sea 1, 3 o 5. Utilizando el operador IN.
SELECT *FROM producto WHERE codigo_fabricante IN (1,3,5)

29. Lista el nombre y el precio de los productos en céntimos (Habrá que multiplicar por 100 el valor del precio).
Cree un alias para la columna que contiene el precio que se llame céntimos.
SELECT nombre, precio * 100 AS céntimos FROM producto

30. Lista los nombres de los fabricantes cuyo nombre empiece por la letra S.
SELECT nombre FROM fabricante WHERE nombre LIKE 'S%'

31. Lista los nombres de los fabricantes cuyo nombre termine por la vocal e.
SELECT nombre FROM fabricante WHERE nombre like '%e'

32. Lista los nombres de los fabricantes cuyo nombre contenga el carácter w.
SELECT nombre FROM fabricante WHERE nombre like '%w%'

12
33. Lista los nombres de los fabricantes cuyo nombre sea de 4 caracteres.
SELECT nombre FROM fabricante WHERE LENGTH (nombre) = 4

34. Devuelve una lista con el nombre de todos los productos que contienen la cadena Portátil en el nom-
bre.
SELECT nombre FROM producto WHERE nombre LIKE '%Portátil%'

35. Devuelve una lista con el nombre de todos los productos que contienen la cadena Monitor en el nombre
y tienen un precio inferior a 215 €.
SELECT nombre FROM producto WHERE nombre LIKE '%Monitor%' AND precio < 215

36. Lista el nombre y el precio de todos los productos que tengan un precio mayor o igual a 180€. Ordene
el resultado en primer lugar por el precio (en orden descendente) y en segundo lugar por el nombre (en
orden ascendente).
SELECT nombre, precio FROM producto WHERE precio >= 180 ORDER BY precio DE
SC, nombre ASC

13
1.1.4 Consultas multitabla (Composición interna)

Resuelva:.
1. Devuelve una lista con el nombre del producto, precio y nombre de fabricante de todos los productos de
la base de datos.
SELECT producto. nombre, precio, fabricante. nombre FROM producto INNE
R JOIN fabricante ON producto. codigo_fabricante = fabricante. codigo

2. Devuelve una lista con el nombre del producto, precio y nombre de fabricante de todos los productos de
la base de datos. Ordene el resultado por el nombre del fabricante, por orden alfabético.
SELECT producto. nombre, precio, fabricante. nombre FROM producto INNE
R JOIN fabricante ON producto. codigo_fabricante = fabricante. codigo
ORDER BY fabricante. nombre ASC

14
3. Devuelve una lista con el código del producto, nombre del producto, código del fabricante y nombre del
fabricante, de todos los productos de la base de datos.
SELECT producto. codigo, producto. nombre, fabricante. codigo, fabrica
nte. nombre FROM producto INNER JOIN fabricante ON producto. codigo_fa
bricante = fabricante. codigo

4. Devuelve el nombre del producto, su precio y el nombre de su fabricante, del producto más barato
SELECT producto. nombre, precio, fabricante. nombre FROM producto INNER
JOIN fabricante ON producto. codigo_fabricante = fabricante. codigo WHE
RE precio = (SELECT MIN(precio) FROM producto)

5. Devuelve el nombre del producto, su precio y el nombre de su fabricante, del producto más caro.
SELECT producto. nombre, precio, fabricante.nombre FROM producto INNER
JOIN fabricante ON producto. codigo_fabricante = fabricante.codigo WHER
E precio = (SELECT MAX(precio) FROM producto)

6. Devuelve una lista de todos los productos del fabricante Lenovo.


SELECT producto.nombre, fabricante.nombre FROM producto INNER JOIN fabr
icante ON producto.codigo_fabricante = fabricante.codigo WHERE fabrican
te.nombre ='Lenovo'

15
7. Devuelve una lista de todos los productos del fabricante Crucial que tengan un precio mayor que 200€.
SELECT producto.nombre, precio,fabricante.nombre FROM producto INNER JO
IN fabricante ON producto.codigo_fabricante = fabricante.codigo WHERE f
abricante.nombre ='Crucial'AND precio >200

8. Devuelve un listado con todos los productos de los fabricantes Asus, Hewlett-Packardy Seagate. Sin
utilizar el operador IN.
SELECT producto.nombre, fabricante.nombre FROM producto INNER JOIN fab
ricante ON producto.codigo_fabricante = fabricante.codigo WHERE fabric
ante.nombre ='Asus' OR fabricante.nombre='Hewlett-
Packard' OR fabricante.nombre='Seagate'

9. Devuelve un listado con todos los productos de los fabricantes Asus, Hewlett-Packardy Seagate.
Utilizando el operador IN.
SELECT producto.nombre,fabricante.nombre FROM producto INNER JOIN fabri
cante ON producto.codigo_fabricante = fabricante.codigo WHERE fabricant
e.nombre IN ('Asus','Hewlett-Packard','Seagate')

10. Devuelve un listado con el nombre y el precio de todos los productos de los fabricantes cuyo nombre
termine por la vocal e.
SELECT producto.nombre,precio,fabricante.nombre FROM producto INNER JO
IN fabricante ON producto.codigo_fabricante = fabricante.codigo WHERE
fabricante.nombre like '%e'

16
11. Devuelve un listado con el nombre y el precio de todos los productos cuyo nombre de fabricante contenga
el carácter w en su nombre.
SELECT producto.nombre,precio,fabricante.nombre FROM producto INNER JO
IN fabricante ON producto.codigo_fabricante = fabricante.codigo WHERE
fabricante.nombre like '%w%'

12. Devuelve un listado con el nombre de producto, precio y nombre de fabricante, de todos los productos
que tengan un precio mayor o igual a 180€. Ordene el resultado en primer lugar por el precio (en orden
descendente) y en segundo lugar por el nombre (en orden ascendente)
SELECT producto.nombre,precio,fabricante.nombre FROM producto INNER JO
IN fabricante ON producto.codigo_fabricante = fabricante.codigo WHERE
precio>=180 ORDER BY precio DESC,fabricante.nombre ASC

13. Devuelve un listado con el código y el nombre de fabricante, solamente de aquellos fabricantes que tienen
productos asociados en la base de datos.

SELECT distinct codigo_fabricante,fabricante.nombre FROM producto INNER JOIN


fabricante ON producto.codigo_fabricante = fabricante.codigo

17
1.1.5 Consultas multitabla (Composición externa)

Resuelva todas las consultas utilizando las cláusulas LEFT JOIN y RIGHT JOIN.

1. Devuelve un listado de todos los fabricantes que existen en la base de datos, junto con los productos que
tiene cada uno de ellos. El listado deberá mostrar también aquellos fabricantes que no tienen productos
asociados.
SELECT fabricante.nombre AS nom_fabricante ,producto.nombre FROM produ
cto RIGHT JOIN fabricante ON producto.codigo_fabricante = fabricante.c
odigo

2. Devuelve un listado donde sólo aparezcan aquellos fabricantes que no tienen ningún producto asociado.
SELECT fabricante.nombre FROM fabricante LEFT JOIN producto ON fabrican
te.codigo != producto.codigo_fabricante WHERE NOT fabricante.codigo = A
NY ( SELECT producto.codigo_fabricante FROM producto) LIMIT 10,2

3. ¿Pueden existir productos que no estén relacionados con un fabricante? Justifique su respuesta.

R/ no,ya que todo product existente en la tienda debe tener un origen y un fabricante
ademas no pueden existir ya que la relación en el modelo relacional es de 1 a muchos.
esto significa que un producto puede ser creado por un mínimo de 1 fabricante .

18
1.1.6 Consultas resumen

1. Calcula el número total de productos que hay en la tabla productos.


SELECT COUNT(*) FROM producto

2. Calcula el número total de fabricantes que hay en la tabla fabricante.


SELECT COUNT(*) FROM fabricante

3. Calcula el número de valores distintos de código de fabricante aparecen en la tabla productos.


SELECT COUNT(DISTINCT codigo_fabricante) FROM producto

4. Calcula la media del precio de todos los productos.


SELECT AVG(precio) FROM producto

5. Calcula el precio más barato de todos los productos.


SELECT MIN(precio) FROM producto

6. Calcula el precio más caro de todos los productos.


SELECT MAX(precio) FROM producto

7. Lista el nombre y el precio del producto más barato.


SELECT nombre, precio FROM producto WHERE precio = (SELECT MIN(precio)
FROM producto)

8. Lista el nombre y el precio del producto más caro.


SELECT nombre, precio FROM producto WHERE precio = (SELECT MAX(precio)
FROM producto)

9. Calcula la suma de los precios de todos los productos.


SELECT SUM(precio) FROM producto

19
10. Calcula el número de productos que tiene el fabricante Asus.
SELECT COUNT(producto.codigo) FROM fabricante INNER JOIN producto ON fa
bricante.codigo = producto.codigo_fabricante WHERE fabricante.nombre =
'Asus'

11. Calcula la media del precio de todos los productos del fabricante Asus.

SELECT AVG(producto.precio) FROM fabricante INNER JOIN producto ON fabr


icante.codigo = producto.codigo_fabricante WHERE fabricante.nombre = 'A
sus'

12. Calcula el precio más barato de todos los productos del fabricante Asus.
SELECT MIN(producto.precio) FROM fabricante INNER JOIN producto ON fabr
icante.codigo = producto.codigo_fabricante WHERE fabricante.nombre = 'A
sus'

13. Calcula el precio más caro de todos los productos del fabricante Asus.
SELECT MAX(producto.precio) FROM fabricante INNER JOIN producto ON fabr
icante.codigo = producto.codigo_fabricante WHERE fabricante.nombre = 'A
sus'

14. Calcula la suma de todos los productos del fabricante Asus.


SELECT SUM(producto.precio) FROM fabricante INNER JOIN producto ON fabr
icante.codigo = producto.codigo_fabricante WHERE fabricante.nombre = 'A
sus'

15. Muestra el precio máximo, precio mínimo, precio medio y el número total de productos que tiene el fa-
bricante Crucial.
SELECT MAX(producto.precio), MIN(producto.precio), AVG(producto.precio)
, COUNT(producto.codigo) FROM fabricante INNER JOIN producto ON fabrica
nte.codigo = producto.codigo_fabricante WHERE fabricante.nombre = 'Cruc
ial'

20
16. Muestra el número total de productos que tiene cada uno de los fabricantes. El listado también debe
incluir los fabricantes que no tienen ningún producto. El resultado mostrará dos columnas, una con el
nombre del fabricante y otra con el número de productos que tiene. Ordene el resultado descendente-
mente por el número de productos.
SELECT fabricante.nombre, COUNT(producto.codigo) FROM fabricante LEFT
JOIN producto ON producto.codigo_fabricante = fabricante.codigo GROUP
BY fabricante.codigo ORDER BY 2 DESC

17. Muestra el precio máximo, precio mínimo y precio medio de los productos de cada uno de los fabricantes.
El resultado mostrará el nombre del fabricante junto con los datos que se solicitan.
SELECT fabricante.nombre, MAX(producto.precio), MIN(producto.precio), AV
G(producto.precio) FROM fabricante INNER JOIN producto ON producto.codig
o_fabricante = fabricante.codigo GROUP BY fabricante.codigo

18. Muestra el precio máximo, precio mínimo, precio medio y el número total de productos de los fabricantes
que tienen un precio medio superior a 200€. No es necesario mostrar el nombre del fabricante, con el
código del fabricante es suficiente.
SELECT codigo_fabricante, MAX(precio), MIN(precio), AVG(precio), COUNT
(*) FROM producto GROUP BY codigo_fabricante HAVING AVG(precio) > 200

21
19. Muestra el nombre de cada fabricante, junto con el precio máximo, precio mínimo, precio medio y el
número total de productos de los fabricantes que tienen un precio medio superior a 200€. Es necesario
mostrar el nombre del fabricante.
SELECT fabricante.nombre, MAX(producto.precio), MIN(producto.precio),
AVG(producto.precio), COUNT(*) FROM producto INNER JOIN fabricante ON
producto.codigo_fabricante = fabricante.codigo GROUP BY fabricante.cod
igo HAVING AVG(producto.precio) > 200

20. Calcula el número de productos que tienen un precio mayor o igual a 180€.
SELECT COUNT(*) FROM producto WHERE precio >= 180

21. Calcula el número de productos que tiene cada fabricante con un precio mayor o igual a 180€.
SELECT fabricante.nombre, COUNT(*) FROM producto INNER JOIN fabricante
ON producto.codigo_fabricante = fabricante.codigo WHERE producto.precio
>= 180 GROUP BY producto.codigo_fabricante

22. Lista el precio medio los productos de cada fabricante, mostrando solamente el código del fabricante
SELECT AVG(precio), codigo_fabricante FROM producto GROUP BY codigo_fab
ricante.

22
23. Lista el precio medio los productos de cada fabricante, mostrando solamente el nombre del fabricante.
SELECT AVG(precio), fabricante.nombre FROM producto INNER JOIN fabrican
te ON producto.codigo_fabricante = fabricante.codigo GROUP BY fabricant
e.nombre

24. Lista los nombres de los fabricantes cuyos productos tienen un precio medio mayor o igual a 150€.
SELECT AVG(precio), fabricante.nombre FROM producto INNER JOIN fabrican
te ON producto.codigo_fabricante = fabricante.codigo GROUP BY fabricant
e.nombre HAVING AVG(precio) >= 150

25. Devuelve un listado con los nombres de los fabricantes que tienen 2 o más productos.
SELECT fabricante.nombre, COUNT(producto.codigo) FROM fabricante INNER
JOIN producto ON fabricante.codigo = producto.codigo_fabricante GROUP B
Y fabricante.codigo HAVING COUNT(producto.codigo) >= 2

26. Devuelve un listado con los nombres de los fabricantes y el número de productos que tiene cada uno con
un precio superior o igual a 220 €. No es necesario mostrar el nombre de los fabricantes que no tienen
productos que cumplan la condición.

Ejemplo del resultado esperado:

nombre total

Lenovo 2
Asus 1

Crucial 1

23
SELECT fabricante.nombre, COUNT(producto.codigo) FROM fabricante INNER JOIN p
roducto ON fabricante.codigo = producto.codigo_fabricante WHERE producto.prec
io >= 220 GROUP BY fabricante.codigo ORDER BY 2 DESC

27. Devuelve un listado con los nombres de los fabricantes y el número de productos que tiene cada uno con
un precio superior o igual a 220 €. El listado debe mostrar el nombre de todos los fabricantes, es decir, si
hay algún fabricante que no tiene productos con un precio superior o igual a 220€ deberá aparecer en el
listado con un valor igual a 0 en el número de productos.

Ejemplo del resultado esperado:

nombre total

Lenovo 2

Crucial 1

Asus 1

Huawei 0

Samsung 0

Gigabyte 0

Hewlett-Packard 0

Xiaomi 0

Seagate 0

24
(SELECT fabricante.nombre, COUNT(producto.codigo) FROM fabricante INNER JOIN
producto ON fabricante.codigo = producto.codigo_fabricante WHERE producto.pre
cio >= 220 GROUP BY fabricante.codigo) UNION (SELECT fabricante.nombre, 0 FRO
M fabricante WHERE fabricante.codigo NOT IN ( SELECT fabricante.codigo FROM f
abricante INNER JOIN producto ON fabricante.codigo = producto.codigo_fabrican
te WHERE producto.precio >= 220 GROUP BY fabricante.codigo)) ORDER BY 2 DESC

28. Devuelve un listado con los nombres de los fabricantes donde la suma del precio de todos sus
productos es superior a 1000 €.
SELECT fabricante.nombre, SUM(producto.precio) FROM fabricante INNER J
OIN producto ON fabricante.codigo = producto.codigo_fabricante GROUP B
Y fabricante.codigo HAVING SUM(producto.precio) > 1000

29. Devuelve un listado con el nombre del producto más caro que tiene cada fabricante. El resultado debe
tener tres columnas: nombre del producto, precio y nombre del fabricante. El resultado tiene que estar
ordenado alfabéticamente de menor a mayor por el nombre del fabricante.
SELECT producto.nombre, producto.precio, fabricante.nombre FROM producto INNE
R JOIN fabricante ON producto.codigo_fabricante = fabricante.codigo WHERE pro
ducto.precio = ( SELECT MAX(precio) FROM producto WHERE codigo_fabricante = f
abricante.codigo ) ORDER BY fabricante.nombre ASC

25
1.1.7 Subconsultas (En la cláusula WHERE)

1.1.7.1 Con operadores básicos de comparación

1. Devuelve todos los productos del fabricante Lenovo. (Sin utilizar INNER JOIN).
SELECT * FROM producto WHERE codigo_fabricante = ( SELECT codigo FROM
fabricante WHERE nombre = 'Lenovo')

2. Devuelve todos los datos de los productos que tienen el mismo precio que el producto más caro del
fa- bricante Lenovo. (Sin utilizar INNER JOIN).
SELECT * FROM producto WHERE precio = ( SELECT MAX(precio) FROM product
o WHERE producto.codigo_fabricante = ( SELECT codigo FROM fabricante WH
ERE nombre = 'Lenovo'))

3. Lista el nombre del producto más caro del fabricante Lenovo.


SELECT producto.nombre FROM fabricante INNER JOIN producto ON fabricant
e.codigo = producto.codigo_fabricante WHERE fabricante.nombre = 'Lenovo
' AND producto.precio = ( SELECT MAX(precio) FROM fabricante INNER JOIN
producto ON fabricante.codigo = producto.codigo_fabricante WHERE fabric
ante.nombre = 'Lenovo')

4. Lista el nombre del producto más barato del fabricante Hewlett-Packard.


SELECT producto.nombre FROM fabricante INNER JOIN producto ON fabricant
e.codigo = producto.codigo_fabricante WHERE fabricante.nombre= 'Hewlett
-
Packard' AND producto.precio = ( SELECT MIN(precio) FROM fabricante INN
ER JOIN producto ON fabricante.codigo = producto.codigo_fabricante WHER
E fabricante.nombre = 'Hewlett-Packard')

26
5. Devuelve todos los productos de la base de datos que tienen un precio mayor o igual al producto
más caro del fabricante Lenovo.
SELECT * FROM producto WHERE precio >= ( SELECT MAX(precio) FROM fabri
cante INNER JOIN producto ON fabricante.codigo = producto.codigo_fabri
cante WHERE fabricante.nombre = 'Lenovo')

6. Lista todos los productos del fabricante Asus que tienen un precio superior al precio medio de todos
sus productos.
SELECT * FROM fabricante INNER JOIN producto ON fabricante.codigo = pr
oducto.codigo_fabricante WHERE fabricante.nombre = 'Asus' AND producto
.precio > ( SELECT AVG(precio) FROM fabricante INNER JOIN producto ON
fabricante.codigo = producto.codigo_fabricante WHERE fabricante.nombre
= 'Asus')

1.1.7.2 Subconsultas con ALLy ANY

7. Devuelve el producto más caro que existe en la tabla producto sin hacer uso de MAX, ORDER BY ni LIMIT.

SELECT * FROM producto WHERE precio >= ALL ( SELECT precio FROM producto)

8. Devuelve el producto más barato que existe en la tabla producto sin hacer uso de MIN, ORDER BY ni
LIMIT.
SELECT * FROM producto WHERE precio <= ALL ( SELECT precio FROM producto)

9. Devuelve los nombres de los fabricantes que tienen productos asociados. (Utilizando ALL o ANY).
SELECT nombre FROM fabricante WHERE codigo = ANY ( SELECT codigo_fabricante
FROM producto)

27
10. Devuelve los nombres de los fabricantes que no tienen productos asociados. (Utilizando ALL o ANY).
SELECT nombre FROM fabricante WHERE codigo != ALL( SELECT codigo_fabricante
FROM producto)

1.1.7.3 Subconsultas con INy NOT IN

13. Devuelve los nombres de los fabricantes que tienen productos asociados. (Utilizando IN o NOT IN).

SELECT nombre FROM fabricante WHERE codigo IN (SELECT codigo_fabricante


FROM producto)

14. Devuelve los nombres de los fabricantes que no tienen productos asociados. (Utilizando IN o NOT IN).
SELECT nombre FROM fabricante WHERE codigo NOT IN (SELECT codigo_fabric
ante FROM producto)

28
1.1.7.4 Subconsultas con EXISTSy NOT EXISTS

15. Devuelve los nombres de los fabricantes que tienen productos asociados. (Utilizando EXISTS o
NOT EXISTS).
SELECT nombre FROM fabricante WHERE EXISTS ( SELECT codigo_fabricante
FROM producto WHERE producto.codigo_fabricante = fabricante.codigo)

16. Devuelve los nombres de los fabricantes que no tienen productos asociados. (Utilizando EXISTS o NOT
EXISTS).
SELECT nombre FROM fabricante WHERE NOT EXISTS ( SELECT codigo_fabricante FRO
M producto WHERE producto.codigo_fabricante = fabricante.codigo)

1.1.7.5 Subconsultas correlacionadas

17.Lista el nombre de cada fabricante con el nombre y el precio de su producto más caro.
SELECT producto.nombre, producto.precio, fabricante.nombre FROM producto INNE
R JOIN fabricante ON producto.codigo_fabricante = fabricante.codigo WHERE pro
ducto.precio = ( SELECT MAX(precio) FROM producto WHERE codigo_fabricante = f
abricante.codigo )

29
18.Devuelve un listado de todos los productos que tienen un precio mayor o igual a la media de todos los
productos de su mismo fabricante.
SELECT * FROM producto AS p1 WHERE precio >= (SELECT AVG(precio) FROM
producto AS p2 WHERE p1.codigo_fabricante = p2.codigo_fabricante)

19.Lista el nombre del producto más caro del fabricante Lenovo.

SELECT producto.nombre FROM fabricante INNER JOIN producto ON fabricant


e.codigo = producto.codigo_fabricante WHERE fabricante.nombre = 'Lenovo
' AND producto.precio = ( SELECT MAX(precio) FROM producto WHERE codigo
_fabricante = fabricante.codigo)

1.1.8 Subconsultas (En la cláusula HAVING)

8. Devuelve un listado con todos los nombres de los fabricantes que tienen el mismo número de
productos que el fabricante Lenovo.
SELECT fabricante.nombre, COUNT(producto.codigo) FROM fabricante INNER
JOIN producto ON fabricante.codigo = producto.codigo_fabricante GROUP
BY fabricante.codigo HAVING COUNT(producto.codigo) >= ( SELECT COUNT(p
roducto.codigo) FROM fabricante INNER JOIN producto ON fabricante.codi
go = producto.codigo_fabricante WHERE fabricante.nombre = 'Lenovo')

30
1.2 Universidad
1.2.1 Modelo entidad/relación

1.2.2 Base de datos para MySQL

DROP DATABASE IF EXISTS universidad;


CREATE DATABASE universidad CHARACTER SET utf8mb4;
USE universidad;

CREATE TABLE departamento (


id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL
);

CREATE TABLE persona (


id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nif VARCHAR(9) UNIQUE,
nombre VARCHAR(25) NOT NULL,
apellido1 VARCHAR(50) NOT NULL,
apellido2 VARCHAR(50),
ciudad VARCHAR(25) NOT NULL,
direccion VARCHAR(50) NOT NULL,
telefono VARCHAR(9),
fecha_nacimiento DATE NOT NULL,

sexo ENUM('H', 'M') NOT NULL,


tipo ENUM('profesor', 'alumno') NOT NULL
31
);

CREATE TABLE profesor (


id_profesor INT UNSIGNED PRIMARY KEY,
id_departamento INT UNSIGNED NOT NULL,
FOREIGN KEY (id_profesor) REFERENCES persona(id),
FOREIGN KEY (id_departamento) REFERENCES departamento(id)
);

CREATE TABLE grado (


id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL
);

CREATE TABLE asignatura (


id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
creditos FLOAT UNSIGNED NOT NULL,
tipo ENUM('básica', 'obligatoria', 'optativa') NOT NULL,
curso TINYINT UNSIGNED NOT NULL,
cuatrimestre TINYINT UNSIGNED NOT NULL,
id_profesor INT UNSIGNED,
id_grado INT UNSIGNED NOT NULL,
FOREIGN KEY(id_profesor) REFERENCES profesor(id_profesor),
FOREIGN KEY(id_grado) REFERENCES grado(id)
);

CREATE TABLE curso_escolar (


id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
anyo_inicio YEAR NOT NULL,
anyo_fin YEAR NOT NULL
);

CREATE TABLE alumno_se_matricula_asignatura (


id_alumno INT UNSIGNED NOT NULL,
id_asignatura INT UNSIGNED NOT NULL,
id_curso_escolar INT UNSIGNED NOT NULL,
PRIMARY KEY (id_alumno, id_asignatura, id_curso_escolar),
FOREIGN KEY (id_alumno) REFERENCES persona(id),
FOREIGN KEY (id_asignatura) REFERENCES asignatura(id),
FOREIGN KEY (id_curso_escolar) REFERENCES curso_escolar(id)
);

32
33
1.2.3 Datos

Acceder al Script SQL: universidad.sql que se provee para realizar este ejercicio.

1.5.4 Consultas sobre una tabla

1. Devuelve un listado con el primer apellido, segundo apellido y el nombre de todos los alumnos. El listado
deberá estar ordenado alfabéticamente de menor a mayor por el primer apellido, segundo apellido y
nombre.
select apellido1, apellido2, nombre from persona where tipo = 'alumno'
order by 1, 2, 3 asc

2.Averigua el nombre y los dos apellidos de los alumnos que no han dado de alta su número de teléfono
en la base de datos.
select nombre, apellido1, apellido2 from persona where tipo = 'alumno' and t
elefono is null

3. Devuelve el listado de los alumnos que nacieron en 1999.

select * from persona where year(fecha_nacimiento) = '1999' and tipo = 'alumno'

34
4. Devuelve el listado de profesores que no han dado de alta su número de teléfono en la base de datos y
además su nif termina en K.

select * from persona where tipo = 'profesor' and nif like '%K' and telefono
is null

5. Devuelve el listado de las asignaturas que se imparten en el primer cuatrimestre, en el tercer curso del
grado que tiene el identificador 7.

select * from asignatura where cuatrimestre = 1 and curso = 3 and id_grado = 7

1.5.5 Consultas multitabla (Composición interna)

1. Devuelve un listado con los datos de todas las alumnas que se han matriculado alguna vez en el Grado
en Ingeniería Informática (Plan 2015).

select distinct a.id, a.nif, a.nombre, a.apellido1, a.apellido2, a.ciudad


, a.direccion, a.telefono, a.fecha_nacimiento, a.sexo, a.tipo from pers
ona a, alumno_se_matricula_asignatura b, asignatura c, grado d where a.
sexo = 'M' and a.tipo = 'alumno' and a.id = b.id_alumno and b.id_asigna
tura = c.id and c.id_grado = d.id and d.id = 4

35
2.Devuelve un listado con todas las asignaturas ofertadas en el Grado en Ingeniería Informática (
Plan 2015).
select * from asignatura a, grado b where a.id_grado = b.id and b.id = 4

3. Devuelve un listado de los profesores junto con el nombre del departamento al que están vinculados. El
listado debe devolver cuatro columnas, primer apellido, segundo apellido, nombre y nombre del depar-
tamento. El resultado estará ordenado alfabéticamente de menor a mayor por los apellidos y el nombre.

SELECT a.apellido1,a.apellido2,a.nombre,b.nombre FROM universidad.perso


na a, universidad.departamento b,universidad.profesor c WHERE a.id=c.id
_profesor AND c.id_departamento=b.id order by a.apellido1,a.apellido2,a
.nombre asc

4. Devuelve un listado con el nombre de las asignaturas, año de inicio y año de fin del curso escolar del
alumno con nif 26902806M.
select c.nombre, d.anyo_inicio, d.anyo_fin from persona a, alumno_se_m
atricula_asignatura b, asignatura c, curso_escolar d where a.nif = '26
902806M' and a.id = b.id_alumno and b.id_asignatura = c.id and b.id_cu
rso_escolar = d.id

36
5. Devuelve un listado con el nombre de todos los departamentos que tienen profesores que imparten
alguna asignatura en el Grado en Ingeniería Informática (Plan 2015).
select distinct a.nombre from departamento a, profesor b, asignatura c,
grado d where a.id= b.id_departamento and b.id_profesor = c.id_profesor
and d.id = c.id_grado and d.id = 4

6. Devuelve un listado con todos los alumnos que se han matriculado en alguna asignatura durante el curso
escolar 2018/2019.
select distinct a.id, a.nif, a.nombre, a.apellido1, a.apellido2 from p
ersona a, alumno_se_matricula_asignatura b, curso_escolar c where a.ti
po = 'alumno' and a.id = b.id_alumno and b.id_curso_escolar = c.id and
c.id = 5

1.5.6 Consultas multitabla (Composición externa)

Resuelva todas las consultas utilizando las cláusulas LEFT JOIN y RIGHT JOIN.
1. Devuelve un listado con los nombres de todos los profesores y los departamentos que tienen vinculados.
El listado también debe mostrar aquellos profesores que no tienen ningún departamento asociado. El
listado debe devolver cuatro columnas, nombre del departamento, primer apellido, segundo apellido y
nombre del profesor. El resultado estará ordenado alfabéticamente de menor a mayor por el nombre del
departamento, apellidos y el nombre.
select c.nombre, a.apellido1, a.apellido2, a.nombre from persona a left
join profesor b on a.id = b.id_profesor left join departamento c on b.i
d_departamento = c.id where a.tipo = 'profesor' order by c.nombre asc

37
2.Devuelve un listado con los profesores que no están asociados a un departamento.

select id, nombre from persona p left join profesor pr on p.id = pr.id_pro
fesor where tipo = 'profesor' and id_profesor is null

--retorna vacio ya que todos los profesores estan asociados a un departamento y


esto lo podemos probar haciendo la sgte consulta:
select id, nombre from persona where tipo = 'profesor'

-- comparamos los ID de ambas consultas y coinciden lo cual quiere decir que todos
los profesores insertados en la tabla persona están asociados a un departamento
en la tabla profesor.

3. Devuelve un listado con los departamentos que no tienen profesores asociados.


select * from profesor p WHERE p.id_departamento is null

38
4. Devuelve un listado con los profesores que no imparten ninguna asignatura.

select p.id, p.nombre from persona p left join profesor pr on p.id = pr


.id_profesor left join asignatura a on pr.id_profesor = a.id_profesor w
here p.tipo = 'profesor' and a.id_profesor is null

5. Devuelve un listado con las asignaturas que no tienen un profesor asignado.

select * from asignatura p where p.id_profesor is null

39
6.Devuelve un listado con todos los departamentos que tienen alguna asignatura que no se haya impar-
tido en ningún curso escolar. El resultado debe mostrar el nombre del departamento y el nombre de la
asignatura que no se haya impartido nunca.

select d.nombre, a.nombre from departamento d left join profesor p on d.id =


p.id_departamento left join asignatura a on p.id_profesor = a.id_profesor lef
t join alumno_se_matricula_asignatura al on a.id = al.id_asignatura where al.
id_asignatura is null and a.nombre is not null

1.5.7 Consultas resumen

1. Devuelve el número total de alumnas que hay.

SELECT count(*) AS TOTAL_ALUMNAS FROM universidad.persona WHERE sexo='f


' AND tipo = 'alumna'

2. Calcula cuántos alumnos nacieron en 1999.


select count(*) from persona where tipo = 'alumno' and year(fecha_nacim
iento) = 1999

40
3. Calcula cuántos profesores hay en cada departamento. El resultado sólo debe mostrar dos columnas, una
con el nombre del departamento y otra con el número de profesores que hay en ese departamento. El
resultado sólo debe incluir los departamentos que tienen profesores asociados y deberá estar ordenado
de mayor a menor por el número de profesores.
select d.nombre, count(p.id_profesor) cantidad_profesores from profeso
r p, departamento d where d.id in(p.id_departamento) group by p.id_dep
artamento order by count(p.id_profesor) desc

4. Devuelve un listado con todos los departamentos y el número de profesores que hay en cada uno de ellos.
Tenga en cuenta que pueden existir departamentos que no tienen profesores asociados. Estos departa-
mentos también tienen que aparecer en el listado.
select d.nombre, count(p.id_profesor) cantidad_profesores from departam
ento d left join profesor p on d.id = p.id_departamento group by d.nomb
re order by count(p.id_profesor) desc

5..Devuelve un listado con el nombre de todos los grados existentes en la base de datos y el número
de asignaturas que tiene cada uno. Tenga en cuenta que pueden existir grados que no tienen asignaturas
asociadas. Estos grados también tienen que aparecer en el listado. El resultado deberá estar ordenado
de mayor a menor por el número de asignaturas.
select g.nombre, count(a.id) cantidad_asignatura from grado g left joi
n asignatura a on g.id = a.id_grado group by g.nombre order by count(a
.id) desc

41
6.Devuelve un listado con el nombre de todos los grados existentes en la base de datos y el número de
asignaturas que tiene cada uno, de los grados que tengan más de 40 asignaturas asociadas.
select g.nombre, count(a.id) cantidad_asignatura from grado g left joi
n asignatura a on g.id = a.id_grado group by g.nombre having cantidad_
asignatura > 40 order by count(a.id) desc

7.Devuelve un listado que muestre el nombre de los grados y la suma del número total de créditos que hay
para cada tipo de asignatura. El resultado debe tener tres columnas: nombre del grado, tipo de asignatura y la
suma de los créditos de todas las asignaturas que hay de ese tipo. Ordene el resultado de mayor a menor
por el número total de crédidos.
select g.nombre, a.tipo, sum(a.creditos) suma_creditos from grado g in
ner join asignatura a on g.id = a.id_grado group by a.tipo order by su
m(a.creditos) desc

8.Devuelve un listado que muestre cuántos alumnos se han matriculado de alguna asignatura en cada uno
de los cursos escolares. El resultado deberá mostrar dos columnas, una columna con el año de inicio del
curso escolar y otra con el número de alumnos matriculados.
select c.anyo_inicio, count(a.id_alumno) from curso_escolar c inner jo
in alumno_se_matricula_asignatura a on c.id = id_curso_escolar group b
y c.anyo_inicio

42
9.Devuelve un listado con el número de asignaturas que imparte cada profesor. El listado debe tener en
cuenta aquellos profesores que no imparten ninguna asignatura. El resultado mostrará cinco columnas: id,
nombre, primer apellido, segundo apellido y número de asignaturas. El resultado estará ordenado de mayor
a menor por el número de asignaturas.
select p.id, p.nombre, p.apellido1, p.apellido2, count(a.id) numero_as
ignaturas from profesor pr left join asignatura a on pr.id_profesor =
a.id_profesor right join persona p on pr.id_profesor = p.id group by p
r.id_profesor order by count(a.id) desc

1.5.8 Subconsultas

1. Devuelve todos los datos del alumno más joven.


select * from persona where fecha_nacimiento = (select max(fecha_nacimi
ento) from persona) and tipo ='alumno'

2. Devuelve un listado con los profesores que no están asociados a un departamento.


select id, nombre from persona p left join profesor pr on p.id = pr.id_
profesor where tipo = 'profesor' and id_profesor is null

La consulta retorna vacia debido a que todos los profesores están asociados a un departamento
3. Devuelve un listado con los departamentos que no tienen profesores asociados.
select d.nombre from departamento d where not exists(select p.id_depart
amento from profesor p where d.id = p.id_departamento)

43
4. Devuelve un listado con los profesores que tienen un departamento asociado y que no imparten
ninguna asignatura.
select p.* from persona p where id in(select id_profesor from profesor
) and not exists (select id_profesor from asignatura where id_profesor
= p.id) and tipo = 'profesor'

5. Devuelve un listado con las asignaturas que no tienen un profesor asignado.


select a.* from asignatura a where not exists (select id_profesor from
profesor where id_profesor = a.id_profesor)

6. Devuelve un listado con todos los departamentos que no han impartido asignaturas en ningún
curso escolar.
select * from departamento where id in( select id_departamento from pr
ofesor p where exists (select id_profesor from asignatura where p.id_p
rofesor = id_profesor and not exists (select id_asignatura from alumno
_se_matricula_asignatura where id = id_asignatura) ) )

44

También podría gustarte