CREATE DATABASE IF NOT EXISTS `concesionario` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */; USE `concesionario`; -- MySQL dump 10.13 Distrib 8.0.34, for Win64 (x86_64) -- -- Host: localhost Database: concesionario -- ------------------------------------------------------ -- Server version 5.5.5-10.4.32-MariaDB /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!50503 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `cliente` -- DROP TABLE IF EXISTS `cliente`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `cliente` ( `idcliente` int(11) NOT NULL AUTO_INCREMENT, `dni` varchar(45) DEFAULT NULL, `nombre` varchar(45) DEFAULT NULL, `apellidos` varchar(45) DEFAULT NULL, `telefono` varchar(45) DEFAULT NULL, `direccion` varchar(45) DEFAULT NULL, PRIMARY KEY (`idcliente`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `cliente` -- LOCK TABLES `cliente` WRITE; /*!40000 ALTER TABLE `cliente` DISABLE KEYS */; INSERT INTO `cliente` VALUES (1,'1234','ana','pi','666','agla'),(2,'222','eva','buj','777','pi'); /*!40000 ALTER TABLE `cliente` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `coche` -- DROP TABLE IF EXISTS `coche`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `coche` ( `idcoche` int(11) NOT NULL AUTO_INCREMENT, `idcliente` int(11) DEFAULT NULL, `matricula` varchar(45) DEFAULT NULL, `modelo` varchar(45) DEFAULT NULL, `marca` varchar(45) DEFAULT NULL, `color` varchar(45) DEFAULT NULL, `nuevo` tinyint(4) DEFAULT NULL, `unidades` int(11) DEFAULT NULL, `kilometros` int(11) DEFAULT NULL, PRIMARY KEY (`idcoche`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `coche` -- LOCK TABLES `coche` WRITE; /*!40000 ALTER TABLE `coche` DISABLE KEYS */; INSERT INTO `coche` VALUES (1,1,'aaaa','seat','seat','azul',1,2,NULL),(2,2,'bbb','clio','clio','verde',0,0,100),(3,1,'ccc','ford','ford','amarillo',1,2,NULL); /*!40000 ALTER TABLE `coche` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `coche_mecanico` -- DROP TABLE IF EXISTS `coche_mecanico`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `coche_mecanico` ( `idcoche_mecanico` int(11) NOT NULL AUTO_INCREMENT, `idcoche` int(11) DEFAULT NULL, `idmecanico` int(11) DEFAULT NULL, `fecha` date DEFAULT NULL, `horas` int(11) DEFAULT NULL, PRIMARY KEY (`idcoche_mecanico`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `coche_mecanico` -- LOCK TABLES `coche_mecanico` WRITE; /*!40000 ALTER TABLE `coche_mecanico` DISABLE KEYS */; INSERT INTO `coche_mecanico` VALUES (1,1,1,'2024-06-19',3),(2,3,2,'2024-06-18',5); /*!40000 ALTER TABLE `coche_mecanico` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `mecanico` -- DROP TABLE IF EXISTS `mecanico`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `mecanico` ( `idmecanico` int(11) NOT NULL AUTO_INCREMENT, `nombre` varchar(45) DEFAULT NULL, `apellidos` varchar(45) DEFAULT NULL, `dni` varchar(45) DEFAULT NULL, `fechacontratacion` date DEFAULT NULL, `sueldo` int(11) DEFAULT NULL, PRIMARY KEY (`idmecanico`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `mecanico` -- LOCK TABLES `mecanico` WRITE; /*!40000 ALTER TABLE `mecanico` DISABLE KEYS */; INSERT INTO `mecanico` VALUES (1,'pep','pi','111','2023-10-01',1000),(2,'juan','pi','222','2023-09-12',2000); /*!40000 ALTER TABLE `mecanico` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2024-06-20 10:31:12
Categoría: BD
Ejercicios modelo lógico
Pasar a modelo lógico los ejercicios siguientes:
cliente idcliente nombre apellido rfc direccion fechanacimiento cliente_producto idclienteproducto idcliente idproducto producto idproducto idproveedor nombre codigo preciounitario proveedor idproveedor nif nombre direccion
camionero idcamionero rfc nombre salario telefono direccion poblacion camionero_camion idcamionerocamion idcamionero idcamion camion idcamion placas modelo tipo potencia paquete idpaquete idcamionero idciudad codigo descripcion destino direccion ciudad idciudad apartadopostal nombre
profesor idprofesor rfc nombre direccion telefono profesor_modulo idprofesormodulo idprofesor idmodulo modulo idmodulo idalumno codigo nombre alumno idalumno idalumnodelegado / iddelegado control nombre apellido fechanacimiento
Más ejercicios modelo entidad relación
Se desea crear una base de datos que contenga información sobre las revistas a las que estás suscrito o compras habitualmente. De cada revista, se pide su título, el ISSN (un código que identifica a la publicación), el número y el año de publicación. También se desea almacenar información de cada uno de los artículos publicados: el título, la página de inicio y la página de fin. Se asume que no hay dos artículos con el mismo título.
Cada artículo puede estar escrito por varios autores, de quienes interesa conocer su nombre, una dirección de correo electrónico y su país de nacimiento, así como un número que indique la posición en la que aparece en cada artículo: un 1 si es el primer autor, un 2 si aparece en segundo lugar, etc.
REVISTA ARTÍCULO AUTOR
Revista(1)—(N)Artículo(N)—(N)Autor
Revista: título, ISSN, número, año publicacion
Artículo: título, página inicio y fin
Autor: Nombre, email, país nacimiento
Autor-Artículo: posición
Una ONG desea elaborar una base de datos para llevar el seguimiento de todos sus proyectos. Tiene diversas sedes en varios países que se encargan de gestionar y coordinar los proyectos de ese país, cada uno de los cuales puede afectar a una o varias poblaciones.
Sobre la sedes se desea mantener un identificador, la ciudad y país en el que se encuentra, junto con su dirección, un teléfono de contacto y el nombre del director. Cada sede gestiona un conjunto de proyectos, con un código, un título, fechas de inicio y finalización, el presupuesto asignado y el nombre del responsable.
De cada proyecto es necesario conocer qué actuaciones se realizan en cada población, almacenando el nombre, país y nº de habitantes y un identificador para diferenciarlas. Además se desea la inversión del proyecto que corresponde a la población y una pequeña descripción de la actuación.
PAIS(1)—-(N)CIUDAD(1)—-(N)SEDE(1)—(N)PROYECTO(1)—–(N)ACTUACIONES
DIRECTOR(1,1) (1,1)RESPONSABLE
Sedes: Identificador, dirección, teléfono
Proyectos: Código, título, inicio, fin, presupuesto
Actuaciones: Población, nombre, país, habitantes, identificador, descripción, inversión
Un parque zoológico quiere construir una BD para organizar las especies que posee y los distintos itinerarios para visitar el parque. La información se estructura de la siguiente forma. De las especies, se desea conocer su nombre común y su nombre científico, así como una descripción general y una fotografía. Cada especie puede vivir en distintos hábitats naturales, definidos por su nombre, clima y vegetación predominante. Cada especie tiene asociado un índice de vulnerabilidad dentro de cada hábitat, que mide el riesgo de extinción de la especie en el dicho hábitat. Para organizar las visitas, y en función de los hábitats que desee recorrer un visitante, el parque le ofrece una serie de recorridos por los hábitats, que se identifican por su código y se caracterizan por su duración estimada, longitud y número máximo de visitantes permitidos. Un hábitat sólo puede formar parte de un itinerario.
ESPECIES(N)—(N)HABITATS(N)—(1)ITINERARIO
Especies: Nombre común, científico, descripción, fotografía,
Habitats: nombre, clima, vegetación
Especies-Habitats: índice vulnerabilidad
Itinerario: Duración, longitud, visitantes, código
Una compañía aérea necesita una base de datos para registrar la información de sus vuelos. Los vuelos están caracterizados por un Id, la fecha y los aeropuertos de origen y destino. Cada vuelo es realizado por un avión. Los aviones tienen una matrícula que los identifica, el fabricante, un modelo e información sobre su capacidad (número máximo de pasajeros) y autonomía de vuelo (en horas). La tripulación asignada al vuelo está formada por el personal de la propia compañía. De cada trabajador se conoce su id, su nombre y su categoría profesional, así como el puesto que ocupa en cada vuelo en particular.
Por último, para cada vuelo, se almacena la lista completa de pasajeros, con su dni, el nombre, el asiento que ocupa y su clase (turista, primera o business).
Modelo lógico vuelos
Trabajador idtrabajador nombre categoria trabajador_vuelo idtrabajadorvuelo idtrabajador idvuelo puesto Vuelo idvuelo idavion fecha origen destino vuelo_pasajero idvuelopasajero idvuelo idpasajero clase asiento Avion idavion matricula fabricante modelo capacidad autonomia Pasajero idpasajero dni nombre
Especie idespecie nombrecomun nombrecientifico descripcion fotografia especie_habitat idespeciehabitat idespecie idhabitat vulnerabilidad Habitat idhabitat iditinerario nombre clima vegetacion Itinerario iditinerario codigo duracion longitud visitantes
Ejercicio ER
Se desea informatizar la gestión de una empresa de transportes que reparte paquetes por toda España. Los encargados de llevar los paquetes son los camioneros, de los que se quiere guardar el dni, nombre, teléfono, dirección, salario y población en la que vive.
De los paquetes transportados interesa conocer el código de paquete, descripción, destinatario y dirección del destinatario. Un camionero distribuye muchos paquetes, y un paquete sólo puede ser distribuido por un camionero.
De las provincias a las que llegan los paquetes interesa guardar el código de provincia y el nombre. Un paquete sólo puede llegar a una provincia. Sin embargo, a una provincia pueden llegar varios paquetes.
De los camiones que llevan los camioneros, interesa conocer la matrícula, modelo, tipo y potencia. Un camionero puede conducir diferentes camiones en fechas diferentes, y un camión puede ser conducido por varios camioneros
provincias 1---N paquetes N-----1 camioneros N----N camiones codigo codigo nombre | matricula nombre descripcion direccion fecha tipo destinatario telefono modelo dirección salario potencia poblacion
Ejemplo ER
Una empresa vende productos a varios clientes. Se necesita conocer los datos personales de los clientes (nombre, apellidos, dni, dirección y fecha de nacimiento). Cada producto tiene un nombre y un código, así como un precio unitario. Un cliente puede comprar varios productos a la empresa, y un mismo producto puede ser comprado por varios clientes.
Los productos son suministrados por diferentes proveedores. Se debe tener en cuenta que un producto sólo puede ser suministrado por un proveedor, y que un proveedor puede suministrar diferentes productos. De cada proveedor se desea conocer el NIF, nombre y dirección
Ejemplo ER
Crear un diseño entidad relación que permita controlar el sistema de información de una academia de cursos siguiendo estas premisas:
Se dan clases a alumno. Los datos que se almacenan de los alumnos son el DNI, dirección, nombre, teléfono y la edad
Los cursos que imparte la academia se identifican con un código de curso. Además se almacena el programa del curso, las horas de duración del mismo y el título.
Los cursos los imparte un profesor o profesora (sólo uno por curso) con estos datos son: dni, nombre, apellidos, dirección y teléfono
Se almacena la nota obtenida por cada alumno en cada curso teniendo en cuenta que un mismo alumno o alumna puede realizar varios cursos y en cada cual obtendrá una nota.
Ejemplos funciones
SELECT concat(SUBSTRING(first_name,1,2),SUBSTRING(last_name,1,2)) ref from actor;
SELECT LENGTH('MySQL') AS longitud;
SELECT UPPER('mysql') AS mayusculas, LOWER('MySQL') AS minusculas;
select concat(upper(substring(first_name,1,1)),
lower(substring(first_name,2))) nombre from actor;
SELECT REPLACE('Aprender SQL', 'SQL', 'MySQL') AS resultado;
update film set description= replace(description,'Crocodile','Cocodrilo') ;
SELECT TRIM(' Hola que ') AS resultado;
SELECT CONCAT_WS('-', '2023', '10', '26') AS fecha;
select * from actor
where length(first_name)>8;
select count(*) from actor;
select concat('hola',5), '5'+3 foo;
select cast('2021-1-1' as date) fecha;
SELECT STR_TO_DATE('1/1/2023', '%d/%m/%Y');
-- SImilar al if... elseif... else
select first_name,
CASE
WHEN length(first_name)<5 THEN 'Nombre corto'
WHEN length(first_name)<8 THEN 'Nombre medio'
ELSE 'Nombre largo'
END tipo
from actor;
-- Similar al switch
select rating,
case rating
when 'r' then 'Para adultos'
else 'Todos los publicos'
end tipo
from film;
-- Similar al operador ternario
select if(length(first_name)<5,'corto','largo') longitud from actor;
select coalesce(first_name,'') from actor;
select concat(coalesce(first_name,'.'),coalesce(last_name,''))nombre from actor;
select now(),CURDATE() AS fecha_actual, CURTIME() AS hora_actual;
SELECT EXTRACT(YEAR FROM NOW()) AS año_actual, EXTRACT(MONTH FROM NOW()) AS mes_actual;
-- Imprescindible
select month(now()),year(now()),day(now());
select month(payment_date) from payment;
select * from payment
where month(payment_date) =5;
select year(payment_date) anyo, month(payment_date) mes,sum(amount) total from payment
group by anyo,mes;
select month('1-1-2023');
SELECT month(STR_TO_DATE('1/1/2023', '%d/%m/%Y'));
SELECT DATE_FORMAT(NOW(), '%d/%m/%Y %H:%i %w') AS fecha_formateada;
-- Alquileres en fin de semana
select count(rental_id) from rental
where date_format(rental_date,'%w') in (0,6);
SELECT ADDDATE(NOW(), 7) AS fecha_en_7_dias, SUBDATE(NOW(), 3) p;
SELECT DATEDIFF(NOW(), '2023-01-01') AS dias_desde_inicio_de_ano;
SELECT ROUND(3.14159) AS redondeo_entero, ROUND(3.14159, 3) AS redondeo_dos_decimales;
select * from actor order by rand() limit 10;
SELECT SCHEMA() AS nombre_de_base_de_datos;
SELECT concat(address,coalesce(address2,'')) dir FROM sakila.address;
insert into user (name,tarjeta)
values ('tarjeta',AES_ENCRYPT('1112222333434', 'mi_clave_secreta') )
SELECT *, cast(AES_deCRYPT(tarjeta, 'mi_clave_secreta') as char) tarjeta FROM sakila.user
Soluciones ejercicios division y vistas
-- Actores con más películas que el actor de id 1 select first_name, last_name, count(film_actor.film_id) total from actor join film_actor on actor.actor_id=film_actor.actor_id group by actor.actor_id having total>(select count(film_actor.film_id) total from actor join film_actor on actor.actor_id=film_actor.actor_id where actor.actor_id=1 group by actor.actor_id); -- con vistas create view totalfilmsbyactor as select actor.actor_id, first_name, last_name, count(film_actor.film_id) total from actor join film_actor on actor.actor_id=film_actor.actor_id group by actor.actor_id; select first_name, last_name, total from totalfilmsbyactor where total>(select total from totalfilmsbyactor where actor_id=1); -- Media global del total de películas por categoría. Si tengo dos categorías, -- una con 100 películas y otra con 50 la media sería 75 select avg(total) total from ( select name, count(film_category.film_id) total from category join film_category on category.category_id=film_category.category_id group by category.category_id) as temp; -- Saber las categorías que tienen peliculas por enciima de la media select name, count(film_category.film_id) total from category join film_category on category.category_id=film_category.category_id group by category.category_id having total>( select avg(total) total from ( select name, count(film_category.film_id) total from category join film_category on category.category_id=film_category.category_id group by category.category_id) as temp); -- COn vistas create view filmsbycategory as select category.category_id, name, count(film_category.film_id) total from category join film_category on category.category_id=film_category.category_id group by category.category_id; select name, total from filmsbycategory where total>(select avg(total) from filmsbycategory); -- Clientes que no han alquilado películas de rating ‘R’ -- Primero busco los clientes que si hayan alquilado -- películas de rating r -- Y después busco los que no estén en esa lista select first_name, last_name from customer where customer_id not in( select customer.customer_id from film join inventory on film.film_id=inventory.film_id join rental on inventory.inventory_id=rental.inventory_id join customer on rental.customer_id=customer.customer_id where rating='r'); -- Clientes que no han alquilado películas del actor con id 1 -- Pasar a positivo y luego los que no -- Clientes que si han alquilado películas del actor 1 select first_name, last_name from customer where customer_id not in ( select customer.customer_id from customer join rental on customer.customer_id=rental.customer_id join inventory on rental.inventory_id=inventory.inventory_id join film on inventory.film_id=film.film_id join film_actor on film.film_id=film_actor.film_id where film_actor.actor_id=1); -- Actores que no hayan trabajado en películas de robots -- ni en películas de cocodrilos -- Actores que sí select * from actor where actor_id not in ( select actor.actor_id from actor join film_actor on actor.actor_id=film_actor.actor_id join film on film_actor.film_id=film.film_id where description like '%robot%' or description like '%crocodile%'); -- Crear una vista 'customer_info' que para cada cliente me muestre el -- total de alquileres y el importe total de los mismos create view customer_info as select customer.*, count(rental.rental_id) total, sum(amount) importe from customer join rental on customer.customer_id=rental.customer_id join payment on rental.rental_id=payment.rental_id group by customer.customer_id; -- Ahora ciertas consultas son más sencillas SELECT sum(total) total FROM customer_info join address on address.address_id=customer_info.address_id where district='ontario'; -- Crear una vista 'customer_films que para cada cliente me muestre -- en un campo los títulos de las películas que ha alquilado create view customer_films as select customer.*, group_concat(title) films from customer join rental on customer.customer_id=rental.customer_id join inventory on rental.inventory_id=inventory.inventory_id join film on inventory.film_id=film.film_id group by customer.customer_id; -- Hay consultas que se simplifican SELECT * FROM sakila.customer_films where films like '%dinosaur%';
Solución Ejercicios sql
-- Películas ‘Épicas’ (Epic) o ‘Brillantes’ (brilliant) (description)
-- que duren más de 180 minutos (length)
SELECT * FROM sakila.film
where (description like '%epic%' or description like '%brilliant%')
and `length`>180;
-- Películas que duren entre 100 y 120 minutos o entre 50 y 70 minutos
SELECT * FROM sakila.film
where length between 100 and 120 or length between 50 and 70;
-- Películas que cuesten 0.99, 2.99 y tengan un rating ‘g’ o ‘r’
-- y que hablen de cocodrilos (crocodile)
SELECT * FROM film
where rental_rate between 0.99 and 2.99 and rating in ('g','r')
and description like '%crocodile%';
-- Direcciones de ontario o de punjab o que su código postal acabe en 5
-- o que su teléfono acabe en 5
SELECT * FROM sakila.address
where district in ('ontario', 'punjab') or postal_code like '%5'
or phone like '%5'
order by district;
-- Ventas totales por empleado
select first_name, last_name, count(payment_id) total, sum(amount) importe
from staff join payment on staff.staff_id=payment.staff_id
group by staff.staff_id;
-- Películas en las que han trabajado más de 10 actores
select title, count(actor.actor_id) total, group_concat(concat(first_name,' ',last_name)) actores from film join film_actor on film.film_id=film_actor.film_id
join actor on actor.actor_id=film_actor.actor_id
group by film.film_id
having total>10
order by title;
-- El título de la película que más se ha alquilado (en número de alquileres)
select title, count(rental_id) total from film join inventory on film.film_id=inventory.film_id
join rental on inventory.inventory_id=rental.inventory_id
group by film.film_id
order by total desc
limit 1;
-- El título de la película que más se ha alquilado de rating 'r'
select title, count(rental_id) total from film join inventory on film.film_id=inventory.film_id
join rental on inventory.inventory_id=rental.inventory_id
where rating='r'
group by film.film_id
order by total desc
limit 1;
-- El título de la película que más dinero ha dado (en suma de importe)
select title, sum(amount) total from film join inventory on film.film_id=inventory.film_id
join rental on inventory.inventory_id=rental.inventory_id
join payment on rental.rental_id=payment.rental_id
group by film.film_id
order by total desc
limit 1;
-- Los 5 actores que han trabajado en menos películas
select first_name, last_name, count(film_actor.film_id) total
from actor join film_actor on actor.actor_id=film_actor.actor_id
group by actor.actor_id
order by total
limit 5;
-- Los 5 actores que han trabajado en menos películas de rating 'r'
select first_name, last_name, count(film_actor.film_id) total
from actor join film_actor on actor.actor_id=film_actor.actor_id
join film on film.film_id=film_actor.film_id
where rating='r'
group by actor.actor_id
order by total
limit 5;
Consultas división
-- Quiero los actores que NO hayan trabajado en una película de rating 'R' -- Con subconsultas -- Cambio la pregunta a positivo: Los que Sí han trabajado en 'R' -- Con una subconsulta seleccion los que no están en esa lista select first_name, last_name from actor where actor_id not in ( select actor.actor_id from actor left join film_actor on actor.actor_id=film_actor.actor_id left join film on film_actor.film_id=film.film_id where rating='R'); -- películas que no sean de la categoría 'children' -- Cambio a positivo: Que si sean de children select title from film where film_id not in (select film.film_id from film join film_category on film.film_id=film_category.film_id join category on film_category.category_id=category.category_id where name='children'); select * from actor where actor_id not in ( select actor_id from actor join film_actor using(actor_id) join film using(film_id) join film_category using(film_id) join category using(category_id) where name='Music'); -- actores que no hayan trabajado en children (con vistas) select * from actor where actor_id not in (select actor_id from filmografia where name='children')






