SUB-QUERY
A QUERY WRITTEN INSIDE ANOTHER QUERY IS KNOWN AS SUB QUERY .
Working Principle :
Let us consider two queries Outer Query and Inner Query .
➢ Inner Query executes first and produces an Output .
➢ The Output of Inner Query is given / fed as an Input to Outer Query .
➢ The Outer Query generates the Result.
➢ Therefore we can state that 'the Outer Query is dependent on
Inner Query' and this is the Execution Principle of Sub Query .
Why / When Do we use SUB QUERY :
Case 1 : Whenever we have Unknowns present in the question, we use sub query
to find the Unknown .
Example :
EMP
EID ENAME SAL DEPTNO
1 ALLEN 1000 20
2 BLAKE 2000 10
3 CLARK 3000 30
4 MILLER 1500 10
5 SMITH 2500 10
1. WAQTD names of the employees earning more than 2500 .
SELECT ENAME
FROM EMP
New Section 1 Page 1
WHERE SAL > 2500 ;
2. WAQTD names of the employees earning less than MILLER .
SELECT ENAME
FROM EMP
WHERE SAL < ( SELECT SAL
FROM EMP
WHERE ENAME = 'MILLER' );
3. WAQTD name and deptno of the employees working in the same Dept as SMITH .
SELECT ENAME , DEPTNO
FROM EMP
WHERE DEPTNO = ( SELECT DEPTNO
FROM EMP
WHERE ENAME ='SMITH' ) ;
4. WAQTD name and hiredate of the employees if the employee was hired after JONES .
SELECT ENAME , HIREDATEFROM EMP
WHERE HIREDATE > ( SELECT HIREDATE
FROM EMP
WHERE ENAME ='JONES' ) ;
5. WAQTD all the details of the employee working in the sameDesignation as KING .
SELECT * FROM EMP
WHERE JOB = ( SELECT JOB
FROM EMP
WHERE ENAME ='KING' );
6. WAQTD name , sal , deptno of the employees if the employees earning more than 2000 and work in
the same dept as JAMES .
SELECT ENAME , SAL , DEPTNOFROM EMP
WHERE SAL > 2000 AND DEPTNO = ( SELECT DEPTNO
FROM EMP
WHERE ENAME ='JAMES' ) ;
7. WAQTD all the details of the employees working in the Same designation as MILLER and
earning more than 1500.
SELECT * FROM EMP
WHERE SAL > 1500 AND JOB = (SELECT JOB
FROM EMP
WHERE ENAME ='MILLER' ) ;
New Section 1 Page 2
8. WAQTD details of the employees earning more than SMITH but less than KING .
SELECT *
FROM EMP
WHERE SAL > ( SELECT SAL
FROM EMP
WHERE ENAME ='SMITH' ) AND SAL < ( SELECT SAL
FROM EMP
WHERE ENAME ='KING' ) ;
9. WAQTD name , sal and deptno of the employees if the employee is
earning commission in dept 20 and earning salary more than Scott
.
SELECT ENAME , SAL , DEPTNO
FROM EMP
WHERE COMM IS NOT NULL AND DEPTNO = 20 AND
SAL > ( SELECT SAL
FROM EMP
WHERE ENAME ='SCOTT' ) ;
10. WAQTD name and hiredate of the employees who's name ends with'S' and hired after
James .
SELECT ENAME , HIREDATE
FROM EMP
WHERE ENAME LIKE '%S' AND
HIREDATE > ( SELECT HIREDATE
FROM EMP
WHERE ENAME ='JAMES' ) ;
11. WAQTD names of the employees working in the same dept as JAMES and earning salary more
than ADAMS and working in thesame job role as MILLER and hired after MARTIN .
SELECT ENAME
FROM EMP
WHERE DEPTNO = (SELECT DEPTNO
FROM EMP
WHERE ENAME='JAMES') ANDSAL > (SELECT SAL
FROM EMP
WHERE ENAME= ‘ADAMS') ANDJOB = (SELECT JOB
FROM EMP
WHERE ENAME='MILLER') AND
New Section 1 Page 3
HIREDATE> (SELECT HIREDATE
FROM EMP
WHERE ENAME='MARTIN');
12. WAQTD all the details of the employees working as salesman in thedept
20 and earning commission more than Smith and hired after KING .
SELECT * FROM EMP
WHERE JOB ='SALESMAN' AND DEPTNO = 20 AND COMM > (SELECT
COMM
FROM EMP
WHERE ENAME ='SMITH') AND HIREDATE > (SELECT HIREDATE
FROM EMP
WHERE ENAME ='KING');
13. WAQTD number of employees earning more than SMITH and less
than MARTIN .
SELECT COUNT(*)FROM EMP
WHERE SAL > ( SELECT SAL
FROM EMP
WHERE ENAME ='SMITH') AND SAL < (SELECT SAL
FROM EMP
WHERE ENAME ='MARTIN')
14. WAQTD Ename and SAL for all the employees earning more than
JONES
SELECT ENAME , SAL
FROM EMP
WHERE SAL > (SELECT SAL
FROM EMP
WHERE ENAME =JONES') ;
15. WAQTD all the details of the employees working as a manager .
SELECT * FROM EMP
WHERE JOB
='MANAGER';
NOTE :
➢ In the Inner Query / Sub Query we cannot select more than
ONE column .
➢ The corresponding columns need not be same , but the
datatypes of those has to be same .
New Section 1 Page 4
SUBQUERY CASE 2
CASE-2 : Whenever the data to be selected and the condition to be executed are
present in different tables we use Sub Query .
Example :
Emp
EID ENAME SAL DEPTNO
1 ALLEN 1000 20 DEPT
2 BLAKE 2000 10 DEPTNO DNAME LOC
3 CLARK 3000 30 10 D1 L1
4 MILLER 1500 10 20 D2 L2
5 ADAMS 2500 20 30 D3 L3
1. WAQTD deptno of the employee whose name is Miller .
SELECT DEPTNO
FROM EMP
WHERE ENAME ='MILLER' ;
2. WAQTD dname of the employee whose name is Miller .
SELECT DNAME
FROM DEPT
WHERE DEPTNO = ( SELECT DEPTNO
FROM EMP
WHERE ENAME ='MILLER' ) ;
3. WAQTD Location of ADAMS
SELECT LOC
FROM DEPT
WHERE DEPTNO = ( SELECT DEPTNO
FROM EMP
WHERE ENAME ='ADAMS' ) ;
4. WAQTD names of the employees working in Location L2.
SELECT ENAME
FROM EMP
WHERE DEPTNO = ( SELECT DEPTNO
FROM DEPT
WHERE LOC ='L2' ) ;
5. WAQTD number of employees working in dept D3 .
SELECT COUNT(*)
FROM EMP
WHERE DEPTNO = ( SELECT DEPTNO
New Section 1 Page 1
FROM DEPT
WHERE DNAME ='D3' ) ;
6. WAQTD ename , sal of all the employee earning more than Scott and working in dept 20 .
SELECT ENAME , SAL
FROM EMP
WHERE DEPTNO = 20 AND SAL > ( SELECT SAL FROM EMP
WHERE ENAME ='SCOTT' ) ;
7. WAQTD all the details of the employee working as a Manager In the dept Accounting .
SELECT *
FROM EMP
WHERE JOB ='MANAGER' AND DEPTNO = ( SELECT DEPTNO FROM DEPT
WHERE DNAME ='ACCOUNTING' ) ;
8. WAQTD all the details of the employee working in the samedesignation as Miller and
works in location New York .
SELECT *
FROM EMP
WHERE JOB = ( SELECT JOB FROM EMP WHERE ENAME ='MILLER' )
AND DEPTNO = ( SELECT DEPTNO FROM DEPT WHERE LOC ='NEW
YORK' ) ;
9. WAQTD number of employees working as a clerk in the samedeptno as SMITH and earning
more than KING hired after MARTIN in the location BOSTON .
SELECT COUNT(*)
FROM EMP
WHERE JOB ='CLERK' AND DEPTNO = ( SELECT DEPTNO FROM EMP
WHERE ENAME ='SMITH') AND
SAL > ( SELECT SAL FROM EMP WHERE ENAME ='KING' ) AND
HIREDATE > ( SELECT HIREDATE
FROM EMP WHERE ENAME ='MARTIN' )
AND DEPTNO = ( SELECT DEPTNO FROM DEPT WHERE LOC
='BOSTON' ) ;
10. WAQTD maximum salary given to a person working in DALLAS .
SELECT MAX(SAL)
FROM EMP
WHERE DEPTNO = ( SELECT DEPTNO
FROM DEPT
WHERE LOC ='DALLAS' ) ;
New Section 1 Page 2
MAX & MIN
EID ENAME SAL DEPTNO
1 ALLEN 1000 20
2 BLAKE 2000 10
3 CLARK 3000 30
4 MILLER 1500 10
5 ADAMS 2500 20
1. WAQTD maximum salary of an employee .
SELECT MAX( SAL )
FROM EMP ;
2. WAQTD name of the employee getting maximum salary .
SELECT ENAME , MAX( SAL )
FROM EMP ;
SELECT ENAME
FROM EMP
WHERE SAL = MAX( SAL ) ;
SELECT ENAME
FROM EMP
WHERE SAL = ( SELECT MAX( SAL )
FROM EMP ) ;
3. WAQTD name and salary earned by the employee getting
Minimum salary .
SELECT ENAME , SAL
FROM EMP
WHERE SAL = ( SELECT MIN( SAL )
FROM EMP ) ;
New Section 1 Page 11
TYPES OF SUB - QUERY
1. SINGLE ROW SUB QUERY
2. MULTI ROW SUB QUERY
Examples :
Emp
EID ENAME SAL DEPTNO
1 ALLEN 1000 20 DEPT
2 BLAKE 2000 10 DEPTNO DNAME LOC
3 CLARK 3000 30 10 D1 L1
4 MILLER 1500 10 20 D2 L2
5 SMITH 2500 10 30 D3 L3
1. WAQTD dname of ALLEN(single row) .
SELECT DNAME 20
FROM DEPT
WHERE DEPTNO = ( SELECT DEPTNO
FROM EMP
WHERE ENAME = 'ALLEN' ) ;
2. WAQTD dnames of Allen and Smith(multi row).
20
10
SELECT DNAME
FROM DEPT
WHERE DEPTNO = ( SELECT DEPTNO
FROM EMP
DEPTNO WHERE ENAME IN
20 ( 'ALLEN' ,'SMITH' ) ) ;
10
Here , since the sub query returns
30 2 records we cannot use '=' Op .
10 We've to use IN Op .
10
New Section 1 Page 7
1. SINGLE ROW SUB QUERY :
➢ If the sub query returns exactly 1 record / value we call it
asSingle Row Sub Query .
➢ If it returns only 1 value then we can use the normal
operators Or the Special Operators to compare the values .
2. MULTI ROW SUB QUERY :
➢ If the sub query returns more than1 record / value we call
itas Multi Row Sub Query .
➢ If it returns more than 1 value then we cannot use the
normal operators We have to use only Special Operators to
compare the values .
Note : It is difficult to identify whether a query Belongs Single or Multi
row So , it is always recommended to use Special Operators to
Compare The values .
1. WAQTD ename and salary of the employees earning more than
Employees of dept 10 .
EID ENAME SAL DEPTNO
1 ALLEN 1000 20
2 BLAKE 2000 10
3 CLARK 3000 30
4 MILLER 1500 10
5 SMITH 2500 10
2000
1500
SELECT ENAME , SAL
FROM EMP 2500
WHERE SAL > ( SELECT SAL
FROM EMP
WHERE DEPTNO = 10 ) ;
New Section 1 Page 8
Here we cannot use > symbol to
compareMultiple values .
We cant use IN or. NOT IN as well
because It is used for = and != symbols
.
Therefore we have to use Sub Query
Sub Query Operators
Operators
For Comparing Relational Operators
1. ALL : such as( > , < , >= , <= ) .
"It is special Op used along with a relational Op ( > , < , > = , <= )
to compare the values present at the RHS ".
➢ ALL Op returns true if all the values at the RHS have satisfied the
condition .
Example :
2000
CLARK ,3000 1500
2500
SELECT ENAME , SAL
FROM EMP
WHERE SAL > ALL ( SELECT SAL
FROM EMP
WHERE DEPTNO = 10 ) ;
New Section 1 Page 9
SAL
1000
2000 1000 > ALL ( 2000 , 1500 , 2500 )
3000
1500 1000 > 2000 False
2500 1000 > 1500 False
1000 > 2500 False
2000 > ALL ( 2000 , 1500 , 2500 )
2000 > 2000 False
2000 > 1500 True
2000 > 2500 False
3000 > ALL ( 2000 , 1500 , 2500 )
3000 > 2000 True
3000 > 1500 True
3000 > 2500 True
1500 > ALL ( 2000 , 1500 , 2500 )
1500 > 2000 False
1500 > 1500 False
1500 > 2500 False
2500 > ALL ( 2000 , 1500 , 2500 )
2500 > 2000 True
2500 > 1500 True
2500 > 2500 False
2. ANY :
"It is special Op used along with a relational Op ( > , < , > = , <= )
to compare the values present at the RHS ".
• ANY Op returns true if one of the values at the RHS have satisfied
the condition .
New Section 1 Page
Example :
2000
1500
SELECT ENAME , SAL 2500
FROM EMP
WHERE SAL > ANY ( SELECT SAL
FROM EMP
SAL WHERE DEPTNO = 10 ) ;
1000
2000 1000 > ANY ( 2000 , 1500 , 2500 )
3000
1500 1000 > 2000 False
2500 1000 > 1500 False
1000 > 2500 False
2000 > ANY ( 2000 , 1500 , 2500 )
2000 > 2000 False
2000 > 1500 True
2000 > 2500 False
3000 > ANY ( 2000 , 1500 , 2500 )
3000 > 2000 True
3000 > 1500 True
3000 > 2500 True
1500 > ANY ( 2000 , 1500 , 2500 )
1500 > 2000 False
1500 > 1500 False
1500 > 2500 False
2500 > ANY ( 2000 , 1500 , 2500 )
2500 > 2000 True
2500 > 1500 True
2500 > 2500 False
1. WAQTD name of the employee if the employee earns less
thanThe employees working as salesman .
SELECT ENAME
FROM EMP
WHERE SAL < ALL ( SELECT SAL
New Section 1 Page
FROM EMP
WHERE JOB='SALESMAN' ) ;
2. WAQTD name of the employee if the employee earns less
thanAt least a salesman .
SELECT ENAME
FROM EMP
WHERE SAL < ANY ( SELECT SAL
FROM EMP
WHERE JOB ='SALESMAN' ) ;
3. WAQTD names of the employees earning more than ADAMS .
SELECT ENAME
FROM EMP
WHERE SAL > ALL ( SELECT SAL
FROM EMP
WHERE ENAME ='ADAMS' ) ;
New Section 1 Page
NESTED SUB QUERY
A sub query written inside a sub query is known as Nested Subquery.
➢ WE CAN NEST ABOUT 255 SUB QUERIES
SAL
1000
2000
4000
3000
5000
3. WAQTD maximum salary given to an employee .
SELECT MAX( SAL )FROM EMP ;
4. WAQTD second maximum salary given to an employee .
SELECT MAX( SAL )
FROM EMP
WHERE SAL < ( SELECT MAX( SAL)
FROM EMP ) ;
SAL
1000
2000
4000
3000
5000
5. WAQTD 3rd maximum salary .
SELECT MAX( SAL ) 3000FROM EMP
WHERE SAL < ( SELECT MAX( SAL ) 4000FROM EMP
WHERE SAL < ( SELECT MAX( SAL ) 5000FROM EMP ) )
6. WAQTD 4th maximum salary .
SELECT MAX( SAL ) 2000FROM EMP
WHERE SAL < ( SELECT MAX( SAL ) 3000FROM EMP
WHERE SAL < ( SELECT MAX( SAL ) 4000FROM EMP
WHERE SAL < ( SELECT MAX( SAL ) 5000FROM EMP ) ) )
7. WAQTD 3 minimum salary .
SELECT MIN(SAL )FROM EMP
WHERE SAL > ( SELECT MIN(SAL )FROM EMP
WHERE SAL > ( SELECT MIN ( SAL )
FROM EMP ) ) ;
New Section 1 Page 1
8. WAQTD Dept name of the employee getting 2nd Minimumsalary .
SELECT DNAMEFROM DEPT
WHERE DEPTNO = ( SELECT DEPTNOFROM EMP
WHERE SAL = (SELECT MIN( SAL )FROM EMP
WHERE SAL > ( SELECT MIN( SAL )
FROM EMP ) ) );
REMEMBER :
MAXIMUM MAX( ) <
MINIMUM MIN( ) >
New Section 1 Page 2
EMPLOYEE AND MANAGER RELATION
CASE 1 : TO IDENTIFY MANAGER
➢ WAQTD name of Allen's manager .
JAMES
SELECT ENAME
FROM EMP 3
WHERE EID = ( SELECT MGR
FROM EMP
WHERE ENAME ='ALLEN' )
EID ENAME MGR EID
1 ALLEN 3 1
2 SMITH 1
2
3 JAMES 2
3
4 KING 3
4
➢ WAQTD name of SMITH's manager .
SELECT ENAME
FROM EMP
WHERE EID = ( SELECT MGR
FROM EMP
WHERE ENAME ='SMITH' ) ;
➢ WAQTD name of SMITH's manager's manager .
EID ENAME MGR
1 ALLEN 3
2 SMITH 1
3 JAMES 2
4 KING 3
SELECT ENAME
FROM EMP
WHERE EID = ( SELECT MGR
FROM EMP
WHERE EID = ( SELECT MGR
FROM EMP
New Section 1 Page 3
WHERE ENAME ='SMITH' ) ) ;
➢ WAQTD dname of King's Manager .
SELECT DNAME
FROM DEPT
WHERE DEPTNO = ( SELECT DEPTNO
FROM EMP
WHERE EID = ( SELECT MGR
FROM EMP
WHERE ENAME ='KING' ) ) ;
➢ WAQTD Location of Adams's manager's manager .
SELECT LOC
FROM DEPT
WHERE DEPTNO = ( SELECT DEPTNO
FROM EMP
WHERE EID = ( SELECT MGR
FROM EMP
WHERE EID = ( SELECT MGR
FROM EMP
WHERE ENAME ='ADAMS' ) ) ) ;
CASE -2: TO IDENTIFY EMPLOYEES REPORTING TO A MANAGER
➢ WAQTD Names of the employees reporting to KING.
SELECT ENAME
FROM EMP
WHERE MGR = ( SELECT EID
FROM EMP
WHERE ENAME ='KING' ) ;
➢ WAQTD Name and salary given to the employees reporting
To James .
SELECT ENAME , SAL
FROM EMP
WHERE MGR = ( SELECT EID
FROM EMP
WHERE ENAME ='JAMES' ) ;
To find Manager Select MGR in Sub Q
To find Employees Select EID in Sub Q
➢ WAQTD dname of the employee reporting to President .
SELECT DNAME
FROM DEPT
WHERE DEPTNO = ( SELECT DEPTNO
New Section 1 Page 4
FROM EMP
WHERE MGR = ( SELECT EID
FROM EMP
WHERE JOB ='PRESIDENT' ) ) ;
➢ WAQTD Department details of the employees who are
reportingto MILLER .
SELECT *
FROM DEPT
WHERE DEPTNO = ( SELECT DEPTNO
FROM EMP
WHERE MGR = ( SELECT EID
FROM EMP
WHERE ENAME ='MILLER' ));
New Section 1 Page 1