SQL āļ‚āļąāđ‰āļ™āļŠāļđāļ‡āļŠāļģāļŦāļĢāļąāļšāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Data Analyst: Subquery, Pivot āđāļĨāļ°āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž Query 2026

āļ„āļđāđˆāļĄāļ·āļ­ SQL āļ‚āļąāđ‰āļ™āļŠāļđāļ‡āļŠāļģāļŦāļĢāļąāļšāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Data Analyst 2026: correlated subquery, pivot query āļ”āđ‰āļ§āļĒ conditional aggregation, EXPLAIN ANALYZE, āļāļĨāļĒāļļāļ—āļ˜āđŒ indexing āđāļĨāļ° anti-pattern āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡

SQL āļ‚āļąāđ‰āļ™āļŠāļđāļ‡āļŠāļģāļŦāļĢāļąāļšāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ data analyst āļžāļĢāđ‰āļ­āļĄ subquery pivot āđāļĨāļ°āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž query

āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™āđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡ Data Analyst āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļĄāđˆāđ„āļ”āđ‰āļ§āļąāļ”āđ€āļžāļĩāļĒāļ‡āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ SELECT āļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđāļ•āđˆāļĒāļąāļ‡āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļąāļāļĐāļ° SQL āļ‚āļąāđ‰āļ™āļŠāļđāļ‡āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢāļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™ āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ‚āļ­āļ‡ Query āđāļĨāļ°āļ­āļ­āļāđāļšāļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāđ„āļ”āđ‰ āļœāļđāđ‰āļŠāļĄāļąāļ„āļĢāļ—āļĩāđˆāđ€āļ‚āđ‰āļēāđƒāļˆāđ€āļ—āļ„āļ™āļīāļ„āļ­āļĒāđˆāļēāļ‡ Correlated Subquery, Pivot Query, EXPLAIN Plan āđāļĨāļ° Indexing Strategy āļˆāļ°āļĄāļĩāļ„āļ§āļēāļĄāđ„āļ”āđ‰āđ€āļ›āļĢāļĩāļĒāļšāļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āđƒāļ™āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ„āļąāļ”āđ€āļĨāļ·āļ­āļ āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰āļĢāļ§āļšāļĢāļ§āļĄāļŦāļąāļ§āļ‚āđ‰āļ­ SQL āļ‚āļąāđ‰āļ™āļŠāļđāļ‡āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ•āļģāđāļŦāļ™āđˆāļ‡ Data Analyst āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļˆāļĢāļīāļ‡

āđ€āļ„āļĨāđ‡āļ”āļĨāļąāļšāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

āđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ āļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļĄāļąāļāđ„āļĄāđˆāđ„āļ”āđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļĩāļĒāļ‡āļ„āļģāļ•āļ­āļšāļ—āļĩāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡ āđāļ•āđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŦāđ‡āļ™āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ„āļīāļ”āļ”āđ‰āļ§āļĒ āļāļēāļĢāļ­āļ˜āļīāļšāļēāļĒāļ§āđˆāļēāđ€āļŦāļ•āļļāđƒāļ”āļˆāļķāļ‡āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰ CTE āđāļ—āļ™ Correlated Subquery āļŦāļĢāļ·āļ­āđ€āļŦāļ•āļļāđƒāļ” EXISTS āļˆāļķāļ‡āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļ§āđˆāļē IN āđƒāļ™āļšāļēāļ‡āļŠāļ–āļēāļ™āļāļēāļĢāļ“āđŒ āļˆāļ°āļŠāđˆāļ§āļĒāđāļŠāļ”āļ‡āļ–āļķāļ‡āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđ€āļŠāļīāļ‡āļĨāļķāļāļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰āđ‚āļ”āļ”āđ€āļ”āđˆāļ™āļˆāļēāļāļœāļđāđ‰āļŠāļĄāļąāļ„āļĢāļ„āļ™āļ­āļ·āđˆāļ™

Correlated Subquery āļāļąāļš Regular Subquery: āļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļ—āļĩāđˆāļŠāļģāļ„āļąāļ

Regular Subquery āļ„āļ·āļ­ Subquery āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļīāļŠāļĢāļ°āļˆāļēāļ Query āļŦāļĨāļąāļ āđ‚āļ”āļĒāļˆāļ°āļ–āļđāļāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ€āļžāļĩāļĒāļ‡āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§āđāļĨāđ‰āļ§āļ™āļģāļœāļĨāļĨāļąāļžāļ˜āđŒāđ„āļ›āđƒāļŠāđ‰āļāļąāļš Query āļ āļēāļĒāļ™āļ­āļ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāļŦāļēāļ„āļģāļŠāļąāđˆāļ‡āļ‹āļ·āđ‰āļ­āļ—āļĩāđˆāļĄāļĩāļĄāļđāļĨāļ„āđˆāļēāļŠāļđāļ‡āļāļ§āđˆāļēāļ„āđˆāļēāđ€āļ‰āļĨāļĩāđˆāļĒāļ‚āļ­āļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ”

sql
-- regular_subquery_threshold.sql
-- Find all orders above the average order value
SELECT
  order_id,
  customer_id,
  total_amount
FROM orders
WHERE total_amount > (
  -- Executes once, returns a single scalar value
  SELECT AVG(total_amount)
  FROM orders
);

āđƒāļ™āļ—āļēāļ‡āļ•āļĢāļ‡āļāļąāļ™āļ‚āđ‰āļēāļĄ Correlated Subquery āļˆāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļ Query āļ āļēāļĒāļ™āļ­āļ āļ—āļģāđƒāļŦāđ‰āļ•āđ‰āļ­āļ‡āļ–āļđāļāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‹āđ‰āļģāļ—āļļāļāļ„āļĢāļąāđ‰āļ‡āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āđāļ–āļ§āļ‚āļ­āļ‡ Query āļŦāļĨāļąāļ āļŠāļīāđˆāļ‡āļ™āļĩāđ‰āļŠāđˆāļ‡āļœāļĨāļ•āđˆāļ­āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ­āļĒāđˆāļēāļ‡āļĄāļēāļāđ€āļĄāļ·āđˆāļ­āļ—āļģāļ‡āļēāļ™āļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļģāļ™āļ§āļ™āļĄāļēāļ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āđāļŠāļ”āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļžāļ™āļąāļāļ‡āļēāļ™āļ—āļĩāđˆāļĄāļĩāđ€āļ‡āļīāļ™āđ€āļ”āļ·āļ­āļ™āļŠāļđāļ‡āļāļ§āđˆāļēāļ„āđˆāļēāđ€āļ‰āļĨāļĩāđˆāļĒāļ‚āļ­āļ‡āđāļœāļ™āļāļ•āļ™āđ€āļ­āļ‡

sql
-- correlated_subquery_department.sql
-- Employees earning above their department average
SELECT
  e.employee_id,
  e.name,
  e.department,
  e.salary
FROM employees e
WHERE e.salary > (
  -- Re-evaluated for each employee's department
  SELECT AVG(e2.salary)
  FROM employees e2
  WHERE e2.department = e.department
);

āļ§āļīāļ˜āļĩāļ—āļĩāđˆāļ”āļĩāļāļ§āđˆāļēāļŠāļģāļŦāļĢāļąāļš Query āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļ„āļ·āļ­āļāļēāļĢāđƒāļŠāđ‰ Common Table Expression (CTE) āđ€āļžāļ·āđˆāļ­āļ„āļģāļ™āļ§āļ“āļ„āđˆāļēāđ€āļ‰āļĨāļĩāđˆāļĒāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āđāļœāļ™āļāđ€āļžāļĩāļĒāļ‡āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§ āđāļĨāđ‰āļ§āļˆāļķāļ‡ JOIN āļāļĨāļąāļšāļĄāļēāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļš āļ§āļīāļ˜āļĩāļ™āļĩāđ‰āļĨāļ”āļˆāļģāļ™āļ§āļ™āļāļēāļĢāļŠāđāļāļ™āļ•āļēāļĢāļēāļ‡āļĨāļ‡āļ­āļĒāđˆāļēāļ‡āļĄāļēāļ

sql
-- optimized_with_cte.sql
-- Same result, single pass over the data
WITH dept_avg AS (
  SELECT
    department,
    AVG(salary) AS avg_salary
  FROM employees
  GROUP BY department
)
SELECT
  e.employee_id,
  e.name,
  e.department,
  e.salary
FROM employees e
JOIN dept_avg d ON e.department = d.department
WHERE e.salary > d.avg_salary;

āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļˆāļēāļ Correlated Subquery āđ€āļ›āđ‡āļ™ CTE + JOIN āđ€āļ›āđ‡āļ™āđ€āļ—āļ„āļ™āļīāļ„āļ—āļĩāđˆāļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļĄāļąāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŦāđ‡āļ™ āđ€āļžāļĢāļēāļ°āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļœāļđāđ‰āļŠāļĄāļąāļ„āļĢāļ„āļģāļ™āļķāļ‡āļ–āļķāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ‚āļ­āļ‡ Query āđ„āļĄāđˆāđƒāļŠāđˆāđ€āļžāļĩāļĒāļ‡āđāļ„āđˆāļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ

Subquery Patterns āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĢāļđāđ‰

EXISTS āļāļąāļš IN: āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āļ­āļĒāđˆāļēāļ‡āđ„āļĢ

āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļ„āļģāļ–āļēāļĄāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ„āļ·āļ­āļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡ EXISTS āļāļąāļš IN āđ€āļĄāļ·āđˆāļ­āđƒāļŠāđ‰āļāļąāļš Subquery āđƒāļ™āđāļ‡āđˆāļ‚āļ­āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđƒāļŦāđ‰āļ„āļģāļ•āļ­āļšāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āđāļ•āđˆāđƒāļ™āđāļ‡āđˆāļ‚āļ­āļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ™āļąāđ‰āļ™āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ™āļąāļĒāļŠāļģāļ„āļąāļ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđ€āļĄāļ·āđˆāļ­ Subquery āļŠāđˆāļ‡āļ„āļ·āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļģāļ™āļ§āļ™āļĄāļēāļ EXISTS āļˆāļ°āļŦāļĒāļļāļ”āļ—āļģāļ‡āļēāļ™āļ—āļąāļ™āļ—āļĩāđ€āļĄāļ·āđˆāļ­āļžāļšāđāļ–āļ§āđāļĢāļāļ—āļĩāđˆāļ•āļĢāļ‡āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆ IN āļ•āđ‰āļ­āļ‡āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ Subquery āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļāđˆāļ­āļ™

sql
-- exists_vs_in.sql
-- Customers who placed at least one order in 2026 (EXISTS — preferred)
SELECT c.customer_id, c.name
FROM customers c
WHERE EXISTS (
  SELECT 1
  FROM orders o
  WHERE o.customer_id = c.customer_id
    AND o.order_date >= '2026-01-01'
);

-- Equivalent with IN (slower on large datasets)
SELECT customer_id, name
FROM customers
WHERE customer_id IN (
  SELECT customer_id
  FROM orders
  WHERE order_date >= '2026-01-01'
);

Scalar Subquery āđƒāļ™ SELECT

āļ­āļĩāļāļĢāļđāļ›āđāļšāļšāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ„āļ§āļĢāļĢāļđāđ‰āļˆāļąāļāļ„āļ·āļ­ Scalar Subquery āđƒāļ™ SELECT clause āļ‹āļķāđˆāļ‡āļŠāđˆāļ‡āļ„āļ·āļ™āļ„āđˆāļēāđ€āļ”āļĩāļĒāļ§āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āđāļ–āļ§ āļ§āļīāļ˜āļĩāļ™āļĩāđ‰āļĄāļĩāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ§āļĄ (Aggregated Data) āļ„āļ§āļšāļ„āļđāđˆāļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļēāļĒāļšāļļāļ„āļ„āļĨ āđāļ•āđˆāļ„āļ§āļĢāļĢāļ°āļĄāļąāļ”āļĢāļ°āļ§āļąāļ‡āđ€āļĢāļ·āđˆāļ­āļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ€āļžāļĢāļēāļ°āļ—āļģāļ‡āļēāļ™āļ„āļĨāđ‰āļēāļĒ Correlated Subquery

sql
-- scalar_subquery_select.sql
-- Each product with its category's total revenue
SELECT
  p.product_id,
  p.product_name,
  p.category,
  (
    SELECT SUM(oi.quantity * oi.unit_price)
    FROM order_items oi
    JOIN products p2 ON oi.product_id = p2.product_id
    WHERE p2.category = p.category
  ) AS category_total_revenue
FROM products p;

āļŠāļģāļŦāļĢāļąāļšāļāļĢāļ“āļĩāļ™āļĩāđ‰ āđƒāļ™āļŠāļ–āļēāļ™āļāļēāļĢāļ“āđŒāļˆāļĢāļīāļ‡āļ„āļ§āļĢāļžāļīāļˆāļēāļĢāļ“āļēāđƒāļŠāđ‰ Window Function āļŦāļĢāļ·āļ­ CTE āđāļ—āļ™āđ€āļžāļ·āđˆāļ­āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ—āļĩāđˆāļ”āļĩāļāļ§āđˆāļē āļāļēāļĢāđ€āļ‚āđ‰āļēāđƒāļˆāļ—āļąāđ‰āļ‡āļ§āļīāļ˜āļĩāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āđāļĨāļ°āļ§āļīāļ˜āļĩāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāļ—āļĩāđˆāļŠāļļāļ”āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļ

Pivot Query āļ”āđ‰āļ§āļĒ Conditional Aggregation

Pivot Query āđ€āļ›āđ‡āļ™āđ€āļ—āļ„āļ™āļīāļ„āļ—āļĩāđˆ Data Analyst āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļšāđˆāļ­āļĒāļĄāļēāļ āđ€āļžāļĢāļēāļ°āļāļēāļĢāđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāđāļ–āļ§āđ€āļ›āđ‡āļ™āļ„āļ­āļĨāļąāļĄāļ™āđŒ (Row to Column) āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāļ­āđˆāļēāļ™āļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™āđāļĨāļ°āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ™āļģāđ€āļŠāļ™āļ­āđƒāļ™āļĢāļēāļĒāļ‡āļēāļ™ āļ§āļīāļ˜āļĩāļ—āļĩāđˆāļ™āļīāļĒāļĄāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āļāļēāļĢāđƒāļŠāđ‰ CASE āļĢāđˆāļ§āļĄāļāļąāļš Aggregate Function

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āđāļŠāļ”āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļēāļĒāļ‡āļēāļ™āļĢāļēāļĒāđ„āļ”āđ‰āļĢāļēāļĒāđ€āļ”āļ·āļ­āļ™āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒ āđ‚āļ”āļĒāđāļ›āļĨāļ‡āđ€āļ”āļ·āļ­āļ™āļˆāļēāļāđāļ–āļ§āđ€āļ›āđ‡āļ™āļ„āļ­āļĨāļąāļĄāļ™āđŒ

sql
-- pivot_monthly_revenue.sql
-- Monthly revenue pivot: one row per product, one column per month
SELECT
  product_id,
  product_name,
  SUM(CASE WHEN EXTRACT(MONTH FROM order_date) = 1
    THEN quantity * unit_price ELSE 0 END) AS jan_revenue,
  SUM(CASE WHEN EXTRACT(MONTH FROM order_date) = 2
    THEN quantity * unit_price ELSE 0 END) AS feb_revenue,
  SUM(CASE WHEN EXTRACT(MONTH FROM order_date) = 3
    THEN quantity * unit_price ELSE 0 END) AS mar_revenue,
  SUM(CASE WHEN EXTRACT(MONTH FROM order_date) = 4
    THEN quantity * unit_price ELSE 0 END) AS apr_revenue,
  -- Repeat for remaining months
  SUM(quantity * unit_price) AS total_revenue
FROM order_items oi
JOIN orders o ON oi.order_id = o.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE o.order_date >= '2026-01-01'
GROUP BY product_id, product_name
ORDER BY total_revenue DESC;

āļ­āļĩāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāđƒāļ™āļ‡āļēāļ™ Data Analyst āļ„āļ·āļ­āļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļžāļĪāļ•āļīāļāļĢāļĢāļĄāļœāļđāđ‰āđƒāļŠāđ‰āļ•āļēāļĄāļ›āļĢāļ°āđ€āļ āļ—āļ­āļļāļ›āļāļĢāļ“āđŒ Query āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāļ™āļąāļšāļˆāļģāļ™āļ§āļ™ Session āļ•āļēāļĄāļ›āļĢāļ°āđ€āļ āļ—āļ­āļļāļ›āļāļĢāļ“āđŒāđāļĨāļ°āļ„āļģāļ™āļ§āļ“āļŠāļąāļ”āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ Mobile

sql
-- pivot_user_activity.sql
-- User activity: sessions by day of week and device type
SELECT
  user_id,
  COUNT(CASE WHEN device_type = 'mobile' THEN 1 END) AS mobile_sessions,
  COUNT(CASE WHEN device_type = 'desktop' THEN 1 END) AS desktop_sessions,
  COUNT(CASE WHEN device_type = 'tablet' THEN 1 END) AS tablet_sessions,
  ROUND(
    COUNT(CASE WHEN device_type = 'mobile' THEN 1 END) * 100.0 / COUNT(*),
    1
  ) AS mobile_pct
FROM user_sessions
WHERE session_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY user_id
HAVING COUNT(*) >= 5  -- Only users with meaningful activity
ORDER BY mobile_pct DESC;

Dynamic Pivot āļ”āđ‰āļ§āļĒ CROSSTAB

āļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āļ—āļĩāđˆāđƒāļŠāđ‰ PostgreSQL āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ CROSSTAB āļˆāļēāļ Extension tablefunc āđ€āļ›āđ‡āļ™āļ­āļĩāļāļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļŦāļ™āļķāđˆāļ‡āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Pivot Table āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ—āļĩāđˆāļŠāļąāļ”āđ€āļˆāļ™āđāļĨāļ°āļ­āđˆāļēāļ™āļ‡āđˆāļēāļĒāļāļ§āđˆāļēāļāļēāļĢāđƒāļŠāđ‰ CASE āļŦāļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ”

sql
-- crosstab_dynamic_pivot.sql
-- Enable the extension (once per database)
CREATE EXTENSION IF NOT EXISTS tablefunc;

-- Revenue by product and quarter using CROSSTAB
SELECT *
FROM crosstab(
  $$
    SELECT
      product_name,
      'Q' || EXTRACT(QUARTER FROM order_date)::TEXT AS quarter,
      SUM(quantity * unit_price) AS revenue
    FROM order_items oi
    JOIN orders o ON oi.order_id = o.order_id
    JOIN products p ON oi.product_id = p.product_id
    WHERE EXTRACT(YEAR FROM o.order_date) = 2026
    GROUP BY product_name, quarter
    ORDER BY product_name, quarter
  $$,
  $$ VALUES ('Q1'), ('Q2'), ('Q3'), ('Q4') $$
) AS pivot_table(
  product_name TEXT,
  q1_revenue NUMERIC,
  q2_revenue NUMERIC,
  q3_revenue NUMERIC,
  q4_revenue NUMERIC
);

āļ‚āđ‰āļ­āļ„āļ§āļĢāļ—āļĢāļēāļšāļ„āļ·āļ­ CROSSTAB āđ€āļ›āđ‡āļ™āļŸāļĩāđ€āļˆāļ­āļĢāđŒāđ€āļ‰āļžāļēāļ°āļ‚āļ­āļ‡ PostgreSQL āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđƒāļ™ MySQL āļŦāļĢāļ·āļ­ SQL Server āđ„āļ”āđ‰āđ‚āļ”āļĒāļ•āļĢāļ‡ āđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ āļ„āļ§āļĢāļĢāļ°āļšāļļāđƒāļŦāđ‰āļŠāļąāļ”āđ€āļˆāļ™āļ§āđˆāļēāļāļģāļĨāļąāļ‡āđƒāļŠāđ‰āļŸāļĩāđ€āļˆāļ­āļĢāđŒāđ€āļ‰āļžāļēāļ°āļ‚āļ­āļ‡ Database āđƒāļ” āđ€āļžāļĢāļēāļ°āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ–āļķāļ‡āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡ Database Engine āļ•āđˆāļēāļ‡ āđ†

āļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āļžāļīāļŠāļīāļ•āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Data Analytics āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āļĒāļąāļ‡āļ„āļĢāļąāļš?

āļāļķāļāļāļ™āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āđāļšāļšāđ‚āļ•āđ‰āļ•āļ­āļš, flashcards āđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

EXPLAIN Plan āđāļĨāļ° Cost Analysis

āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āđāļĨāļ°āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒ EXPLAIN Plan āļ–āļ·āļ­āđ€āļ›āđ‡āļ™āļ—āļąāļāļĐāļ°āļ—āļĩāđˆāđāļĒāļāļĢāļ°āļŦāļ§āđˆāļēāļ‡ Data Analyst āļ—āļąāđˆāļ§āđ„āļ›āļāļąāļš Data Analyst āļ‚āļąāđ‰āļ™āļŠāļđāļ‡āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™ āļ„āļģāļŠāļąāđˆāļ‡ EXPLAIN ANALYZE āļˆāļ°āđāļŠāļ”āļ‡āđāļœāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļĢāļīāļ‡āļ‚āļ­āļ‡ Query āļĢāļ§āļĄāļ–āļķāļ‡āđ€āļ§āļĨāļēāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āđāļ•āđˆāļĨāļ°āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđāļĨāļ°āļˆāļģāļ™āļ§āļ™ Buffer āļ—āļĩāđˆāļ­āđˆāļēāļ™

sql
-- explain_analyze_example.sql
-- Analyze a slow query to identify bottlenecks
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT
  c.customer_id,
  c.name,
  COUNT(o.order_id) AS order_count,
  SUM(o.total_amount) AS lifetime_value
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE o.order_date >= '2025-01-01'
GROUP BY c.customer_id, c.name
HAVING SUM(o.total_amount) > 1000
ORDER BY lifetime_value DESC;

āđ€āļĄāļ·āđˆāļ­āļ­āđˆāļēāļ™āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡ EXPLAIN ANALYZE āļĄāļĩāļˆāļļāļ”āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļŠāļąāļ‡āđ€āļāļ•āļ”āļąāļ‡āļ™āļĩāđ‰

  • Seq Scan vs Index Scan: Seq Scan āļšāļ™āļ•āļēāļĢāļēāļ‡āļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļĄāļąāļāđ€āļ›āđ‡āļ™āļŠāļąāļāļāļēāļ“āļ‚āļ­āļ‡ Query āļ—āļĩāđˆāļŠāđ‰āļē āļ„āļ§āļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļĄāļĩ Index āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāļŦāļĢāļ·āļ­āđ„āļĄāđˆ
  • Actual Time: āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāđ€āļ§āļĨāļēāļˆāļĢāļīāļ‡āļāļąāļš Estimated Cost āđ€āļžāļ·āđˆāļ­āļ”āļđāļ§āđˆāļē Planner āļ›āļĢāļ°āđ€āļĄāļīāļ™āđ„āļ”āđ‰āđāļĄāđˆāļ™āļĒāļģāļŦāļĢāļ·āļ­āđ„āļĄāđˆ
  • Rows: āļˆāļģāļ™āļ§āļ™āđāļ–āļ§āļˆāļĢāļīāļ‡āļ—āļĩāđˆāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ€āļ—āļĩāļĒāļšāļāļąāļšāļ—āļĩāđˆ Planner āļ„āļēāļ”āļāļēāļĢāļ“āđŒ āļ–āđ‰āļēāļ•āđˆāļēāļ‡āļāļąāļ™āļĄāļēāļāļ­āļēāļˆāļ•āđ‰āļ­āļ‡āļ­āļąāļ›āđ€āļ”āļ• Statistics
  • Buffers: āļˆāļģāļ™āļ§āļ™ Shared Hit (āļ­āđˆāļēāļ™āļˆāļēāļ Cache) āđ€āļ—āļĩāļĒāļšāļāļąāļš Shared Read (āļ­āđˆāļēāļ™āļˆāļēāļ Disk) āļĒāļīāđˆāļ‡āļĄāļĩ Hit āļĄāļēāļāļĒāļīāđˆāļ‡āļ”āļĩ
  • Sort Method: āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāđ€āļ›āđ‡āļ™ In-Memory Sort āļŦāļĢāļ·āļ­ Disk Sort āđ€āļžāļĢāļēāļ° Disk Sort āļŠāđ‰āļēāļāļ§āđˆāļēāļĄāļēāļ

Indexing Strategies āļŠāļģāļŦāļĢāļąāļš Query āļ—āļĩāđˆāđƒāļŠāđ‰āļšāđˆāļ­āļĒ

āļŦāļĨāļąāļ‡āļˆāļēāļāļĢāļ°āļšāļļ Bottleneck āļˆāļēāļ EXPLAIN Plan āđāļĨāđ‰āļ§ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ–āļąāļ”āđ„āļ›āļ„āļ·āļ­āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Index āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄ āļāļēāļĢāļ­āļ­āļāđāļšāļš Index āļ—āļĩāđˆāļ”āļĩāļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļĨāļĩāđˆāļĒāļ™ Query āļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļ§āļĨāļēāļŦāļĨāļēāļĒāļ§āļīāļ™āļēāļ—āļĩāđƒāļŦāđ‰āđ€āļŦāļĨāļ·āļ­āđ€āļžāļĩāļĒāļ‡āđ„āļĄāđˆāļāļĩāđˆāļĄāļīāļĨāļĨāļīāļ§āļīāļ™āļēāļ—āļĩ

sql
-- indexing_strategies.sql
-- Index on order_date: filters a small percentage of rows
CREATE INDEX idx_orders_date ON orders (order_date);

-- Composite index for queries filtering on both columns
CREATE INDEX idx_orders_customer_date
  ON orders (customer_id, order_date);

-- Covering index: includes columns needed in SELECT
-- Enables Index Only Scan (no table access)
CREATE INDEX idx_orders_covering
  ON orders (customer_id, order_date)
  INCLUDE (total_amount, status);

āļŠāļīāđˆāļ‡āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđƒāļˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš Composite Index āļ„āļ·āļ­ āļĨāļģāļ”āļąāļšāļ‚āļ­āļ‡āļ„āļ­āļĨāļąāļĄāļ™āđŒāļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļĄāļēāļ Index (customer_id, order_date) āļˆāļ°āļ–āļđāļāđƒāļŠāđ‰āđ€āļĄāļ·āđˆāļ­āļāļĢāļ­āļ‡āļ”āđ‰āļ§āļĒ customer_id āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āļŦāļĢāļ·āļ­āļāļĢāļ­āļ‡āļ”āđ‰āļ§āļĒāļ—āļąāđ‰āļ‡ customer_id āđāļĨāļ° order_date āđāļ•āđˆāļˆāļ°āđ„āļĄāđˆāļ–āļđāļāđƒāļŠāđ‰āđ€āļĄāļ·āđˆāļ­āļāļĢāļ­āļ‡āļ”āđ‰āļ§āļĒ order_date āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āđƒāļŦāđ‰āļ™āļķāļāļ–āļķāļ‡āļŦāļĨāļąāļ "Leftmost Prefix" āđ€āļŠāļĄāļ­

Partial Index: Index āđ€āļ‰āļžāļēāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ

Partial Index āļ„āļ·āļ­ Index āļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āđ€āļ‰āļžāļēāļ°āļšāļēāļ‡āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļ•āļēāļĢāļēāļ‡ āđ‚āļ”āļĒāđƒāļŠāđ‰āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚ WHERE āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļ‚āļ­āļšāđ€āļ‚āļ• āļ§āļīāļ˜āļĩāļ™āļĩāđ‰āļ—āļģāđƒāļŦāđ‰ Index āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļĨāļ‡ āđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ™āđ‰āļ­āļĒāļĨāļ‡ āđāļĨāļ°āļ„āđ‰āļ™āļŦāļēāđ„āļ”āđ‰āđ€āļĢāđ‡āļ§āļ‚āļķāđ‰āļ™

sql
-- partial_index.sql
-- Only index active orders (smaller, faster index)
CREATE INDEX idx_orders_active
  ON orders (customer_id, order_date)
  WHERE status = 'active';

-- Only index recent data for dashboard queries
CREATE INDEX idx_orders_recent
  ON orders (order_date)
  WHERE order_date >= '2026-01-01';

Partial Index āđ€āļŦāļĄāļēāļ°āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļāļĢāļ“āļĩāļ—āļĩāđˆ Query āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ€āļ‰āļžāļēāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļšāļēāļ‡āļŠāđˆāļ§āļ™āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđ€āļŠāđˆāļ™ Dashboard āļ—āļĩāđˆāđāļŠāļ”āļ‡āđ€āļ‰āļžāļēāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļŦāļĢāļ·āļ­āļĢāļ°āļšāļšāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ„āđ‰āļ™āļŦāļēāđ€āļ‰āļžāļēāļ°āļĢāļēāļĒāļāļēāļĢāļ—āļĩāđˆāļĒāļąāļ‡āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ­āļĒāļđāđˆ

Anti-Pattern āļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰ Index āđ„āļĄāđˆāļ—āļģāļ‡āļēāļ™

āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āļāļēāļĢāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļąāļšāļ„āļ­āļĨāļąāļĄāļ™āđŒāļ—āļĩāđˆāļĄāļĩ Index āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāđƒāļŦāđ‰ Database āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ Index āđ„āļ”āđ‰āđ€āļĨāļĒ āļ•āđ‰āļ­āļ‡āļ—āļģ Seq Scan āđāļ—āļ™ āļ•āļĢāļ§āļˆāļŠāļ­āļš Query āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļŦāđ‰āđāļ™āđˆāđƒāļˆāļ§āđˆāļēāđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļŦāđˆāļ­āļ„āļ­āļĨāļąāļĄāļ™āđŒāļ—āļĩāđˆāļĄāļĩ Index āļ”āđ‰āļ§āļĒāļŸāļąāļ‡āļāđŒāļŠāļąāļ™

Query Anti-Patterns āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡

āļāļēāļĢāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļąāļšāļ„āļ­āļĨāļąāļĄāļ™āđŒāļ—āļĩāđˆāļĄāļĩ Index

āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļ™āļĩāđ‰āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļšāđˆāļ­āļĒāļĄāļēāļāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ Query āļāļĢāļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļēāļĄāļ§āļąāļ™āļ—āļĩāđˆ āļāļēāļĢāđƒāļŠāđ‰ EXTRACT āļŦāļĢāļ·āļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ­āļ·āđˆāļ™ āđ† āļāļąāļšāļ„āļ­āļĨāļąāļĄāļ™āđŒāļ—āļĩāđˆāļĄāļĩ Index āļˆāļ°āļ—āļģāđƒāļŦāđ‰ Database āļ•āđ‰āļ­āļ‡āļ„āļģāļ™āļ§āļ“āļ„āđˆāļēāļ‚āļ­āļ‡āļ—āļļāļāđāļ–āļ§āļāđˆāļ­āļ™āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļš āļŠāđˆāļ‡āļœāļĨāđƒāļŦāđ‰ Index āđ„āļĄāđˆāļ–āļđāļāđƒāļŠāđ‰āļ‡āļēāļ™

sql
-- anti_patterns.sql
-- BAD: function on indexed column disables the index
SELECT * FROM orders
WHERE EXTRACT(YEAR FROM order_date) = 2026;

-- GOOD: range comparison uses the index
SELECT * FROM orders
WHERE order_date >= '2026-01-01'
  AND order_date < '2027-01-01';

āļāļąāļšāļ”āļąāļ NOT IN āļāļąāļš NULL

āļ­āļĩāļāļŦāļ™āļķāđˆāļ‡ Anti-Pattern āļ—āļĩāđˆāļ­āļąāļ™āļ•āļĢāļēāļĒāļĄāļēāļāļ„āļ·āļ­āļāļēāļĢāđƒāļŠāđ‰ NOT IN āļāļąāļš Subquery āļ—āļĩāđˆāļ­āļēāļˆāļĄāļĩāļ„āđˆāļē NULL āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļāļēāļĢāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāđƒāļ” āđ† āļāļąāļš NULL āđƒāļ™ SQL āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāđ€āļ›āđ‡āļ™ UNKNOWN āđ„āļĄāđˆāđƒāļŠāđˆ TRUE āļŦāļĢāļ·āļ­ FALSE āļ”āļąāļ‡āļ™āļąāđ‰āļ™ āļŦāļēāļāļĄāļĩāļ„āđˆāļē NULL āđāļĄāđ‰āđāļ•āđˆāļ„āđˆāļēāđ€āļ”āļĩāļĒāļ§āđƒāļ™ Subquery āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡ NOT IN āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāļļāļ”āļ§āđˆāļēāļ‡āđ€āļŠāļĄāļ­

sql
-- not_in_null_trap.sql
-- BAD: returns empty if any customer_id is NULL in subquery
SELECT * FROM customers
WHERE customer_id NOT IN (
  SELECT customer_id FROM orders
);

-- GOOD: NOT EXISTS handles NULLs correctly
SELECT * FROM customers c
WHERE NOT EXISTS (
  SELECT 1 FROM orders o
  WHERE o.customer_id = c.customer_id
);

āđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ āļāļēāļĢāļĢāļđāđ‰āļˆāļąāļ Anti-Pattern āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđāļĨāļ°āļ­āļ˜āļīāļšāļēāļĒāđ„āļ”āđ‰āļ§āđˆāļēāđ€āļŦāļ•āļļāđƒāļ”āļˆāļķāļ‡āđ€āļ›āđ‡āļ™āļ›āļąāļāļŦāļēāļˆāļ°āļŠāđˆāļ§āļĒāļŠāļĢāđ‰āļēāļ‡āļ„āļ§āļēāļĄāļ™āđˆāļēāđ€āļŠāļ·āđˆāļ­āļ–āļ·āļ­āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļēāļ āđ€āļžāļĢāļēāļ°āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļœāļđāđ‰āļŠāļĄāļąāļ„āļĢāļĄāļĩāļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļˆāļĢāļīāļ‡āđƒāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨ

āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļāļķāļāļāļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āļāļēāļĢāļāļķāļāđ€āļ‚āļĩāļĒāļ™ Query āļˆāļĢāļīāļ‡āļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļĢāļīāļ‡ āļĨāļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļ”āļŠāļ­āļš āļŠāļĢāđ‰āļēāļ‡ Index āđāļĨāđ‰āļ§āđƒāļŠāđ‰ EXPLAIN ANALYZE āļ”āļđāļœāļĨāļāļĢāļ°āļ—āļš āļāļēāļĢāđ€āļŦāđ‡āļ™āļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļ‚āļ­āļ‡ Execution Time āļ”āđ‰āļ§āļĒāļ•āļ™āđ€āļ­āļ‡āļˆāļ°āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāđƒāļˆāđ„āļ”āđ‰āļĨāļķāļāļ‹āļķāđ‰āļ‡āļāļ§āđˆāļēāļāļēāļĢāļ­āđˆāļēāļ™āļ—āļĪāļĐāļŽāļĩāđ€āļžāļĩāļĒāļ‡āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āđāļ™āļ°āļ™āļģāđƒāļŦāđ‰āđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāļ§āđƒāļ™āļŦāļąāļ§āļ‚āđ‰āļ­āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ•āļēāļĄāļĨāļģāļ”āļąāļš: Subquery Patterns → Pivot Queries → EXPLAIN Plan → Indexing → Anti-Patterns

āļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āļžāļīāļŠāļīāļ•āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Data Analytics āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āļĒāļąāļ‡āļ„āļĢāļąāļš?

āļāļķāļāļāļ™āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āđāļšāļšāđ‚āļ•āđ‰āļ•āļ­āļš, flashcards āđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

āļŠāļĢāļļāļ›

āļŦāļąāļ§āļ‚āđ‰āļ­ SQL āļ‚āļąāđ‰āļ™āļŠāļđāļ‡āļ—āļĩāđˆāļāļĨāđˆāļēāļ§āļĄāļēāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļĨāđ‰āļ§āļ™āđ€āļ›āđ‡āļ™āļ—āļąāļāļĐāļ°āļŠāļģāļ„āļąāļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ•āļģāđāļŦāļ™āđˆāļ‡ Data Analyst āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāļļāļ›āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļŦāļĨāļąāļāđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰

  • Correlated Subquery āļāļąāļš Regular Subquery — āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđƒāļˆāļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļ”āđ‰āļēāļ™āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āđāļĨāļ°āļĢāļđāđ‰āļ§āļīāļ˜āļĩāđ€āļ›āļĨāļĩāđˆāļĒāļ™ Correlated Subquery āđ€āļ›āđ‡āļ™ CTE + JOIN āđ€āļĄāļ·āđˆāļ­āđ€āļŦāļĄāļēāļ°āļŠāļĄ
  • EXISTS āļāļąāļš IN — EXISTS āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāļĄāļĩāļ­āļĒāļđāđˆāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĄāļēāļāļāļ§āđˆāļē IN āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļāļąāļšāļŠāļļāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ āđāļĨāļ° NOT EXISTS āļˆāļąāļ”āļāļēāļĢ NULL āđ„āļ”āđ‰āļ–āļđāļāļ•āđ‰āļ­āļ‡āļāļ§āđˆāļē NOT IN
  • Pivot Query — āđ€āļ—āļ„āļ™āļīāļ„ Conditional Aggregation āļ”āđ‰āļ§āļĒ CASE āđ€āļ›āđ‡āļ™āļ§āļīāļ˜āļĩāļĄāļēāļ•āļĢāļāļēāļ™āļ—āļĩāđˆāđƒāļŠāđ‰āđ„āļ”āđ‰āļāļąāļšāļ—āļļāļ Database āļŠāđˆāļ§āļ™ CROSSTAB āđ€āļ›āđ‡āļ™āļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŠāļģāļŦāļĢāļąāļš PostgreSQL
  • EXPLAIN Plan — āļ—āļąāļāļĐāļ°āļāļēāļĢāļ­āđˆāļēāļ™ Execution Plan āļˆāļ°āļŠāđˆāļ§āļĒāļĢāļ°āļšāļļ Bottleneck āđāļĨāļ°āļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāđ€āļĨāļ·āļ­āļāļ§āļīāļ˜āļĩāđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđāļĄāđˆāļ™āļĒāļģ
  • Indexing — āļāļēāļĢāļ­āļ­āļāđāļšāļš Index āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄ āļ—āļąāđ‰āļ‡ Single Column, Composite, Covering āđāļĨāļ° Partial Index āļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ‚āļ­āļ‡ Query āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļŦāļēāļĻāļēāļĨ
  • Anti-Patterns — āļāļēāļĢāļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļāļēāļĢāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļąāļšāļ„āļ­āļĨāļąāļĄāļ™āđŒāļ—āļĩāđˆāļĄāļĩ Index āđāļĨāļ°āļāļēāļĢāļĢāļ°āļ§āļąāļ‡āļāļąāļšāļ”āļąāļ NOT IN āļāļąāļš NULL āđ€āļ›āđ‡āļ™āļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļĩāđˆāđāļŠāļ”āļ‡āļ–āļķāļ‡āļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļˆāļĢāļīāļ‡

āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāđƒāļ™āļŦāļąāļ§āļ‚āđ‰āļ­āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļŠāđˆāļ§āļĒāđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāļĄāļąāđˆāļ™āđƒāļˆāđāļĨāļ°āđ‚āļ­āļāļēāļŠāđƒāļ™āļāļēāļĢāļœāđˆāļēāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ•āļģāđāļŦāļ™āđˆāļ‡ Data Analyst āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ™āļąāļĒāļŠāļģāļ„āļąāļ

āđ€āļĢāļīāđˆāļĄāļāļķāļāļ‹āđ‰āļ­āļĄāđ€āļĨāļĒ!

āļ—āļ”āļŠāļ­āļšāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ‚āļ­āļ‡āļ„āļļāļ“āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

āļŠāļēāđ€āļĨāļ™āļˆāđŒāļ›āļĢāļ°āļˆāļģāļ§āļąāļ™

āļ„āļļāļ“āļŦāļēāļšāļąāđŠāļāđƒāļ™ Data Analytics āđ€āļˆāļ­āđ„āļŦāļĄ

āđ‚āļ„āđ‰āļ”āļˆāļĢāļīāļ‡āļŦāļ™āļķāđˆāļ‡āļŠāļīāđ‰āļ™ āļšāļąāđŠāļāļ—āļĩāđˆāļ‹āđˆāļ­āļ™āļ­āļĒāļđāđˆāļŦāļ™āļķāđˆāļ‡āļˆāļļāļ” āļ§āļąāļ™āļĨāļ°āļŦāļ™āļķāđˆāļ‡āļ„āļĢāļąāđ‰āļ‡ āļĨāļ­āļ‡āđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļšāļąāļāļŠāļĩ

Anthony Fillion-Maillet

āđ€āļ‚āļĩāļĒāļ™āđ‚āļ”āļĒ

Anthony Fillion-Maillet

āļœāļđāđ‰āļāđˆāļ­āļ•āļąāđ‰āļ‡ SharpSkill

āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļŸāļđāļĨāļŠāđāļ•āļāļĄāļēāļāļ§āđˆāļē 10 āļ›āļĩ āļ”āļđāđāļĨ SharpSkill āđāļĨāļ°āļĢāļąāļšāļœāļīāļ”āļŠāļ­āļšāļ—āļļāļāļŠāļīāđˆāļ‡āļ—āļĩāđˆāđ€āļœāļĒāđāļžāļĢāđˆāļ—āļĩāđˆāļ™āļĩāđˆ

āļ­āļąāļ›āđ€āļ”āļ•āđ€āļĄāļ·āđˆāļ­ 15 āļžāļĪāļĐāļ āļēāļ„āļĄ 2569

āđāļ—āđ‡āļ

#sql
#data-analytics
#interview
#query-optimization
#subqueries

āđāļŠāļĢāđŒ

āļšāļ—āļ„āļ§āļēāļĄāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

dbt data modeling testing āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™āļŠāļģāļŦāļĢāļąāļš data analyst

dbt āļŠāļģāļŦāļĢāļąāļš Data Analyst āđƒāļ™āļ›āļĩ 2026: āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļĄāđ€āļ”āļĨ āļāļēāļĢāļ—āļ”āļŠāļ­āļš āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™

āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰ dbt āļŠāļģāļŦāļĢāļąāļš Data Analyst āļ•āļąāđ‰āļ‡āđāļ•āđˆāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļĄāđ€āļ”āļĨ āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āđ„āļ›āļˆāļ™āļ–āļķāļ‡āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āđāļĨāļ°āđāļ™āļ§āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩ

āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ Data Analytics āļ—āļĩāđˆāļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ SQL queries, Python scripts āđāļĨāļ°āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨ Dashboard

25 āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ Data Analytics āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļ›āļĩ 2026

āļĢāļ§āļĄāļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ Data Analytics āļ—āļĩāđˆāļ–āļđāļāļ–āļēāļĄāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļ›āļĩ 2026 āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ SQL, Python, Power BI, āļŠāļ–āļīāļ•āļī āđāļĨāļ°āļ„āļģāļ–āļēāļĄāđ€āļŠāļīāļ‡āļžāļĪāļ•āļīāļāļĢāļĢāļĄ āļžāļĢāđ‰āļ­āļĄāļ„āļģāļ•āļ­āļšāđ‚āļ”āļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđāļĨāļ°āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”

Pandas 3.0 API āđƒāļŦāļĄāđˆāđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ data analytics 2026

Pandas 3.0 āđƒāļ™āļ›āļĩ 2026: API āđƒāļŦāļĄāđˆ, Breaking Changes āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™

āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš Pandas 3.0 āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ Copy-on-Write, PyArrow string backend, pd.col() expressions, breaking changes āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ data analytics