Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ejercicios SQL Bases de Datos (Soluciones Internet)
Ejercicios SQL Bases de Datos (Soluciones Internet)
10. Dada la tabla LIBRERIA, haz una sentencia SELECT que visualice el tema, el ltimo carcter del tema que no sea blanco y el nmero de caracteres de tema(sin contar los blancos de la derecha) ordenados por tema. select rtrim(tema,' ') , length(rtrim(tema,' ')) from libreria; select tema,substr(rtrim(tema,' '),length(rtrim(tema,' '))) , length(rtrim(tema,' ')) from libreria; 11. A partir de la tabla NACIMIENTOS, visualiza en una columna el NOMBRE seguido de su fecha de nacimiento formateada (quita blancos del nombre). select length(rtrim(nombre,' ')) as PruebaEspacios, rtrim(nombre,' ') || ' ' || ( 'Naci el ' || to_char(fechanac, 'DD') || ' de ' || lower(to_char(fechanac, 'MONTH')) || 'de ' || to_char(fechanac, 'YYYY') || '.' ) as nombre_y_fecha_formateada from nacimientos; 12. Convierte la cadena '010712' a fecha y visualiza su nombre de mes en maysculas. select to_char(to_date('010712','DDMMYY'),'MONTH') as fecha from dual; 13. Visualiza aquellos temas de la tabla LIBRERIA cuyos ejemplares sean 7 con el nombre de tema de 'SEVEN'; el resto de temas que no tengan 7 ejemplares se visualizarn como estn. select tema, decode(ejemplares,7,'SEVEN', ejemplares) from libreria; 14. A partir de la tabla EMPLE, obtn el apellido de los empleados que lleven ms de 15 aos trabajando. select APELLIDO,(to_char(current_date,'YYYY') - to_char(fecha_alt,'YYYY')) FROM EMPLE WHERE(to_char(current_date,'YYYY') - to_char(fecha_alt,'YYYY'))>15; select APELLIDO from EMPLE where (to_char (current_date,'YYYY') - to_char (fecha_alt,'YYYY') )> 15; select APELLIDO FROM EMPLE WHERE months_between(sysdate,emple.fecha_alt)>(15*12); 15. Selecciona el apellido de los empleados de la tabla EMPLE que lleven ms de 16 aos trabajando en el departamento 'VENTAS'. select APELLIDO,(to_char(current_date,'YYYY') - to_char(fecha_alt,'YYYY')) FROM EMPLE WHERE(to_char(current_date,'YYYY') - to_char(fecha_alt,'YYYY'))>16 AND EMPLE.DEPT_NO=(SELECT DEPT_NO FROM DEPART WHERE DNOMBRE='VENTAS'); select APELLIDO FROM EMPLE, depart WHERE months_between(sysdate,emple.fecha_alt)>(16*12) and emple.dept_no=depart.dept_no and dnombre='VENTAS' 16. Visualiza el apellido, el salario y el nmero de departamento de aquellos empleados de la tabla EMPLE cuyo salario sea el mayor de su departamento. SELECT apellido, salario, dept_no as numero_departamento from emple e where salario=(select max(salario) from emple where emple.dept_no=e.dept_no) order by dept_no; 17. Visualiza el apellido, el salario y el nmero de departamento de aquellos empledados de la tabla EMPLE cuyo salario supere a la media en su departamento. SELECT apellido, salario, dept_no as numero_departamento from emple e where salario>(select avg(salario) from emple where emple.dept_no=e.dept_no) order by dept_no;
Tablas ALUMNOS, ANTIGUOS y NUEVOS 7) Visualizar los nombres de los alumnos de la tabla ALUM que aparezcan en alguna de estas tablas: NUEVOS y ANTIGUOS. select nombre from alum intersect (select nombre from nuevos union select nombre from antiguos); 8) Escribir las distintas formas en que se puede poner la consulta anterior llegando al mismo resultado select nombre from alum where nombre in(select nombre from nuevo) union select nombre from antiguo); select nombre from alum where nombre in (select nombre from nuevo) or nombre in (select nombre from antiguo); 9) Visualizar aquellos nombres de la tabla ALUM que no esten en la tabla ANTIGUOS ni en la tabla NUEVOS select nombre from alum minus select nombre from antiguos minus select nombre from nuevos;
Tablas PERSONAL, PROFESORES Y CENTROS 10) Realizar una consulta en la que aparezca por cada centro y en cada especialidad el numero de profesores. Si el centro no tiene profesores debe aparecer un 0 en la columna de profesores. select nombre,especialidad,count(*) from centros,profesores group by cod_centro,especialidad; select nombre,especialidad,count(dni) from centros,profesores group by cod_centro having (centros.cod_centro = profesores.cod_centro); 12) Obtener la especialidad con menos empleados select especialidad from profesores where apellidos = (select min(apellidos) from profesores);
Tablas ARTICULOS, FABRICANTES, TIENDAS, PEDIDOS Y VENTAS 6) Dar de alta un nuevo artculo de 'Primera' categora para los fabricantes de 'Francia' y abastecer con 5 unidades de ese artculo a todas las tiendas y en la fecha de hoy. insert into articulos select 'Yogur Fresa', cod_fabricante, 4, 'Primera', 120,100,190 from fabricantes where pais = 'FRANCIA'; select nif, 'Yogur Fresa', cod_fabricante, 4, 'Primera', sysdate, 5 from tiendas, fabricantes where pais like 'FRANCIA'; 7) Insertar un pedido de 20 unidades en la tienda '1111-A' con el artculo que mayor nmero de ventas haya realizado. insert into pedidos select distinct '1111-A', articulo, cod_fabricante, peso, categoria, sysdate, 20 from ventas where (articulo, cod_fabricante,peso,categoria) in (select articulo,cod_fabricante,peso,categoria from ventas group by articulo, cod_fabricante, peso, categoria having count (*) = (select max(count(*)) from ventas group by articulo, cod_fabricante, peso, categoria)); 8) Dar de alta una tienda en la provincia de 'MADRID' y abastecerla con 20 unidades de cada uno de los artculos existentes. insert into tiendas values ('1010-C', 'La Cesta', 'C/Juan Mazo 30', 'Alcala','MADRID',28809); insert into pedidos select '1010-C',articulo, cod_fabricante, peso, categoria, sysdate, 20 from articulos; 9) Dar de alta dos tiendas en la provincia de 'SEVILLA' y abastecerlas con 30 unidades de artculos de la marca 'GALLO' insert into tiendas values('4501-B','La Econmica','C\Sevillanas 130','Dos hemanas','SEVILLA',44003); insert into tiendas values('4501-B','Cometibles Peter','C\Sevillanas 130','Dos hemanas','SEVILLA',44009); insert into pedidos select nif,articulo,a.cod_fabricante,peso,categoria,sysdate,30 from tiendas,articulos a, fabricantes f where provincia='SEVILLA' and f.nombre='GALLO' and a.cod_fabricante=f.cod_fabricante; 10) Realizar una venta para todas las tiendas de 'TOLEDO' de 10 unidades en los artculos de 'Primera' categora. insert into ventas select nif,articulo,cod_fabricante,peso,categoria,sysdate,10 from tiendas ,articulos where provincia='TOLEDO' AND categoria='Primera'; 11) Para aquellos artculos de los que se hayan vendido ms de 30 unidades, realizar un pedido de 10 unidades para la tienda con NIF '5555-B' con la fecha actual. insert into pedidos select distinct '5555-B',articulo,cod_fabricante,peso,categoria,sysdate,10from ventas where (articulo,cod_fabricante,peso,categoria)in (select articulo,cod_fabricante,peso,categoria from ventas group by articulo, cod_fabricante,peso,categoria having sum(unidades_vendidas)<30); 12) Cambiar los datos de la tienda con NIF '1111-A' igualandolos a los de la tienda NIF '2222-A'. update tiendas set(nombre,direccin,poblacin,provincia,codpostal)=(select nombre,direccin,poblacin,provincia, codpostal from tiendas where pais='ITALIA'); 13) Cambiar todos los artculos de 'Primera' categoria a 'Segunda' categoria del pais 'ITALIA'. UPDATE ARTICULOS SET CATEGORIA='Segunda' WHERE CATEGORIA='Primera' AND COD_FABRICANTE = (SELECT COD_FABRICANTE FROM FABRICANTES WHERE PAIS='ITALIA');
14) Modificar aquellos pedidos en los que la cantidad pedida sea superior a las existencias del artculo, asignando el 20% de las existencias a la cantidad que se ha pedido. UPDATE PEDIDOS P SET UNIDADES_PEDIDAS=(SELECT EXISTENCIAS*0.2 FROM ARTICULOS WHERE ARTICULO=P. ARTICULO AND COD_FABRICANTE=P. COD_FABRICANTE AND PESO=P. PESO AND CATEGORIA=P. CATEGORIA ) WHERE UNIDADES_PEDIDAS > (SELECT EXISTENCIAS FROM ARTICULOS WHERE ARTICULO=P. ARTICULO AND COD_FABRICANTE=P. COD_FABRICANTE AND PESO=P. PESO AND CATEGORIA=P. CATEGORIA); 15) Eliminar aquellas tiendas que no han realizado ventas. DELETE TIENDAS WHERE NIF NOT IN (SELECT DISTINCT NIF FROM VENTAS); 16) Eliminar los artculos que no hayan tenido ni compras ni ventas. DELETE ARTICULOS WHERE (ARTICULO, COD_FABRICANTE, PESO, CATEGORIA) NOT IN (SELECT DISTINCT ARTICULO, COD_FABRICANTE, PESO, CATEGORIA FROM VENTAS) AND (ARTICULO, COD_FABRICANTE, PESO, CATEGORIA) NOT IN (SELECT DISTINCT ARTICULO, COD_FABRICANTE, PESO, CATEGORIA FROM PEDIDOS); 17) Borrar los pedidos de 'Primera' categoria cuyo pais de procedencia sea 'BELGICA'. DELETE PEDIDOS WHERE (ARTICULO, COD_FABRICANTE, PESO, CATEGORIA) IN (SELECT ARTICULO, COD_FABRICANTE, PESO, CATEGORIA FROM ARTICULOS WHERE COD_FABRICANTE= (SELECT COD_FABRICANTE FROM FABRICANTES WHERE PAIS ='BELGICA')) AND CATEGORIA='Primera'; 18) Borrar los pedidos que no tengan tienda. DELETE PEDIDOS WHERE NIF NOT IN (SELECT NIF FROM TIENDAS); 19) Restar uno a las unidades de los ltimos pedidos de la tienda con NIF '5555-B'. UPDATE PEDIDOS SET UNIDADES_PEDIDAS=UNIDADES_PEDIDAS-1 WHERE NIF='5555-B' AND FECHA_PEDIDO=(SELECT MAX(FECHA_PEDIDO) FROM PEDIDOS WHERE NIF='5555-B');
5) Visualizar los nombres de los alumnos de la tabla alum que aparezcan en estas dos tablas: antiguos y nuevos select nombre from alum intersect select nombre from antiguos intersect select nombre from nuevos; 6) Escribir las distintas formas en que se puede poner la consulta anterior llegando al mismo resultado. select nombre from alum where nombre in(select nombre from nuevos)and nombre in(select nombre from antiguos); 7) Mostrar el oficio y media de salarios de aquellos empleados cuya media de salario sea mayor que 200000 select avg(salario),oficio from emple group by oficio having avg(salario)>200000; 8) Mostrar el nombre y la comision de aquellos empleados que tengan una comision mayor que la de sanchez select apellido,comision from emple where comision > (select comision from emple where apellido like 'SNCHEZ'); 9) Mostrar el nombre salario y n de departamento de aquellos empleados que ganan el salario maximo de su departamento select apellido,salario, dept_no from emple where salario in (select max(salario) from emple group by dept_no); 10) Mostrar el nombre del departamento que tanga mas empleados cuyo oficio sea presidente select dnombre from depart group by dnombre having count(*) = (select max(count(*)) from emple where oficio like 'PRESIDENTE' group by dept_no); 11) Mostrar el numero de directores de la tabla emple que sean dep departamento produccin select count(oficio) from emple where oficio = 'DIRECTOR' and dept_no = (select dept_no from depart where dnombre = 'PRODUCCIN');