SQL

Hola amigos! Con el objetivo de ir ampliando el blog tengo intención de compartir con vosotros algunos ejercicios básicos de consultas (SQL/ORACLE) estos son algunos ejemplos:

1. Crear una consulta para visualizar el apellido y el sueldo de los empleados que ganen más de 2850$.Ordenar el resultado por el apellido.

select ename, sal
from emp
where sal>2850
order by ename;

2. Crear una consulta para visualizar el apellido del empleado y el número de departamento del empleado 7566

select ename, job
from emp
where empno = '7566';

3. Crear una consulta para visualizar el apellido y el salario de todos los empleado que no tienen el sueldo entre 1500 y 2850$

select ename, sal
from emp
where sal not between 1500 and 2850;

4. Visualizar el apellido del empleado, oficio y fecha de alta de todos los empleados contratados entre el 20 de Febrero de 1981 y el 1 de Mayo de 1981. Ordenar la consulta en orden ascendente por fecha de alta.

select ename, job, hiredate
from emp
where hiredate between '20/02/81' and '1/05/81'
order by hiredate asc;

5. Obtener un listado del apellido y del número de departamentos de todos los empleados de los departamentos 10 o 30.

select ename, deptno
from emp
where deptno = '10' or deptno = '30';

6. Obtener un listado del apellido y el salario de todos los empleados que ganen más de 1500$ de los departamentos 10 o 30. Etiquetar las columnas Empleados y Salario Mensual.

select ename "Empleados", sal "Salario Mensual"
from emp
where sal > 1500 and deptno in (10, 30);

7. Visualizar el apellido y la fecha de alta de todos los empleados contratados en 1982.

select ename, hiredate
from emp
where hiredate between '01/01/1982' and  '31/12/1982'

8. Visualizar el apellido y el oficio de todos los empleados que no tienen un jefe asignado

select ename, job
from emp
where mgr is null;

9. Visualizar el apellido, salario y comisión de todos los empleados que ganen comisión. Ordenarlos por salario y comisión en orden descendente.

select ename, sal, comm
from emp
where comm is not null and comm !=0
order by sal desc, comm desc;

10. Visualizar el apellido de todos los empleados que tienen una A en la tercera letra de su nombre

select ename
from emp
where ename like  '__A%' ;

11. Visualizar el apellido de todos los empleados que tienen dos L en su nombre y que pertenecen al departamento 30 o que su jefe es el 7782.

select ename
from emp
where ename like '%L%L%' and deptno in (30) or mgr = '7782';

12. Visualizar el apellido, el oficio y el salario de todos los empleados que tienen el oficio de Clerk o Analyst y su salario no sea igual a 1000, 3000 o 5000 dólares.

select ename, job, sal
from emp
where job = 'Clerk' or job = 'Analyst' and sal not in (1000, 3000, 5000);



A continuación vamos a ver otro ejercicio, este es más divertido, pues en esta ocasión utilizaremos las "joins" para poder acceder a los datos de las tablas.




1. Mostrar el NIF, el nombre y el teléfono de todos los empleados contratados entre el 12/02/2002 y el 15/02/2002, ambas inclusive.

select empleats.NIF,empleats.nom,empleats.telefon
from Empleats,contractacio
where Empleats.NIF = contractacio.NIF and contractacio.data_con between '12/02/02' and '15/02/02';

2. Mostrar el NIF y el nombre de los empleados contratados por la cadena “NH” y que trabajan en el “Princesa Sofia”.

select empleats.NIF, empleats.nom
from empleats,cadenes,hotels, contractacio,historial
where empleats.NIF = contractacio.NIF and contractacio.cif = cadenes.cif
And initcap(cadenes.nom) = 'Nh' and Contractacio.Data_con is not null and Hotels.nom = 'Princesa Sofia' and historial.Data is not null
and empleats.Nif = historial.Nif and historial.nom = hotels.nom and Contractacio.data_baixa is null and historial.data_fi is null;

3. Mostrar el NIF y el nombre de los empleados, y el hotel en el que trabajan, de todos los empleados que su última asignación a un hotel haya sido en el mes de julio. Ordenar el resultado por nombre de ciudad y nombre de hotel alfabéticamente.

select empleats.NIF, empleats.nom, hotels.nom
from empleats,hotels,historial,ciutats
where historial.NIF = empleats.NIF and historial.nom = hotels.nom and hotels.id_ciutat = ciutats.id_ciutat
and historial.id_ciutat = hotels.id_ciutat and to_char(historial.data, 'fmMONTH') = Upper('Julio')
order by ciutats.nom, hotels.nom;

4. Crear una consulta que muestre el hotel, el nif del empleado, el nombre del empleado y el nombre de la cadena de todos los empleados que trabajan en un hotel de la cadena Hilton o Trip

select Empleats.Nif, Empleats.Nom Empleats, Hotels.Nom Hotel, Cadenes.Nom Cadena
from Empleats, Historial, Hotels, cadenes
where Empleats.Nif=Historial.Nif And
Hotels.Id_Ciutat=Historial.Id_Ciutat And
Hotels.Nom=Historial.Nom And
Cadenes.Cif=Hotels.Cif And
Cadenes.Nom In ('Tryp','Hilton')And
Historial.Data_Fi is null

A continuación veremos un pequeño ejercicio de funciones de grupo.


1. Mostrar el saldo medio de todas las cuentas de la entidad bancaria.

select avg (round (cuenta.saldo) )
from cuenta

2. Mostrar la suma de los saldos de todas las cuentas bancarias.

select sum (saldo)
from cuenta

3. Mostrar el saldo mínimo, máximo y medio de todas las cuentas bancarias.

select avg (saldo), min (saldo), max (saldo)
from cuenta

4. Mostrar la suma de los saldos y el saldo medio de las cuentas bancarias para cada una de las diferentes sucursales.

select sum (saldo), avg (saldo)
from cuenta, sucursal
where cuenta.cod_sucursal = sucursal.cod_sucursal

5. Para cada cliente del banco se desea conocer su código, la cantidad total que tiene depositada en la entidad y el número de cuentas abiertas.

select cliente.cod_cliente, sum (cuenta.saldo), cuenta.cod_cuenta
from cliente, cuenta

where cliente.cod_cliente = cuenta.cod_cliente
group by cliente.cod_cliente, cuenta.saldo, cuenta.cod_cuenta

6. Retocar la consulta anterior para que aparezca el nombre y apellidos de cada cliente en vez de su código de cliente.

select cliente.nombre, cliente.apellidos, sum (cuenta.saldo), cuenta.cod_cuenta
from cliente, cuenta
where cliente.cod_cliente = cuenta.cod_cliente
group by cliente.nombre, cliente.apellidos, cuenta.saldo, cuenta.cod_cuenta

7. Para cada sucursal del banco se desea conocer su dirección, el número de cuentas que tiene abiertas y la suma total que hay en ellas.

select sucursal.direccion, count (sucursal.cod_sucursal), sum (cuenta.saldo)
from sucursal, cuenta
where sucursal.cod_sucursal = cuenta.cod_sucursal
group by sucursal.direccion

8. Mostrar el saldo medio y el interés medio de las cuentas a las que se le aplique un interés mayor del 10%, de las sucursales 1 y 2

select avg (cuenta.saldo), avg (cuenta.interes)
from cuenta, sucursal
where cuenta.cod_sucursal = sucursal.cod_sucursal and sucursal.cod_sucursal = 1
or sucursal.cod_sucursal = 2
and cuenta.interes > 0.1
group by sucursal.cod_sucursal

9. Mostrar los tipos de movimientos de las cuentas bancarias, sus descripciones y el volumen total de dinero que se manejado en cada tipo de movimiento.

select tm.cod_tipo_movimiento, tm.descripcion, sum (movimiento.importe), count (importe)
from tipo_movimiento tm, movimiento, cuenta
where tm.cod_tipo_movimiento = movimiento.cod_tipo_movimiento
and movimiento.cod_cuenta = cuenta.cod_cuenta
group by tm.cod_tipo_movimiento, tm.descripcion

10. Mostrar cuál es la cantidad media que sacan de cajero los clientes de nuestro banco.

select trunc(avg(movimiento.importe))
from movimiento, cliente, tipo_movimiento,cuenta
where cuenta.cod_cliente = cliente.cod_cliente
and movimiento.cod_tipo_movimiento = tipo_movimiento.cod_tipo_movimiento
and cuenta.cod_cuenta = movimiento.cod_cuenta
and movimiento.cod_tipo_movimiento = 'TR-S';

11. Calcular la cantidad total de dinero que emite la entidad bancaria clasificada según los tipos de movimientos de salida.

select sum(movimiento.importe)
from movimiento, tipo_movimiento
where tipo_movimiento.cod_tipo_movimiento = movimiento.cod_tipo_movimiento
And tipo_movimiento.salida = 'Sí'
group by tipo_movimiento.salida;

12. Calcular la cantidad total de dinero que ingresa cada cuenta bancaria clasificada según los tipos de movimientos de entrada.

select sum(movimiento.importe)
from movimiento, tipo_movimiento
where tipo_movimiento.cod_tipo_movimiento = movimiento.cod_tipo_movimiento
And tipo_movimiento.salida = 'NO'
group by tipo_movimiento.cod_tipo_movimiento;

13. Calcular la cantidad total de dinero que sale de la entidad bancaria mediante cualquier movimiento de “salida”.

select sum(movimiento.importe)
from movimiento, tipo_movimiento
where tipo_movimiento.cod_tipo_movimiento = movimiento.cod_tipo_movimiento
And tipo_movimiento.salida = 'Sí'
group by tipo_movimiento.cod_tipo_movimiento;

14. Mostrar la suma total por tipo de movimiento de las cuentas bancarias de los clientes del banco. Se deben mostrar los siguientes campos: apellidos, nombre, cod_cuenta, descripción del tipo movimiento y el total acumulado de los movimientos de un mismo tipo.

select cliente.nombre, cliente.apellidos, cuenta.cod_cuenta, tipo_movimiento.descripcion, sum(movimiento.importe)
from cliente, cuenta, tipo_movimiento, movimiento
where cliente.cod_cliente = cuenta.cod_cliente and cuenta.cod_cuenta = movimiento.cod_cuenta and movimiento.cod_tipo_movimiento = movimiento.cod_tipo_movimiento
group by cliente.nombre, cliente.apellidos, cuenta.cod_cuenta, tipo_movimiento.descripcion, tipo_movimiento.cod_tipo_movimiento;

15. Contar el número de cuentas bancarias que no tienen asociados movimientos.

select count(cuenta.cod_cuenta)
from cuenta, movimiento
where cuenta.cod_cuenta = movimiento.cod_cuenta (+) and nvl(movimiento.mes,0) = 0;

16. Mostrar el código de cliente, la suma total del dinero de todas sus cuentas y el número de cuentas abiertas, sólo para aquellos clientes cuyo capital supere los 35.000 euros.

select cliente.cod_cliente, sum (cuenta.saldo), count(cuenta.cod_cuenta)
from cliente,cuenta
where cliente.cod_cliente = cuenta.cod_cliente
having sum(cuenta.saldo) > 35000
group by cliente.cod_cliente, cuenta.cod_cuenta;

17. Mostrar los apellidos, el nombre y el número de cuentas abiertas sólo de aquellos clientes que tengan más de 2 cuentas.

select cliente.apellidos, cliente.nombre, count(cuenta.cod_cuenta)
from cliente, cuenta
where cliente.cod_cliente = cuenta.cod_cliente
having count(cuenta.cod_cuenta) > 2
group by cliente.apellidos, cliente.nombre;

18. Mostrar el código de sucursal, dirección, capital del año anterior y la suma de los saldos de sus cuentas, sólo de aquellas sucursales cuya suma de los saldos de las cuentas supera el capital del año anterior.

select sucursal.cod_sucursal, sucursal.direccion, sum (cuenta.saldo), sucursal.capital_anio_anterior
from sucursal,cuenta
where cuenta.cod_sucursal = sucursal.cod_sucursal
having sum (cuenta.saldo) < sucursal.capital_anio_anterior
group by sucursal.cod_sucursal, sucursal.direccion, sucursal.capital_anio_anterior;

19. Mostrar el código de cuenta, su saldo, la descripción del tipo de movimiento y la suma total de dinero por movimiento, sólo para aquellas cuentas cuya suma total de dinero por movimiento supere el 20% del saldo.

select cuenta.cod_cuenta, cuenta.saldo,tipo_movimiento.descripcion, sum(movimiento.importe)
from cuenta,tipo_movimiento,movimiento
where cuenta.cod_cuenta = movimiento.cod_cuenta and movimiento.cod_tipo_movimiento = tipo_movimiento.cod_tipo_movimiento
having sum(movimiento.importe)>(20/100*cuenta.saldo)
group by cuenta.cod_cuenta, cuenta.saldo, tipo_movimiento.descripcion;

20. Mostrar los mismos campos del ejercicio anterior pero ahora sólo de aquellas cuentas cuya suma de importes por movimiento supere el 10% del saldo y no sean de la sucursal 4.

select cuenta.cod_cuenta, cuenta.saldo,tipo_movimiento.descripcion, sum(movimiento.importe)
from cuenta,tipo_movimiento,movimiento
where cuenta.cod_cuenta = movimiento.cod_cuenta and movimiento.cod_tipo_movimiento = tipo_movimiento.cod_tipo_movimiento and cuenta.cod_sucursal <> 4
having sum(movimiento.importe)>(10/100*cuenta.saldo)
group by cuenta.cod_cuenta, cuenta.saldo, tipo_movimiento.descripcion;

21. Mostrar los datos de aquellos clientes para los que el saldo de sus cuentas suponga al menos el 20% del capital del año anterior de su sucursal.

select cuenta.cod_cuenta,cliente.*
from cliente, cuenta, sucursal
where cliente.cod_cliente = cuenta.cod_cliente and sucursal.cod_sucursal = cuenta.cod_sucursal
having sum (cuenta.saldo) > (20/100*sucursal.capital_anio_anterior)
group by cliente.nombre,cliente.apellidos, cliente.cod_cliente, cliente.direccion,cuenta.saldo, sucursal.capital_anio_anterior,cuenta.cod_cu

Bien, pues para ir acabando os dejo algunos ejemplos de subconsultas





1. Por cada cliente, contar el número de cuentas bancarias que posee sin movimientos. Se deben mostrar los siguientes campos: apellidos, nombre, num_cuentas_sin_movimiento

select cliente.nombre, cliente.apellidos, count(cuenta.cod_cuenta)
from cliente, cuenta, movimiento
where cliente.cod_cliente = cuenta.cod_cliente
and cuenta.cod_cuenta not in (select cod_cuenta from movimiento)
group by cliente.nombre, cliente.apellidos

2. Mostrar los datos de aquellos clientes que en todas sus cuentas posean un saldo mayor de 15.000 euros.

select nombre, apellidos
from cliente, cuenta
where cliente.cod_cliente = cuenta.cod_cliente
and 15.000 < all (select saldo
from cuenta, cliente cl2,cliente
where cliente.cod_cliente = cuenta.cod_cliente and cl2.cod_cliente = cliente.cod_cliente)
group by nombre, apellidos

3. Mostrar los datos de aquellos clientes que alguna de sus cuentas posean un saldo superior a 60.000 euros.

select nombre, apellidos
from cliente cf, cuenta
where cf.cod_cliente = cuenta.cod_cliente
and 184500 in ( select saldo
from cuenta, cliente cl2
where cl2.cod_cliente = cuenta.cod_cliente
and cl2.cod_cliente = cf.cod_cliente)
group by nombre, apellidos

4. Mostrar los datos de aquellas cuentas que tenga algún movimiento a las 14:15 horas.

select *
from cuenta
where cod_cuenta in (select movimiento.cod_cuenta
from movimiento
where to_char (movimiento.fecha_hora, 'fmHH24:MI') = '14:15')

5. Mostrar los datos de aquellas cuentas que no tengan movimientos del tipo PT (pago con tarjeta).

select *
from cuenta
where cod_cuenta not in ( select movimiento.cod_cuenta
from movimiento
where Upper(movimiento.cod_tipo_movimiento)= 'PT' )

6. Mostrar los datos de las cuentas de las que no existan movimientos.

select *
from cuenta
where cod_cuenta not in ( select movimiento.cod_cuenta
from movimiento)

7. Mostrar los datos de las cuentas que tienen más de 1 movimiento del tipo PT (pago con tarjeta).

select *
from cuenta
where cod_cuenta in ( select movimiento.cod_cuenta
from movimiento
where Upper (movimiento.cod_tipo_movimiento)='PT'
group by movimiento.cod_tipo_movimiento
having count (movimeinto.cod_tipo_movimiento)<1)


Pd: no os olvidéis de suscribiros a mi blog (arriba a la derecha donde dice: participar en este sitio)

2 comentarios: