DQL Nested Queries DEMO ORACLE19C 1738295160029
DQL Nested Queries DEMO ORACLE19C 1738295160029
---------------------------------------------------
--SUB QUERIES - A subquery (or nested query) in SQL is a query within another
query. It is used to perform operations that cannot be done in a single query and
helps break down complex operations into simpler ones. Subqueries can be used in
the SELECT, FROM, WHERE, and HAVING clauses.
--Types of Subqueries:Single-Row Subquery, Multi-Row Subquery, Multi-Column
Subquery AND Correlated Subquery
--SYNTAX: SELECT column_name FROM table_name WHERE column_name operator (SELECT
column_name FROM another_table WHERE condition);
-----------------------------------------------------------------------------------
-------------------------------------------------
--single-row subquery returns exactly one row and one column.
8 rows selected.
SQL> SELECT CUS_NAME, AGE FROM CUSTOMER WHERE AGE = (SELECT MAX(AGE) FROM
CUSTOMER);
CUS_NAME AGE
-------------------- ----------
PAVI 45
--QUERY:Find the customer who is older than the average age of all customers.
SQL> SELECT CUS_NAME, AGE FROM CUSTOMER WHERE AGE > (SELECT AVG(AGE) FROM
CUSTOMER);
CUS_NAME AGE
-------------------- ----------
KAVI 43
RAVI 35
PAVI 45
--multi-row subquery returns multiple rows. It’s typically used with operators like
IN, ANY, or ALL.
--QUERY: Find customers who live in the same cities as customers who are aged 40 or
older.
SQL> SELECT CUS_NAME, CUS_CITY FROM CUSTOMER WHERE CUS_CITY IN (SELECT CUS_CITY
FROM CUSTOMER WHERE AGE >= 40);
CUS_NAME CUS_CITY
-------------------- --------------------
KAVI MADURAI
ARUN MADURAI
VARUN MADURAI
PAVI CHENNAI
PARUN CHENNAI
CUS_NAME CUS_CITY
-------------------- --------------------
KAVI MADURAI
ARUN MADURAI
VARUN MADURAI
--QUERY:Find customers who are younger than any customer with an age greater than
30.
SQL> SELECT CUS_NAME, AGE FROM CUSTOMER WHERE AGE < ANY (SELECT AGE FROM CUSTOMER
WHERE AGE > 30);
CUS_NAME AGE
-------------------- ----------
ARUN 23
SARUN 28
VARUN 28
MARUN 28
PARUN 32
RAVI 35
KAVI 43
7 rows selected.
--QUERY:Find the names and ages of customers who are younger than every customer
whose age is greater than 30
SQL> SELECT CUS_NAME, AGE FROM CUSTOMER WHERE AGE < ALL (SELECT AGE FROM CUSTOMER
WHERE AGE > 30);
CUS_NAME AGE
-------------------- ----------
SARUN 28
VARUN 28
MARUN 28
ARUN 23
--QUERY:Find customers who are older than all customers with an age greater than
20.
SQL> SELECT CUS_NAME, AGE FROM CUSTOMER WHERE AGE > ALL (SELECT AGE FROM CUSTOMER
WHERE AGE > 20);
no rows selected
--multi-column subquery returns more than one column. It can be used with IN or
EXISTS
--QUERY:Find customers who live in the same city as any customer with the name
"KAVI".
CUS_NAME CUS_CITY
-------------------- --------------------
KAVI MADURAI
ARUN MADURAI
VARUN MADURAI
-- correlated subquery is one where the inner query refers to columns from the
outer query. It is evaluated once for each row processed by the outer query.
--QUERY:Find customers who are younger than their supervisor.
SQL> SELECT C1.CUS_NAME, C1.AGE FROM CUSTOMER C1 WHERE C1.AGE < (SELECT C2.AGE FROM
CUSTOMER C2 WHERE C1.SUP_NAME = C2.CUS_NAME);
CUS_NAME AGE
-------------------- ----------
ARUN 23
VARUN 28
MARUN 28
PARUN 32
SARUN 28
ALLEN 42
6 rows selected.
1 row updated.
9 rows selected.
SQL> SELECT C1.CUS_NAME, C1.AGE FROM CUSTOMER C1 WHERE C1.AGE < (SELECT C2.AGE FROM
CUSTOMER C2 WHERE C1.SUP_NAME = C2.CUS_NAME);
CUS_NAME AGE
-------------------- ----------
ARUN 23
VARUN 28
MARUN 28
PARUN 32
SARUN 28
CUS_CITY NUM_CUSTOMERS
-------------------- -------------
MADURAI 4
SIVAKASI 1
CHENNAI 2
ERODE 1
TRICHY 1
9 rows selected.
SQL> SELECT CUS_CITY, AVG(AGE) AS AVG_AGE FROM CUSTOMER GROUP BY CUS_CITY HAVING
AVG(AGE) > (SELECT AVG(AGE) FROM CUSTOMER);
CUS_CITY AVG_AGE
-------------------- ----------
MADURAI 36
SIVAKASI 35
CHENNAI 38.5
SQL> SELECT CUS_NAME, SUP_NAME FROM CUSTOMER C1 WHERE EXISTS (SELECT 1 FROM
CUSTOMER C2 WHERE C1.SUP_NAME = C2.CUS_NAME);
CUS_NAME SUP_NAME
-------------------- --------------------
ARUN KAVI
VARUN KAVI
MARUN PAVI
PARUN PAVI
SARUN KAVI
ALLEN PAVI
6 rows selected.
--QUERY: Find customers who live in the same city as any other customer.
SQL> SELECT C1.CUS_NAME, C1.CUS_CITY FROM CUSTOMER C1 WHERE EXISTS (SELECT 1 FROM
CUSTOMER C2 WHERE C1.CUS_CITY = C2.CUS_CITY AND C1.CUS_NAME != C2.CUS_NAME);
CUS_NAME CUS_CITY
-------------------- --------------------
ARUN MADURAI
VARUN MADURAI
ALLEN MADURAI
PARUN CHENNAI
KAVI MADURAI
PAVI CHENNAI
6 rows selected.
CUS_NAME CUS_CITY
-------------------- --------------------
KAVI MADURAI
RAVI SIVAKASI
PAVI CHENNAI
--WITH clause define temporary result sets (which can be treated like tables) that
can be referenced multiple times within a query
--QUERY:find the average age of customers and then find customers whose age is
above the average.
SQL> WITH AvgAge AS (SELECT AVG(AGE) AS avg_age FROM CUSTOMER) SELECT CUS_NAME, AGE
FROM CUSTOMER WHERE AGE > (SELECT avg_age FROM AvgAge);
CUS_NAME AGE
-------------------- ----------
KAVI 43
RAVI 35
PAVI 45
ALLEN 50
--QUERY: display customers whose age is above the average and who live in a city
with more than 2 customers
--scalar subquery is a subquery that returns a single value (one row and one
column). It can be used anywhere an expression is expected, such as in the SELECT,
WHERE, or HAVING clauses.
--Using Scalar Subquery in SELECT
--QUERY:fetch a list of customer names and their SUERVISOR names, but only for
customers who live in a specific city, like 'MADURAI'
SQL> SELECT CUS_NAME, (SELECT SUP_NAME FROM CUSTOMER WHERE CUS_NAME = 'VARUN') AS
SUPERVISOR_NAME FROM CUSTOMER WHERE CUS_CITY = 'MADURAI';
CUS_NAME SUPERVISOR_NAME
-------------------- --------------------
KAVI KAVI
ARUN KAVI
VARUN KAVI
ALLEN KAVI
SQL> SELECT CUS_NAME, (SELECT SUP_NAME FROM CUSTOMER WHERE CUS_NAME = 'KAVI') AS
SUPERVISOR_NAME FROM CUSTOMER WHERE CUS_CITY = 'MADURAI';
CUS_NAME SUPERVISOR_NAME
-------------------- --------------------
KAVI
ARUN
VARUN
ALLEN
--Using Scalar Subquery in WHERE Clause to Compare Ages
SQL> SELECT CUS_NAME, AGE FROM CUSTOMER WHERE AGE > (SELECT AVG(AGE) FROM
CUSTOMER);
CUS_NAME AGE
-------------------- ----------
KAVI 43
RAVI 35
PAVI 45
ALLEN 50