Files
databases.softwareshinobi.com/landing/docs/SQL-101/013-sub-queries.md

144 lines
5.2 KiB
Markdown
Raw Normal View History

2025-06-19 13:04:08 -04:00
# Sub Queries
A subquery is a SQL query nested within a larger query. This powerful technique allows you to build complex data operations, treating the output of the inner query as input for the outer one.
Subqueries are crucial for filtering, aggregation, and data manipulation tasks that simple queries cannot address effectively.
Subqueries can appear in several key clauses:
- SELECT clause
- FROM clause
- WHERE clause
- HAVING clause
The inner query executes first, its results informing the execution of the parent query. This execution order is fundamental to understanding subquery behavior.
Employ subqueries within SELECT, INSERT, UPDATE, or DELETE statements to:
- Compare an expression against the result of another query.
- Ascertain if an expression is present within a query's results.
- Verify if a query returns any rows.
## Subqueries with SELECT
Subqueries frequently appear in the `WHERE` clause of `SELECT` statements to filter data based on criteria derived from another query's result set.
Consider the following `CUSTOMERS` table:
| ID | NAME | AGE | ADDRESS | SALARY |
|-----|----------|-----|-----------|-----------|
| 1 | Ramesh | 35 | Ahmedabad | 2000.0 0 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | Kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
Example: Retrieve customers with a salary greater than 4500.
```sql
SELECT *
FROM CUSTOMERS
WHERE ID IN (
SELECT ID
FROM CUSTOMERS
WHERE SALARY > 4500
);
```
This query first identifies the `ID`s of customers earning more than 4500. The outer query then selects all information for customers whose `ID` is in that list.
Result:
| ID | NAME | AGE | ADDRESS | SALARY |
|-----|----------|-----|---------|---------- |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500 .00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
## Subqueries with UPDATE
Subqueries can update single or multiple columns based on criteria determined by the subquery's result.
Assuming a `CUSTOMERS_BKP` table exists as a backup. The following example updates the `SALARY` in the `CUSTOMERS` table by multiplying it by 0 .25 for customers whose `AGE` is 27 or greater, based on the `CUSTOMERS_BKP` table.
```sql
UPDATE CUSTOMERS
SET SALARY = SALARY * 0.25
WHERE AGE IN (
SELECT AGE
FROM CUSTOMERS_BKP
WHERE AGE >= 27
);
```
This statement identifies ages from `CUSTOMERS_BKP` that are 27 or greater. The outer `UPDATE` then applies the salary adjustment to rows in `CUSTOMERS` with matching ages.
Initial `CUSTOMERS` table:
| ID | NAME | AGE | ADDRESS | SALARY |
|-----|----------|-----|-----------|----------- |
| 1 | Ramesh | 35 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 15 00.00 |
| 3 | Kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000. 00 |
After executing the `UPDATE`, the `CUSTOMERS` table will contain:
| ID | NAME | AGE | ADDRESS | SALARY |
|-----|----------|-----|-----------|-----------|
| 1 | Ramesh | 35 | Ahmedabad | 500.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | Kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 65 00.00 |
| 5 | Hardik | 27 | Bhopal | 2125.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
Note: Ramesh (Age 35) and Hardik (Age 27) are affected as their age is >= 27.
## Subqueries with DELETE
Subqueries enable deleting rows based on conditions derived from the subquery's output .
Assuming a `CUSTOMERS_BKP` table is available. The following example deletes records from the `CUSTOMERS` table for customers whose `AGE` is 27 or greater, as found in the `CUSTOMERS_BKP` table.
```sql
DELETE FROM CUSTOMERS
WHERE AGE IN (
SELECT AGE
FROM CUSTOMERS_BKP
WHERE AGE >= 27
);
```
This query identifies ages from `CUSTOMERS_BKP` that meet the condition. The outer `DELETE` then removes rows from `CUSTOMERS` with those corresponding ages.
Initial `CUSTOMERS` table:
| ID | NAME | AGE | ADDRESS | SALARY |
|-----|----------|-----|-----------|-----------|
| 1 | Ramesh | 35 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | Kaushik | 23 | Kota | 2 000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
After executing the `DELETE`, the `CUSTOMERS` table will contain:
| ID | NAME | AGE | ADDRESS | SALARY |
|-----|----------|-----|---------|----------|
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | Kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.0 0 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
Rows with Age 35 (Ramesh) and 27 (Hardik) are removed.