09 Advanced SQL Techniques
09 Advanced SQL Techniques
Techniques
Main Query
Subquery
SELECT
Column1,
FROM table1
Subquery
Rules
Only Scalar Subqueries are allowed to be used
FROM table1
Rules Subquery
Only Scalar Subqueries are allowed to be used
> Greater than WHERE Sales > (SELECT AVG(Sales) FROM ORDERS)
< Less than WHERE Sales < (SELECT AVG(Sales) FROM ORDERS)
>= Greater than or equal to WHERE Sales >= (SELECT AVG(Sales) FROM ORDERS)
<= Less than or equal to WHERE Sales <= (SELECT AVG(Sales) FROM ORDERS)
Subquery in
WHERE Clause
Comparison Operators
Subquery in
WHERE Clause
In Operator
Main Query
FROM table1
Subquery
NOT IN Checks if a value does not matches any value in a list WHERE Sales NOT IN (SELECT …)
NOT EXISTS Checks if subquery returns no rows WHERE NOT EXISTS (SELECT …)
ANY Returns true if a value matches any value in a list. WHERE Sales < ANY (SELECT …)
ALL Returns true if a value matches all values in a list. WHERE Sales > ALL (SELECT …)
Subquery in
WHERE Clause
In Operator
Subquery in
WHERE Clause
ALL Operators
Main Query
FROM table1
WHERE column < ALL( SELECT column FROM table1 WHERE condition )
Subquery
Main Query
FROM table1
WHERE column < ANY( SELECT column FROM table1 WHERE condition )
Subquery
Definition Subquery is independent of the main query Subquery is dependent of the main query
Executed once and its result is used by the main query Executed for each row processed by the main query
Execution
Can be executed on its Own Can't be executed on its Own.
Performance Executed only once leads to better Performance Executed multiple times leads to bad Performance
Usage Static Comparisons, Filtering with Constants Row-by-Row Comparisons, Dynamic Filtering
FROM Table2
FROM Table1
Subquery
Run outer
Runs Subquery
query
SELECT *
SELECT o.*
FROM Orders
FROM Orders o
WHERE CustomerID IN
Syntax JOIN Customers c
(SELECT CustomerID
ON c.CustomerID = o.CustomerID
FROM Customers
AND c.Country = 'USA'
WHERE Country = 'USA')
Readability Not easy to read & maintain easy to read & maintain
Best
Practices
Useful with Larg tables Useful with small tables
WITH CTE-Name AS
(
SELECT … CTE Query
FROM … - CTE Definition -
WHERE …
)
SELECT …
FROM CTE-Name Main Query
- CTE Usage -
WHERE …
WITH CTE-Name1 AS
(
CTE Query
- CTE Definition - SELECT …
FROM …
WHERE …
)
, CTE-Name2 AS
(
CTE Query
SELECT …
- CTE Definition - FROM …
WHERE …
)
SELECT …
Main Query FROM CTE-Name1
- CTE Usage - JOIN CTE-Name2
WHERE …
SQL Course | Multiple CTE
SQL Course | Nested CTE
Nested CTEs
WITH CTE-Name1 AS
(
SELECT … CTE Query
Standalone CTE - CTE Definition -
FROM …
WHERE …
)
, CTE-Name2 AS
(
NESTED CTE SELECT … CTE Query
- CTE Definition -
FROM CTE-Name1
WHERE …
)
SELECT …
Main Query
FROM CTE-Name2 - CTE Usage -
WHERE …
WITH CTE-Name AS
(
SELECT …
Anchor
FROM …
Query
WHERE …
CTE Query
- CTE Definition - UNION ALL
SELECT …
Recursive
FROM CTE-Name Query
WHERE [Break Condition]
)
SELECT …
Main Query FROM CTE-Name
- CTE Usage -
WHERE …
DDL
Statement
CREATE VIEW VIEW-NAME AS
(
SELECT …
FROM …
Query WHERE …
)
DDL
Statement
CREATE TABLE NAME AS
SELECT …
(
SELECT … INTO New-Table
FROM …
Query FROM …
WHERE …
WHERE …
)
MySQL | Postgres | Oracle Sql Server
SELECT …
INTO # New-Table
FROM …
WHERE …
Sql Server
END
Stored Procedure
Execution (Call) EXEC ProcedureName
BEGIN TRY
Execute
-- SQL statements that might cause an error
TRY
END TRY
Error
Error?
BEGIN CATCH
-- SQL statements To Handle The Error Execute
No CATCH
END CATCH Error
End
Start
Value is Yes
NULL?
Update
No To Zero
End