0% encontró este documento útil (0 votos)
10 vistas26 páginas

11 SQL Server-EJER - DML - DDL - PROPUESTOS

Cargado por

tellov29
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
10 vistas26 páginas

11 SQL Server-EJER - DML - DDL - PROPUESTOS

Cargado por

tellov29
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 26

SQL-Server-EJERCICIO_CONSULTA

https://josejuansanchez.org/bd/ejercicios-consultas-sql/index.html#consultas-sobre-una-tabla
Apuntes de BD para DAW, DAM y ASIR
José Juan Sánchez Hernández
Curso 2023/2024

INDI CE

1 Ejercicios. Realización de consultas SQL

1.1 TIENDA DE INFORMÁTICA


1.1.1 Modelo entidad/relación
1.1.2 Base de datos para SQLServer
1.1.3 Consultas sobre una tabla
1.1.4 Consultas multitabla (Composición interna)
1.1.5 Consultas multitabla (Composición externa)
1.1.6 Consultas resumen
1.1.7 Subconsultas (En la cláusula WHERE)
1.1.7.1 Con operadores básicos de comparación
1.1.7.2 Subconsultas con ALL y ANY
1.1.7.3 Subconsultas con IN y NOT IN
1.1.7.4 Subconsultas con EXISTS y NOT EXISTS
1.1.7.5 Subconsultas correlacionadas
1.1.8 Subconsultas (En la cláusula HAVING)

1.2 GESTIÓN DE EMPLEADOS


1.2.1 Modelo entidad/relación
1.2.2 Base de datos para SQLServer
1.2.3 Consultas sobre una tabla
1.2.4 Consultas multitabla (Composición interna)
1.2.5 Consultas multitabla (Composición externa)
1.2.6 Consultas resumen
1.2.7 Subconsultas
1.2.7.1 Con operadores básicos de comparación
1.2.7.2 Subconsultas con ALL y ANY
1.2.7.3 Subconsultas con IN y NOT IN
1.2.7.4 Subconsultas con EXISTS y NOT EXISTS

1.3 GESTIÓN DE VENTAS


1.3.1 Modelo entidad/relación
1.3.2 Base de datos para SQLServer
1.3.3 Consultas sobre una tabla
1.3.4 Consultas multitabla (Composición interna)
1.3.5 Consultas multitabla (Composición externa)
1.3.6 Consultas resumen
1.3.7 Subconsultas
1.3.7.1 Con operadores básicos de comparación
1.3.7.2 Subconsultas con ALL y ANY
1.3.7.3 Subconsultas con IN y NOT IN
1.3.7.4 Subconsultas con EXISTS y NOT EXISTS

1.4 JARDINERÍA
1.4.1 Modelo entidad/relación
1.4.2 Base de datos para SQLServer
1.4.3 Datos
1.4.4 Consultas sobre una tabla
1.4.5 Consultas multitabla (Composición interna)
1.4.6 Consultas multitabla (Composición externa)
1.4.7 Consultas resumen
1.4.8 Subconsultas
Angel Tello Valles correo: [email protected] 1
1.4.8.1 Con operadores básicos de comparación
1.4.8.2 Subconsultas con ALL y ANY
1.4.8.3 Subconsultas con IN y NOT IN
1.4.8.4 Subconsultas con EXISTS y NOT EXISTS
1.4.8.5 Subconsultas correlacionadas
1.4.9 Consultas variadas

1.5 UNIVERSIDAD (TIPO A)


1.5.1 Modelo entidad/relación
1.5.2 Base de datos para SQLServer
1.5.3 Datos
1.5.4 Consultas sobre una tabla
1.5.5 Consultas multitabla (Composición interna)
1.5.6 Consultas multitabla (Composición externa)
1.5.7 Consultas resumen
1.5.8 Subconsultas

1.6 UNIVERSIDAD (TIPO B)


1.6.1 Modelo entidad/relación
1.6.2 Base de datos para SQLServer
1.6.3 Datos

Angel Tello Valles correo: [email protected] 2


1.2 GESTIÓN DE EMPLEADOS

1.2.1 Modelo entidad/relación

1.2.2 Base de datos para SQLServer

DROP DATABASE IF EXISTS empleados;


CREATE DATABASE empleados
USE empleados;

CREATE TABLE departamento (


id INT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
presupuesto numeric(20,4) NOT NULL,
gastos numeric(20,4) NOT NULL
);

CREATE TABLE empleado (


id INT PRIMARY KEY,
nif VARCHAR(9) NOT NULL UNIQUE,
nombre VARCHAR(100) NOT NULL,
apellido1 VARCHAR(100) NOT NULL,
apellido2 VARCHAR(100),
id_departamento INT,
FOREIGN KEY (id_departamento) REFERENCES departamento(id)
);

INSERT INTO departamento VALUES(1, 'Desarrollo', 120000, 6000);


INSERT INTO departamento VALUES(2, 'Sistemas', 150000, 21000);
INSERT INTO departamento VALUES(3, 'Recursos Humanos', 280000, 25000);
INSERT INTO departamento VALUES(4, 'Contabilidad', 110000, 3000);
INSERT INTO departamento VALUES(5, 'I+D', 375000, 380000);
INSERT INTO departamento VALUES(6, 'Proyectos', 0, 0);
INSERT INTO departamento VALUES(7, 'Publicidad', 0, 1000);

INSERT INTO empleado VALUES(1, '32481596F', 'Aarón', 'Rivero', 'Gómez', 1);


INSERT INTO empleado VALUES(2, 'Y5575632D', 'Adela', 'Salas', 'Díaz', 2);
INSERT INTO empleado VALUES(3, 'R6970642B', 'Adolfo', 'Rubio', 'Flores', 3);
INSERT INTO empleado VALUES(4, '77705545E', 'Adrián', 'Suárez', NULL, 4);
INSERT INTO empleado VALUES(5, '17087203C', 'Marcos', 'Loyola', 'Méndez', 5);

Angel Tello Valles correo: [email protected] 3


INSERT INTO empleado VALUES(6, '38382980M', 'María', 'Santana', 'Moreno', 1);
INSERT INTO empleado VALUES(7, '80576669X', 'Pilar', 'Ruiz', NULL, 2);
INSERT INTO empleado VALUES(8, '71651431Z', 'Pepe', 'Ruiz', 'Santana', 3);
INSERT INTO empleado VALUES(9, '56399183D', 'Juan', 'Gómez', 'López', 2);
INSERT INTO empleado VALUES(10, '46384486H', 'Diego','Flores', 'Salas', 5);
INSERT INTO empleado VALUES(11, '67389283A', 'Marta','Herrera', 'Gil', 1);
INSERT INTO empleado VALUES(12, '41234836R', 'Irene','Salas', 'Flores', NULL);
INSERT INTO empleado VALUES(13, '82635162B', 'Juan Antonio','Sáez', 'Guerrero',
NULL);

1.2.3 Consultas sobre una tabla

1 Lista el primer apellido de todos los empleados.


2 Lista el primer apellido de los empleados eliminando los apellidos que estén repetidos.
3 Lista todas las columnas de la tabla empleado.
4 Lista el nombre y los apellidos de todos los empleados.
5 Lista el identificador de los departamentos de los empleados que aparecen en la tabla empleado.
6 Lista el identificador de los departamentos de los empleados que aparecen en la tabla empleado,
eliminando los identificadores que aparecen repetidos.
7 Lista el nombre y apellidos de los empleados en una única columna.
8 Lista el nombre y apellidos de los empleados en una única columna, convirtiendo todos los
caracteres en mayúscula.
9 Lista el nombre y apellidos de los empleados en una única columna, convirtiendo todos los
caracteres en minúscula.
10 Lista el identificador de los empleados junto al nif, pero el nif deberá aparecer en dos columnas,
una mostrará únicamente los dígitos del nif y la otra la letra.
11 Lista el nombre de cada departamento y el valor del presupuesto actual del que dispone. Para
calcular este dato tendrá que restar al valor del presupuesto inicial (columna presupuesto) los
gastos que se han generado (columna gastos). Tenga en cuenta que en algunos casos pueden existir
valores negativos. Utilice un alias apropiado para la nueva columna columna que está calculando.
12 Lista el nombre de los departamentos y el valor del presupuesto actual ordenado de forma
ascendente.
13 Lista el nombre de todos los departamentos ordenados de forma ascendente.
14 Lista el nombre de todos los departamentos ordenados de forma descendente.
15 Lista los apellidos y el nombre de todos los empleados, ordenados de forma alfabética tendiendo
en cuenta en primer lugar sus apellidos y luego su nombre.
16 Devuelve una lista con el nombre y el presupuesto, de los 3 departamentos que tienen mayor
presupuesto.
17 Devuelve una lista con el nombre y el presupuesto, de los 3 departamentos que tienen menor
presupuesto.
18 Devuelve una lista con el nombre y el gasto, de los 2 departamentos que tienen mayor gasto.
19 Devuelve una lista con el nombre y el gasto, de los 2 departamentos que tienen menor gasto.
20 Devuelve una lista con 5 filas a partir de la tercera fila de la tabla empleado. La tercera fila se
debe incluir en la respuesta. La respuesta debe incluir todas las columnas de la tabla empleado.
21 Devuelve una lista con el nombre de los departamentos y el presupuesto, de aquellos que tienen
un presupuesto mayor o igual a 150000 soles.
22 Devuelve una lista con el nombre de los departamentos y el gasto, de aquellos que tienen menos
de 5000 soles de gastos.
23 Devuelve una lista con el nombre de los departamentos y el presupuesto, de aquellos que tienen
un presupuesto entre 100000 y 200000 soles. Sin utilizar el operador BETWEEN.
24 Devuelve una lista con el nombre de los departamentos que no tienen un presupuesto entre
100000 y 200000 soles. Sin utilizar el operador BETWEEN.
25 Devuelve una lista con el nombre de los departamentos que tienen un presupuesto entre 100000 y
200000 soles. Utilizando el operador BETWEEN.
Angel Tello Valles correo: [email protected] 4
26 Devuelve una lista con el nombre de los departamentos que no tienen un presupuesto entre
100000 y 200000 soles. Utilizando el operador BETWEEN.
27 Devuelve una lista con el nombre de los departamentos, gastos y presupuesto, de aquellos
departamentos donde los gastos sean mayores que el presupuesto del que disponen.
28 Devuelve una lista con el nombre de los departamentos, gastos y presupuesto, de aquellos
departamentos donde los gastos sean menores que el presupuesto del que disponen.
29 Devuelve una lista con el nombre de los departamentos, gastos y presupuesto, de aquellos
departamentos donde los gastos sean iguales al presupuesto del que disponen.
30 Lista todos los datos de los empleados cuyo segundo apellido sea NULL.
31 Lista todos los datos de los empleados cuyo segundo apellido no sea NULL.
32 Lista todos los datos de los empleados cuyo segundo apellido sea López.
33 Lista todos los datos de los empleados cuyo segundo apellido sea Díaz o Moreno. Sin utilizar el
operador IN.
34 Lista todos los datos de los empleados cuyo segundo apellido sea Díaz o Moreno. Utilizando el
operador IN.
35 Lista los nombres, apellidos y nif de los empleados que trabajan en el departamento 3.
36 Lista los nombres, apellidos y nif de los empleados que trabajan en los departamentos 2, 4 o 5.

1.2.4 Consultas multitabla (Composición interna)

Resuelva todas las consultas utilizando la sintaxis de SQL1 y SQL2.


1 Devuelve un listado con los empleados y los datos de los departamentos donde trabaja cada uno.
2 Devuelve un listado con los empleados y los datos de los departamentos donde trabaja cada uno.
Ordena el resultado, en primer lugar por el nombre del departamento (en orden alfabético) y en
segundo lugar por los apellidos y el nombre de los empleados.
3 Devuelve un listado con el identificador y el nombre del departamento, solamente de aquellos
departamentos que tienen empleados.
4 Devuelve un listado con el identificador, el nombre del departamento y el valor del presupuesto
actual del que dispone, solamente de aquellos departamentos que tienen empleados. El valor del
presupuesto actual lo puede calcular restando al valor del presupuesto inicial
(columna presupuesto) el valor de los gastos que ha generado (columna gastos).
5 Devuelve el nombre del departamento donde trabaja el empleado que tiene el nif 38382980M.
6 Devuelve el nombre del departamento donde trabaja el empleado Pepe Ruiz Santana.
7 Devuelve un listado con los datos de los empleados que trabajan en el departamento de I+D.
Ordena el resultado alfabéticamente.
8 Devuelve un listado con los datos de los empleados que trabajan en el departamento
de Sistemas, Contabilidad o I+D. Ordena el resultado alfabéticamente.
9 Devuelve una lista con el nombre de los empleados que tienen los departamentos que no tienen un
presupuesto entre 100000 y 200000 soles.
10 Devuelve un listado con el nombre de los departamentos donde existe algún empleado cuyo
segundo apellido sea NULL. Tenga en cuenta que no debe mostrar nombres de departamentos que
estén repetidos.

1.2.5 Consultas multitabla (Composición externa)

Resuelva todas las consultas utilizando las cláusulas LEFT JOIN y RIGHT JOIN.
1 Devuelve un listado con todos los empleados junto con los datos de los departamentos donde
trabajan. Este listado también debe incluir los empleados que no tienen ningún departamento
asociado.
2 Devuelve un listado donde sólo aparezcan aquellos empleados que no tienen ningún departamento
asociado.
3 Devuelve un listado donde sólo aparezcan aquellos departamentos que no tienen ningún empleado
asociado.

Angel Tello Valles correo: [email protected] 5


4 Devuelve un listado con todos los empleados junto con los datos de los departamentos donde
trabajan. El listado debe incluir los empleados que no tienen ningún departamento asociado y los
departamentos que no tienen ningún empleado asociado. Ordene el listado alfabéticamente por el
nombre del departamento.
5 Devuelve un listado con los empleados que no tienen ningún departamento asociado y los
departamentos que no tienen ningún empleado asociado. Ordene el listado alfabéticamente por el
nombre del departamento.

1.2.6 Consultas resumen

1 Calcula la suma del presupuesto de todos los departamentos.


2 Calcula la media del presupuesto de todos los departamentos.
3 Calcula el valor mínimo del presupuesto de todos los departamentos.
4 Calcula el nombre del departamento y el presupuesto que tiene asignado, del departamento con
menor presupuesto.
5 Calcula el valor máximo del presupuesto de todos los departamentos.
6 Calcula el nombre del departamento y el presupuesto que tiene asignado, del departamento con
mayor presupuesto.
7 Calcula el número total de empleados que hay en la tabla empleado.
8 Calcula el número de empleados que no tienen NULL en su segundo apellido.
9 Calcula el número de empleados que hay en cada departamento. Tienes que devolver dos
columnas, una con el nombre del departamento y otra con el número de empleados que tiene
asignados.
10 Calcula el nombre de los departamentos que tienen más de 2 empleados. El resultado debe tener
dos columnas, una con el nombre del departamento y otra con el número de empleados que tiene
asignados.
11 Calcula el número de empleados que trabajan en cada uno de los departamentos. El resultado de
esta consulta también tiene que incluir aquellos departamentos que no tienen ningún empleado
asociado.
12 Calcula el número de empleados que trabajan en cada uno de los departamentos que tienen un
presupuesto mayor a 200000 soles.

1.2.7 Subconsultas

1.2.7.1 Con operadores básicos de comparación

1. Devuelve un listado con todos los empleados que tiene el departamento de Sistemas. (Sin
utilizar INNER JOIN).
2. Devuelve el nombre del departamento con mayor presupuesto y la cantidad que tiene asignada.
3. Devuelve el nombre del departamento con menor presupuesto y la cantidad que tiene asignada.

1.2.7.2 Subconsultas con ALL y ANY


4. Devuelve el nombre del departamento con mayor presupuesto y la cantidad que tiene asignada. Sin
hacer uso de MAX, ORDER BY ni LIMIT.
5. Devuelve el nombre del departamento con menor presupuesto y la cantidad que tiene asignada. Sin
hacer uso de MIN, ORDER BY ni LIMIT.
6. Devuelve los nombres de los departamentos que tienen empleados asociados.
(Utilizando ALL o ANY).
7. Devuelve los nombres de los departamentos que no tienen empleados asociados.
(Utilizando ALL o ANY).

1.2.7.3 Subconsultas con IN y NOT IN


8. Devuelve los nombres de los departamentos que tienen empleados asociados. (Utilizando IN o NOT
IN).

Angel Tello Valles correo: [email protected] 6


9. Devuelve los nombres de los departamentos que no tienen empleados asociados.
(Utilizando IN o NOT IN).

1.2.7.4 Subconsultas con EXISTS y NOT EXISTS


10. Devuelve los nombres de los departamentos que tienen empleados asociados.
(Utilizando EXISTS o NOT EXISTS).
11. Devuelve los nombres de los departamentos que tienen empleados asociados.
(Utilizando EXISTS o NOT EXISTS).

Angel Tello Valles correo: [email protected] 7


1.3 GESTIÓN DE VENTAS

1.3.1 Modelo entidad/relación

1.3.2 Base de datos para SQLServer

DROP DATABASE IF EXISTS ventas;


CREATE DATABASE ventas ;
USE ventas;

CREATE TABLE cliente (


id INT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
apellido1 VARCHAR(100) NOT NULL,
apellido2 VARCHAR(100),
ciudad VARCHAR(100),
categoria INT
);

CREATE TABLE comercial (


id INT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
apellido1 VARCHAR(100) NOT NULL,
apellido2 VARCHAR(100),
comision FLOAT
);

CREATE TABLE pedido (


id INT PRIMARY KEY,
total numeric(20,4) NOT NULL,
fecha DATE,
id_cliente INT NOT NULL,
id_comercial INT NOT NULL,
FOREIGN KEY (id_cliente) REFERENCES cliente(id),
FOREIGN KEY (id_comercial) REFERENCES comercial(id)
);

INSERT INTO cliente VALUES(1, 'Aarón', 'Rivero', 'Gómez', 'Almería', 100);


INSERT INTO cliente VALUES(2, 'Adela', 'Salas', 'Díaz', 'Granada', 200);
INSERT INTO cliente VALUES(3, 'Adolfo', 'Rubio', 'Flores', 'Sevilla', NULL);
INSERT INTO cliente VALUES(4, 'Adrián', 'Suárez', NULL, 'Jaén', 300);
INSERT INTO cliente VALUES(5, 'Marcos', 'Loyola', 'Méndez', 'Almería', 200);
INSERT INTO cliente VALUES(6, 'María', 'Santana', 'Moreno', 'Cádiz', 100);
INSERT INTO cliente VALUES(7, 'Pilar', 'Ruiz', NULL, 'Sevilla', 300);
INSERT INTO cliente VALUES(8, 'Pepe', 'Ruiz', 'Santana', 'Huelva', 200);
INSERT INTO cliente VALUES(9, 'Guillermo', 'López', 'Gómez', 'Granada', 225);
INSERT INTO cliente VALUES(10, 'Daniel', 'Santana', 'Loyola', 'Sevilla', 125);

Angel Tello Valles correo: [email protected] 8


INSERT INTO comercial VALUES(1, 'Daniel', 'Sáez', 'Vega', 0.15);
INSERT INTO comercial VALUES(2, 'Juan', 'Gómez', 'López', 0.13);
INSERT INTO comercial VALUES(3, 'Diego','Flores', 'Salas', 0.11);
INSERT INTO comercial VALUES(4, 'Marta','Herrera', 'Gil', 0.14);
INSERT INTO comercial VALUES(5, 'Antonio','Carretero', 'Ortega', 0.12);
INSERT INTO comercial VALUES(6, 'Manuel','Domínguez', 'Hernández', 0.13);
INSERT INTO comercial VALUES(7, 'Antonio','Vega', 'Hernández', 0.11);
INSERT INTO comercial VALUES(8, 'Alfredo','Ruiz', 'Flores', 0.05);

INSERT INTO pedido VALUES(1, 150.5, '2017-10-05', 5, 2);


INSERT INTO pedido VALUES(2, 270.65, '2016-09-10', 1, 5);
INSERT INTO pedido VALUES(3, 65.26, '2017-10-05', 2, 1);
INSERT INTO pedido VALUES(4, 110.5, '2016-08-17', 8, 3);
INSERT INTO pedido VALUES(5, 948.5, '2017-09-10', 5, 2);
INSERT INTO pedido VALUES(6, 2400.6, '2016-07-27', 7, 1);
INSERT INTO pedido VALUES(7, 5760, '2015-09-10', 2, 1);
INSERT INTO pedido VALUES(8, 1983.43, '2017-10-10', 4, 6);
INSERT INTO pedido VALUES(9, 2480.4, '2016-10-10', 8, 3);
INSERT INTO pedido VALUES(10, 250.45, '2015-06-27', 8, 2);
INSERT INTO pedido VALUES(11, 75.29, '2016-08-17', 3, 7);
INSERT INTO pedido VALUES(12, 3045.6, '2017-04-25', 2, 1);
INSERT INTO pedido VALUES(13, 545.75, '2019-01-25', 6, 1);
INSERT INTO pedido VALUES(14, 145.82, '2017-02-02', 6, 1);
INSERT INTO pedido VALUES(15, 370.85, '2019-03-11', 1, 5);
INSERT INTO pedido VALUES(16, 2389.23, '2019-03-11', 1, 5);

1.3.3 Consultas sobre una tabla

1. Devuelve un listado con todos los pedidos que se han realizado. Los pedidos deben estar
ordenados por la fecha de realización, mostrando en primer lugar los pedidos más recientes.
2. Devuelve todos los datos de los dos pedidos de mayor valor.
3. Devuelve un listado con los identificadores de los clientes que han realizado algún pedido. Tenga en
cuenta que no debe mostrar identificadores que estén repetidos.
4. Devuelve un listado de todos los pedidos que se realizaron durante el año 2017, cuya cantidad total
sea superior a 500 soles .
5. Devuelve un listado con el nombre y los apellidos de los comerciales que tienen una comisión entre
0.05 y 0.11.
6. Devuelve el valor de la comisión de mayor valor que existe en la tabla comercial.
7. Devuelve el identificador, nombre y primer apellido de aquellos clientes cuyo segundo
apellido no es NULL. El listado deberá estar ordenado alfabéticamente por apellidos y nombre.
8. Devuelve un listado de los nombres de los clientes que empiezan por A y terminan por n y también
los nombres que empiezan por P. El listado deberá estar ordenado alfabéticamente.
9. Devuelve un listado de los nombres de los clientes que no empiezan por A. El listado deberá estar
ordenado alfabéticamente.
10. Devuelve un listado con los nombres de los comerciales que terminan por el o o. Tenga en cuenta
que se deberán eliminar los nombres repetidos.

1.3.4 Consultas multitabla (Composición interna)

Resuelva todas las consultas utilizando la sintaxis de SQL1 y SQL2.


1. Devuelve un listado con el identificador, nombre y los apellidos de todos los clientes que han
realizado algún pedido. El listado debe estar ordenado alfabéticamente y se deben eliminar los
elementos repetidos.
2. Devuelve un listado que muestre todos los pedidos que ha realizado cada cliente. El resultado debe
mostrar todos los datos de los pedidos y del cliente. El listado debe mostrar los datos de los clientes
ordenados alfabéticamente.

Angel Tello Valles correo: [email protected] 9


3. Devuelve un listado que muestre todos los pedidos en los que ha participado un comercial. El
resultado debe mostrar todos los datos de los pedidos y de los comerciales. El listado debe mostrar
los datos de los comerciales ordenados alfabéticamente.
4. Devuelve un listado que muestre todos los clientes, con todos los pedidos que han realizado y con
los datos de los comerciales asociados a cada pedido.
5. Devuelve un listado de todos los clientes que realizaron un pedido durante el año 2017, cuya
cantidad esté entre 300 soles y 1000 soles .
6. Devuelve el nombre y los apellidos de todos los comerciales que ha participado en algún pedido
realizado por María Santana Moreno.
7. Devuelve el nombre de todos los clientes que han realizado algún pedido con el comercial Daniel
Sáez Vega.

1.3.5 Consultas multitabla (Composición externa)

Resuelva todas las consultas utilizando las cláusulas LEFT JOIN y RIGHT JOIN.
1. Devuelve un listado con todos los clientes junto con los datos de los pedidos que han realizado.
Este listado también debe incluir los clientes que no han realizado ningún pedido. El listado debe
estar ordenado alfabéticamente por el primer apellido, segundo apellido y nombre de los clientes.
2. Devuelve un listado con todos los comerciales junto con los datos de los pedidos que han
realizado. Este listado también debe incluir los comerciales que no han realizado ningún pedido. El
listado debe estar ordenado alfabéticamente por el primer apellido, segundo apellido y nombre de
los comerciales.
3. Devuelve un listado que solamente muestre los clientes que no han realizado ningún pedido.
4. Devuelve un listado que solamente muestre los comerciales que no han realizado ningún pedido.
5. Devuelve un listado con los clientes que no han realizado ningún pedido y de los comerciales que
no han participado en ningún pedido. Ordene el listado alfabéticamente por los apellidos y el
nombre. En en listado deberá diferenciar de algún modo los clientes y los comerciales.
6. ¿Se podrían realizar las consultas anteriores con NATURAL LEFT JOIN o NATURAL RIGHT JOIN?
Justifique su respuesta.

1.3.6 Consultas resumen

7. Calcula la cantidad total que suman todos los pedidos que aparecen en la tabla pedido.
8. Calcula la cantidad media de todos los pedidos que aparecen en la tabla pedido.
9. Calcula el número total de comerciales distintos que aparecen en la tabla pedido.
10. Calcula el número total de clientes que aparecen en la tabla cliente.
11. Calcula cuál es la mayor cantidad que aparece en la tabla pedido.
12. Calcula cuál es la menor cantidad que aparece en la tabla pedido.
13. Calcula cuál es el valor máximo de categoría para cada una de las ciudades que aparece en la
tabla cliente.
14. Calcula cuál es el máximo valor de los pedidos realizados durante el mismo día para cada uno de los
clientes. Es decir, el mismo cliente puede haber realizado varios pedidos de diferentes cantidades el
mismo día. Se pide que se calcule cuál es el pedido de máximo valor para cada uno de los días en
los que un cliente ha realizado un pedido. Muestra el identificador del cliente, nombre, apellidos, la
fecha y el valor de la cantidad.
15. Calcula cuál es el máximo valor de los pedidos realizados durante el mismo día para cada uno de los
clientes, teniendo en cuenta que sólo queremos mostrar aquellos pedidos que superen la cantidad
de 2000 soles .
16. Calcula el máximo valor de los pedidos realizados para cada uno de los comerciales durante la
fecha 2016-08-17. Muestra el identificador del comercial, nombre, apellidos y total.
17. Devuelve un listado con el identificador de cliente, nombre y apellidos y el número total de pedidos
que ha realizado cada uno de clientes. Tenga en cuenta que pueden existir clientes que no han

Angel Tello Valles correo: [email protected] 10


realizado ningún pedido. Estos clientes también deben aparecer en el listado indicando que el
número de pedidos realizados es 0.
18. Devuelve un listado con el identificador de cliente, nombre y apellidos y el número total de pedidos
que ha realizado cada uno de clientes durante el año 2017.
19. Devuelve un listado que muestre el identificador de cliente, nombre, primer apellido y el valor de la
máxima cantidad del pedido realizado por cada uno de los clientes. El resultado debe mostrar
aquellos clientes que no han realizado ningún pedido indicando que la máxima cantidad de sus
pedidos realizados es 0. Puede hacer uso de la función IFNULL.
20. Devuelve cuál ha sido el pedido de máximo valor que se ha realizado cada año.
21. Devuelve el número total de pedidos que se han realizado cada año.

1.3.7 Subconsultas

1.3.7.1 Con operadores básicos de comparación

1. Devuelve un listado con todos los pedidos que ha realizado Adela Salas Díaz. (Sin utilizar INNER
JOIN).
2. Devuelve el número de pedidos en los que ha participado el comercial Daniel Sáez Vega. (Sin
utilizar INNER JOIN)
3. Devuelve los datos del cliente que realizó el pedido más caro en el año 2019. (Sin utilizar INNER
JOIN)
4. Devuelve la fecha y la cantidad del pedido de menor valor realizado por el cliente Pepe Ruiz
Santana.
5. Devuelve un listado con los datos de los clientes y los pedidos, de todos los clientes que han
realizado un pedido durante el año 2017 con un valor mayor o igual al valor medio de los pedidos
realizados durante ese mismo año.

1.3.7.2 Subconsultas con ALL y ANY


6. Devuelve el pedido más caro que existe en la tabla pedido si hacer uso de MAX, ORDER
BY ni LIMIT.
7. Devuelve un listado de los clientes que no han realizado ningún pedido. (Utilizando ANY o ALL).
8. Devuelve un listado de los comerciales que no han realizado ningún pedido. (Utilizando ANY o ALL).

1.3.7.3 Subconsultas con IN y NOT IN


9. Devuelve un listado de los clientes que no han realizado ningún pedido. (Utilizando IN o NOT IN).
10. Devuelve un listado de los comerciales que no han realizado ningún pedido. (Utilizando IN o NOT
IN).

1.3.7.4 Subconsultas con EXISTS y NOT EXISTS


11. Devuelve un listado de los clientes que no han realizado ningún pedido. (Utilizando EXISTS o NOT
EXISTS).
12. Devuelve un listado de los comerciales que no han realizado ningún pedido.
(Utilizando EXISTS o NOT EXISTS).

Angel Tello Valles correo: [email protected] 11


1.4 JARDINERÍA

1.4.1 Modelo entidad/relación

1.4.2 Base de datos para SQLServer

DROP DATABASE IF EXISTS jardineria;


CREATE DATABASE jardineria ;
USE jardineria;

CREATE TABLE oficina (


codigo_oficina VARCHAR(10) NOT NULL,
ciudad VARCHAR(30) NOT NULL,

Angel Tello Valles correo: [email protected] 12


pais VARCHAR(50) NOT NULL,
region VARCHAR(50) DEFAULT NULL,
codigo_postal VARCHAR(10) NOT NULL,
telefono VARCHAR(20) NOT NULL,
linea_direccion1 VARCHAR(50) NOT NULL,
linea_direccion2 VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (codigo_oficina)
);

CREATE TABLE empleado (


codigo_empleado INTEGER NOT NULL,
nombre VARCHAR(50) NOT NULL,
apellido1 VARCHAR(50) NOT NULL,
apellido2 VARCHAR(50) DEFAULT NULL,
extension VARCHAR(10) NOT NULL,
email VARCHAR(100) NOT NULL,
codigo_oficina VARCHAR(10) NOT NULL,
codigo_jefe INTEGER DEFAULT NULL,
puesto VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (codigo_empleado),
FOREIGN KEY (codigo_oficina) REFERENCES oficina (codigo_oficina),
FOREIGN KEY (codigo_jefe) REFERENCES empleado (codigo_empleado)
);

CREATE TABLE gama_producto (


gama VARCHAR(50) NOT NULL,
descripcion_texto TEXT,
descripcion_html TEXT,
imagen VARCHAR(256),
PRIMARY KEY (gama)
);

CREATE TABLE cliente (


codigo_cliente INTEGER NOT NULL,
nombre_cliente VARCHAR(50) NOT NULL,
nombre_contacto VARCHAR(30) DEFAULT NULL,
apellido_contacto VARCHAR(30) DEFAULT NULL,
telefono VARCHAR(15) NOT NULL,
fax VARCHAR(15) NOT NULL,
linea_direccion1 VARCHAR(50) NOT NULL,
linea_direccion2 VARCHAR(50) DEFAULT NULL,
ciudad VARCHAR(50) NOT NULL,
region VARCHAR(50) DEFAULT NULL,
pais VARCHAR(50) DEFAULT NULL,
codigo_postal VARCHAR(10) DEFAULT NULL,
codigo_empleado_rep_ventas INTEGER DEFAULT NULL,
limite_credito NUMERIC(15,2) DEFAULT NULL,
PRIMARY KEY (codigo_cliente),
FOREIGN KEY (codigo_empleado_rep_ventas) REFERENCES empleado (codigo_empleado)
);

CREATE TABLE pedido (


codigo_pedido INTEGER NOT NULL,
fecha_pedido date NOT NULL,
fecha_esperada date NOT NULL,
fecha_entrega date DEFAULT NULL,
estado VARCHAR(15) NOT NULL,
comentarios TEXT,
codigo_cliente INTEGER NOT NULL,
PRIMARY KEY (codigo_pedido),
FOREIGN KEY (codigo_cliente) REFERENCES cliente (codigo_cliente)
);

CREATE TABLE producto (


Angel Tello Valles correo: [email protected] 13
codigo_producto VARCHAR(15) NOT NULL,
nombre VARCHAR(70) NOT NULL,
gama VARCHAR(50) NOT NULL,
dimensiones VARCHAR(25) NULL,
proveedor VARCHAR(50) DEFAULT NULL,
descripcion text NULL,
cantidad_en_stock SMALLINT NOT NULL,
precio_venta NUMERIC(15,2) NOT NULL,
precio_proveedor NUMERIC(15,2) DEFAULT NULL,
PRIMARY KEY (codigo_producto),
FOREIGN KEY (gama) REFERENCES gama_producto (gama)
);

CREATE TABLE detalle_pedido (


codigo_pedido INTEGER NOT NULL,
codigo_producto VARCHAR(15) NOT NULL,
cantidad INTEGER NOT NULL,
precio_unidad NUMERIC(15,2) NOT NULL,
numero_linea SMALLINT NOT NULL,
PRIMARY KEY (codigo_pedido, codigo_producto),
FOREIGN KEY (codigo_pedido) REFERENCES pedido (codigo_pedido),
FOREIGN KEY (codigo_producto) REFERENCES producto (codigo_producto)
);

CREATE TABLE pago (


codigo_cliente INTEGER NOT NULL,
forma_pago VARCHAR(40) NOT NULL,
id_transaccion VARCHAR(50) NOT NULL,
fecha_pago date NOT NULL,
total NUMERIC(15,2) NOT NULL,
PRIMARY KEY (codigo_cliente, id_transaccion),
FOREIGN KEY (codigo_cliente) REFERENCES cliente (codigo_cliente)
);

1.4.3 Datos

Acceder al script SQL para la creación de la base de datos y la inserción de datos: jardineria.sql.

1.4.4 Consultas sobre una tabla

1. Devuelve un listado con el código de oficina y la ciudad donde hay oficinas.


2. Devuelve un listado con la ciudad y el teléfono de las oficinas de España.
3. Devuelve un listado con el nombre, apellidos y email de los empleados cuyo jefe tiene un código de
jefe igual a 7.
4. Devuelve el nombre del puesto, nombre, apellidos y email del jefe de la empresa.
5. Devuelve un listado con el nombre, apellidos y puesto de aquellos empleados que no sean
representantes de ventas.
6. Devuelve un listado con el nombre de los todos los clientes españoles.
7. Devuelve un listado con los distintos estados por los que puede pasar un pedido.
8. Devuelve un listado con el código de cliente de aquellos clientes que realizaron algún pago en 2008.
Tenga en cuenta que deberá eliminar aquellos códigos de cliente que aparezcan repetidos.
Resuelva la consulta:

 Utilizando la función YEAR de SQLServer .


 Utilizando la función DATE_FORMAT de SQLServer .
 Sin utilizar ninguna de las funciones anteriores.

Angel Tello Valles correo: [email protected] 14


9. Devuelve un listado con el código de pedido, código de cliente, fecha esperada y fecha de entrega
de los pedidos que no han sido entregados a tiempo.
10. Devuelve un listado con el código de pedido, código de cliente, fecha esperada y fecha de entrega
de los pedidos cuya fecha de entrega ha sido al menos dos días antes de la fecha esperada.

 Utilizando la función ADDDATE de SQLServer .


 Utilizando la función DATEDIFF de SQLServer .
 ¿Sería posible resolver esta consulta utilizando el operador de suma + o resta -?

11. Devuelve un listado de todos los pedidos que fueron rechazados en 2009.
12. Devuelve un listado de todos los pedidos que han sido entregados en el mes de enero de cualquier
año.
13. Devuelve un listado con todos los pagos que se realizaron en el año 2008 mediante Paypal. Ordene
el resultado de mayor a menor.
14. Devuelve un listado con todas las formas de pago que aparecen en la tabla pago. Tenga en cuenta
que no deben aparecer formas de pago repetidas.
15. Devuelve un listado con todos los productos que pertenecen a la gama Ornamentales y que tienen
más de 100 unidades en stock. El listado deberá estar ordenado por su precio de venta, mostrando
en primer lugar los de mayor precio.
16. Devuelve un listado con todos los clientes que sean de la ciudad de Madrid y cuyo representante de
ventas tenga el código de empleado 11 o 30.

1.4.5 Consultas multitabla (Composición interna)

Resuelva todas las consultas utilizando la sintaxis de SQL1 y SQL2. Las consultas con sintaxis de SQL2 se
deben resolver con INNER JOIN y NATURAL JOIN.
1. Obtén un listado con el nombre de cada cliente y el nombre y apellido de su representante de
ventas.
2. Muestra el nombre de los clientes que hayan realizado pagos junto con el nombre de sus
representantes de ventas.
3. Muestra el nombre de los clientes que no hayan realizado pagos junto con el nombre de sus
representantes de ventas.
4. Devuelve el nombre de los clientes que han hecho pagos y el nombre de sus representantes junto
con la ciudad de la oficina a la que pertenece el representante.
5. Devuelve el nombre de los clientes que no hayan hecho pagos y el nombre de sus representantes
junto con la ciudad de la oficina a la que pertenece el representante.
6. Lista la dirección de las oficinas que tengan clientes en Fuenlabrada.
7. Devuelve el nombre de los clientes y el nombre de sus representantes junto con la ciudad de la
oficina a la que pertenece el representante.
8. Devuelve un listado con el nombre de los empleados junto con el nombre de sus jefes.
9. Devuelve un listado que muestre el nombre de cada empleado, el nombre de su jefe y el nombre
del jefe de sus jefe.
10. Devuelve el nombre de los clientes a los que no se les ha entregado a tiempo un pedido.
11. Devuelve un listado de las diferentes gamas de producto que ha comprado cada cliente.

1.4.6 Consultas multitabla (Composición externa)

Resuelva todas las consultas utilizando las cláusulas LEFT JOIN, RIGHT JOIN, NATURAL LEFT
JOIN y NATURAL RIGHT JOIN.
1. Devuelve un listado que muestre solamente los clientes que no han realizado ningún pago.
2. Devuelve un listado que muestre solamente los clientes que no han realizado ningún pedido.
3. Devuelve un listado que muestre los clientes que no han realizado ningún pago y los que no han
realizado ningún pedido.
4. Devuelve un listado que muestre solamente los empleados que no tienen una oficina asociada.
Angel Tello Valles correo: [email protected] 15
5. Devuelve un listado que muestre solamente los empleados que no tienen un cliente asociado.
6. Devuelve un listado que muestre solamente los empleados que no tienen un cliente asociado junto
con los datos de la oficina donde trabajan.
7. Devuelve un listado que muestre los empleados que no tienen una oficina asociada y los que no
tienen un cliente asociado.
8. Devuelve un listado de los productos que nunca han aparecido en un pedido.
9. Devuelve un listado de los productos que nunca han aparecido en un pedido. El resultado debe
mostrar el nombre, la descripción y la imagen del producto.
10. Devuelve las oficinas donde no trabajan ninguno de los empleados que hayan sido los
representantes de ventas de algún cliente que haya realizado la compra de algún producto de la
gama Frutales.
11. Devuelve un listado con los clientes que han realizado algún pedido, pero no han realizado ningún
pago.
12. Devuelve un listado con los datos de los empleados que no tienen clientes asociados y el nombre
de su jefe asociado.

1.4.7 Consultas resumen

13. ¿Cuántos empleados hay en la compañía?


14. ¿Cuántos clientes tiene cada país?
15. ¿Cuál fue el pago medio en 2009?
16. ¿Cuántos pedidos hay en cada estado? Ordena el resultado de forma descendente por el número
de pedidos.
17. Calcula el precio de venta del producto más caro y más barato en una misma consulta.
18. Calcula el número de clientes que tiene la empresa.
19. ¿Cuántos clientes existen con domicilio en la ciudad de Madrid?
20. ¿Calcula cuántos clientes tiene cada una de las ciudades que empiezan por M?
21. Devuelve el nombre de los representantes de ventas y el número de clientes al que atiende cada
uno.
22. Calcula el número de clientes que no tiene asignado representante de ventas.
23. Calcula la fecha del primer y último pago realizado por cada uno de los clientes. El listado deberá
mostrar el nombre y los apellidos de cada cliente.
24. Calcula el número de productos diferentes que hay en cada uno de los pedidos.
25. Calcula la suma de la cantidad total de todos los productos que aparecen en cada uno de los
pedidos.
26. Devuelve un listado de los 20 productos más vendidos y el número total de unidades que se han
vendido de cada uno. El listado deberá estar ordenado por el número total de unidades vendidas.
27. La facturación que ha tenido la empresa en toda la historia, indicando la base imponible, el IVA y el
total facturado. La base imponible se calcula sumando el coste del producto por el número de
unidades vendidas de la tabla detalle_pedido. El IVA es el 21 % de la base imponible, y el total la
suma de los dos campos anteriores.
28. La misma información que en la pregunta anterior, pero agrupada por código de producto.
29. La misma información que en la pregunta anterior, pero agrupada por código de producto filtrada
por los códigos que empiecen por OR.
30. Lista las ventas totales de los productos que hayan facturado más de 3000 soles. Se mostrará el
nombre, unidades vendidas, total facturado y total facturado con impuestos (21% IVA).
31. Muestre la suma total de todos los pagos que se realizaron para cada uno de los años que aparecen
en la tabla pagos.

1.4.8 Subconsultas

1.4.8.1 Con operadores básicos de comparación

Angel Tello Valles correo: [email protected] 16


1. Devuelve el nombre del cliente con mayor límite de crédito.
2. Devuelve el nombre del producto que tenga el precio de venta más caro.
3. Devuelve el nombre del producto del que se han vendido más unidades. (Tenga en cuenta que
tendrá que calcular cuál es el número total de unidades que se han vendido de cada producto a
partir de los datos de la tabla detalle_pedido)
4. Los clientes cuyo límite de crédito sea mayor que los pagos que haya realizado. (Sin utilizar INNER
JOIN).
5. Devuelve el producto que más unidades tiene en stock.
6. Devuelve el producto que menos unidades tiene en stock.
7. Devuelve el nombre, los apellidos y el email de los empleados que están a cargo de Alberto Soria.

1.4.8.2 Subconsultas con ALL y ANY

8. Devuelve el nombre del cliente con mayor límite de crédito.


9. Devuelve el nombre del producto que tenga el precio de venta más caro.
10. Devuelve el producto que menos unidades tiene en stock.

1.4.8.3 Subconsultas con IN y NOT IN

11. Devuelve el nombre, apellido1 y cargo de los empleados que no representen a ningún cliente.
12. Devuelve un listado que muestre solamente los clientes que no han realizado ningún pago.
13. Devuelve un listado que muestre solamente los clientes que sí han realizado algún pago.
14. Devuelve un listado de los productos que nunca han aparecido en un pedido.
15. Devuelve el nombre, apellidos, puesto y teléfono de la oficina de aquellos empleados que no sean
representante de ventas de ningún cliente.
16. Devuelve las oficinas donde no trabajan ninguno de los empleados que hayan sido los
representantes de ventas de algún cliente que haya realizado la compra de algún producto de la
gama Frutales.
17. Devuelve un listado con los clientes que han realizado algún pedido pero no han realizado ningún
pago.

1.4.8.4 Subconsultas con EXISTS y NOT EXISTS

18. Devuelve un listado que muestre solamente los clientes que no han realizado ningún pago.
19. Devuelve un listado que muestre solamente los clientes que sí han realizado algún pago.
20. Devuelve un listado de los productos que nunca han aparecido en un pedido.
21. Devuelve un listado de los productos que han aparecido en un pedido alguna vez.

1.4.8.5 Subconsultas correlacionadas

1.4.9 Consultas variadas

1. Devuelve el listado de clientes indicando el nombre del cliente y cuántos pedidos ha realizado.
Tenga en cuenta que pueden existir clientes que no han realizado ningún pedido.
2. Devuelve un listado con los nombres de los clientes y el total pagado por cada uno de ellos. Tenga
en cuenta que pueden existir clientes que no han realizado ningún pago.
3. Devuelve el nombre de los clientes que hayan hecho pedidos en 2008 ordenados alfabéticamente
de menor a mayor.
4. Devuelve el nombre del cliente, el nombre y primer apellido de su representante de ventas y el
número de teléfono de la oficina del representante de ventas, de aquellos clientes que no hayan
realizado ningún pago.

Angel Tello Valles correo: [email protected] 17


5. Devuelve el listado de clientes donde aparezca el nombre del cliente, el nombre y primer apellido
de su representante de ventas y la ciudad donde está su oficina.
6. Devuelve el nombre, apellidos, puesto y teléfono de la oficina de aquellos empleados que no sean
representante de ventas de ningún cliente.
7. Devuelve un listado indicando todas las ciudades donde hay oficinas y el número de empleados que
tiene.

Angel Tello Valles correo: [email protected] 18


1.5 UNIVERSIDAD (TIPO A)

1.5.1 Modelo entidad/relación

1.5.2 Base de datos para SQLServer

DROP DATABASE IF EXISTS universidad;


CREATE DATABASE universidad ;
USE universidad;

CREATE TABLE departamento (


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

CREATE TABLE persona (


id INT 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 char(1) NOT NULL CHECK (sexo in ('H', 'M')),
tipo varchar(10) NOT NULL CHECK (tipo in ('profesor', 'alumno'))
);

Angel Tello Valles correo: [email protected] 19


CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
date_of_birth DATE,
-- Other columns
CONSTRAINT check_age CHECK (DATEDIFF(dd,getdate(), date_of_birth) >= 6570)
);

CREATE TABLE profesor (


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

CREATE TABLE grado (


id INT identity (1,1) PRIMARY KEY,
nombre VARCHAR(100) NOT NULL
);

CREATE TABLE asignatura (


id INT identity (1,1) PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
creditos FLOAT NOT NULL,
tipo varchar(20) not null CHECK (tipo in ('básica', 'obligatoria', 'optativa')),
curso TINYINT NOT NULL,
cuatrimestre TINYINT NOT NULL,
id_profesor INT ,
id_grado INT NOT NULL,
FOREIGN KEY(id_profesor) REFERENCES profesor(id_profesor),
FOREIGN KEY(id_grado) REFERENCES grado(id)
);

CREATE TABLE curso_escolar (


id INT identity (1,1) PRIMARY KEY,
anyo_inicio smallint NOT NULL,
anyo_fin smallint NOT NULL
);

CREATE TABLE alumno_se_matricula_asignatura (


id_alumno INT NOT NULL,
id_asignatura INT NOT NULL,
id_curso_escolar INT 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)
);

1.5.3 Datos

Acceder al script SQL para la creación de la base de datos y la inserción de datos: universidad_a.sql.

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.

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.

Angel Tello Valles correo: [email protected] 20


3. Devuelve el listado de los alumnos que nacieron en 1999.
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.
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.

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).
2. Devuelve un listado con todas las asignaturas ofertadas en el Grado en Ingeniería Informática (Plan
2015).
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 departamento. El resultado estará ordenado alfabéticamente de menor a mayor por
los apellidos y el nombre.
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.
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).
6. Devuelve un listado con todos los alumnos que se han matriculado en alguna asignatura durante el
curso escolar 2018/2019.

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.
2. Devuelve un listado con los profesores que no están asociados a un departamento.
3. Devuelve un listado con los departamentos que no tienen profesores asociados.
4. Devuelve un listado con los profesores que no imparten ninguna asignatura.
5. Devuelve un listado con las asignaturas que no tienen un profesor asignado.
6. Devuelve un listado con todos los departamentos que tienen alguna asignatura que no se haya
impartido 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.

1.5.7 Consultas resumen

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


2. Calcula cuántos alumnos nacieron en 1999.
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.
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 departamentos también tienen que aparecer en el listado.
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

Angel Tello Valles correo: [email protected] 21


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.
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.
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.
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.
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.

1.5.8 Subconsultas

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


2. Devuelve un listado con los profesores que no están asociados a un departamento.
3. Devuelve un listado con los departamentos que no tienen profesores asociados.
4. Devuelve un listado con los profesores que tienen un departamento asociado y que no imparten
ninguna asignatura.
5. Devuelve un listado con las asignaturas que no tienen un profesor asignado.
6. Devuelve un listado con todos los departamentos que no han impartido asignaturas en ningún
curso escolar.

Angel Tello Valles correo: [email protected] 22


1.6 UNIVERSIDAD (TIPO B)

1.6.1 Modelo entidad/relación

1.6.2 Base de datos para SQLServer

DROP DATABASE IF EXISTS universidad;


CREATE DATABASE universidad ;
USE universidad;

CREATE TABLE departamento (


id INT identity(1,1) PRIMARY KEY,
nombre VARCHAR(50) NOT NULL
);

CREATE TABLE alumno (


id INT identity(1,1) 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 char(1) NOT NULL CHECK (sexo in ('H', 'M'))
);
Angel Tello Valles correo: [email protected] 23
CREATE TABLE profesor (
id INT identity(1,1) 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 char(1) NOT NULL CHECK (sexo in ('H', 'M')),
id_departamento INT NOT NULL,
FOREIGN KEY (id_departamento) REFERENCES departamento(id)
);

CREATE TABLE grado (


id INT identity(1,1) PRIMARY KEY,
nombre VARCHAR(100) NOT NULL
);

CREATE TABLE asignatura (


id INT identity(1,1) PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
creditos numeric(20,4) NOT NULL,
tipo varchar(20) NOT NULL CHECK (tipo in ('básica', 'obligatoria', 'optativa')),
curso TINYINT NOT NULL,
cuatrimestre TINYINT NOT NULL,
id_profesor INT ,
id_grado INT NOT NULL,
FOREIGN KEY(id_profesor) REFERENCES profesor(id),
FOREIGN KEY(id_grado) REFERENCES grado(id)
);

CREATE TABLE curso_escolar (


id INT identity(1,1)PRIMARY KEY,
anyo_inicio smallint NOT NULL,
anyo_fin smallint NOT NULL
);

CREATE TABLE alumno_se_matricula_asignatura (


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

);

1.6.3 Datos

Acceder al script SQL para la creación de la base de datos y la inserción de datos: universidad_b.sql.

1.5.4 Consultas sobre una tabla

6. 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.

Angel Tello Valles correo: [email protected] 24


7. 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.

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


9. 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.
10. Devuelve el listado de las asignaturas que se imparten en el primer cuatrimestre, en el tercer curso
del grado que tiene el identificador 7.

1.5.5 Consultas multitabla (Composición interna)

7. 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).
8. Devuelve un listado con todas las asignaturas ofertadas en el Grado en Ingeniería Informática (Plan
2015).
9. 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 departamento. El resultado estará ordenado alfabéticamente de menor a mayor por
los apellidos y el nombre.
10. 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.
11. 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).
12. Devuelve un listado con todos los alumnos que se han matriculado en alguna asignatura durante el
curso escolar 2018/2019.

1.5.6 Consultas multitabla (Composición externa)

Resuelva todas las consultas utilizando las cláusulas LEFT JOIN y RIGHT JOIN.
7. 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.
8. Devuelve un listado con los profesores que no están asociados a un departamento.
9. Devuelve un listado con los departamentos que no tienen profesores asociados.
10. Devuelve un listado con los profesores que no imparten ninguna asignatura.
11. Devuelve un listado con las asignaturas que no tienen un profesor asignado.
12. Devuelve un listado con todos los departamentos que tienen alguna asignatura que no se haya
impartido 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.

1.5.7 Consultas resumen

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


11. Calcula cuántos alumnos nacieron en 1999.
12. 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.
13. 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 departamentos también tienen que aparecer en el listado.

Angel Tello Valles correo: [email protected] 25


14. 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.
15. 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.
16. 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éditos.
17. 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.
18. 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.

1.5.8 Subconsultas

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


8. Devuelve un listado con los profesores que no están asociados a un departamento.
9. Devuelve un listado con los departamentos que no tienen profesores asociados.
10. Devuelve un listado con los profesores que tienen un departamento asociado y que no imparten
ninguna asignatura.
11. Devuelve un listado con las asignaturas que no tienen un profesor asignado.
12. Devuelve un listado con todos los departamentos que no han impartido asignaturas en ningún
curso escolar.

Angel Tello Valles correo: [email protected] 26

También podría gustarte