Top 50 SQL Queries
comprehensive list of the Top 50 SQL Queries commonly asked in interviews—from fresher to mid-level and advanced roles, with detailed explanations and real-life analogies to simplify your understanding.
🔹 SECTION 1: BASIC SQL QUERIES (1–15)
These test fundamental understanding of data retrieval, filtering, and sorting.
1. SELECT all columns from a table
SELECT * FROM Employees;
🔸 Analogy: Think of this as opening an Excel sheet and looking at all columns and rows.
2. SELECT specific columns
SELECT Emp_Name, Salary FROM Employees;
🔸 Analogy: Like highlighting just the "Name" and "Salary" columns from a sheet to print.
3. WHERE clause (filtering)
SELECT * FROM Employees WHERE Dept_No = 10;
🔸 Analogy: Filtering all employees who belong to Dept 10—like filtering rows in Excel.
4. ORDER BY clause
SELECT * FROM Employees ORDER BY Salary DESC;
🔸 Analogy: Sorting employee salaries from highest to lowest.
5. DISTINCT values
SELECT DISTINCT Job FROM Employees;
🔸 Analogy: Listing all unique job titles like “Analyst,” “Manager” without repeats.
6. COUNT aggregate
SELECT COUNT(*) FROM Employees;
🔸 Analogy: Counting how many total employees are present—like checking row count in Excel.
7. GROUP BY + COUNT
SELECT Job, COUNT(*) FROM Employees GROUP BY Job;
🔸 Analogy: Tallying how many people hold each job type—like pivot tables.
8. HAVING clause
SELECT Job, COUNT(*) FROM Employees GROUP BY Job HAVING COUNT(*) > 1;
🔸 Analogy: Like saying “only show jobs with more than one employee.”
9. LIKE operator
SELECT * FROM Employees WHERE Emp_Name LIKE 'S%';
🔸 Analogy: Finding names starting with ‘S’ — similar to filter using “Starts with S”.
10. IN clause
SELECT * FROM Employees WHERE Dept_No IN (10, 30);
🔸 Analogy: Like saying "I want data for departments 10 and 30 only".
11. BETWEEN clause
SELECT * FROM Employees WHERE Salary BETWEEN 30000 AND 50000;
🔸 Analogy: Show salaries in a given range—like applying number filters.
12. IS NULL / IS NOT NULL
SELECT * FROM Employees WHERE Manager_ID IS NULL;
🔸 Analogy: Like checking for blank cells in a column.
13. LIMIT (TOP N Records)
SELECT * FROM Employees ORDER BY Salary DESC LIMIT 5;
🔸 Analogy: "Show me top 5 highest paid employees."
14. Simple INNER JOIN
SELECT E.Emp_Name, D.Dept_Name
FROM Employees E
JOIN Departments D ON E.Dept_No = D.Dept_No;
🔸 Analogy: Combining two Excel sheets based on a common column.
15. Aliases
SELECT Emp_Name AS Name, Salary AS Monthly_Income FROM Employees;
🔸 Analogy: Like renaming column headers in a report.
🔹 SECTION 2: INTERMEDIATE LEVEL QUERIES (16–30)
16. Subquery (single value)
SELECT * FROM Employees
WHERE Salary > (SELECT AVG(Salary) FROM Employees);
🔸 Analogy: Like filtering people who earn more than the average salary.
17. Subquery (IN clause)
SELECT * FROM Employees
WHERE Dept_No IN (SELECT Dept_No FROM Departments WHERE Location = 'Delhi');
🔸 Analogy: Pulling employees only from departments located in Delhi.
18. CASE statement
SELECT Emp_Name,
CASE
WHEN Salary >= 50000 THEN 'High'
WHEN Salary >= 30000 THEN 'Medium'
ELSE 'Low'
END AS Salary_Level
FROM Employees;
🔸 Analogy: Like writing an IF-ELSE ladder to classify data.
19. UNION / UNION ALL
SELECT City FROM Customers
UNION
SELECT City FROM Suppliers;
🔸 Analogy: Merging two mailing lists without duplicates.
20. EXISTS
SELECT * FROM Employees E
WHERE EXISTS (SELECT 1 FROM Projects P WHERE E.Emp_ID = P.Emp_ID);
🔸 Analogy: Checking if a record exists in a related table (like checking if someone has submitted any project).
21. NOT EXISTS
SELECT * FROM Employees E
WHERE NOT EXISTS (SELECT 1 FROM Projects P WHERE E.Emp_ID = P.Emp_ID);
22. DELETE with condition
DELETE FROM Employees WHERE Emp_Name = 'John';
23. UPDATE with condition
UPDATE Employees SET Salary = Salary * 1.10 WHERE Job = 'Analyst';
24. INSERT INTO SELECT
INSERT INTO BackupEmployees
SELECT * FROM Employees WHERE Dept_No = 10;
25. Self Join
SELECT E1.Emp_Name, E2.Emp_Name AS Manager
FROM Employees E1
JOIN Employees E2 ON E1.Manager_ID = E2.Emp_ID;
🔸 Analogy: Finding who reports to whom in the same table.
26. Find Nth Highest Salary
SELECT * FROM (
SELECT Emp_Name, Salary, DENSE_RANK() OVER (ORDER BY Salary DESC) AS rnk
FROM Employees
) AS T WHERE rnk = 2;
27. String Functions
SELECT UPPER(Emp_Name), LENGTH(Job) FROM Employees;
28. Date Functions
SELECT Emp_Name, MONTH(Joining_Date), YEAR(Joining_Date)
FROM Employees;
29. CASE inside ORDER BY
SELECT * FROM Employees
ORDER BY
CASE
WHEN Job = 'Manager' THEN 1
WHEN Job = 'Analyst' THEN 2
ELSE 3
END;
30. IFNULL / COALESCE
SELECT Emp_Name, COALESCE(Manager_ID, 'No Manager') FROM Employees;
🔹 SECTION 3: ADVANCED / INDUSTRY USAGE (31–50)
31. CTE (Common Table Expression)
WITH TopEarners AS (
SELECT Emp_Name, Salary
FROM Employees
WHERE Salary > 50000
)
SELECT * FROM TopEarners;
32. Window Functions (OVER + PARTITION)
SELECT Emp_Name, Dept_No, Salary,
RANK() OVER (PARTITION BY Dept_No ORDER BY Salary DESC) AS DeptRank
FROM Employees;
33. Pivot Table using CASE
SELECT Dept_No,
SUM(CASE WHEN Job = 'Analyst' THEN 1 ELSE 0 END) AS Analysts,
SUM(CASE WHEN Job = 'Manager' THEN 1 ELSE 0 END) AS Managers
FROM Employees GROUP BY Dept_No;
34. Find Duplicate Rows
SELECT Emp_Name, COUNT(*)
FROM Employees
GROUP BY Emp_Name
HAVING COUNT(*) > 1;
35. Running Total
SELECT Emp_Name, Salary,
SUM(Salary) OVER (ORDER BY Emp_ID) AS Running_Total
FROM Employees;
36. Top N per Category
SELECT * FROM (
SELECT *, RANK() OVER (PARTITION BY Dept_No ORDER BY Salary DESC) AS rnk
FROM Employees
) AS T WHERE rnk <= 2;
37. Delete Duplicates
DELETE FROM Employees
WHERE Emp_ID NOT IN (
SELECT MIN(Emp_ID) FROM Employees GROUP BY Emp_Name, Job
);
38. Find Employees Without Department
SELECT * FROM Employees
WHERE Dept_No NOT IN (SELECT Dept_No FROM Departments);
39. Complex JOIN with Aggregates
SELECT D.Dept_Name, COUNT(E.Emp_ID) AS Num_Employees, AVG(E.Salary)
FROM Employees E
JOIN Departments D ON E.Dept_No = D.Dept_No
GROUP BY D.Dept_Name;
40. Cross Join (Cartesian Product)
SELECT * FROM Products CROSS JOIN Suppliers;
41. Find Gaps in Sequence
SELECT Emp_ID + 1 AS Missing_ID
FROM Employees E1
WHERE NOT EXISTS (
SELECT 1 FROM Employees E2 WHERE E2.Emp_ID = E1.Emp_ID + 1
);
42. JSON Query (MySQL/PostgreSQL)
SELECT JSON_EXTRACT(Profile_Data, '$.skills[0]') FROM Users;
43. Recursive CTE (Hierarchy)
WITH RECURSIVE OrgChart AS (
SELECT Emp_ID, Emp_Name, Manager_ID
FROM Employees
WHERE Manager_ID IS NULL
UNION ALL
SELECT E.Emp_ID, E.Emp_Name, E.Manager_ID
FROM Employees E
JOIN OrgChart O ON E.Manager_ID = O.Emp_ID
)
SELECT * FROM OrgChart;
44. ROLLUP
SELECT Dept_No, Job, COUNT(*)
FROM Employees
GROUP BY ROLLUP (Dept_No, Job);
45. CUBE
SELECT Dept_No, Job, COUNT(*)
FROM Employees
GROUP BY CUBE (Dept_No, Job);
46. MERGE statement (SQL Server / Oracle)
MERGE INTO TargetTable T
USING SourceTable S
ON T.ID = S.ID
WHEN MATCHED THEN UPDATE SET T.Name = S.Name
WHEN NOT MATCHED THEN INSERT (ID, Name) VALUES (S.ID, S.Name);
47. Stored Procedure to return salary stats
CREATE PROCEDURE GetSalaryStats()
BEGIN
SELECT AVG(Salary), MIN(Salary), MAX(Salary) FROM Employees;
END;
48. Trigger (example before insert)
CREATE TRIGGER before_insert_emp
BEFORE INSERT ON Employees
FOR EACH ROW
SET NEW.Created_At = NOW();
49. Dynamic SQL Execution
SET @sql = 'SELECT * FROM ' + @tableName;
PREPARE stmt FROM @sql;
EXECUTE stmt;
50. Find % Contribution of Salary per Dept
SELECT Emp_Name, Salary,
ROUND(Salary * 100.0 / SUM(Salary) OVER (PARTITION BY Dept_No), 2) AS Pct_Contribution
FROM Employees;