50 Important SQL Query Interview Questions (With Answers)
This document includes detailed answers with syntax, explanations, and sample outputs to the most
commonly asked SQL interview questions for roles like SDE, Full Stack Developer, and TCS Prime.
Basic SQL Query Questions
1. Fetch all records from a table:
SELECT * FROM employees;
Output: All rows and columns from employees table.
2. Select specific columns:
SELECT name, salary FROM employees;
3. Filter data with WHERE :
SELECT * FROM employees WHERE department = 'HR';
4. Unique values using DISTINCT :
SELECT DISTINCT department FROM employees;
5. Sort using ORDER BY :
SELECT * FROM employees ORDER BY salary DESC;
6. Multiple conditions:
SELECT * FROM employees WHERE department = 'HR' AND salary > 30000;
1
7. = vs LIKE :
-- Using =
SELECT * FROM employees WHERE name = 'John';
-- Using LIKE
SELECT * FROM employees WHERE name LIKE 'Jo%';
8. Pattern search using LIKE :
SELECT * FROM employees WHERE name LIKE 'A%';
9. Count total rows:
SELECT COUNT(*) FROM employees;
10. Average, Min, Max:
SELECT AVG(salary), MIN(salary), MAX(salary) FROM employees;
SQL Functions & Aggregation
1. GROUP BY usage:
SELECT department, COUNT(*) FROM employees GROUP BY department;
2. Group by with aggregation:
SELECT department, SUM(salary) FROM employees GROUP BY department;
3. GROUP BY vs HAVING :
4. GROUP BY groups rows.
5. HAVING filters after grouping.
6. Filter groups using HAVING :
2
SELECT department, COUNT(*) FROM employees GROUP BY department HAVING
COUNT(*) > 5;
7. What is NULL & filter it:
SELECT * FROM employees WHERE manager_id IS NULL;
8. Replace NULLs using COALESCE :
SELECT name, COALESCE(manager_id, 0) FROM employees;
9. IS NULL vs = NULL : Use IS NULL , = NULL is invalid.
10. Employees in each department:
SELECT department, COUNT(*) FROM employees GROUP BY department;
11. Highest salary:
SELECT MAX(salary) FROM employees;
12. Second highest salary:
SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM
employees);
Joins
1. What is JOIN:
SELECT e.name, d.name FROM employees e JOIN departments d ON e.dept_id =
d.id;
2. INNER vs LEFT JOIN :
3
3. INNER: Only matching rows.
4. LEFT: All left rows + matched right rows.
5. LEFT JOIN for unmatched:
SELECT e.name FROM employees e LEFT JOIN departments d ON e.dept_id = d.id
WHERE d.id IS NULL;
6. RIGHT JOIN:
SELECT * FROM employees e RIGHT JOIN departments d ON e.dept_id = d.id;
7. FULL OUTER JOIN:
SELECT * FROM employees e FULL OUTER JOIN departments d ON e.dept_id =
d.id;
8. SELF JOIN:
SELECT e.name, m.name AS manager FROM employees e JOIN employees m ON
e.manager_id = m.id;
9. Join more than 2 tables:
SELECT e.name, d.name, l.city FROM employees e JOIN departments d ON
e.dept_id = d.id JOIN locations l ON d.loc_id = l.id;
10. Employee & Manager names:
SELECT e.name, m.name AS manager FROM employees e LEFT JOIN employees m ON
e.manager_id = m.id;
11. ON vs USING:
-- ON
SELECT * FROM employees e JOIN departments d ON e.dept_id = d.id;
4
-- USING (common column name only)
SELECT * FROM employees JOIN departments USING (dept_id);
12. Combine data from multiple tables:
SELECT e.name, d.name FROM employees e JOIN departments d ON e.dept_id =
d.id;
Subqueries & Nested Queries
1. Subquery inside WHERE :
SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM
employees);
2. Subquery in FROM :
SELECT dept, avg_sal FROM (SELECT department AS dept, AVG(salary) AS
avg_sal FROM employees GROUP BY department) AS dept_avg;
3. Correlated subquery:
SELECT name FROM employees e WHERE salary > (SELECT AVG(salary) FROM
employees WHERE department = e.department);
4. Correlated vs Non-correlated:
5. Non-correlated: Independent.
6. Correlated: Depends on outer query.
7. Employees earning above average:
SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM
employees);
8. Department-wise max salary:
5
SELECT * FROM employees e WHERE salary = (SELECT MAX(salary) FROM
employees WHERE department = e.department);
9. Use of EXISTS:
SELECT name FROM employees e WHERE EXISTS (SELECT 1 FROM departments d
WHERE d.id = e.dept_id);
10. IN and NOT IN :
SELECT name FROM employees WHERE dept_id IN (1, 2, 3);
SELECT name FROM employees WHERE dept_id NOT IN (4, 5);
Advanced Querying
1. Delete duplicates:
DELETE FROM employees WHERE id NOT IN (
SELECT MIN(id) FROM employees GROUP BY name, department, salary
);
2. Nth highest salary:
SELECT salary FROM (
SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rank FROM
employees
) AS ranked WHERE rank = 3; -- for 3rd highest
3. Conditional update using CASE:
UPDATE employees SET bonus =
CASE
WHEN department = 'Sales' THEN 1000
WHEN department = 'HR' THEN 500
ELSE 0
END;
6
4. Window functions – ROW_NUMBER, RANK:
SELECT name, salary, RANK() OVER (ORDER BY salary DESC) FROM employees;
5. Running total:
SELECT name, salary, SUM(salary) OVER (ORDER BY id) AS running_total FROM
employees;
6. PARTITION BY usage:
SELECT name, department, RANK() OVER (PARTITION BY department ORDER BY
salary DESC) FROM employees;
7. UNION vs UNION ALL :
SELECT name FROM employees
UNION
SELECT name FROM interns;
-- UNION removes duplicates; UNION ALL keeps all.
8. Pivot data: (Depends on DB, for PostgreSQL):
SELECT * FROM
crosstab('SELECT department, month, total FROM sales ORDER BY 1,2')
AS ct (department TEXT, Jan INT, Feb INT, Mar INT);
9. Transpose rows to columns:
10. Use CASE with MAX() :
SELECT MAX(CASE WHEN month = 'Jan' THEN total END) AS Jan,
MAX(CASE WHEN month = 'Feb' THEN total END) AS Feb
FROM sales;
11. Top 5 records:
7
SELECT * FROM employees ORDER BY salary DESC LIMIT 5;
12. Employees without department:
SELECT name FROM employees WHERE dept_id IS NULL;
13. Insert, update, delete using subqueries:
-- Insert
INSERT INTO temp_employees (name, salary)
SELECT name, salary FROM employees WHERE salary > 50000;
-- Update
UPDATE employees SET salary = salary * 1.1 WHERE id IN (
SELECT id FROM top_performers
);
-- Delete
DELETE FROM employees WHERE dept_id NOT IN (
SELECT id FROM departments
);
This SQL sheet is highly useful for interview prep and daily practice. You can copy these queries and test
them in your SQL environment like MySQL, PostgreSQL, or SQL Server.