You are on page 1of 22

CONSULTAS SQL EN ORACLE

Esquema Conceptual HR
JOBS JOB_HISTORY
JOB_ID <pi> Variable characters (10) <M> job_history_jobs START_DATE <pi> Date & Time <M>
JOB_TITLE Variable characters (35) <M> END_DATE Date & Time <M>
MIN_SALARY Number (6) PK_JOB_HISTORY <pi>
MAX_SALARY Number (6) ...
PK_JOBS <pi>
...

job_history_employees job_history_departments
employees_jobs

DEPARTMENTS
EMPLOYEES employees_departments DEPARTMENT_ID <pi> Number (4) <M>
EMPLOYEE_ID <pi > Number (6) <M> DEPARTMENT_NAME Variable characters (30) <M>
MANAGER_ID Number (6) MANAGER_ID Number (4)
FIRST_NAME Variable characters
(20) PK_DEPARTMENTS <pi>
LAST_NAME <M>
Variable characters ...
EMAIL <M>
(25)
PHONE_NUMBER
HIRE_DATE Variable characters
<M>
(25) departments_locations
SALARY
Variable characters (20)
COMMISSION_PCT
Date & Time
Number (8,2)
Number (2,2)
PK_EMPLOYEES departments_employees
<pi>
...
LOCATIONS
LOCATION_ID
<pi> Number (4) <M>
STREET_ADDRESS
Variable characters
POSTAL_CODE (40)
Variable characters
(12)
employees_employees CITY Variable characters (30) <M>
STATE_PROVINCE Variable characters (25)
PK_LOCATIONS <pi>
...

locations_countries

REGIONS COUNTRIES
REGION_ID <pi > Number <M> countries_regions COUNTRY_ID <pi> Characters (2) <M>
REGION_NAME Variable characters (25) COUNTRY_NAME Variable characters (40)
PK_REGIONS <pi> PK_COUNTRIES <pi>
...
Esquema Físico HR
JOBS JOB_HISTORY
JOB_ID
VARCHAR2(10) <pk> EMPLOYEE_ID NUMBER(6) <pk,fk2>
JOB_TITLE
VARCHAR2(35) START_DATE DATE <pk>
MIN_SALARY
NUMBER(6) DEPARTMENT_ID NUMBER(4) <fk3>
MAX_SALARY
NUMBER(6) JOB_ID VARCHAR2(10) <fk1>
...
END_DATE DATE
...

EMPLOYEES
DEPARTMENTS
EMPLOYEE_ID DEPARTMENT_ID NUMBER(4) <pk>
NUMBER(6) <pk>
EMP_EMPLOYEE_ID EMPLOYEE_ID NUMBER(6) <fk1>
NUMBER(6) <fk3>
DEPARTMENT_ID LOCATION_ID NUMBER(4) <fk2>
NUMBER(4) <fk2>
JOB_ID DEPARTMENT_NAME VARCHAR2(30)
VARCHAR2(10) <fk1>
MANAGER_ID MANAGER_ID NUMBER(4)
NUMBER(6)
FIRST_NAME ...
VARCHAR2(20)
LAST_NAME
VARCHAR2(25)
EMAIL
VARCHAR2(25)
PHONE_NUMBER
VARCHAR2(20)
HIRE_DATE
DATE
SALARY
NUMBER(8,2)
COMMISSION_PCT
NUMBER(2,2)
... LOCATIONS
LOCATION_ID NUMBER(4) <pk>
COUNTRY_ID CHAR(2) <fk>
STREET_ADDRESS VARCHAR2(40)
POSTAL_CODE VARCHAR2(12)
CITY VARCHAR2(30)
STATE_PROVINCE VARCHAR2(25)
...

REGIONS COUNTRIES
REGION_ID NUMBER <pk> COUNTRY_ID CHAR(2) <pk>
REGION_NAME VARCHAR2(25) REGION_ID NUMBER <fk>
COUNTRY_NAME VARCHAR2(40)
1. Desarrolle una consulta que liste el nombre del empleado, el código del departamento y la fecha de inicio que
empezó a trabajar, ordenando el resultado por departamento y por fecha de inicio, el ultimo que entro a trabajar va
de primero.
select PRIMER_NOMBRE, DEPARTAMENTO_ID, FECHA_CONTRATACION
from EMPLEADOS
order by DEPARTAMENTO_ID, FECHA_CONTRATACION desc;

2. Desarrolle una consulta que liste el código, nombre y apellido de los empleados y sus respectivos fejes con titulo
Empleado y Jefe:
select e1.EMPLEADO_ID||’ ‘||e1.PRIMER_NOMBRE||’ ‘||e1.APELLIDO as Empelado, e2.EMPLEADO_ID||’ ‘||
e2.PRIMER_NOMBRE||’ ‘||e2.APELLIDO as Jefe
from EMPLEADOS e1,EMPLEADOS e2
where e1.GERENTE_ID=e2.EMPLEADO_ID;

3. Desarrolle una consulta que liste los países por región, los datos que debe mostrar son: el código de la región y nombre
de la región con los nombre se sus países.
select r.REGION_ID, REGION_NOMBRE, PAIS_NOMBRE
from REGIONES r, PAISES c
where r.REGION_ID=c.REGION_ID;

4. Realice una consulta que muestre el código, nombre, apellido, inicio y fin del historial de trabajo de los empleados.
select e.EMPLEADO_ID, PRIMER_NOMBRE, APELLIDO, FECHA_INICIAL, FECHA_FINAL
from EMPLEADOS e,HISTORIAL_TRABAJO j
where e.EMPLEADO_ID=j.EMPLEADO_ID;

5. Elabore una consulta que muestre el nombre y apellido del empleado con titulo Empleado, el salario, porcentaje de
comisión, la comisión y salario total.
select PRIMER_NOMBRE||’ ‘||APELLIDO Empleado, SALARIO Salario, PORCENTAJE_COMISION Porcentaje,
nvl(PORCENTAJE_COMISION * SALARIO,0) Comision, SALARIO + nvl(PORCENTAJE_COMISION * SALARIO,0)
“Salario total”
from EMPLEADOS;

6. Elabore una consulta que liste nombre del trabajo y el salario de los empleados que son manager, cuyo código es 100 o
125 y cuyo salario sea mayor de 6000.
select TRABAJO_TITULO, SALARIO
from EMPLEADOS e, TRABAJOS j
where e.TRABAJO_ID=e.TRABAJO_ID
and GERENTE_ID=100 or GERENTE_ID = 125 and SALARIO > 6000;

7. Desarrolle una consulta que liste el código de la localidad, la ciudad y el nombre del departamento de únicamente de los
que se encuentran fuera de estados unidos (US).
select l.LOCALIDAD_ID, CIUDAD, NOMBRE_DEPARTAMENTO
from DEPARTAMENTOS d,LOCALIDADES l,PAISES c
where d.LOCALIDAD_ID=l.LOCALIDAD_ID
and l.PAIS_ID=c.PAIS_ID
and c.PAIS_ID !=‘US’;

8. Realice una consulta que muestres el código de la región, nombre de la región y el nombre de los países que se
encuentran en “Asia”.
select r.REGION_ID, REGION_NOMBRE, PAIS_NOMBRE
from REGIONES r,PAISES c
where r.REGION_ID=c.REGION_ID and REGION_NOMBRE=‘Asia’;

9. Elabore una consulta que liste el código de la región y nombre de la región, código de la localidad, la ciudad, código del
país y nombre del país, de solamente de las localidades mayores a 2400.
select r.REGION_ID, REGION_NOMBRE, l.LOCALIDAD_ID, c.PAIS_ID, PAIS_NOMBRE
from LOCALIDADES l, REGIONES r,PAISES c
where l.PAIS_ID=c.PAIS_ID
and c.REGION_ID=r.REGION_ID
and l.LOCALIDAD_ID > 2400;

10. Desarrolle una consulta donde muestre el código de región con un alias de Región, el nombre de la región con una
etiqueta Nombre Región, que muestre una cadena string (concatenación) que diga la siguiente frase “Código País: CA
Nombre: Canadá “,CA es el código de país y Canadá es el nombre del país con etiqueta País, el código de localización
con etiqueta Localización, la dirección de calle con etiqueta Dirección y el código postal con etiqueta “Código Postal”,
esto a su vez no deben aparecer código postal que sean nulos.
select a.REGION_ID “Region”, a.REGION_NOMBRE “Nombre region”, ‘Codigo Pais :’||b.PAIS_ID ||’ Nombre :’ ||
b.PAIS_NOMBRE “Pais”, c.LOCALIDAD_ID “Localización”, c.DIRECCIONs “Direccion “, c.CODIGO_POSTAL “Código
Postal”
from REGIONES a , PAISES b, LOCALIDADES c
where a.REGION_ID = b.REGION_ID
and b.PAIS_ID =c.PAIS_ID
and c.CODIGO_POSTAL is not null;

11. Desarrolle una consulta que muestre el salario promedio de los empleados de los departamentos 30 y 80.
select avg(SALARIO)
from EMPLEADOS
where DEPARTAMENTO_ID in (30,80);

12. Desarrolle una consulta que muestre el nombre de la región, el nombre del país, el estado de la provincia, el código de
los empleados que son manager, el nombre y apellido del empleado que es manager de los países del reino Unido (UK),
Estados Unidos de América (US), respectivamente de los estados de la provincia de Washington y Oxford.
select REGION_NOMBRE, PAIS_NOMBRE, PROVINCIA, e.GERENTE_ID, PRIMER_NOMBRE, APELLIDO
from EMPLEADOS e, DEPARTAMENTOS d,LOCALIDADES l,PAISES c,REGIONES r
where e.GERENTE_ID=d.GERENTE_ID
and d.LOCALIDAD_ID=l.LOCALIDAD_ID
and l.PAIS_ID=c.PAIS_ID
and c.REGION_ID=r.REGION_ID
and c.PAIS_ID in (‘UK’,’US’)
and PROVINCIA in(‘Washington’,’Oxford’);

13. Realice una consulta que muestre el nombre y apellido de los empleados que trabajan para departamentos que están
localizados en países cuyo nombre comienza con la letra C, que muestre el nombre del país.
select PRIMER_NOMBRE||’ ‘||APELLIDO, PAIS_NOMBRE
from EMPLEADOS e,DEPARTAMENTOS d, LOCALIDADES l,PAISES c
where e.DEPARTAMENTO_ID=d.DEPARTAMENTO_ID
and d.LOCALIDAD_ID=l.LOCALIDAD_ID
and l.PAIS_ID=c.PAIS_ID
and PAIS_NOMBRE like ‘C%’;

14. Desarrolle una consulta que liste en nombre del puesto (TRABAJO_TITULO), el nombre y apellidos del empleado que
ocupa ese puesto, cuyo email es ‘NKOCHHAR’, el 21 de septiembre de 1989.
select TRABAJO_TITULO, PRIMER_NOMBRE||’ ‘||APELLIDO
from TRABAJOS j,EMPLEADOS e
where j.TRABAJO_ID=e.TRABAJO_ID
and email = ‘NKOCHHAR’
and FECHA_CONTRATACION = ‘21/09/1989’;

15. Escriba una sola consulta que liste los empleados de los departamentos 10,20 y 80 que fueron contratados hace mas de
180 días, que ganan una comisión no menor de 20% y cuyo nombre o apellido comienza con la letra ‘J’.
select PRIMER_NOMBRE||’ ‘||APELLIDO
from EMPLEADOS
where DEPARTAMENTO_ID in (10,20,80)
and months_between (sysdate,FECHA_CONTRATACION) >6
and PORCENTAJE_COMISION >= 0.2
and (PRIMER_NOMBRE like ‘J%’ or APELLIDO like ‘J%’);
16. Realice una consulta de muestre el nombre, el apellido y nombre de departamento de los empleados cuyo número
telefónico tiene código de área 515 (numero de 12 dígitos: 3 del área, 7 del numero y dos puntos), excluya los números
telefónicos que tienen una longitud diferente de 12 caracteres.

select PRIMER_NOMBRE||’ ‘||APELLIDO, NOMBRE_DEPARTAMENTO


from EMPLEADOS e,DEPARTAMENTOS d
where e.DEPARTAMENTO_ID=d.DEPARTAMENTO_ID
and TELEFONO like’515%’
and length(TELEFONO)<=12;

17. Desarrolle una consulta que muestre el código, el nombre y apellido separado por coma con titulo de encabezado
Nombre Completo, el salario con titulo Salario, el código de departamento con titulo Código de Departamento y el
nombre de departamento al que pertenece con titulo Descripción, únicamente se desean consultas los que pertenezcan
al departamento de IT y ordenar la información por salario descendentemente.
select e.EMPLEADO_ID, PRIMER_NOMBRE||’,’||APELLIDO “Nombre Completo”, SALARIO Salario,
d.DEPARTAMENTO_ID “Codigo de Departamento”, NOMBRE_DEPARTAMENTO Descripción
from EMPLEADOS e, DEPARTAMENTOS d
where e.DEPARTAMENTO_ID=d.DEPARTAMENTO_ID
and NOMBRE_DEPARTAMENTO=‘IT’
order by SALARIO Desc;

18. Realice una consulta que liste el nombre y apellido, salario del empleado, el nombre del departamento al que pertenece,
la dirección, el código postal y la ciudad donde está ubicado el departamento, se debe mostrar únicamente aquellos que
sean del departamento 100,80 y 50 respectivamente, además deben pertenecer únicamente a la ciudad del sur de san
francisco y el rango de salario debe ser entre 4000 y 8000 incluyendo los valores limites.
select PRIMER_NOMBRE, APELLIDO, SALARIO, NOMBRE_DEPARTAMENTO, DIRECCIONs, CODIGO_POSTAL,
CIUDAD
from EMPLEADOS e,DEPARTAMENTOS d,LOCALIDADES l
where e.DEPARTAMENTO_ID=d.DEPARTAMENTO_ID
and d.LOCALIDAD_ID=l.LOCALIDAD_ID
and d.DEPARTAMENTO_ID in (100,80,50)
and CIUDAD =‘South San Francisco’
and SALARIO between 4000 and 8000;

19. Desarrolle una consulta donde seleccione el código del empleado cuyo alias será código, el apellido concatenado con el
nombre de empleado pero separados por coma(,) cuyo alias será Nombres, el email donde su inicial este en mayúscula y
todos posean el dominio de @eisi.ues.edu.sv, es decir debe ir concatenado con ese dominio cuyo alias es email, además
que aparezca si el número telefónico está almacenado en el campo de esta manera 515.123.4567 deberá convertirlo al
formato siguiente formato (515)-123-4567, si posee un número telefónico con esta longitud 011.44.1344.429268, es decir
una longitud mayor al formato anterior, deberá aparecer en el formato siguiente (011-44 -1344-429268- Funciones que
puede hacer uso para este ejercicio LENGTH, SUBSTR. Dicha información deberá ir ordenada por código de empleado.
select EMPLEADO_ID Codigo, APELLIDO||’, ‘||PRIMER_NOMBRE Nombres, Initcap(email)||’@eisi.ues.edu.sv’ email,
‘(‘||substr(TELEFONO,1,3)||’) - ‘||substr(TELEFONO,5,3)||’ - ‘||substr(TELEFONO,9,4) Telefono
from EMPLEADOS
where length(TELEFONO)<=12
UNION
select EMPLEADO_ID Codigo, APELLIDO||’, ‘||PRIMER_NOMBRE Nombres, Initcap(email)||’@eisi.ues.edu.sv’ email,
‘(‘||substr(TELEFONO,1,3)||’) - ‘||substr(TELEFONO,5,2)||’ - ‘||substr(TELEFONO,8,4)||’ - ‘||substr(TELEFONO,13,6)
Telefono
from EMPLEADOS
where length(TELEFONO)>12 order by 1;

20. Desarrolle una consulta que permita seleccionar las ciudades, su código de país, y si es de Reino Unido (United
Kingdom) lo cambia por (UNKing) caso contrario si no es de Reino Unido (Non- UNKing) y cuya ciudades deben iniciar
con la letra S.
select CIUDAD, PAIS_ID, (case
when PAIS_ID in ( select PAIS_ID
from PAISES
where PAIS_NOMBRE = ‘United Kingdom’) then
‘UNKing’
else ‘Non- UNKing’
end) as “ UNKing?”
from LOCALIDADES
where CIUDAD like ‘S%’;

21. Desarrolle una consulta que muestre el código del departamento con titulo Código del departamento, que cuente los
empleados agrupados por departamentos, ordenados por código de departamento;
select DEPARTAMENTO_ID “Codigo del Departamento”, count(*) “Numero de Empleados”
from EMPLEADOS
group by DEPARTAMENTO_ID order by 2;

22. Realicé una consulta que muestre solo los nombres de los empleados que se repiten.
select PRIMER_NOMBRE
from EMPLEADOS
group by PRIMER_NOMBRE
having count(*)>1;

23. Desarrolle una consulta que muestre solo los nombres de los empleados que no se repiten.
select PRIMER_NOMBRE
from EMPLEADOS
group by PRIMER_NOMBRE
having count(*)=1;

24. Realice una consulta que muestre el número de países por región, la consulta debe mostrar el código y nombre de la
región así como el número de países de cada región, ordenando el resultado por la región que tenga mayor número de
países.
select r.REGION_ID, REGION_NOMBRE, count(*)
from REGIONES r, PAISES c
where r.REGION_ID=c.REGION_ID
group by r.REGION_ID,REGION_NOMBRE order by 3 desc;

25. Desarrolle una consulta que liste los códigos de puestos con el número de empleados que pertenecen a cada puesto,
ordenados por número de empleados: los puestos que tienen más empleados aparecen primero.
select j.TRABAJO_ID, count(*) numero
from EMPLEADOS e,TRABAJOS j
where e.TRABAJO_ID=j.TRABAJO_ID
group by j.TRABAJO_ID order by 2 desc;

26. Desarrolle una consulta que muestre el número de empleados por departamento, ordenados alfabéticamente por nombre
de departamento.
select d.DEPARTAMENTO_ID, NOMBRE_DEPARTAMENTO, count(*)
from EMPLEADOS e,DEPARTAMENTOS d
where e.DEPARTAMENTO_ID=d.DEPARTAMENTO_ID
group by d.DEPARTAMENTO_ID,NOMBRE_DEPARTAMENTO
order by NOMBRE_DEPARTAMENTO;

27. Realice una consulta que muestre el número de departamentos por región.
select r.REGION_ID, count(*)
from DEPARTAMENTOS d, LOCALIDADES l, PAISES c, REGIONES r
where d.LOCALIDAD_ID=l.LOCALIDAD_ID
and l.PAIS_ID=c.PAIS_ID
and c.REGION_ID=r.REGION_ID
group by r.REGION_ID
order by 1 asc;

28. Realice una consulta que muestre el salario que paga cada departamento (sin incluir comisión), ordenado
descendentemente por salario pagado. Se mostrara el código y nombre del departamento y el salario que paga.
select d.DEPARTAMENTO_ID, NOMBRE_DEPARTAMENTO, sum(SALARIO)
from EMPLEADOS e,DEPARTAMENTOS d
where e.DEPARTAMENTO_ID=d.DEPARTAMENTO_ID
group by d.DEPARTAMENTO_ID,NOMBRE_DEPARTAMENTO
order by 3 desc;

29. Desarrolle una consulta que muestre el año de contratación, el salario menor, mayor y promedio de todos los empleados
por año de contratación. Ordene el resultado por año de contratación: Los más recientes primero.
select extract(year from FECHA_CONTRATACION), min(SALARIO), max(SALARIO), avg(SALARIO)
from EMPLEADOS
group by extract(year from FECHA_CONTRATACION)
order by 1 desc;

30. Desarrolle una consulta que muestre el código del departamento con titulo “Código del Departamento”, El código del
trabajo con titulo “Puesto de trabajo” y que cuente los empleados de los departamentos 50 y 80, ordenado el resultado
por departamento y puesto de trabajo.
select d.DEPARTAMENTO_ID “Codigo del Departamento”, j.TRABAJO_ID “Puesto de Trabajo”, count(*)
from DEPARTAMENTOS d,TRABAJOS j,EMPLEADOS e
where e.DEPARTAMENTO_ID=d.DEPARTAMENTO_ID
and e.TRABAJO_ID=j.TRABAJO_ID
and d.DEPARTAMENTO_ID in (50,80)
group by d.DEPARTAMENTO_ID,j.TRABAJO_ID
order by d.DEPARTAMENTO_ID desc ,j.TRABAJO_ID desc;

31. Desarrolle una consulta que liste el código del departamento con titulo “Código del departamento”, el código de trabajo
con titulo “Puesto de Trabajo” y que cuente los empleados por departamentos y puesto de trabajo, en donde el puesto de
trabajo tenga solamente un empleado en la empresa.
select DEPARTAMENTO_ID “Codigo del Departamento”, TRABAJO_ID “Puesto de Trabajo”, count(*)
from EMPLEADOS
group by DEPARTAMENTO_ID,TRABAJO_ID
having count(*)=1;

32. Realice una consulta que liste el número de empleados por ciudad, que ganan como mínimo 5000 en concepto de
salario. Omita las ciudades que tengan menos de 3 empleados con ese salario.
select CIUDAD, count(*)
from EMPLEADOS e,DEPARTAMENTOS d,LOCALIDADES l
where e.DEPARTAMENTO_ID=d.DEPARTAMENTO_ID
and d.LOCALIDAD_ID=l.LOCALIDAD_ID
and SALARIO >=5000
group by CIUDAD
having count(*)>3;

33. Elabore una consulta que muestre el código del departamento con titulo “Código del departamento”, que cuente los
empleados por departamento de aquellos departamentos que tengan más de 10 empleados.
select DEPARTAMENTO_ID “Codigo del Departamento”, count(*)
from EMPLEADOS
group by DEPARTAMENTO_ID
having count(*)>10;

34. Desarrolle una consulta que liste el apellido, el nombre y salario del empleado con el salario mayor de los todos los
departamentos.
select APELLIDO, PRIMER_NOMBRE, SALARIO
from EMPLEADOS
where SALARIO = (select max(SALARIO) from EMPLEADOS);

35. Desarrolle una consulta que muestre código de departamento, el nombre y apellido de los empleados de únicamente de
los departamentos en donde existen empleados con nombre ‘Jonh’
select NOMBRE_DEPARTAMENTO, PRIMER_NOMBRE, APELLIDO
from EMPLEADOS e,DEPARTAMENTOS d
where e.DEPARTAMENTO_ID=d.DEPARTAMENTO_ID
and d.DEPARTAMENTO_ID in (select DEPARTAMENTO_ID from EMPLEADOS where PRIMER_NOMBRE = ‘John’);

36. Desarrolle una consulta que liste el código de departamento, nombre, apellido y salario de únicamente de los empleados
con máximo salario en cada departamento.

select DEPARTAMENTO_ID, PRIMER_NOMBRE, APELLIDO, SALARIO


from EMPLEADOS e1
whereSALARIO=(selectmax(SALARIO)from EMPLEADOS e2 where
e1.DEPARTAMENTO_ID=e2.DEPARTAMENTO_ID);

37. Elabore una consulta que muestre el código del departamento, el nombre de departamento y el salario máximo de cada
departamento.
select d.DEPARTAMENTO_ID, NOMBRE_DEPARTAMENTO, SALARIO
from DEPARTAMENTOS d,EMPLEADOS e
where e.DEPARTAMENTO_ID=d.DEPARTAMENTO_ID
andSALARIO=(selectmax(SALARIO)from EMPLEADOS e2 where
e.DEPARTAMENTO_ID=e2.DEPARTAMENTO_ID);

38. Encuentra todos los registros en la tabla empleados que contengan un valor que ocurre dos veces en una columna dada.
select *
from EMPLEADOS e1
where 2 = ( select count(*) from EMPLEADOS e2 where e1.DEPARTAMENTO_ID=e2.DEPARTAMENTO_ID);

39. Realice una consulta que liste los empleados que están en departamentos que tienen menos de 10 empleados.
select DEPARTAMENTO_ID, PRIMER_NOMBRE||’ ‘||APELLIDO
from EMPLEADOS e1
where (select count(*) from EMPLEADOS e2 where e1.DEPARTAMENTO_ID=e2.DEPARTAMENTO_ID)<10 order by
DEPARTAMENTO_ID;

40. Desarrolle una consulta que muestre el mayor salario entre los empleados que trabajan en el departamento 30
(DEPARTAMENTO_ID) y que empleados ganan ese salario.
select DEPARTAMENTO_ID, PRIMER_NOMBRE||’ ‘||APELLIDO, SALARIO
from EMPLEADOS
where DEPARTAMENTO_ID =30
and SALARIO= (select max(SALARIO) from EMPLEADOS where DEPARTAMENTO_ID=30);

41. Elabore una consulta que muestre los departamentos en donde no exista ningún empleado.
select DEPARTAMENTO_ID, NOMBRE_DEPARTAMENTO
from DEPARTAMENTOS d
where not exists (select * from EMPLEADOS e where e.DEPARTAMENTO_ID=DEPARTAMENTO_ID);

42. Desarrolle una consulta que muestre a todos los empleados que no estén trabaj ando en el departamento 30 y que
ganen más que todos los empleados que trabajan en el departamento 30.
select PRIMER_NOMBRE, APELLIDO
from EMPLEADOS
where DEPARTAMENTO_ID <> 30
and SALARIO > all (select SALARIO from EMPLEADOS where DEPARTAMENTO_ID=30);

43. Realice una consulta que muestre los empleados que son gerentes (GERENTE_ID) y el número de empleados
subordinados a cada uno, ordenados descendentemente por número de subordinado. Excluya a los gerentes que tienen
5 empleados subordinados o menos.
select e1.EMPLEADO_ID, e1.PRIMER_NOMBRE||’ ‘||e1.APELLIDO, count(*)
from EMPLEADOS e1,EMPLEADOS e2
where e2.GERENTE_ID=e1.EMPLEADO_ID
and e2.GERENTE_ID in (select d.GERENTE_ID from DEPARTAMENTOS d where d.GERENTE_ID is not null)
and (select count(*)
from EMPLEADOS e3, EMPLEADOS e4
where e3.GERENTE_ID=e4.EMPLEADO_ID
and e3.GERENTE_ID=e1.EMPLEADO_ID)>5
group by e1.EMPLEADO_ID,e1.PRIMER_NOMBRE||’ ‘||e1.APELLIDO;

44. Desarrolle una consulta donde muestre el código de empleado, el apellido, salario, nombre de región, nombre de país,
estado de la provincia , código de departamento, nombre de departamento donde cumpla las siguientes condiciones:
a. Que los empleados que seleccione su salario sea mayor al promedio de su departamento.
b. Que no seleccione los del estado de la provincia de Texas
c. Que ordene la información por código de empleado ascendentemente.
d. Que no escoja los del departamento de finanzas (Finance)
select a.EMPLEADO_ID, a.APELLIDO ,a.SALARIO, b.REGION_NOMBRE , c.PAIS_NOMBRE, d.PROVINCIA,
e.DEPARTAMENTO_ID, e.NOMBRE_DEPARTAMENTO
from EMPLEADOS a, REGIONES b, PAISES c, LOCALIDADES d, DEPARTAMENTOS e
where a.DEPARTAMENTO_ID = e.DEPARTAMENTO_ID
and e.LOCALIDAD_ID = d.LOCALIDAD_ID
and d.PAIS_ID = c.PAIS_ID
and c.REGION_ID = b.REGION_ID
and a. SALARIO > (select avg(SALARIO)
from EMPLEADOS g
where a.DEPARTAMENTO_ID = g.DEPARTAMENTO_ID)
and d.PROVINCIA <> ‘Texas’
and e.NOMBRE_DEPARTAMENTO<> ‘Finance’
order by a.EMPLEADO_ID;

-- HR
schema
excercise
s

------- SELECT STATEMENT AND SINGLE-ROW FUNCTIONS

/* 1. Mostrar las columnas de jobs donde el salario mínimo es


mayor que 10000 */

SELECT * FROM JOBS WHERE MIN_SALARY > 10000;

/* 2. Mostrar first_name y hire_date de los empleados


que ingresaron entre 2002 y 2005*/

SELECT FIRST_NAME, HIRE_DATE FROM EMPLOYEES


WHERE TO_CHAR(HIRE_DATE, 'YYYY') BETWEEN 2002 AND 2005 ORDER BY HIRE_DATE;

/* 3. Mostrar first_name y hire_Date de los empleados que son


IT Programmer o Sales Man*/

SELECT FIRST_NAME, HIRE_DATE


FROM EMPLOYEES WHERE JOB_ID IN ('IT_PROG', 'SA_MAN');
/* 4. Mostrar empleados que ingresaron después del 1° de enero de 2008*/

SELECT * FROM EMPLOYEES where hire_date > '01-jan-2008';

/* 5. Mostrar los detalles de los empleados con id 150 o 160*/

SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID in (150,160);

/* 6. Mostrar first_name, salary, commission_pct y hire_date de los


empleados con salario menor a 10000*/

SELECT FIRST_NAME, SALARY, COMMISSION_PCT, HIRE_DATE


FROM EMPLOYEES WHERE SALARY < 10000;

/* 7. Mostrar job_title, la diferencia etre el salario mínimo y máximo


para los jobs con max_salary en el rango de 10000 a 20000*/

SELECT JOB_TITLE, MAX_SALARY-MIN_SALARY DIFFERENCE


FROM JOBS WHERE MAX_SALARY BETWEEN 10000 AND 20000;

/* 8. Mostrar first_name, salary y redondear el salario a millares


de todos los empleados*/

SELECT FIRST_NAME, SALARY, ROUND(SALARY, -3) FROM EMPLOYEES;

/* 9. Mostrar los detalles de los jobs en orden descendente por title*/

SELECT * FROM JOBS ORDER BY JOB_TITLE;

/* 10. Mostrar el nombre completo de los empleados cuyo first_name


o last_name comiece con S*/

SELECT FIRST_NAME, LAST_NAME


FROM EMPLOYEES
WHERE FIRST_NAME LIKE 'S%' OR LAST_NAME LIKE 'S%';

/* 11. Mostrar los datos de los empleados que ingresaron durante


el mes de mayo*/

SELECT * FROM EMPLOYEES WHERE TO_CHAR(HIRE_DATE, 'MON') = 'MAY';

/* 12. Mostrar los datos de los empleados cuyo commission_pct es nulo,


tienen un salario en el rango de 5000 y 10000 y su departamento es 30*/

SELECT * FROM EMPLOYEES


WHERE COMMISSION_PCT IS NULL
AND SALARY BETWEEN 5000 AND 10000 AND DEPARTMENT_ID=30;

/* 13. Mostrar first_name, fecha de ingreso y el primer día del siguiente


mes a la fecha de ingreso de los empleados*/

SELECT FIRST_NAME, HIRE_DATE, LAST_DAY(HIRE_DATE)+1 FROM EMPLOYEES;

/* 14. Mostrar first_name y años de experiencia de los empleados*/

SELECT FIRST_NAME, HIRE_DATE, FLOOR((SYSDATE-HIRE_DATE)/365)FROM EMPLOYEES;

/* 15. Mostrar first_name de los empleados que ingresaron durante


el año 2001*/

SELECT first_name
FROM employees
WHERE TO_CHAR(hire_date, 'YYYY') = '2001';

/* 16. Mostrar first_name, last_name después de convertir la primera letra


de cada uno a mayúscula y el resto a minúscula*/

SELECT INITCAP(FIRST_NAME), INITCAP(LAST_NAME) FROM EMPLOYEES;

/* 17. Mostrar la primera palabra de cada job_title*/


SELECT JOB_TITLE, SUBSTR(JOB_TITLE,1, INSTR(JOB_TITLE, ' ')-1) FROM JOBS;

/* 18. Mostrar la longitud de first_name de los empelados si


el last_name contiene el carácter 'b' después de la 3a posición*/

SELECT FIRST_NAME, LAST_NAME FROM EMPLOYEES WHERE INSTR(LAST_NAME,'b') > 3;

/* 19. Mostrar first_name en mayúsculas, last_name en minúsuclas


para los empleados cuya primera letra de first_name sea distinta
de la primera letra de last_name*/

SELECT UPPER(FIRST_NAME), LOWER(LAST_NAME)


FROM EMPLOYEES WHERE SUBSTR(FIRST_NAME, 1, 1) <> SUBSTR(LAST_NAME, 1, 1);

/* 20. Mostrar datos de los empleados que han ingresado este año */

SELECT * FROM EMPLOYEES


WHERE TO_CHAR(HIRE_DATE,'YYYY') = TO_CHAR(SYSDATE, 'YYYY');

/* 21. Mostrar el número de días entre la fecha actual y el


1° de enero de 2011 */

SELECT SYSDATE - to_date('01-jan-2011') FROM DUAL

------ AGGREGATE FUNCTIONS AND GROUP BY CLAUSE


/* 22. Mostrar cuantos empleados por cada mes del año actual
han ingresado a la compañia*/

SELECT TO_CHAR(HIRE_DATE,'MM'), COUNT (*) FROM EMPLOYEES


WHERE TO_CHAR(HIRE_DATE,'YYYY') = TO_CHAR(SYSDATE,'YYYY')
GROUP BY TO_CHAR(HIRE_DATE,'MM');

/* 23. Mostrar el manager_id y cuantos empleados tiene a su cargo*/


SELECT MANAGER_ID, COUNT(*) FROM EMPLOYEES GROUP BY MANAGER_ID;

/* 24. Mostrar el employee_id y la fecha en que terminó su


puesto anterior (end_date)*/

SELECT EMPLOYEE_ID, MAX(END_DATE) FROM JOB_HISTORY GROUP BY EMPLOYEE_ID;

/* 25. Mostrar la cantidad de empleados que ingresaron en un día


de mes mayor a 15*/

SELECT COUNT(*) FROM EMPLOYEES WHERE TO_CHAR(HIRE_DATE,'DD') > 15;

/* 26. Mostrar el country_id y el número de ciudades que hay


en ese país*/

SELECT COUNTRY_ID, COUNT(*) FROM LOCATIONS GROUP BY COUNTRY_ID;

/* 27. Mostrar el promedio de salario de los empleados por departamento


que tengan asignado un porcentaje de comisión */

SELECT DEPARTMENT_ID, AVG(SALARY) FROM EMPLOYEES


WHERE COMMISSION_PCT IS NOT NULL GROUP BY DEPARTMENT_ID;

/* 28. Mostrar el job_id, número de empleados, suma de salarios


y diferencia del mayor y el menor salario por puesto (job_id)*/

SELECT JOB_ID, COUNT(*), SUM(SALARY), MAX(SALARY)-MIN(SALARY) SALARY


FROM EMPLOYEES GROUP BY JOB_ID;

/* 29. Mostrar el job_id y el promedio de salarios para los puestos


con promedio de salario mayor a 10000*/

SELECT JOB_ID, AVG(SALARY) FROM EMPLOYEES


GROUP BY JOB_ID
HAVING AVG(SALARY) > 10000;
/* 30. Mostrar los años en que ingresaron más de 10 empleados*/

SELECT TO_CHAR(HIRE_DATE,'YYYY') FROM EMPLOYEES


GROUP BY TO_CHAR(HIRE_DATE,'YYYY')
HAVING COUNT(EMPLOYEE_ID) > 10;

/* 31. Mostrar los departamentos en los cuáles más de 5 empleados


tengan porcentaje de comisión */

SELECT DEPARTMENT_ID FROM EMPLOYEES


WHERE COMMISSION_PCT IS NOT NULL
GROUP BY DEPARTMENT_ID
HAVING COUNT(COMMISSION_PCT) > 5;

/* 32. Mostrar el employee_id de los empleados que tuvieron


más de un puesto en la compañía*/
SELECT EMPLOYEE_ID
FROM JOB_HISTORY GROUP BY EMPLOYEE_ID HAVING COUNT(*) > 1;

/* 33. Mostrar el job_id de los puestos que fueron ocupados


por más de tres empleados que hayan trabajado más de 100 días*/

SELECT JOB_ID FROM JOB_HISTORY


WHERE END_DATE-START_DATE > 100
GROUP BY JOB_ID
HAVING COUNT(*) > 3;

/* 34. Mostrar por departamento y año la cantidad de empleados


que ingresaron*/

SELECT DEPARTMENT_ID, TO_CHAR(HIRE_DATE,'YYYY'), COUNT(EMPLOYEE_ID)


FROM EMPLOYEES
GROUP BY DEPARTMENT_ID, TO_CHAR(HIRE_DATE, 'YYYY');
ORDER BY DEPARTMENT_ID;

/* 35. Mostrar los departament_id de los departamentos que tienen


managers que tienen a cargo más de 5 empleados */
SELECT DISTINCT DEPARTMENT_ID
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID, MANAGER_ID
HAVING COUNT(EMPLOYEE_ID) > 5;

------------------- INSERT, UPDATE, DELETE

/* 36. Cambiar el salario del empleado 115 a 8000 si el salario


existente es menor que 6000*/

UPDATE EMPLOYEES
SET SALARY = 8000
WHERE EMPLOYEE_ID = 115 AND SALARY < 6000;

/* 37. Insertar un nuevo empleado con todos los campos*/

INSERT INTO EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE,JOB_ID,


SALARY, DEPARTMENT_ID)
VALUES (207, 'ANGELA', 'SNYDER','ANGELA@DOMAIN.COM','215 253 4737', SYSDATE, 'SA_MAN', 12000, 80);

/* 38. Borrar el departamento 20 */

DELETE FROM DEPARTMENTS


WHERE DEPARTMENT_ID=20;

/* 39. Cambiar el job_id del empleado 110 a IT_PRGO si el empleado pertenece


al departamento 10 y el job_id existente no empieza con 'IT' */
UPDATE EMPLOYEES SET JOB_ID= 'IT_PROG'
WHERE EMPLOYEE_ID=110 AND DEPARTMENT_ID=10 AND NOT JOB_ID LIKE 'IT%';

/* 40. Insertar una fila en la tabla de departamentos con manager id 120


y location id en cualquier ciudad de Tokyo */

INSERT INTO DEPARTMENTS (150,'SPORTS',120,1200);

------------------- JOINS
/* 41. Mostrar el nombre del departamento y el número de empleados
en cada uno*/

SELECT DEPARTMENT_NAME, COUNT(*)


FROM EMPLOYEES NATURAL JOIN DEPARTMENTS GROUP BY DEPARTMENT_NAME;

/* 42. Mostrar job_title, employee_id y número de días de diferencia


entre end_date y start_date para los jobs del departamento 30,
de la tabla job_history */

SELECT EMPLOYEE_ID, JOB_TITLE, END_DATE-START_DATE DAYS


FROM JOB_HISTORY NATURAL JOIN JOBS
WHERE DEPARTMENT_ID = 30;

/* 43. Mostrar el nombre del departamento y el nombre del manager


a cargo del departamento*/

SELECT DEPARTMENT_NAME, FIRST_NAME


FROM DEPARTMENTS D JOIN EMPLOYEES E ON (D.MANAGER_ID=E.EMPLOYEE_ID);

/* 44. Mostrar el nombre del departamento, el del manager a cargo


y la ciudad a la que pertenece*/

SELECT DEPARTMENT_NAME, FIRST_NAME, CITY


FROM DEPARTMENTS D JOIN EMPLOYEES E
ON (D.MANAGER_ID=E.EMPLOYEE_ID) JOIN LOCATIONS L USING (LOCATION_ID);

/* 45. Mostrar nombre de departamento, y su país*/

SELECT COUNTRY_NAME, DEPARTMENT_NAME


FROM COUNTRIES JOIN LOCATIONS USING (COUNTRY_ID)
JOIN DEPARTMENTS USING (LOCATION_ID)

/* 46. Mostrar job_title, department_name, last_name de empleado y la fecha


de inicio de todos los puestos de 2000 a 2005*/
SELECT JOB_TITLE, DEPARTMENT_NAME, LAST_NAME, START_DATE
FROM JOB_HISTORY
JOIN JOBS USING (JOB_ID)
JOIN DEPARTMENTS USING (DEPARTMENT_ID)
JOIN EMPLOYEES USING (EMPLOYEE_ID)
WHERE TO_CHAR(START_DATE,'YYYY') BETWEEN 2000 AND 2005;

/* 47. Mostrar job_title y promedio de los salarios de los empleados */

SELECT JOB_TITLE, AVG(SALARY)


FROM EMPLOYEES
NATURAL JOIN JOBS GROUP BY JOB_TITLE;

/* 48. Mostrar job_title, first_name de empleado, y la diferencia entre al


salary mayor y el menor para el puesto del empleado*/

SELECT JOB_TITLE, FIRST_NAME, MAX_SALARY-SALARY DIFFERENCE


FROM EMPLOYEES NATURAL JOIN JOBS;

/* 49. Mostrar last_name, job_title de los empleados que tienen un


commission_pct y pertenecen al departamento 30 */

SELECT LAST_NAME, JOB_TITLE


FROM EMPLOYEES NATURAL JOIN JOBS
WHERE COMMISSION_PCT IS NOT NULL AND DEPARTMENT_ID = 80;

/* 50. Mostrar los detalles de los puestos ocupados por cualquier empleado
que actualmente tenga más de 15000 de salario*/

SELECT JH.*
FROM JOB_HISTORY JH
JOIN EMPLOYEES E ON (JH.EMPLOYEE_ID = E.EMPLOYEE_ID)
WHERE SALARY > 15000;

/* 51. Mostrar department_name, nombre y salario de los managers con experiencia


mayor a 5 años*/

SELECT DEPARTMENT_NAME, FIRST_NAME, SALARY


FROM DEPARTMENTS D
JOIN EMPLOYEES E ON (D.MANAGER_ID=E.MANAGER_ID)
WHERE (SYSDATE-HIRE_DATE) / 365 > 5;

/* 52. Mostrar nombre de los empleados que ingresaron antes que su manager*/

SELECT E1.FIRST_NAME
FROM EMPLOYEES E1 JOIN EMPLOYEES E2 ON (E1.MANAGER_ID=E2.EMPLOYEE_ID)
WHERE E1.HIRE_DATE < E2.HIRE_DATE;

/* 53. Mostrar nombre, job_title para los puestos que un empleado tuvo
anteriormente y que duró menos de 6 meses */
SELECT FIRST_NAME, JOB_TITLE
FROM EMPLOYEES E
JOIN JOB_HISTORY JH ON (JH.EMPLOYEE_ID = E.EMPLOYEE_ID)
JOIN JOBS J ON( JH.JOB_ID = J.JOB_ID)
WHERE MONTHS_BETWEEN(END_DATE,START_DATE) < 6 ;

/* 54. Mostrar nombre del empleado y el país en el que trabaja */

SELECT FIRST_NAME, COUNTRY_NAME


FROM EMPLOYEES
JOIN DEPARTMENTS USING(DEPARTMENT_ID)
JOIN LOCATIONS USING( LOCATION_ID)
JOIN COUNTRIES USING ( COUNTRY_ID);

/* 55. Mostrar department_name, promedio del salario y numero de


empleados con commission_pct en el departamento*/

SELECT DEPARTMENT_NAME, AVG(SALARY), COUNT(COMMISSION_PCT)


FROM DEPARTMENTS
JOIN EMPLOYEES USING (DEPARTMENT_ID)
GROUP BY DEPARTMENT_NAME;

/* 56. Mostrar el mes en qúe más de 5 empleados ingresaron


a un departamento ubicado en Seattle*/

SELECT TO_CHAR(HIRE_DATE,'MON-YY')
FROM EMPLOYEES
JOIN DEPARTMENTS USING (DEPARTMENT_ID)
JOIN LOCATIONS USING (LOCATION_ID)
WHERE CITY = 'Seattle'
GROUP BY TO_CHAR(HIRE_DATE,'MON-YY')
HAVING COUNT(*) > 5;

-------- SUBQUERIES

/* 57. Mostrar los detalles de los departamentos en los cuales


el salario máximo sea mayor a 10000*/

SELECT *
FROM DEPARTMENTS
WHERE DEPARTMENT_ID IN
(SELECT DEPARTMENT_ID FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING MAX(SALARY)>10000);

/* 58. Mostrar los detalles de los departamentos a cargo


de 'Smith' */

SELECT * FROM DEPARTMENTS WHERE MANAGER_ID IN


(SELECT EMPLOYEE_ID FROM EMPLOYEES WHERE last_name='SMITH');

/* 59. Mostrar los puestos de los empleados se unieron durante el 2008 */

SELECT * FROM JOBS


WHERE JOB_ID IN
(SELECT JOB_ID FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE,'YYYY')= '2008');

/* 60. Mostrar los empleados que no tienen un puesto previo


en la compañía */

SELECT * FROM EMPLOYEES


WHERE EMPLOYEE_ID NOT IN
(SELECT EMPLOYEE_ID FROM JOB_HISTORY);

/* 61. Mostrar job_title y promedio de salario para empleados


que tenían un puesto previo en la compañía */

SELECT JOB_TITLE, AVG(SALARY)


FROM JOBS NATURAL JOIN EMPLOYEES
GROUP BY JOB_TITLE
WHERE EMPLOYEE_ID IN
(SELECT EMPLOYEE_ID FROM JOB_HISTORY);

/* 62. Mostrar country_name, city y número de departamentos


donde el departamento tenga más de 5 empleados */

SELECT COUNTRY_NAME, CITY, COUNT(DEPARTMENT_ID)


FROM COUNTRIES
JOIN LOCATIONS USING (COUNTRY_ID)
JOIN DEPARTMENTS USING (LOCATION_ID)
WHERE DEPARTMENT_ID IN
(SELECT DEPARTMENT_ID FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING COUNT(DEPARTMENT_ID)>5)
GROUP BY COUNTRY_NAME, CITY;

/* 63. Mostrar el nombre de los manager que tengan a su


cargo más de 5 personas */

SELECT FIRST_NAME
FROM EMPLOYEES
WHERE EMPLOYEE_ID IN
(SELECT MANAGER_ID FROM EMPLOYEES
GROUP BY MANAGER_ID
HAVING COUNT(*)>5);

/* 64. Mostrar para los empleados: nombre, job_title, start_date


y end_date de los trabajos previos, que no tengan
commission_pct*/

SELECT FIRST_NAME, JOB_TITLE, START_DATE, END_DATE


FROM JOB_HISTORY JH
JOIN JOBS J USING (JOB_ID)
JOIN EMPLOYEES E ON ( JH.EMPLOYEE_ID = E.EMPLOYEE_ID)
WHERE COMMISSION_PCT IS NULL;
/* 65. Mostrar los departamentos en los cuales no ha ingresado
un empleado durante los últimos dos años */

SELECT * FROM DEPARTMENTS


WHERE DEPARTMENT_ID NOT IN
( SELECT DEPARTMENT_ID
FROM EMPLOYEES
WHERE FLOOR((SYSDATE-HIRE_DATE)/365) < 2);

/* 66. Mostrar los detalles de los departamentos en los cuales


el salario máximo es mayor que 10000 para los empleados
que no tuvieron un puesto previamente */

SELECT * FROM DEPARTMENTS


WHERE DEPARTMENT_ID IN
(SELECT DEPARTMENT_ID
FROM EMPLOYEES
WHERE EMPLOYEE_ID IN (SELECT EMPLOYEE_ID FROM JOB_HISTORY)
GROUP BY DEPARTMENT_ID
HAVING MAX(SALARY) > 10000);

/* 67. Mostrar detalles del job actual para los empleados


que trabajaron previamente en IT_PROG */

SELECT *
FROM JOBS
WHERE JOB_ID IN
(SELECT JOB_ID FROM EMPLOYEES WHERE EMPLOYEE_ID IN
(SELECT EMPLOYEE_ID FROM JOB_HISTORY WHERE JOB_ID='IT_PROG'));

/* 68. Mostrar los detalles de los empleados que tienen el


mayor salario de su departamento*/

SELECT DEPARTMENT_ID,FIRST_NAME, SALARY


FROM EMPLOYEES OUTER WHERE SALARY =
(SELECT MAX(SALARY)
FROM EMPLOYEES
WHERE DEPARTMENT_ID = OUTER.DEPARTMENT_ID);

/* 69. Mostrar la ciudad del empleado 105 */


SELECT CITY FROM LOCATIONS
WHERE LOCATION_ID =
(SELECT LOCATION_ID
FROM DEPARTMENTS
WHERE DEPARTMENT_ID =
(SELECT DEPARTMENT_ID
FROM EMPLOYEES
WHERE EMPLOYEE_ID=105))

/* 70. Mostrar el tercer mayor salario de los empleados */

SELECT SALARY
FROM EMPLOYEES main
WHERE 2 = (SELECT COUNT( DISTINCT SALARY )
FROM EMPLOYEES
WHERE SALARY > main.SALARY);

You might also like