Hi,
I will explain SQL Subquery and Nested Queries in Oracle SQL in this post of Oracle SQL Tutorial series.
Read the previous post of this tutorial series before this.
Intersect and Minus in Oracle SQL | Oracle SQL Tutorials -25
Sub-Query
Subquery is used frequently in SQL Statements that is a SQL Query within a query. Subqueries are nested queries.
Subqueries are frequently used by developers and it is very important to create complex SQL Statements for Reporting.
Subqueries return a list of records and main query use them. Subqueries must be enclosed with the parenthesis
Let’s make an example about Subquery usage as follows.
Firstly find the salary of Abel as follows.
SQL> SELECT salary
2 FROM hr.employees
3 WHERE last_name = ‘Abel’;
SALARY
———-
12000
SQL>
Now we can use this query as subquery as follows.
List the employees whose salary are greater than Abel as follows.
SQL> SELECT first_name,last_name, salary 2 FROM hr.employees 3 WHERE salary > 4 (SELECT salary 5 FROM hr.employees 6 WHERE last_name = 'Abel'); FIRST_NAME LAST_NAME SALARY -------------------- ------------------------- ---------- Neena Kochhar 23000 Lex De Haan 23000 Nancy Greenberg 13008 John Russell 15000 Karen Partners 14500 Alberto Errazuriz 13000 Lisa Ozer 12500 Michael Hartstein 14000 Shelley Higgins 13008 9 rows selected. SQL>
Abel’s salary was 12.000, and all employees whose salary is greater than 12.000 are listed.
You can use multiple sub query in a single SQL Statement as follows.
List the employees whose job id equals to the Austin and salary is greater than Austin as follows.
SQL> SELECT first_name,last_name, job_id, salary 2 FROM hr.employees WHERE job_id = 3 (SELECT job_id FROM hr.employees 4 WHERE last_name = 'Austin') 5 AND salary > 6 (SELECT salary FROM hr.employees 7 WHERE last_name = 'Austin'); FIRST_NAME LAST_NAME JOB_ID SALARY -------------------- ------------------------- ---------- ---------- Alexander Hunold IT_PROG 10000 Bruce Ernst IT_PROG 7000 SQL>
You can use the subqueries with the Aggregate functions as follows.
List the details of employee who has the minimum salary.
SQL> SELECT first_name,last_name, job_id, salary 2 FROM hr.employees 3 WHERE salary = 4 (SELECT MIN(salary) 5 FROM hr.employees); FIRST_NAME LAST_NAME JOB_ID SALARY -------------------- ------------------------- ---------- ---------- TJ Olson ST_CLERK 3100 SQL>
You can use the subqueries with the Having as follows.
List the employees whose salary is greater than the employee who has the minimum salary in the department of 50 as follows.
SQL> SELECT d.department_name,e.department_id, MIN(salary) 2 FROM hr.employees e,hr.departments d where e.department_id=d.department_id 3 GROUP BY e.department_id,d.department_name 4 HAVING MIN(salary) > 5 (SELECT MIN(salary) FROM hr.employees 6 WHERE department_id = 50); DEPARTMENT_NAME DEPARTMENT_ID MIN(SALARY) ------------------------------ ------------- ----------- Finance 100 7900 Public Relations 70 11000 Purchasing 30 3500 Executive 90 23000 Administration 10 5400 Accounting 110 9300 Human Resources 40 7500 Marketing 20 7000 IT 60 5200 Sales 80 7100 10 rows selected. SQL>
You can use the subqueries with In, Any and All operator as follows.
For example; List the emloyees and their salaries whose salary is equal to minimum salary of each department as follows.
SQL>
SQL> SELECT employee_id, first_name,last_name,salary
2 FROM hr.employees
3 WHERE salary in
4 (SELECT MIN(salary)
5 FROM hr.employees
6 GROUP BY department_id);
EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY
----------- -------------------- ------------------------- ----------
101 Neena Kochhar 23000
102 Lex De Haan 23000
104 Bruce Ernst 7000
107 Diana Lorentz 5200
113 Luis Popp 7900
119 Karen Colmenares 3500
123 Shanta Vollman 7500
131 James Marlow 3500
132 TJ Olson 3100
140 Joshua Patel 3500
144 Peter Vargas 3500
EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY
----------- -------------------- ------------------------- ----------
150 Peter Tucker 11000
155 Oliver Tuvault 8000
156 Janette King 11000
161 Sarath Sewall 8000
169 Harrison Bloom 11000
173 Sundita Kumar 7100
178 Kimberely Grant 8000
182 Martha Sullivan 3500
184 Nandita Sarchand 5200
191 Randall Perkins 3500
200 Jennifer Whalen 5400
EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY
----------- -------------------- ------------------------- ----------
202 Pat Fay 7000
203 Susan Mavris 7500
204 Hermann Baer 11000
206 William Gietz 9300
26 rows selected.
SQL>
List the employees whose salary is greater than the minimum salary of employee in IT_PROG department.
SQL> SELECT employee_id, last_name, job_id, salary
2 FROM hr.employees
3 WHERE salary > ANY
4 (SELECT salary
5 FROM hr.employees
6 WHERE job_id = 'IT_PROG')
7 AND job_id <> 'IT_PROG';
EMPLOYEE_ID LAST_NAME JOB_ID SALARY
----------- ------------------------- ---------- ----------
101 Kochhar AD_VP 23000
102 De Haan AD_VP 23000
108 Greenberg FI_MGR 13008
109 Faviet FI_ACCOUNT 10000
110 Chen FI_ACCOUNT 9200
111 Sciarra FI_ACCOUNT 8700
112 Urman FI_ACCOUNT 8800
113 Popp FI_ACCOUNT 7900
114 Raphaely PU_MAN 12000
120 Weiss ST_MAN 9000
121 Fripp ST_MAN 9200
EMPLOYEE_ID LAST_NAME JOB_ID SALARY
----------- ------------------------- ---------- ----------
122 Kaufling ST_MAN 8900
123 Vollman ST_MAN 7500
124 Mourgos ST_MAN 6800
145 Russell SA_MAN 15000
146 Partners SA_MAN 14500
147 Errazuriz SA_MAN 13000
148 Cambrault SA_MAN 12000
149 Zlotkey SA_MAN 11500
150 Tucker SA_REP 11000
151 Bernstein SA_REP 10500
152 Hall SA_REP 10000
EMPLOYEE_ID LAST_NAME JOB_ID SALARY
----------- ------------------------- ---------- ----------
153 Olsen SA_REP 9000
154 Cambrault SA_REP 8500
155 Tuvault SA_REP 8000
156 King SA_REP 11000
157 Sully SA_REP 10500
158 McEwen SA_REP 10000
159 Smith SA_REP 9000
160 Doran SA_REP 8500
161 Sewall SA_REP 8000
162 Vishney SA_REP 11500
163 Greene SA_REP 10500
EMPLOYEE_ID LAST_NAME JOB_ID SALARY
----------- ------------------------- ---------- ----------
164 Marvins SA_REP 8200
165 Lee SA_REP 7800
166 Ande SA_REP 7400
167 Banda SA_REP 7200
168 Ozer SA_REP 12500
169 Bloom SA_REP 11000
170 Fox SA_REP 10600
171 Smith SA_REP 8400
172 Bates SA_REP 8300
173 Kumar SA_REP 7100
174 Abel SA_REP 12000
EMPLOYEE_ID LAST_NAME JOB_ID SALARY
----------- ------------------------- ---------- ----------
175 Hutton SA_REP 9800
176 Taylor SA_REP 9600
177 Livingston SA_REP 9400
178 Grant SA_REP 8000
179 Johnson SA_REP 7200
200 Whalen AD_ASST 5400
201 Hartstein MK_MAN 14000
202 Fay MK_REP 7000
203 Mavris HR_REP 7500
204 Baer PR_REP 11000
205 Higgins AC_MGR 13008
EMPLOYEE_ID LAST_NAME JOB_ID SALARY
----------- ------------------------- ---------- ----------
206 Gietz AC_ACCOUNT 9300
56 rows selected.
SQL>
List the employees whose salary is lower than the employees who is salary is lower than employee in IT_PROG department as follows.
SQL> SELECT employee_id, first_name, last_name, job_id, salary
2 FROM hr.employees
3 WHERE salary < ALL
4 (SELECT salary FROM hr.employees
5 WHERE job_id = 'IT_PROG')
6 AND job_id <> 'IT_PROG';
EMPLOYEE_ID FIRST_NAME LAST_NAME JOB_ID SALARY
----------- -------------------- ------------------------- ---------- ----------
185 Alexis Bull SH_CLERK 5100
192 Sarah Bell SH_CLERK 5000
193 Britney Everett SH_CLERK 4900
188 Kelly Chung SH_CLERK 4800
137 Renske Ladwig ST_CLERK 4600
189 Jennifer Dilly SH_CLERK 4600
141 Trenna Rajs ST_CLERK 4500
186 Julia Dellinger SH_CLERK 4400
133 Jason Mallin ST_CLERK 4300
129 Laura Bissot ST_CLERK 4300
194 Samuel McCain SH_CLERK 4200
EMPLOYEE_ID FIRST_NAME LAST_NAME JOB_ID SALARY
----------- -------------------- ------------------------- ---------- ----------
138 Stephen Stiles ST_CLERK 4200
125 Julia Nayer ST_CLERK 4200
180 Winston Taylor SH_CLERK 4200
142 Curtis Davies ST_CLERK 4100
115 Alexander Khoo PU_CLERK 4100
196 Alana Walsh SH_CLERK 4100
181 Jean Fleaur SH_CLERK 4100
187 Anthony Cabrio SH_CLERK 4000
197 Kevin Feeney SH_CLERK 4000
134 Michael Rogers ST_CLERK 3900
116 Shelli Baida PU_CLERK 3900
EMPLOYEE_ID FIRST_NAME LAST_NAME JOB_ID SALARY
----------- -------------------- ------------------------- ---------- ----------
190 Timothy Gates SH_CLERK 3900
130 Mozhe Atkinson ST_CLERK 3800
117 Sigal Tobias PU_CLERK 3800
195 Vance Jones SH_CLERK 3800
183 Girard Geoni SH_CLERK 3800
126 Irene Mikkilineni ST_CLERK 3700
139 John Seo ST_CLERK 3700
199 Douglas Grant SH_CLERK 3600
118 Guy Himuro PU_CLERK 3600
198 Donald OConnell SH_CLERK 3600
143 Randall Matos ST_CLERK 3600
EMPLOYEE_ID FIRST_NAME LAST_NAME JOB_ID SALARY
----------- -------------------- ------------------------- ---------- ----------
140 Joshua Patel ST_CLERK 3500
144 Peter Vargas ST_CLERK 3500
131 James Marlow ST_CLERK 3500
191 Randall Perkins SH_CLERK 3500
182 Martha Sullivan SH_CLERK 3500
119 Karen Colmenares PU_CLERK 3500
135 Ki Gee ST_CLERK 3400
127 James Landry ST_CLERK 3400
136 Hazel Philtanker ST_CLERK 3200
128 Steven Markle ST_CLERK 3200
132 TJ Olson ST_CLERK 3100
44 rows selected.
SQL>
Dou want to learn Oracle SQL Tutorial for Beginners, then read the following articles.
Oracle SQL Tutorials For Beginners – Learn Oracle SQL from scratch with Oracle SQL Online Course
