Saltar a contenido

SA5 · Ejercicios de SQL moderno

Los ejercicios SA5.1, SA5.2 y SA5.5 usan las tablas de las páginas A5.1 y A5.2: en cada ejercicio la base de datos parte de cero, así que incluye tú las sentencias de creación. Los SA5.3 y SA5.4 usan la base de datos del instituto. Escribe tú toda la solución.

Ejercicio SA5.1

Un contador de visitas. Con esta tabla:

CREATE TABLE visitas (
  pagina TEXT    PRIMARY KEY,
  total  INTEGER NOT NULL
);

Registra tres visitas a la página inicio con tres sentencias iguales (INSERT con ON CONFLICT) y muestra pagina y total. El total debe ser 3.

Resultado esperado:

pagina total
inicio 3

1 fila

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

CREATE TABLE visitas (
  pagina TEXT    PRIMARY KEY,
  total  INTEGER NOT NULL
);
INSERT INTO visitas VALUES ('inicio', 1) ON CONFLICT(pagina) DO UPDATE SET total = total + 1;
-- ... (resto de la solución bloqueado)

Ejercicio SA5.2

Recibir mercancía. Con la tabla stock de la página A5.1 (con sus dos filas iniciales, café 10 y té 4):

CREATE TABLE stock (
  producto TEXT    PRIMARY KEY,
  cantidad INTEGER NOT NULL,
  nota     TEXT
);
INSERT INTO stock VALUES ('café', 10, 'pedir más'), ('té', 4, NULL);

En una sola sentencia llegan 5 de café, 6 de té y 2 de zumo: lo que ya existe suma la cantidad y lo que no existe se crea. Muestra producto y cantidad, ordenados por producto. La nota del café debe conservarse.

Resultado esperado:

producto cantidad
café 15
té 10
zumo 2

3 filas

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

CREATE TABLE stock (
  producto TEXT    PRIMARY KEY,
  cantidad INTEGER NOT NULL,
  nota     TEXT
);
-- ... (resto de la solución bloqueado)

Ejercicio SA5.3

Subir las horas y verlas. Con la base de datos del instituto: suma 10 horas a las asignaturas del profesor 3 y, en la misma sentencia, muestra con RETURNING el nombre y las horas de cada asignatura ya modificada.

Resultado esperado:

nombre horas
Entornos de Desarrollo 110
Lenguajes de Marcas 110

2 filas

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

UPDATE asignaturas
SET horas = horas + 10
WHERE id_profesor = 3
RETURNING nombre, horas;
-- ... (resto de la solución bloqueado)

Ejercicio SA5.4

El cuadro de honor. Con la base de datos del instituto: crea una tabla cuadro_honor con las columnas id_alumno (clave primaria) y media, y rellénala con una sola sentencia INSERT ... SELECT con los alumnos cuya media de la convocatoria 1 sea de 7,5 o más (la media, redondeada a 2 decimales). Muestra id_alumno y media, ordenados por media de mayor a menor y, si empatan, por id_alumno.

Resultado esperado:

id_alumno media
6 8.5
3 7.75
8 7.67
11 7.5

4 filas

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

CREATE TABLE cuadro_honor (
  id_alumno INTEGER PRIMARY KEY,
  media     REAL NOT NULL
);
INSERT INTO cuadro_honor (id_alumno, media)
-- ... (resto de la solución bloqueado)

Ejercicio SA5.5

Consultar un JSON. Con la tabla productos de la página A5.2:

CREATE TABLE productos (
  id        INTEGER PRIMARY KEY,
  nombre    TEXT NOT NULL,
  atributos TEXT CHECK (json_valid(atributos))   -- JSON guardado como texto
);
INSERT INTO productos VALUES
  (1, 'Camiseta', '{"color":"rojo","tallas":["S","M","L"],"peso_g":180}'),
  (2, 'Sudadera', '{"color":"azul","tallas":["M","L"],"peso_g":450}'),
  (3, 'Gorra',    '{"color":"rojo","tallas":["U"],"extra":{"logo":true}}');

Muestra el nombre y el peso en gramos (peso_g) de los productos de color rojo que tengan peso indicado, ordenados por nombre. Usa ->> tanto para filtrar por el color como para sacar el peso.

Resultado esperado:

nombre peso
Camiseta 180

1 fila

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

CREATE TABLE productos (
  id        INTEGER PRIMARY KEY,
  nombre    TEXT NOT NULL,
  atributos TEXT CHECK (json_valid(atributos))   -- JSON guardado como texto
);
-- ... (resto de la solución bloqueado)

Ejercicio SA5.6

Una columna generada. Crea una tabla articulos con id (clave primaria), precio (entero, en céntimos), iva (entero, el porcentaje) y una columna generada y guardada (STORED) llamada precio_final que sea precio + precio * iva / 100 (con división entera). Inserta (1, 1000, 21), (2, 250, 10) y (3, 800, 4) solo con precio e iva y muestra todas las columnas ordenadas por id.

Resultado esperado:

id precio iva precio_final
1 1000 21 1210
2 250 10 275
3 800 4 832

3 filas

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

CREATE TABLE articulos (
  id           INTEGER PRIMARY KEY,
  precio       INTEGER NOT NULL,
  iva          INTEGER NOT NULL,
  precio_final INTEGER GENERATED ALWAYS AS (precio + precio * iva / 100) STORED
-- ... (resto de la solución bloqueado)