HR Schema
HR Schema
HR Schema
The following is the structure of the tables provided by Oracle in Human Resource Schema
(HR).
Queries
1. Display details of jobs where the minimum salary is greater than 10000.
2. Display the first name and join date of the employees who joined between 2002 and
2005.
3. Display first name and join date of the employees who is either IT Programmer or Sales
Man.
6. Display first name, salary, commission pct, and hire date for employees with salary less
than 10000.
7. Display job Title, the difference between minimum and maximum salaries for jobs with
max salary in the range 10000 to 20000.
10. Display employees where the first name or last name starts with S.
12. Display details of the employees where commission percentage is null and salary in the
range 5000 to 10000 and department is 60.
13. Display first name and date of first salary of the employees.
16. Display first name and last name after converting the first letter of each name to upper
case and the rest to lower case.
1st method-
SELECT JOB_TITLE, SUBSTR(JOB_TITLE,1, INSTR(JOB_TITLE, ' ')-1) FROM
JOBS
2nd method-select nvl((substr(job_title,1,
instr(job_title,' ',1,1)-1)),job_title) from jobs;
18. Display the length of first name for employees where last name contain character ‘b’ after
3rd position.
19. Display first name in upper case and email address in lower case for employees where the
first name and email address are same irrespective of the case.
21. Display the number of days between system date and 1st January 2011.
22. Display how many employees joined in each month of the current year.
24. Display employee ID and the date on which he ended his previous job.
27. Display average salary of employees in each department who have commission
percentage.
28. Display job ID, number of employees, sum of salary, and difference between highest
salary and lowest salary of the employees of the job.
29. Display job ID for jobs with average salary more than 10000.
31. Display departments in which more than five employees have commission percentage.
32. Display employee ID for employees who did more than one job in the past.
33. Display job ID of jobs that were done by more than 3 employees for more than 100 days.
35. Display departments where any manager is managing more than 5 employees.
36. Change salary of employee 115 to 8000 if the existing salary is less than 6000.
UPDATE EMPLOYEES SET SALARY = 8000 WHERE EMPLOYEE_ID = 115 AND SALARY <
6000
37. Insert a new employee into employees with all the required details.
39. Change job ID of employee 110 to IT_PROG if the employee belongs to department 10
and the existing job ID does not start with IT.
40. Insert a row into departments table with manager ID 120 and location ID in any location
ID for city Tokyo.
42. Display job title, employee ID, number of days between ending date and starting date for
all jobs in department 30 from job history.
46. Display job title, department name, employee last name, starting date for all jobs from
2000 to 2005.
select job_title,department_name,last_name,start_date
from job_history jh join jobs j
on jh.job_id=j.job_id
join departments d
on jh.department_id=d.department_id
join employees e
on e.employee_id=jh.employee_id
where to_char(start_date,'yyyy') between 2000 and 2005
48. Display job title, employee name, and the difference between maximum salary for the job
and salary of the employee.
49. Display last name, job title of employees who have commission percentage and belongs
to department 30.
select last_name,job_title
from jobs j join employees e
on j.job_id=e.job_id
50. Display details of jobs that were done by any employee who is currently drawing more
than 15000 of salary.
SELECT JH.*
FROM JOB_HISTORY JH JOIN EMPLOYEES E ON (JH.EMPLOYEE_ID =
E.EMPLOYEE_ID)
WHERE SALARY > 15000
51. Display department name, manager name, and salary of the manager for all managers
whose experience is more than 5 years.
52. Display employee name if the employee joined before his manager.
53. Display employee name, job title for the jobs employee did in the past where the job was
done less than six months.
55. Display department name, average salary and number of employees with commission
within the department.
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
57. Display details of departments in which the maximum salary is more than 10000.
59. Display jobs into which employees joined in the current year.
60. Display employees who did not do any job in the past.
61. Display job title and average salary for employees who did a job in the past.
62. Display country name, city, and number of departments where department has more than
5 employees.
64. Display employee name, job title, start date, and end date of past jobs of all employees
with commission percentage null.
65. Display the departments into which no employee joined in last two years.
66. Display the details of departments in which the max salary is greater than 10000 for
employees who did a job in the past.
67. Display details of current job for employees who worked as IT Programmers in the past.
68. Display the details of employees drawing the highest salary in the department.
select salary
from employees main
where 2 = (select count( distinct salary )
from employees
where salary > main.salary)
PL/SQL Programs
1. Write a program to interchange the salaries of employee 120 and 122.
Declare
V_salary_120 employees.salary%type;
Begin
Select salary into v_salary_120
From employees where employee_id = 120;
Commit;
End;
2. Increase the salary of employee 115 based on the following conditions: If experience is
more than 10 years, increase salary by 20% If experience is greater than 5 years, increase
salary by 10% Otherwise 5% Case by Expression:
declare
v_exp number(2);
v_hike number(5,2);
begin
select floor((sysdate-hire_date) / 365 ) into v_exp
from employees
where employee_id = 115;
v_hike := 1.05;
case
when v_exp > 10 then
v_hike := 1.20;
when v_exp > 5 then
v_hike := 1.10;
end case;
3. Change commission percentage as follows for employee with ID = 150. If salary is more
than 10000 then commission is 0.4%, if Salary is less than 10000 but experience is more
than 10 years then 0.35%, if salary is less than 3000 then commission is 0.25%. In the
remaining cases commission is 0.15%.
declare
v_salary employees.salary%type;
v_exp number(2);
v_cp number(5,2);
begin
select v_salary, floor ( (sysdate-hire_date)/365) into v_salary,
v_exp
from employees
where employee_id = 150;
end if;
4. Find out the name of the employee and name of the department for the employee who is
managing for employee 103.
declare
v_name employees.first_name%type;
v_deptname departments.department_name%type;
begin
select first_name , department_name into v_name, v_deptname
from employees join departments using (department_id)
where employee_id = ( select manager_id from employees where
employee_id = 103);
dbms_output.put_line(v_name);
dbms_output.put_line(v_deptname);
end;
declare
v_min number(3);
v_max number(3);
v_c number(1);
begin
select min(employee_id), max(employee_id) into v_min, v_max
from employees;
ifv_c = 0 then
dbms_output.put_line(i);
end if;
end loop;
end;
6. Display the year in which maximum number of employees joined along with how many
joined in each month in that year.
declare
v_year number(4);
v_c number(2);
begin
select to_char(hire_date,'yyyy') into v_year
from employees
group by to_char(hire_date,'yyyy')
having count(*) =
( select max( count(*))
from employees
group by to_char(hire_date,'yyyy'));
end loop;
end;
7. Change salary of employee 130 to the salary of the employee with first name ‘Joe’. If Joe
is not found then take average salary of all employees. If more than one employee with
first name ‘Joe’ is found then take the least salary of the employees with first name Joe.
declare
v_salary employees.salary%type;
begin
select salary into v_salary
from employees where first_name = 'Joe';
exception
when no_data_found then
update employees set salary = (select avg(salary) from employees)
where employee_id = 130;
end;
8. Display Job Title and Name of the Employee who joined the job first day.
declare
cursor jobscur is select job_id, job_title from jobs;
v_name employees.first_name%type;
begin
for jobrec in jobscur
loop
select first_name into v_name
from employees
where hire_date = ( select min(hire_date) from employees
where job_id = jobrec.job_id)
and job_id = jobrec.job_id;
end loop;
end;
cursor empcur is
select employee_id, first_name
from employees;
begin
for emprec in empcur
loop
if empcur%rowcount > 4 then
dbms_output.put_line( emprec.first_name);
exit when empcur%rowcount > 10;
end if;
end loop;
end;
declare
cursor empcur is
select employee_id, department_id, commission_pct
from employees;
v_hike number(2);
begin
end loop;
end;
11. Create a function that takes department ID and returns the name of the manager of the
department.
v_name employees.first_name%type;
begin
select first_name into v_name
from employees
where employee_id = ( select manager_id from departments where
department_id = deptid);
return v_name;
end;
12. Create a function that takes employee ID and return the number of jobs done by the
employee in the past.
return v_count;
end;
13. Create a procedure that takes department ID and changes the manager ID for the
department to the employee in the department with highest salary. (Use Exceptions).
14. Create a function that takes a manager ID and return the names of employees who report
to this manager. The names must be returned as a string with comma separating names.
15. Ensure no changes can be made to EMPLOYEES table before 6am and after 10pm in a
day.
16. Create a Trigger to ensure the salary of the employee is not decreased.
17. Create a trigger to ensure the employee and manager belongs to the same department.
Note: This trigger need to read the row that is being modified, which
causes mutating problem. The solution to mutating problem is
explained at : Work around for mutating problem in Oracle Triggers.
Please check it out.
18. Whenever the job is changed for an employee write the following details into job history.
Employee ID, old job ID, old department ID, hire date of the employee for start date,
system date for end date. But if a row is already present for employee job history then the
start date should be the end date of that row +1.