DEV Community

Cover image for Cheat Sheet: SQL Query Interview Questions
Devashish Roy
Devashish Roy

Posted on

Cheat Sheet: SQL Query Interview Questions

1. Find the Second Highest Salary

SELECT MAX(e1.salary)
FROM employee e1
WHERE e1.salary < (
    SELECT MAX(e2.salary)
    FROM employee e2
);
Enter fullscreen mode Exit fullscreen mode

2. Find the Nth Highest Salary

Option 1: Using LIMIT and OFFSET

SELECT DISTINCT e.salary
FROM employee e
ORDER BY e.salary DESC
LIMIT 1 OFFSET n-1; -- Replace 'n-1' with the calculated offset number
Enter fullscreen mode Exit fullscreen mode

Option 2: Using a Correlated Subquery

SELECT DISTINCT e1.salary
FROM employee e1
WHERE n-1 = ( -- Replace 'n-1' with your target ranking index
    SELECT COUNT(DISTINCT e2.salary)
    FROM employee e2
    WHERE e2.salary > e1.salary
);
Enter fullscreen mode Exit fullscreen mode

3. Find Duplicate Rows in a Table

SELECT e.salary, COUNT(e.salary)
FROM employee e
GROUP BY e.salary
HAVING COUNT(*) > 1;
Enter fullscreen mode Exit fullscreen mode

4. Find Employees Who Earn More Than Their Manager

SELECT e.*
FROM employee e
JOIN employee m ON e.manager_id = m.id
WHERE e.salary > m.salary;
Enter fullscreen mode Exit fullscreen mode

5. Count the Number of Employees in Each Department

SELECT
    d.id,
    CASE
        WHEN d.department_name IS NULL THEN 'No department'
        ELSE d.department_name
    END AS department,
    COUNT(*)
FROM employee e
LEFT JOIN department d ON e.department_id = d.id
GROUP BY d.id, d.department_name
ORDER BY d.id;
Enter fullscreen mode Exit fullscreen mode

6. Find the Department with the Highest Number of Employees

SELECT
    e.department_id,
    d.department_name,
    COUNT(*) AS emp_count
FROM employee e
LEFT JOIN department d ON e.department_id = d.id
GROUP BY e.department_id, d.department_name
ORDER BY emp_count DESC
LIMIT 1;
Enter fullscreen mode Exit fullscreen mode

7. Find Employees Who Do Not Belong to Any Department

SELECT *
FROM employee e
WHERE e.department_id NOT IN (
    SELECT d.id FROM department d
);
Enter fullscreen mode Exit fullscreen mode

8. Fetch the Top 3 Highest Paid Employees in Each Department

SELECT d.department_name, e.*
FROM (
    SELECT
        e.*,
        RANK() OVER(
            PARTITION BY department_id
            ORDER BY salary DESC
        ) rnk
    FROM employee e
) e
LEFT JOIN department d ON e.department_id = d.id
WHERE rnk <= 3
ORDER BY department_id, rnk;
Enter fullscreen mode Exit fullscreen mode

9. Find Employees Hired in the Last 30 Days

SELECT *
FROM employee e
WHERE e.hire_date >= CURRENT_DATE - INTERVAL '30 day';
Enter fullscreen mode Exit fullscreen mode

10. Display Employee Name Along with Their Manager Name (Self Join)

SELECT e."name" AS emp_name, m."name" AS manager_name
FROM employee e
JOIN employee m ON e.manager_id = m.id;
Enter fullscreen mode Exit fullscreen mode

11. Find the Total Salary Paid in Each Department

SELECT
    e.department_id,
    d.department_name,
    SUM(e.salary)
FROM employee e
LEFT JOIN department d ON e.department_id = d.id
GROUP BY e.department_id, d.department_name
ORDER BY e.department_id;
Enter fullscreen mode Exit fullscreen mode

12. Find Employees Whose Name Starts with 'A'

SELECT e."name"
FROM employee e
WHERE e."name" LIKE 'A%';
Enter fullscreen mode Exit fullscreen mode

13. Fetch Employees Whose Salary is Between 30,000 and 50,000

SELECT e.*
FROM employee e
WHERE e.salary BETWEEN 30000 AND 50000;
Enter fullscreen mode Exit fullscreen mode

14. Simulate a 10 Percent Salary Increase Preview

SELECT *, (e.salary * 1.10) AS new_salary
FROM employee e
WHERE e.department_id = 1;
Enter fullscreen mode Exit fullscreen mode

15. Find the Average Salary of Each Department

SELECT e.department_id, d.department_name, AVG(e.salary)
FROM employee e
LEFT JOIN department d ON e.department_id = d.id
GROUP BY e.department_id, d.department_name
ORDER BY e.department_id;
Enter fullscreen mode Exit fullscreen mode

16. List Employees with No Assigned Projects (Anti-Join Pattern)

-- Preferred Method: Optimised Hash / Merge Joins and safe against NULLs
SELECT e.*
FROM employee e
LEFT JOIN project_assignment pa ON e.id = pa.emp_id
WHERE pa.emp_id IS NULL
ORDER BY e.id;
Enter fullscreen mode Exit fullscreen mode

17. Fetch Current Date and Time

SELECT NOW();          -- Timestamp with time zone
SELECT CURRENT_DATE;   -- Date only
SELECT CURRENT_TIME;   -- Time only
Enter fullscreen mode Exit fullscreen mode

18. Find the Number of Days Between Two Dates

SELECT end_date::date - start_date::date AS days_diff
FROM project p;
Enter fullscreen mode Exit fullscreen mode

19. Concatenate First Name and Last Name into a Full Name

SELECT
    e.id,
    CONCAT(e.first_name, ' ', e.last_name) AS full_name
FROM employee e;
Enter fullscreen mode Exit fullscreen mode

20. Find Employees with the Same Salary (Group Aggregation)

SELECT
    e.salary,
    STRING_AGG(e.name, ', ') AS aggregated_names
FROM employee e
GROUP BY e.salary
HAVING COUNT(*) > 1;
Enter fullscreen mode Exit fullscreen mode

21. Find Departments Having More Than 5 Employees

SELECT e.department_id, d.department_name
FROM employee e
LEFT JOIN department d ON e.department_id = d.id
GROUP BY e.department_id, d.department_name
HAVING COUNT(*) > 5;
Enter fullscreen mode Exit fullscreen mode

22. Swap the Values of Two Columns in a Table

UPDATE employee
SET
    first_name = last_name,
    last_name = first_name;
Enter fullscreen mode Exit fullscreen mode

23. Find Maximum Salary in a Department Without Using MAX()

SELECT
    e1.department_id,
    e1.salary
FROM employee e1
LEFT JOIN employee e2
  ON e1.department_id = e2.department_id
  AND e1.salary < e2.salary
WHERE e2.salary IS NULL
ORDER BY e1.department_id;
Enter fullscreen mode Exit fullscreen mode

24. Fetch Alternate Rows from a Table (Even Rows)

SELECT *
FROM (
    SELECT
        *,
        ROW_NUMBER() OVER (ORDER BY id) AS rn
    FROM employee e
) t
WHERE t.rn % 2 = 0;
Enter fullscreen mode Exit fullscreen mode

25. Find Employees Who Joined in a Particular Month

-- Method 1: Using EXTRACT (Numeric representation)
SELECT *
FROM employee e
WHERE EXTRACT(MONTH FROM e.hire_date) = 9;

-- Method 2: Using TO_CHAR (Text pattern representation)
SELECT *
FROM employee e
WHERE TO_CHAR(e.hire_date, 'Month') LIKE 'June%';
Enter fullscreen mode Exit fullscreen mode

26. Find NULL Values in a Column

SELECT *
FROM employee e
WHERE e.manager_id IS NULL;
Enter fullscreen mode Exit fullscreen mode

27. Rename a Column in an Existing Table

ALTER TABLE employee RENAME COLUMN name TO full_name;
Enter fullscreen mode Exit fullscreen mode

28. Find the Total Number of Records in a Table

SELECT COUNT(*) FROM employee e;
Enter fullscreen mode Exit fullscreen mode

29. Fetch the First and Last Record Combined From a Table

(SELECT * FROM employee ORDER BY id ASC LIMIT 1)
UNION
(SELECT * FROM employee ORDER BY id DESC LIMIT 1);
Enter fullscreen mode Exit fullscreen mode

30. Delete Duplicate Rows (Keeping the Earliest Copy)

DELETE FROM employee e
USING employee e2
WHERE e.email = e2.email
  AND e.id > e2.id;
Enter fullscreen mode Exit fullscreen mode

Top comments (0)