Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
100% found this document useful (2 votes)
2K views

All Oracle SQL Questions and Answers

This document contains 57 SQL queries with explanations on how to retrieve various types of data from database tables like EMP and DEPT. The queries cover basic selects, filtering, sorting, aggregate functions, joins, subqueries and more. They provide examples of retrieving data based on conditions, calculations, groupings and ordering.

Uploaded by

raj
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
100% found this document useful (2 votes)
2K views

All Oracle SQL Questions and Answers

This document contains 57 SQL queries with explanations on how to retrieve various types of data from database tables like EMP and DEPT. The queries cover basic selects, filtering, sorting, aggregate functions, joins, subqueries and more. They provide examples of retrieving data based on conditions, calculations, groupings and ordering.

Uploaded by

raj
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 32

1.

Display the dept information from department table

SQL> select * from dept;

2. Display the details of all employees

SQL> select * from emp;

3.  Display the name and job for all employees

SQL> select e.ename,e.job from emp e;

4.  Display name and salary for all employees

SQL> select e.ename,e.sal from emp e;

5. Display employee number and total salary for each employee

SQL> select e.empno, e.sal + nvl(e.comm,0) as total_sal from emp e;

6. Display employee name and annual salary for all employees

SQL> select e.ename,12 * e.sal as annual_sal from emp e;

7. Display the names of all employees who are working in department number 10

SQL> select e.ename from emp e where e.deptno=10;

 
8. Display the names of all employees working as clerks and drawing a salary more than
3000

SQL> select e.ename from emp e where e.job=’CLERK’ and e.sal>3000;

9.  Display employee number and names for employees who earn commission

SQL> select e.empno, e.ename from emp e where e.comm is not null;

10. Display names of employees who do not earn any commission

SQL> select e.empno, e.ename from emp e where e.comm is null or e.comm=0;

11. Display the names of employees who are working as clerk , salesman or analyst and
drawing a salary more than 3000

SQL> select e.ename from emp e where (e.job=’CLERK’ or e.job=’ANALYST’ or


e.job=’SALESMAN’) and e.sal>3000;
or

SQL> select e.ename from emp e where e.job in (‘CLERK’ ,’ANALYST’,’SALESMAN’) and
e.sal>3000;
//Prefer the second one as it is easier to insert new values if required

12. Display the names of employees who are working in the company for the past 5 years

SQL> select ename from emp e where sysdate – e.hiredate>5*365;

13. Display the list of employees who have joined the company before 30 th june 90 or after
31 st dec 90
SQL> select * from emp e where e.hiredate between ’30-jun-1990′ and ’31-dec-1990′;
 

14. Display current date

SQL> select sysdate as currentdate from dual

15. Display the list of users in your database (using log table)

SQL> select * from all_users;

or

SQL> select * from dba_users;

16. Display the names of all tables from the current user

SQL> select * from tab;

17. Display the name of the current user

SQL> select username from user_users;

or

SQL> show user;

// show user works in command line/sql*plus. Might not work in few GUIs

18. Display the names of employees working in department number 10 or 20 or 40 or em


employees working as clerks , salesman or analyst

SQL> select e.ename from emp e where e.job in (‘CLERK’ ,’ANALYST’,’SALESMAN’) or


e.deptno in (10,20,40);
 

19. Display the names of employees whose name starts with alphabet S

SQL> select e.ename from emp e where e.ename like ‘S%’ or e.ename like ‘s%’;

20. Display employee name from employees whose name ends with alphabet S

SQL> select e.ename from emp e where e.ename like ‘%S’ or e.ename like ‘%s’;

21. Display the names of employees whose names have second alphabet A in their names

SQL> select e.ename from emp e where e.ename like ‘_a%’ or e.ename like ‘_A%’;

22.Display the names of employees whose name is exactly five characters in length

SQL> select e.ename from emp e where length(e.ename)=5;

23.Display the names of employees who are not working as managers

SQL> select e.ename from emp e where e.job<>’MANAGER’;

24.Display the names of employees who are not working as SALESMAN or CLERK or
ANALYST

SQL> select e.ename from emp e where e.job not in (‘CLERK’ ,’ANALYST’,’SALESMAN’)

25.Display all rows from emp table. The system should wait after every screen full of
information
SQL> set pause on;

pause press return;

select * from emp;

//The first statement is going to turn the pause feature on. Once a page size is reached in
sql*plus [ this can be run in sql*plus or command line alone I think], it will pause and wait
for user input.
//The next statement is going to print a message saying “press return” whenever it is
paused to continue
//The emp records are printed.

26.Display the total number of employees working in the company

SQL>select count(e.empno) as employee_count from emp e;

27.Display the total salary and total commission to all employees.

SQL>select sum(e.sal) as totalsal,sum(nvl(e.comm,0)) as totalcomm from emp e;

28.Display the maximum salary from emp table

SQL>select max(e.sal) from emp e;

29.Display the minimum salary from emp table

SQL>select min(e.sal) from emp e;

30.Display the average salary from emp table

SQL>select avg(e.sal) from emp e;


 

31.Display the maximum salary being paid to CLERK.

SQL>select max(e.sal) from emp e where e.job=’CLERK’;

32.Display the maximum salary being paid in dept no 20

SQL>select max(e.sal) from emp e where e.deptno=20;

33.Display the minimum salary being paid to any SALESMAN

SQL>select min(e.sal) from emp e where e.job=’SALESMAN’;

34.Display the average salary drawn by managers

SQL>select avg(e.sal) from emp e where e.job=’MANAGER’;

35.Display the total salary drawn by analyst working in dept no 20

SQL>select SUM(e.sal) from emp e where e.job=’ANALYST’ and e.deptno=20;

36.Display the names of employees in order of salary i.e. the name of the employee earning
highest should appear first

SQL>select e.ename from emp e order by e.sal desc;

37.Display the names of employees in ascending  order of salary lowest salary shoud appear
first
SQL>select e.ename from emp e order by e.sal;

38.Display the details from emp table in order of emp name

SQL>select * from emp e order by e.ename;

39.Display empnno,ename,deptno and sal. Sort the output first based on name and within
name by deptno and witdhin deptno by sal;

SQL> select e.empno,e.ename,e.deptno,e.sal from emp e order by e.ename,e.deptno,e.sal;

// To see if this is actually working, you need to insert more values which meet such
condition. Try to insert few values with the same name but different depto’s & sal
combinations

40) Display the name of employees along with their annual salary(sal*12). the name of the
employee earning highest annual salary should appear first?

SQL>select e.ename,e.sal*12 as annualsal from emp e order by annualsal desc;

41) Display name,salary,Hra,pf,da,TotalSalary for each employee. The out put should be in
the order of total salary ,hra 15% of salary ,DA 10% of salary .pf 5% salary Total Salary will be
(salary+hra+da)-pf?

SQL> select e.ename,e.sal, 0.15*sal as hra,0.10*sal as da,0.05*sal as pf,(e.sal + 0.15*sal +


0.10*sal – 0.05*sal) as totalsal from emp e;

42) Display Department numbers and total number of employees working in each
Department?

SQL>select e.deptno, count(e.empno) from emp e group by e.deptno;


 

43) Display the various jobs and total number of employees working in each job group?

SQL>select e.job, count(e.empno) from emp e group by e.job;

44)Display department numbers and Total Salary for each Department?

SQL>select e.deptno, sum(sal) from emp e group by e.deptno;

45)Display department numbers and Maximum Salary from each Department?

SQL>select e.deptno, max(sal) from emp e group by e.deptno;

46)Display various jobs and Total Salary for each job?

SQL>select e.job, sum(e.sal) as totalsal from emp e group by e.job;

47)Display each job along with min of salary being paid in each job group?

SQL>select e.job, min(e.sal) from emp e group by e.job;

48) Display the department Number with more than three employees in each department?

SQL>select e.deptno from emp e group by e.deptno having count(empno) >3;

49) Display various jobs along with total salary for each of the job where total salary is
greater than 40000?

SQL>select e.job, sum(e.sal) as totalsal from emp e group by e.job having sum(e.sal)>4000;
 

50) Display the various jobs along with total number of employees in each job. The output
should contain only those jobs with more than three employees?
SQL> select e.job, count(empno) as employees from emp e group by e.job having
count(empno) >3;

51) Display the name of employees who earn Highest Salary?

SQL>SELECT E.ENAME FROM EMP E WHERE E.SAL=(SELECT MAX(E.SAL) FROM EMP E);

52) Display the employee Number and name for employee working as clerk and earning
highest salary among the clerks?

SQL> SELECT E.EMPNO,E.ENAME FROM EMP E WHERE E.JOB=’CLERK’ AND E.SAL=(SELECT


MAX(E.SAL) FROM EMP E WHERE E.JOB=’CLERK’)

53) Display the names of salesman who earns a salary more than the Highest Salary of the
clerk?

SQL>SELECT E.ENAME FROM EMP E WHERE E.JOB=’SALESMAN’ AND E.SAL>(SELECT


MAX(E.SAL) FROM EMP E WHERE E.JOB=’CLERK’)

54) Display the names of clerks who earn a salary more than the lowest Salary of any
salesman?

SQL>SELECT E.ENAME FROM EMP E WHERE E.JOB=’CLERK’ AND E.SAL>(SELECT MIN(E.SAL)


FROM EMP E WHERE E.JOB=’SALESMAN’)

55) Display the names of employees who earn a salary more than that of jones or greater
than that of scott?

SQL> SELECT E.ENAME FROM EMP E WHERE E.SAL>(SELECT E.SAL FROM EMP E WHERE
E.ENAME=’JONES’) AND E.SAL>(SELECT E.SAL FROM EMP E WHERE E.ENAME=’SCOTT’)
OR

SELECT E.ENAME FROM EMP E WHERE E.SAL>(SELECT MAX(E.SAL) FROM EMP E WHERE
E.ENAME IN (‘JONES’,’SCOTT’));

//This is done here as the salary needs to be greater than both Scott & Jones. If it is greater
than max, then it is obviously greater individually.  If the condition is changed like less than
one and greater than the other etc, then individual queries need to be written

56) Display the names of employees who earn Highest salary in their respective
departments?

SQL>SELECT E.ENAME, E.DEPTNO FROM EMP E WHERE SAL IN (SELECT MAX(SAL) FROM EMP E
GROUP BY DEPTNO)

57) Display the names of employees who earn Highest salaries in their respective job
Groups?

SQL>SELECT E.ENAME, E.JOB FROM EMP E WHERE SAL IN (SELECT MAX(SAL) FROM EMP E
GROUP BY JOB)

58) Display employee names who are working in Accounting department?

SQL> SELECT E.ENAME FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO AND


D.DNAME=’ACCOUNTING’

59) Display the employee names who are Working in Chicago?

SQL>SELECT E.ENAME FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO AND


D.LOC=’CHICAGO’

60) Display the job groups having Total Salary greater than the maximum salary for
Managers?
SQL> SELECT E.JOB FROM EMP E GROUP BY E.JOB HAVING SUM(E.SAL)>(SELECT MAX(E.SAL)
FROM EMP E WHERE E.JOB=’MANAGER’);

61) Display the names of employees from department number 10 with salary greater than
that of ANY employee working in other departments?

SQL>SELECT E.ENAME FROM EMP E WHERE E.DEPTNO=10 AND E.SAL > ANY (SELECT E2.SAL
FROM EMP E2 WHERE E2.DEPTNO!=E.DEPTNO);

62) Display the names of employees from department number 10 with salary greater than
of   ALL employee working in other departments ?

SQL> SELECT E.ENAME FROM EMP E WHERE E.DEPTNO=10 AND E.SAL > ALL (SELECT E2.SAL
FROM EMP E2 WHERE E2.DEPTNO!=E.DEPTNO);

63) Display the names of employees in Upper Case?

SQL> SELECT UPPER(E.ENAME) FROM EMP E;

64) Display the names of employees in Lower Case?

SQL> SELECT LOWER(E.ENAME) FROM EMP E;

65) Display the names of employees in Proper case?

SQL> SELECT INITCAP(E.ENAME) FROM EMP E;

66) Find the length of your name using Appropriate Function?


SQL> SELECT LENGTH(‘YOURNAME’) FROM DUAL;
//Replace it with any name

67) Display the length of all the employee names?

SQL> SELECT E.ENAME, LENGTH(E.ENAME) FROM EMP E;

68) Display the name of employee Concatenated with Employee Number?

SQL> SELECT E.ENAME||E.EMPNO FROM EMP E;


OR
SELECT CONCAT(E.ENAME,E.EMPNO) FROM EMP E;

69) Use appropriate function and extract 3 characters starting from 2 characters from the
following string ‘Oracle’ i.e., the output should be ac?

SQL> SELECT SUBSTR(‘ORACLE’,3,2) FROM DUAL;

70) Find the first occurrence of character ‘a’ from the following string Computer
Maintenance Corporation?

SQL> SELECT INSTR(‘Computer Maintenance Corporation’,’a’,1,1) FROM DUAL;

71) Replace every occurrence of alphabet A with B in the string Aliens (Use Translate
function)?

SQL> SELECT REPLACE(‘Aliens’,’A’,’B’) FROM DUAL;


OR
SELECT TRANSLATE(‘Aliens’, ‘A’, ‘B’) FROM DUAL;

 
72) Display the information from the employee table wherever job Manager is found it
should be displayed as Boss?

SQL> SELECT E.EMPNO, E.ENAME, REPLACE (JOB,’MANAGER’,’BOSS’) AS JOB FROM EMP E

73) Display empno, ename, deptno from emp table. Instead of display department numbers
display the related department name (Use decode function)?

SQL> SELECT E.EMPNO,E.ENAME, ,D.DNAME AS DEPTNO FROM EMP E, DEPT D WHERE


E.DEPTNO = D.DEPTNO;

OR

SELECT
E.EMPNO,E.ENAME,DECODE(E.DEPTNO,10,’ACCOUNTING’,20,’RESEARCH’,30,’SALES’,40,’OPE
RATIONS’) FROM EMP E;

74) Display your Age in Days?

SQL> SELECT ROUND (SYSDATE – TO_DATE (’13-MAY-92′)) AS AGE_IN_DAYS FROM DUAL;

75) Display your Age in Months?

SQL> SELECT FLOOR (MONTHS_BETWEEN (SYSDATE, TO_DATE (’13-MAY-92′))) AS


AGE_IN_MONTHS FROM DUAL;

76)Display current date as 15th August Friday Nineteen Ninety Seven?

SQL> SELECT TO_CHAR(SYSDATE,’DDTH MONTH DAY YEAR’) AS TODAY FROM DUAL;

77)Get last day of the current month?


SQL>SELECT TRUNC (LAST_DAY (SYSDATE)) AS “Last day” FROM DUAL;

78)Display all the records of emp in the following format  “Scott has joined the company on
13th August ninteen ninety?”

SQL> select ename||’ has joined the company on ‘||to_char(hiredate,’day ddth month year’)
as doj from emp;

79) Find the nearest Saturday after Current date?

SQL> SELECT NEXT_DAY (SYSDATE, ‘SATURDAY’) FROM DUAL;

80) Display the current time?

SQL> SELECT TO_CHAR (SYSDATE,’HH:MI:SS’) TIME FROM DUAL;

81) Display the date three months before the Current date?

SQL> SELECT ADD_MONTHS(SYSDATE,-3) FROM DUAL

82) Display the common jobs from department number 10 and 20?

SQL> SELECT JOB FROM EMP WHERE DEPTNO=10 AND JOB IN (SELECT JOB FROM EMP WHERE
DEPTNO=20);

OR

SELECT JOB FROM EMP WHERE DEPTNO=10 INTERSECT SELECT JOB FROM EMP WHERE
DEPTNO=20;

 
83) Display the jobs found in department 10 and 20. Eliminate duplicate jobs [Eliminate the
jobs that are common in 10&20]?

SQL> (SELECT JOB FROM EMP WHERE DEPTNO=10 UNION SELECT JOB FROM EMP WHERE
DEPTNO=20)  MINUS (SELECT JOB FROM EMP WHERE DEPTNO=10 INTERSECT SELECT JOB
FROM EMP WHERE DEPTNO=20);
// This is similar to the sets concept (A-B)U(B-A) OR (AUB)-(A∩B). Suggest a better way to
do this as this is not at all suitable as the deptnos increase. If we add another deptno say
30, then it will be one big mess of a query.
//We can do these effectively by using PL/SQL by storing the repetitive parts as sub queries.
Then it will be similar to an expression.

84) Display the jobs which are unique to department 10?

SQL> SELECT JOB FROM EMP WHERE DEPTNO=10 MINUS SELECT JOB FROM EMP WHERE
DEPTNO!=10;

OR

SELECT JOB FROM EMP WHERE DEPTNO = 10 AND JOB NOT IN (SELECT JOB FROM EMP WHERE
DEPTNO<>10);

//Second one is cost effective

85) Display the details of those employees who do not have any person working under him?

SQL> SELECT * FROM EMP WHERE EMPNO NOT IN (SELECT MGR FROM EMP WHERE MGR IS
NOT NULL);

86) Display the details of those employees who are in sales department and grade is 3?

SQL> SELECT E.* FROM EMP E WHERE E.SAL BETWEEN (SELECT LOSAL FROM SALGRADE
WHERE GRADE =3) AND (SELECT HISAL FROM SALGRADE WHERE GRADE =3) AND DEPTNO =
(SELECT DEPTNO FROM DEPT WHERE DNAME=’SALES’);

OR
SELECT E.* FROM EMP E, SALGRADE S, DEPT D WHERE S.GRADE=3 AND E.SAL>S.LOSAL AND
E.SAL<S.HISAL AND E.DEPTNO=D.DEPTNO AND D.DNAME=’SALES’;

// The first query is more cost effective.

87) Display those who are not managers?

SQL> SELECT * FROM EMP E WHERE E.JOB <> ‘MANAGER’;


//Simply checking if job is not manager

SELECT * FROM EMP WHERE EMPNO NOT IN (SELECT MGR FROM EMP WHERE MGR IS NOT
NULL);
//Ensures that the names of employees who are reporting to others are displayed.

88) Display those employees whose name contains not less than 4 characters?

SQL> SELECT * FROM EMP E WHERE LENGTH(E.ENAME)>4;

89) Display those departments whose name starts with “S” while location name ends with
“K”?

SQL> SELECT * FROM DEPT D WHERE D.DNAME LIKE ‘S%’ AND D.LOC LIKE ‘%O’;

90) Display those employees whose manager name is Jones?

SQL> SELECT E.* FROM EMP E, EMP E1 WHERE E.MGR = E1.EMPNO AND E1.ENAME=’JONES’;

Or

SELECT * FROM EMP E WHERE E.MGR = (SELECT E1.EMPNO FROM EMP E1 WHERE
E1.ENAME=’JONES’);

// Both produce the same results but the second query will be more cost effective as the
filter will be executed first thus reducing  no. of records that need to be processed. In the
first case, a hash join will be done first and then the filters will be checked upon that join
result.

91) Display those employees whose salary is more than 3000 after giving 20% increment?

SQL> SELECT * FROM EMP WHERE SAL*120/100 > 3000;

92) Display all employees with their department names?

SQL> SELECT E.ENAME, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;

93) Display ename who are working in sales department?

SQL> SELECT ENAME FROM EMP WHERE DEPTNO = (SELECT DEPTNO FROM DEPT WHERE
DNAME=’SALES’);

94) Display employee name, dept name, salary and commission for those with sal in
between 2000 to 5000 while location is Chicago?

SQL> SELECT E.ENAME, D.DNAME, E.SAL, E.COMM FROM EMP E, DEPT D WHERE
E.DEPTNO=D.DEPTNO AND D.LOC=’CHICAGO’ AND E.SAL BETWEEN 2000 AND 5000;

95) Display those employees whose salary is greater than his manager’s salary?

SQL> SELECT E.* FROM EMP E, EMP E1 WHERE E.MGR = E1.EMPNO AND E.SAL>=E1.SAL;

OR

SELECT * FROM EMP E WHERE E.SAL >= (SELECT E1.SAL FROM EMP E1 WHERE
E1.EMPNO=E.MGR);
// Both produce the same results but the second query will be more cost effective as the
filter will be executed first thus reducing  no. of records that need to be processed.

96) Display those employees who are working in the same dept where his manager is work?

SQL> SELECT E.* FROM EMP E, EMP E1 WHERE E.MGR = E1.EMPNO AND
E.DEPTNO=E1.DEPTNO;

OR

SELECT * FROM EMP E WHERE E.DEPTNO = (SELECT E1.DEPTNO FROM EMP E1 WHERE
E1.EMPNO=E.MGR);

//Both produce the same results but the second query will be more cost effective.

97) Display those employees who are not working under any Manager?

SQL> SELECT DISTINCT(E.EMPNO), E.ENAME,E.JOB FROM EMP E,EMP E1 WHERE E.MGR IS NULL
OR (E1.EMPNO=E.MGR AND E1.JOB!=’MANAGER’);
//This ensures that those without a manager, those working under someone other than a
manager are displayed.
SQL>SELECT * FROM EMP WHERE MGR IS NULL;

//This only checks if an employee doesn’t report to anyone i.e. has no mgr entry.

98) Display the grade and employees name for the deptno 10 or 30 but grade is not 4 while
joined the company before 31-DEC-82?

SQL>  SELECT S.GRADE, E.ENAME FROM EMP E, SALGRADE S WHERE E.DEPTNO IN(’10’,’30’)
AND E.SAL >= S.LOSAL AND E.SAL<=S.HISAL MINUS (SELECT S.GRADE, E.ENAME FROM EMP
E, SALGRADE S WHERE E.DEPTNO IN(’10’,’30’) AND E.SAL >= S.LOSAL AND E.SAL<=S.HISAL
AND E.HIREDATE<’31-DEC-82′ AND S.GRADE=4);

//This question is ambiguous, to me at least. If the grade!=4 and date<’31-DEC-82’ are


separate conditions, then the below query will do.
SQL>SELECT EMPNO,ENAME,SAL,DEPTNO,HIREDATE,GRADE FROM EMP E,SALGRADE S WHERE
E.SAL>=S.LOSAL AND E.SAL<=S.HISAL AND DEPTNO IN(10,30) AND GRADE<>4 AND
HIREDATE<’31-DEC-1982′;

//But this eliminates all the people who joined after that date. Thus if the restriction was ‘if
the joining date is before that, then the grade should not be 4’, then the first query is apt as
it eliminates those people alone.

99) Update the salary of each employee by 10% increment who are not eligible for
commission?

SQL> UPDATE EMP2 SET SAL=(SAL+0.10*SAL) WHERE COMM IS NULL OR COMM=0;

//I created a copy of emp for this query so as to not affect the original table. We can also
ensure that the original table isn’t affected by using rollback if one hasn’t committed after
executing this query on original emp.

100) Delete those employees who joined the company before 31-Dec-82 while their
department Location is New York or Chicago?

SQL> DELETE FROM EMP2 E WHERE E.HIREDATE < TO_DATE(’31-DEC-82′) AND E.DEPTNO IN
(SELECT D.DEPTNO FROM DEPT2 D WHERE D.LOC IN (‘CHICAGO’,’NEW YORK’));

101) Display employee name, job, deptname, loc for all who are working as manager?

SQL> SELECT E.ENAME, E.JOB, D.DNAME, D.LOC FROM EMP E, DEPT D WHERE
D.DEPTNO=E.DEPTNO AND E.EMPNO IN (SELECT MGR FROM EMP WHERE MGR IS NOT NULL);

OR

SELECT E.ENAME, E.JOB, D.DNAME, D.LOC FROM EMP E, DEPT D WHERE


D.DEPTNO=E.DEPTNO AND E.JOB=’MANAGER’;
//When we consider the name alone. The first one is based on the mgr column.

102) Display those employees whose manager name is jones and also display their manager
name?
SQL> SELECT E.EMPNO, E.ENAME, M.ENAME AS MANAGER FROM EMP E, EMP M WHERE
E.MGR=M.EMPNO AND M.ENAME=’JONES’;

103)Display name and salary of employees whose salary is equal to hisal of the grade of
Ford?

SQL> SELECT E1.ENAME FROM EMP E1 WHERE E1.SAL = (SELECT S.HISAL FROM SALGRADE S,
EMP E WHERE E.ENAME=’FORD’ AND E.SAL>=S.LOSAL AND E.SAL<=S.HISAL)

104)Display employee name, job, dept name, his manager name and his grade. Display
department wise?

SQL> SELECT E.ENAME,E.JOB,D.DNAME,E1.ENAME AS “MGR NAME”,S.GRADE FROM EMP E,EMP


E1,SALGRADE S, DEPT D WHERE E.DEPTNO=D.DEPTNO AND E.MGR=E1.EMPNO AND E.SAL
BETWEEN S.LOSAL AND S.HISAL ORDER BY DNAME;

105) List out all the employee names, job, salary, grade and dept name for everyone in a
company except ‘CLERK’ . Sort on salary display the highest salary?

SQL> SELECT E.ENAME, E.JOB, D.DNAME , S.GRADE FROM EMP E, SALGRADE S, DEPT D 
WHERE E.JOB!=’CLERK’ AND E.DEPTNO=D.DEPTNO AND E.SAL BETWEEN S.LOSAL AND
S.HISAL ORDER BY E.SAL DESC;

106) Display employee name, job and his manager .Display also employees who are without
managers?

SQL> SELECT E.ENAME, E.JOB, E1.ENAME AS “MGR NAME” FROM EMP E, EMP E1 WHERE
E.MGR=E1.EMPNO UNION SELECT E.ENAME,E.JOB,’NO Manager’ AS “MGR NAME” FROM EMP E
WHERE E.MGR is null;

OR

SELECT E.ENAME, E.JOB, NVL2(E.MGR,E1.ENAME,’NO MANAGER’) AS “MGR NAME” FROM EMP


E1,EMP E WHERE E1.EMPNO(+)=E.MGR;

 
107)  Display top 5 earning employees of a Company?

SQL> SELECT * FROM (SELECT ENAME, EMPNO, SAL, RANK() OVER (ORDER BY SAL DESC) AS
RANK FROM EMP) WHERE RANK<=5;

OR

SELECT * FROM EMP E WHERE 5>(SELECT COUNT(*) FROM EMP E1 WHERE E1.SAL>E.SAL)
ORDER BY E.SAL DESC;

//You can change the no. 5 depending on the requirement

108) Display the names of those employees who are getting the highest salary?

SQL> SELECT E.ENAME, E.SAL FROM EMP E WHERE (N-1) = (SELECT


COUNT(DISTINCT(E2.SAL)) FROM EMP E2 WHERE E2.SAL > E.SAL);

OR

SELECT ENAME, SAL FROM EMP WHERE SAL=(SELECT MAX(SAL) FROM EMP);

// The first case can be used to find the nth highest salary. If you want the first highest
salary, replace N with 1 and so on

109) Display those employees whose salary is equal to average of maximum and minimum
salaries?

SQL> SELECT E.ENAME,E.SAL FROM EMP E WHERE SAL=(SELECT (MAX(E1.SAL) +


MIN(E1.SAL))/2 FROM EMP E1);

110) Select count of employees in each department where count >3?

SQL> SELECT DEPTNO, COUNT(DEPTNO) FROM EMP GROUP BY DEPTNO HAVING


COUNT(DEPTNO)>3;

 
111) Display dname where atleast three are working and display only deptname?

SQL> SELECT D.DNAME FROM DEPT D WHERE D.DEPTNO IN (SELECT E.DEPTNO FROM EMP E
GROUP BY E.DEPTNO HAVING COUNT(E.DEPTNO)>3);

OR

SELECT D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO GROUP BY D.DNAME


HAVING COUNT(E.DEPTNO)>3;

//The first query is cost effective. When column values depending on one table alone are the
required output [Here dname is from dept alone], it is always preferable to eliminate the no.
of joins made. Thus use co-related sub queries instead of hash join which is done in the
second query

112) Display names of those managers whose salary is more than average salary of
Company?

SQL> SELECT E.ENAME,E.SAL FROM EMP E WHERE JOB=’MANAGER’ AND E.SAL>=(SELECT


AVG(E.SAL) FROM EMP E);

OR

SELECT E.ENAME, E.SAL FROM EMP E WHERE E.EMPNO IN(SELECT E.MGR FROM EMP E) AND
E.SAL > (SELECT AVG(E.SAL) FROM EMP E);

113) Display those managers name whose salary is more than average salary of his
employees?

SQL> SELECT E.ENAME FROM EMP E WHERE E.SAL >(SELECT AVG(E1.SAL) FROM EMP E1
WHERE E1.MGR=E.EMPNO);

OR

SELECT DISTINCT EMP.ENAME FROM EMP,EMP E WHERE E.SAL <(SELECT AVG(EMP.SAL) FROM


EMP WHERE EMP.EMPNO=E.MGR GROUP BY EMP.ENAME) AND EMP.EMPNO=E.MGR;
OR
SELECT M.ENAME FROM EMP M WHERE M.JOB=’MANAGER’ AND M.SAL>=(SELECT AVG(SAL)
FROM EMP E WHERE E.MGR = M.EMPNO);

//The first query is the most cost effective followed by the third but it only considers those
whose job is managers in the third case.

114) Display employee name, sal, comm and netpay for those employees whose netpay is
greater than or equal to any other employee salary of the company?

SQL> SELECT ENAME,SAL,NET_SAL FROM (SELECT ENAME,SAL,SAL+NVL(COMM,0) AS


NET_SAL FROM EMP) WHERE NET_SAL>=SAL;

OR

SELECT ENAME, SAL, SAL+NVL(COMM,0) AS NET_SAL FROM EMP WHERE SAL+NVL(COMM,0)


>= ANY(SELECT SAL FROM EMP);

//The first one will be more cost effective

115) Display those employees whose salary is less than his manager but more than salary of
other managers?

SQL>   select * from emp e where e.sal <( select e1.sal from emp e1 where
e.mgr=e1.empno) and e.sal > any (select e1.sal from emp e1 where e1.empno in( select
e.mgr from emp e));

// I am considering the “mgr” column as the basis for deciding managers rather than the job
‘MANAGER’

116) Display all employees names with total sal of company with each employee name?

SQL> SELECT E1.ENAME,(SELECT SUM(SAL) FROM EMP) AS TOTAL_SAL_CMP FROM EMP E1;

117)  Find the last 5(least) employees of company based on salary?


SQL> SELECT * FROM (SELECT ENAME, EMPNO, SAL, RANK() OVER (ORDER BY SAL ASC) AS
RANK FROM EMP) WHERE RANK<=5;

OR

SELECT * FROM EMP E WHERE 5>(SELECT COUNT(*) FROM EMP E1 WHERE E1.SAL<E.SAL)
ORDER BY E.SAL ASC;

118)  Find out the number of employees whose salary is greater than their managers salary?

SQL> SELECT COUNT(*) FROM EMP E,EMP E1 WHERE E.MGR = E1.EMPNO AND E.SAL>E1.SAL;

119) Display the manager who are not working under president but they are working under
any other manager?

SQL> SELECT E.EMPNO, E.ENAME, M.ENAME AS MANAGER FROM EMP E, EMP M WHERE
E.MGR=M.EMPNO AND M.ENAME!=(SELECT ENAME FROM EMP WHERE JOB=’PRESIDENT’);

120) Delete those department where no employee working?

SQL> DELETE FROM DEPT1 D WHERE D.DEPTNO NOT IN (SELECT E.DEPTNO FROM EMP E);

121) Delete those records from emp table whose deptno not available in dept table?

SQL> DELETE FROM EMP1 E WHERE E.DEPTNO NOT IN (SELECT D.DEPTNO FROM DEPT D);

122) Display those enames whose salary is out of grade available in salgrade table?

SQL> SELECT * FROM EMP E WHERE E.SAL<(SELECT MIN(LOSAL) FROM SALGRADE) OR


E.SAL>(SELECT MAX(HISAL) FROM SALGRADE);
//This query is based on our analysis that for a salary to be out of grade, either  the salary
should be lesser than the minimum or greater the maximum values in losal & hisal
respectively.
//What’s the flaw in this.

Say the salgrade table is as follows

GRADE LOSAL HISAL

1 1000 2000

2 3000 4000

Now say a emp has a salary of 2500, the above query will result that a valid grade exists.

Thus it is wrong.

(SELECT * FROM EMP) MINUS (SELECT E.* FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN
S.LOSAL AND S.HISAL);

// This ensures results but won’t be suitable for great no. of data items.

SELECT ENAME FROM EMP,SALGRADE S,SALGRADE S1 WHERE EMP.SAL > S.HISAL


AND EMP.SAL<S1.LOSALD S1.GRADE = S.GRADE+1;
//This is slightly better than the above one as each row in salgrade will be compared .
//If one reaches at a better way to do this, then kindly point that out.

123) Display employee name, sal, comm and whose netpay is greater than any other
employee in the company?

SQL> SELECT E.ENAME,E.SAL,E.COMM FROM EMP E WHERE


(E.SAL+NVL(E.COMM,0))>ANY(SELECT SAL+NVL(COMM,0) FROM EMP);

// We are assuming here that the netpay should be better than any one employee atleast

SELECT E.ENAME,E.SAL,E.COMM FROM EMP E WHERE (E.SAL+NVL(E.COMM,0))>= ALL(SELECT


SAL+NVL(COMM,0) FROM EMP);
//Here the netpay is greater than all employees as the question can be deciphered this way
too

124) Display name of those employees who are going to retire by 31-Dec-99 if maximum
job period is 30 years?

SQL> SELECT * FROM EMP WHERE ADD_MONTHS(HIREDATE,12*30) <= ’31-DEC-99′;

OR

SELECT * FROM EMP WHERE MONTHS_BETWEEN(’31-DEC-1999′,HIREDATE)>=(30*12);

125) Display those employees whose salary is odd value?

SQL> SELECT * FROM EMP E WHERE MOD(E.SAL,2)!=0;

126) Display those employees whose salary contains atleast 3 digits?

SQL> SELECT * FROM EMP E WHERE LENGTH(E.SAL)>=3;

127) Display those employees who joined in the company in the month of Dec?

SQL> SELECT * FROM EMP E WHERE TO_CHAR(HIREDATE,’MM’)=12;

OR

SELECT * FROM EMP WHERE EXTRACT(MONTH FROM HIREDATE) = 12;

128) Display those employees whose name contains A?

SQL> SELECT * FROM EMP WHERE ENAME LIKE ‘%A%’;


 

129) Display those employees whose deptno is available in salary?

SQL> SELECT * FROM EMP WHERE INSTR(SAL,DEPTNO,1,1)!=0;

130) Display those employees whose salary is less than (first 2 characters from hiredate
combined with last 2 characters of sal)?

SQL> SELECT * FROM EMP WHERE SAL < (substr(hiredate,1,2)||substr(sal,-2,2));

131) Display those employees whose 10% of salary is equal to the year joining?

SQL> SELECT * FROM EMP E WHERE (0.10*SAL)=TO_CHAR(HIREDATE,’YYYY’);

OR

SELECT * FROM EMP E WHERE (E.SAL*0.10) = EXTRACT(YEAR FROM E.HIREDATE);

132) Display those employees who are working in sales or research?

SQL> SELECT E.ENAME FROM EMP E WHERE E.DEPTNO IN (SELECT D.DEPTNO FROM DEPT D
WHERE D.DNAME IN (‘SALES’,’RESEARCH’));

133) Display the grade of jones?

SQL> SELECT S.GRADE,E.ENAME FROM EMP E,SALGRADE S WHERE E.ENAME = ‘JONES’ AND
E.SAL BETWEEN S.LOSAL AND S.HISAL;

OR

SELECT S.GRADE FROM SALGRADE S WHERE S.LOSAL <= (SELECT E.SAL FROM EMP E WHERE
E.ENAME=’JONES’) AND S.HISAL >= (SELECT E.SAL FROM EMP E WHERE E.ENAME=’JONES’);
 

134) Display those employees who joined the company before 15th of the month?

SQL>SELECT * FROM EMP WHERE TO_CHAR(HIREDATE,’DD’)<15;

OR

SELECT * FROM EMP WHERE EXTRACT(DAY FROM HIREDATE)=15 AND EXTRACT(DAY FROM
HIREDATE)<=20;

135) Display those employees who has joined between 15th 20th of the month?

SQL> SELECT * FROM EMP WHERE TO_CHAR(HIREDATE,’DD’) BETWEEN 15 AND 20 ;

OR

SELECT * FROM EMP WHERE EXTRACT(DAY FROM HIREDATE)>=15 AND EXTRACT(DAY FROM
HIREDATE)<=20;

136) Delete those records where no of employees in particular department is less than 3?

SQL>DELETE FROM EMP1 WHERE DEPTNO IN (SELECT DEPTNO FROM EMP GROUP BY DEPTNO
HAVING COUNT(DEPTNO)<3);

137) Delete those employee who joined the company 10 years back from today?

SQL>DELETE FROM EMP1 WHERE HIREDATE = ADD_MONTHS(SYSDATE,-12*10);

OR

DELETE FROM EMP1 WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE)<(12*10);

138) Display the dept. name where no employee is working?


SQL> SELECT D.DNAME FROM DEPT D WHERE D.DEPTNO NOT IN (SELECT E.DEPTNO FROM
EMP E);

139) Display those employees who are working as manager?

SQL> SELECT E.ENAME FROM EMP E WHERE E.JOB=’MANAGER’;

OR

SELECT E.ENAME FROM EMP E WHERE E.EMPNO IN (SELECT E.MGR FROM EMP E);

140) Display the dept name the number of characters of which is equal to no of employee in
any other department?

SQL> SELECT DISTINCT(D.DNAME) FROM DEPT D,EMP E WHERE LENGTH(D.DNAME) IN


(SELECT COUNT(E.EMPNO)  FROM EMP E GROUP BY E.DEPTNO) AND E.DEPTNO!=D.DEPTNO;

OR

SELECT * FROM DEPT WHERE LENGTH(DNAME) IN (SELECT COUNT(DEPTNO) FROM EMP


GROUP BY DEPTNO);

//The first one ensures that same dept isn’t checked. The second one checks for the length
match alone.

141) Display the name of the dept of those employees who joined the company on the same
date?

SQL> SELECT DNAME FROM DEPT WHERE DEPTNO IN (SELECT E.DEPTNO FROM EMP E, EMP
E1 WHERE E.EMPNO!=E1.EMPNO AND E.HIREDATE=E1.HIREDATE AND E.DEPTNO =
E1.DEPTNO );

//This ensures that we are comparing those who are from the same dept.

OR
SELECT DNAME FROM DEPT WHERE DEPTNO IN (SELECT E.DEPTNO FROM EMP E, EMP E1
WHERE E.EMPNO!=E1.EMPNO AND E.HIREDATE=E1.HIREDATE);

//This just compares the hiredates and returns the dept names of the employees [But the
employees with the same date might be from different depts..]

142) Display those employees whose grade is equal to any number of sal but not equal to
first number of sal?

SQL> SELECT E.ENAME, E.SAL , S.GRADE FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN
S.LOSAL AND S.HISAL  AND SUBSTR(E.SAL,1,1)!=GRADE AND INSTR(E.SAL,S.GRADE,1,1)!=0;

143) Count the no of employees working as manager (using set operation)?

SQL> SELECT COUNT(JOB) FROM EMP GROUP BY JOB HAVING JOB=’MANAGER’;

//Only the job manager is checked

OR

SELECT COUNT(DISTINCT(MGR)) AS MGR FROM EMP;

//The count of those who have employees reporting to them are displayed.
// Set operations and also a set function that are available. Set operations like UNION,
INTERSECT, MINUS etc. can be used. SET function is more complex though.

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions144.htm#i1269374
http://docs.oracle.com/cd/B19306_01/server.102/b14200/operators006.htm#i1035617
Refer those two documents for the set function. No point in doing using that for this simple
task. The following query can be used if we want to involve set operations

SELECT COUNT(EMPNO) FROM EMP WHERE EMPNO NOT IN (SELECT A.EMPNO FROM EMP A
MINUS SELECT B.MGR FROM EMP B)

or

SELECT COUNT(EMPNO) FROM EMP WHERE EMPNO IN (SELECT A.EMPNO FROM EMP A
INTERSECT SELECT B.MGR FROM EMP B)
//Pointless to do all of that though when a simple query can get us the results.

144) Display the name of employees who joined the company on the same date?

SQL> SELECT E.ENAME FROM EMP E,EMP E1 WHERE E.EMPNO!=E1.EMPNO AND


E.HIREDATE=E1.HIREDATE;

OR

SELECT E.ENAME FROM EMP E WHERE HIREDATE IN(SELECT HIREDATE FROM EMP WHERE
EMPNO<>E.EMPNO);

145) Display the manager who is having maximum number of employees working under
him?

SQL>SELECT E1.ENAME FROM (SELECT MGR,COUNT(MGR) FROM EMP GROUP BY MGR ORDER
BY
COUNT(MGR) DESC) X,EMP E1 WHERE X.MGR=E1.EMPNO AND ROWNUM = 1;

OR

SELECT MGR FROM EMP GROUP BY MGR HAVING COUNT(*)=(SELECT MAX(COUNT(MGR))


FROM EMP GROUP BY MGR);

146) List out the employee name and salary increased by 15% and express as whole number
of Dollars?

SQL> SELECT ENAME,’$’||ROUND(1.15*SAL) AS “$_SAL” FROM EMP;

147) Produce the output of the emp table “EMPLOYEE_AND_JOB” for ename and job ?

SQL> SELECT ENAME||’_AND_’||JOB AS “EMPLOYEE_JOB” FROM EMP;

 
148) List of employees with hiredate in the format of ‘June 4 1988′?

SQL> SELECT ENAME, TO_CHAR(HIREDATE,’MONTH DD YYYY’) FROM EMP;

149) Print list of employees displaying ‘Just salary’ if sal more than 1500, if exactly 1500
display ‘on target’, if less than 1500 display below 1500?

SQL> SELECT ENAME, (CASE WHEN SAL>1500 THEN ‘BELOW_TARGET’ WHEN SAL=1500
THEN ‘ON_TARGET’ WHEN SAL<1500 THEN ‘LESS THAN TARGET’ END ) AS SALCOND FROM
EMP

150) Given a string of the format ‘nn/nn’ . Verify that the first and last 2 characters are
numbers .And that the middle character is ‘/’ Print the expressions ‘Yes’ IF valid ‘NO’ of not
valid . Use the following values to test your solution’12/54′,01/1a,’99/98′?

SQL> select (CASE WHEN


DECODE(TRANSLATE(SUBSTR(’11/11′,0,TRUNC(LENGTH(’11/11′)/2)),’#1234567980.’,’.’),NUL
L,’YES’,’NO’) = ‘YES’ and
DECODE(TRANSLATE(substr(’11/11′,round(length(’11/11′)/2)+1,TRUNC(LENGTH(’11/11′)/2)
),’#1234567980.’,’.’),NULL,’YES’,’NO’) = ‘YES’ AND
substr(’11/11′,round(length(’11/11′)/2),1)=’/’ THEN ‘YES’ ELSE ‘NO’ END) from dual;

You might also like