KEMBAR78
Nested Queries | PDF | Data | Databases
0% found this document useful (0 votes)
30 views36 pages

Nested Queries

Uploaded by

s g shrinivas
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
30 views36 pages

Nested Queries

Uploaded by

s g shrinivas
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 36

NESTED QUERIES

A Subquery or Inner query or a Nested


query is a query within another SQL query
and embedded within the WHERE clause
A subquery is used to return data that will

be used in the main query as a condition


to Restrict the data to be retrieved
Subqueries can be used with the
SELECT, INSERT, UPDATE, DELETE
statements along with the operators like
=, <, >, >=, <=, IN, BETWEEN, etc.
RULES
 Subqueries must be enclosed within
paentheses.
 A subquery can have only one column in the

SELECT CLAUSE
 Multiple columns can be there in the
subquery.
But when?
 Multiple columns are in the main query for

the subquery to compare its selected


columns.
RULES CONTD
 ORDER BY CLAUSE CANNOT BE USED IN
SUBQUERY
 EG:

WHICH EMPLOYEES SALARY ARE GREATER


THAN BLAKE SALARY
2 QUERIES
I. WHAT IS BLAKE SALARY?
II. COMPARE THIS AND FIND WHICH
EMPLOYEES SAL ARE > THAN BLAKE
SALARY
WHICH EMPLOYEES SALARY ARE
GREATER THAN BLAKE SALARY?
SQL> SELECT ENAME, SAL FROM EMP WHERE SAL >
(SELECT SAL FROM EMP WHERE ENAME = 'BLAKE');

ENAME SAL
---------- ----------
JONES 2975
SCOTT 3000
KING 5000
FORD 3000
TYPES
◦ SINGLE ROW

 SUB QUERY RETURNS ONLY ONE ROW

MULTIPLE ROW

SUB QUERY RETURNS MULTIPLE


ROWS
SQL> SELECT ENAME, JOB FROM EMP WHERE
JOB = (SELECT JOB FROM EMP WHERE EMPNO
= 7900);

ENAME JOB
---------- ---------
SMITH CLERK
ADAMS CLERK
JAMES CLERK
MILLER CLERK

SQL>
SQL> SELECT EMPNO, JOB, ENAME, SAL FROM EMP;

EMPNO JOB ENAME SAL


---------- --------- ---------- ----------
7369 CLERK SMITH 800
7499 SALESMAN ALLEN 1600
7521 SALESMAN WARD 1250
7566 MANAGER JONES 2975
7654 SALESMAN MARTIN 1250
7698 MANAGER BLAKE 2850
7782 MANAGER CLARK 2450
7788 ANALYST SCOTT 3000
7839 PRESIDENT KING 5000
7844 SALESMAN TURNER 1500
7876 CLERK ADAMS 1100
7900 CLERK JAMES 950
7902 ANALYST FORD 3000
7934 CLERK MILLER 1300
 SQL> SELECT ENAME, JOB, SAL FROM EMP
WHERE JOB = ( SELECT JOB FROM EMP WHERE
EMPNO = 7900) AND SAL >
(SELECT SAL FROM EMP WHERE EMPNO =
7412);

no rows selected
SQL> SELECT SAL FROM EMP WHERE JOB = (SELECT JOB FROM
EMP WHERE ENAME = 'SCOTT') AND SAL > (SELECT SAL FROM
EMP WHERE EMPNO = 7844);
SAL
----------
EMPNO JOB ENAME SAL
3000 ---------- -------- ---------- ---------
3000 7369 CLERK SMITH 800
7499 SALESMAN ALLEN 1600
7521 SALESMAN WARD 1250
7566 MANAGER JONES 2975
7654 SALESMAN MARTIN 1250
7698 MANAGER BLAKE 2850
7782 MANAGER CLARK 2450
ANALYST 7788 ANALYST SCOTT 3000
7839 PRESIDENT KING 5000
7844 SALESMAN TURNER 1500
1500
7876 CLERK ADAMS 1100
7900 CLERK JAMES 950
7902 ANALYST FORD 3000
7934 CLERK MILLER 1300
SQL> SELECT ENAME, JOB, SAL FROM EMP WHERE SAL =
(SELECT MIN(SAL) FROM EMP);

EMPNO JOB ENAME SAL


------- --------- ---------- -------
7500 ASSISTANT HARIKUMAR 750 750
7369 CLERK SMITH 800
7499 SALESMAN ALLEN 1600
7521 SALESMAN WARD 1250
7566 MANAGER JONES 2975
7654 SALESMAN MARTIN 1250
7698 MANAGER BLAKE 2850
7782 MANAGER CLARK 2450
7788 ANALYST SCOTT 3000
7839 PRESIDENT KING 5000
7844 SALESMAN TURNER 1500
7876 CLERK ADAMS 1100
7900 CLERK JAMES 950
7902 ANALYST FORD 3000
7934 CLERK MILLER 1300
SQL> select ename, job, sal from emp where
sal = (select min(sal) from emp);

ENAME JOB SAL


---------- --------- ----------
HARIKUMAR ASSISTANT 750
SQL> SELECT MIN(SAL) FROM EMP WHERE DEPTNO = 20;
MIN(SAL)
----------
750

SQL> SELECT MIN(SAL) FROM EMP WHERE DEPTNO = 30;


MIN(SAL)
----------
950

SQL> SELECT MIN(SAL) FROM EMP WHERE DEPTNO = 10;


MIN(SAL)
----------
1300
SQL> SELECT DEPTNO, MIN(SAL) FROM EMP GROUP
BY DEPTNO;
DEPTNO MIN(SAL)
--------- ----------
30 950
20 750
10 1300

SQL> SELECT DEPTNO, MIN(SAL) FROM EMP GROUP


BY DEPTNO HAVING MIN(SAL) > (SELECT MIN(SAL)
FROM EMP WHERE DEPTNO = 20);

DEPTNO MIN(SAL)
---------- ----------
30 950 20 750
 SQL> SELECT DEPTNO, MIN(SAL) FROM EMP
GROUP BY DEPTNO HAVING MIN(SAL) >
(SELECT MIN(SAL) FROM EMP WHERE DEPTNO
= 20);

DEPTNO MIN(SAL)
---------- ----------
30 950
10 1300
Multiple-Row Subqueries
 Return more than one row
 Use multiple-row comparison operators
SQL> SELECT ENAME, SAL, DEPTNO FROM EMP
WHERE SAL IN (950,750,1300);

ENAME SAL DEPTNO


---------- ---------- ----------
JAMES 950 30
RAMAN 950 30
HARIKUMAR 750 20
MILLER 1300 10
SQL> SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL <
ANY
2 (SELECT SAL FROM EMP WHERE JOB = 'ANALYST');

EMPNO ENAME JOB SAL


---------- ---------- --------- ----------
7500 HARIKUMAR ASSISTANT 750
7369 SMITH CLERK 800
7510 RAMAN TECH_AST 950
7900 JAMES CLERK 950
7876 ADAMS CLERK 1100
7521 WARD SALESMAN 1250
7654 MARTIN SALESMAN 1250
7934 MILLER CLERK 1300
7844 TURNER SALESMAN 1500
7499 ALLEN SALESMAN 1600
7782 CLARK MANAGER 2450
7698 BLAKE MANAGER 2850
SQL> SELECT EMPNO, ENAME, JOB, SAL FROM
EMP WHERE SAL < ALL ( SELECT SAL FROM
EMP WHERE JOB = 'CLERK');

EMPNO ENAME JOB SAL


---------- ---------- --------- ---------
7500 HARIKUMAR ASSISTANT 750
SQL> SELECT EMPNO, ENAME, JOB, SAL FROM EMP
WHERE SAL > ALL (SELECT SAL 1300
FROM EMP WHERE
JOB = 'CLERK');
EMPNO ENAME JOB SAL
---------- ---------- --------- ----------
7499 ALLEN SALESMAN 1600
7566 JONES MANAGER 2975
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7788 SCOTT ANALYST 3000
7839 KING PRESIDENT 5000
7844 TURNER SALESMAN 1500
7902 FORD ANALYST 3000

8 rows selected.
Correlated Nestedquery
Nested query:
1. Outer query uses the result of the inner query
2. Outer query depends on the value returned by
the inner query
3. But inner query does not depend on the outer
query
4. That is why it is called as plain subquery or plain
Nested query
Correlated Nested Query
 Both are inter related with each other
 Uses the values from the outer query
 Executes each time for each row selected by

the outer query.


 That is why a query that uses correlated

nested query may be slow.


 A correlated nested query is otherwise

called as repeating nested query or


synchronized nested query
SELECT employee_id, first_name, last_name,
salary FROM employees WHERE salary >
(SELECT AVG(salary) FROM employees);
SELECT AVG(salary) FROM employees;
SELECT employee_id, first_name,
last_name, salary, department_id
FROM employees e
WHERE
salary >(SELECT AVG(salary)
FROM
employees
WHERE
department_id = e.department_id)
ORDER BY
department_id ,
first_name , last_name;
SQL> SELECT JOB, SAL FROM EMP WHERE JOB = 'CLERK';

JOB SAL
--------- ----------
CLERK 800
CLERK 1100
CLERK 950
CLERK 1300

SQL> SELECT MAX(SAL) FROM EMP WHERE JOB = 'CLERK';

MAX(SAL)
----------
1300
 The output shows the employee
details those who are not clerks, but,
whose salary is less than the salary of
all clerks.
 >ALL means more than the maximum,

and
 <ALL means less than the minimum
EXISTS Operator
• The EXISTS operator is used to test for the
existence of any record in a subquery.
• The EXISTS operator returns TRUE if the
subquery returns one or more records.

EXISTS Syntax

SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE
condition);
Example
SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Pro
ducts WHERE Products.SupplierID =
Suppliers.supplierID AND Price < 20);

SELECT SupplierName
FROM Suppliers
WHERE
NOT EXISTS (SELECT ProductName FROM Produ
cts WHERE Products.SupplierID =
Suppliers.supplierID AND Price = 22);
SQL SELECT INTO Examples
 SELECT * INTO CustomersBackup2017
FROM Customers;

SELECT * INTO CustomersBackup2017 IN


'Backup.mdb‘ FROM Customers;

SELECTCustomerName,
ContactName INTO CustomersBackup2017
FROM Customers;
Example contd.,
 SELECT * INTO CustomersGermany
FROM Customers
WHERE Country = 'Germany';

Create new table from more than one tables:

SELECT Customers.CustomerName,
Orders.OrderID
INTO CustomersOrderBackup2017
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID =
Orders.CustomerID;
Example contd.,
 SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

You might also like