50 SQL Interview Questions With Answers
50 SQL Interview Questions With Answers
SELECT product_id
FROM Products
WHERE low_fats = 'Y'
SELECT name
FROM Customer
ORDER BY author_id
SELECT tweet_id
FROM Tweets
ON e.id = eu.id
ON s.product_id = p.product_id
1581 - Customer Who Visited but Did Not Make Any Transactions
GROUP BY customer_id
SELECT w1.id
FROM Weather w1, Weather w2
WHERE DATEDIFF(w1.recordDate, w2.recordDate) = 1
AND w1.temperature > w2.temperature
-- OR
SELECT w1.id
FROM Weather w1, Weather w2
WHERE w1.temperature > w2.temperature
GROUP BY machine_id
577 - Employee Bonus
OR bonus IS NULL
ORDER BY 1, 3
SELECT name
FROM Employee
WHERE id IN
(SELECT managerId
FROM Employee
GROUP BY managerId
HAVING COUNT(*) >= 5
)
-- OR
SELECT a.name
FROM Employee a
JOIN Employee b
WHERE a.id = b.managerId
GROUP BY b.managerId
SELECT
s.user_id,
ROUND(
COALESCE(
SUM(
CASE WHEN ACTION = 'confirmed' THEN 1 END
) / COUNT(*), 0),2)
AS confirmation_rate
FROM Signups s
LEFT JOIN Confirmations c
ON s.user_id = c.user_id
GROUP BY s.user_id;
-- avg(selling), round 2
SELECT p.product_id,
ROUND(SUM(price * units) / SUM(units), 2) AS average_price
FROM Prices p
LEFT JOIN UnitsSold s
ON p.product_id = s.product_id
AND purchase_date BETWEEN start_date AND end_date
GROUP BY p.product_id
GROUP BY project_id
-- OR
SELECT query_name,
ROUND(AVG(rating/position), 2) AS quality,
ROUND(SUM(
CASE WHEN rating < 3 THEN 1 ELSE 0 END
) * 100/ COUNT(rating), 2) AS poor_query_percentage
FROM Queries
GROUP BY query_name
-- OR
SELECT DATE_FORMAT(trans_date, '%Y-%m') month, country,
COUNT(state) trans_count,
SUM(CASE WHEN state = 'approved' THEN 1 ELSE 0 END) approved_count,
SUM(amount) trans_total_amount,
SUM(CASE WHEN state = 'approved' THEN amount ELSE 0 END) approved_total_amount
FROM Transactions
GROUP BY 1, 2
1174. Immediate Food Delivery II
SELECT
ROUND((COUNT(CASE WHEN d.order_date = d.customer_pref_delivery_date THEN 1 END) /
COUNT(*)) * 100, 2) immediate_percentage
FROM Delivery d
WHERE d.order_date = (
SELECT
MIN(order_date)
FROM Delivery
WHERE customer_id = d.customer_id
);
-- OR
SELECT ROUND(AVG(temp.order_date=temp.customer_pref_delivery_date) * 100, 2)
immediate_percentage
FROM (
SELECT *, RANK() OVER(partition by customer_id ORDER BY order_date) od
FROM Delivery) temp
WHERE temp.od = 1
recent_login AS (
SELECT *, DATE_ADD(first_login, INTERVAL 1 DAY) AS next_day
FROM login_date)
GROUP BY teacher_id
GROUP BY activity_date
-- OR
WITH first_year_sales AS (
SELECT s.product_id, MIN(s.year) as first_year
FROM Sales s
INNER JOIN Product p
ON s.product_id = p.product_id
GROUP BY s.product_id)
SELECT f.product_id, f.first_year, s.quantity, s.price
FROM first_year_sales f
JOIN Sales s
ON f.product_id = s.product_id
SELECT class
FROM Courses
GROUP BY class
SELECT COALESCE(
(SELECT num
FROM MyNumbers
GROUP BY num
HAVING COUNT(num) = 1
ORDER BY num DESC
LIMIT 1), null)
AS num
SELECT customer_id
FROM Customer
GROUP BY customer_id
HAVING COUNT(DISTINCT product_key) = (
SELECT COUNT(product_key)
FROM Product
ORDER BY e1.employee_id
-- OR
SELECT employee_id,department_id
FROM Employee
WHERE primary_flag = 'Y' OR employee_id IN
(SELECT employee_id
FROM employee
GROUP BY employee_id
HAVING COUNT(department_id) = 1
SELECT x, y, z,
CASE WHEN x + y > z AND x + z > y AND y + z > x THEN 'Yes'
ELSE 'No' END AS triangle
FROM Triangle
WITH cte AS (
SELECT id, num,
LEAD(num) OVER (ORDER BY id) AS next,
LAG(num) OVER (ORDER BY id) AS prev
FROM Logs
)
SELECT DISTINCT(num) AS ConsecutiveNums
FROM cte
SELECT employee_id
FROM Employees
WHERE manager_id NOT IN (
SELECT employee_id
FROM Employees
)
AND salary < 30000
ORDER BY employee_id
WITH RankedSalaries AS
(SELECT
e.Id AS employee_id,
e.name AS employee,
e.salary,
e.departmentId,
DENSE_RANK() OVER (PARTITION BY e.departmentId ORDER BY e.salary DESC) AS salary_rank
FROM Employee e)
SELECT d.name AS Department,
r.employee,
r.salary
FROM Department d
JOIN RankedSalaries r ON r.departmentId = d.id
ORDER BY user_id
DELETE p
FROM Person p, Person q
WHERE p.id > q.id
SELECT
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1)
AS SecondHighestSalary
SELECT *
FROM Users
-- 1000 kg limit
-- name of last person
WITH CTE AS (
SELECT person_name, weight, turn, SUM(weight)
OVER(ORDER BY turn) AS total_weight
FROM Queue
)
SELECT person_name
FROM cte
WHERE total_weight <=1000
ORDER BY total_weight DESC
LIMIT 1;
FROM Accounts
-- id, student
-- swap every two consecutives
-- num(students): odd? no swap for last one
SELECT id,
CASE WHEN MOD(id,2)=0 THEN (LAG(student) OVER (ORDER BY id))
ELSE (LEAD(student, 1, student) OVER (ORDER BY id))
END AS 'Student'
FROM Seat
-- name, amt
-- >= 100 units, feb 2020
ORDER BY sell_date
UNION ALL
(SELECT title
FROM Movies m
LEFT JOIN MovieRating mr
ON m.movie_id = mr.movie_id
WHERE DATE_FORMAT(created_at, '%Y-%m') = '2020-02'
GROUP BY title
ORDER BY AVG(rating) DESC, title ASC
LIMIT 1
WITH CTE AS (
SELECT requester_id AS id FROM RequestAccepted
UNION ALL
SELECT accepter_id AS id FROM RequestAccepted
)
LIMIT 1
SELECT
ROUND(SUM(tiv_2016),2) AS tiv_2016
FROM insurance
WHERE tiv_2015 IN (SELECT tiv_2015 FROM insurance GROUP BY tiv_2015 HAVING COUNT(*) > 1)
AND (lat,lon) IN (SELECT lat,lon FROM insurance GROUP BY lat,lon HAVING COUNT(*) = 1)
Here are some best Telegram Channels for free education in 2024
ENJOY LEARNING 👍👍