✅ 16. Write a query to find the 2nd highest salary from Employee table using subquery OR window function.
⭐ Using Subquery
SELECT MAX(salary) AS second_highest_salary⭐ Using Window Function
FROM employees
WHERE salary < (SELECT MAX(salary) FROM employees);
SELECT salary✅ 17. Explain INNER JOIN vs LEFT JOIN vs FULL JOIN with examples for employees and departments.
FROM (
SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employees
) t
WHERE rnk = 2;
⭐ INNER JOIN → Only matching records
SELECT e.name, d.department_name⭐ LEFT JOIN → All employees + matching departments
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
SELECT e.name, d.department_name⭐ FULL JOIN → All records from both tables
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
SELECT e.name, d.department_name✅ 18. Find and remove duplicate records using CTE + ROW_NUMBER().
FROM employees e
FULL JOIN departments d ON e.department_id = d.id;
⭐ Find Duplicates
WITH cte AS (⭐ Remove Duplicates
SELECT *, ROW_NUMBER() OVER(PARTITION BY email ORDER BY id) rn
FROM employees
)
SELECT * FROM cte WHERE rn > 1;
WITH cte AS (✅ 19. Explain WHERE vs HAVING with GROUP BY. Show department-wise avg salary > 50k.
SELECT *, ROW_NUMBER() OVER(PARTITION BY email ORDER BY id) rn
FROM employees
)
DELETE FROM cte WHERE rn > 1;
👉 Difference
WHERE → filter before grouping
HAVING → filter after grouping
SELECT department_id, AVG(salary) AS avg_salary✅ 20. Explain RANK vs DENSE_RANK vs ROW_NUMBER partitioned by department ordered by salary.
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 50000;
SELECT name, department_id, salary,✅ 21. Find top 5 products by total sales using GROUP BY + LIMIT.
ROW_NUMBER() OVER(PARTITION BY department_id ORDER BY salary DESC) rn,
RANK() OVER(PARTITION BY department_id ORDER BY salary DESC) rnk,
DENSE_RANK() OVER(PARTITION BY department_id ORDER BY salary DESC) drnk
FROM employees;
SELECT product_id, SUM(sales_amount) AS total_sales✅ 22. Write a self join to show employee name and manager name.
FROM sales
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 5;
SELECT e.name AS employee, m.name AS manager✅ 23. Handle NULL salaries using COALESCE, IS NULL, IFNULL.
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;
⭐ Using COALESCE
SELECT name, COALESCE(salary, 0) AS salary⭐ Using IS NULL
FROM employees;
SELECT * FROM employees WHERE salary IS NULL;✅ 24. Pivot sales data by month using CASE statement.
SELECT✅ 25. Subquery vs JOIN — which is faster? Why?
SUM(CASE WHEN month = 'Jan' THEN sales ELSE 0 END) AS Jan,
SUM(CASE WHEN month = 'Feb' THEN sales ELSE 0 END) AS Feb,
SUM(CASE WHEN month = 'Mar' THEN sales ELSE 0 END) AS Mar
FROM sales;
JOIN is usually faster, subquery is easier to read.
✅ 26. Write a recursive CTE for company hierarchy (CEO → managers → employees).
WITH RECURSIVE emp_hierarchy AS (✅ 27. Explain clustered vs non-clustered indexes. When to use each?
SELECT employee_id, name, manager_id
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.employee_id, e.name, e.manager_id
FROM employees e
JOIN emp_hierarchy h ON e.manager_id = h.employee_id
)
SELECT * FROM emp_hierarchy;
⭐ Clustered Index: physically sorts table data
⭐ Non-Clustered Index: separate structure pointing to data
SQL Resources: https://whatsapp.com/channel/0029VanC5rODzgT6TiTGoa1v
Double Tap ♥️ For More