Skip to content

SalmaAlassal/LeetCode-SQL-50

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 

Repository files navigation

SQL 50

My solutions to the Top 50 SQL questions from LeetCode

Crack SQL Interview in 50 Qs

Select

SELECT product_id
FROM Products
WHERE low_fats = 'Y' AND recyclable = 'Y';
SELECT name
FROM Customer
WHERE referee_id != 2 OR referee_id IS NULL;

In SQL, NULL represents an unknown or missing value. When you compare any value with NULL, the result of the comparison is also NULL, which is interpreted as FALSE in the context of WHERE clauses.

SELECT name, population, area
FROM World
WHERE area >= 3000000 or population >= 25000000;
SELECT DISTINCT author_id as id
FROM Views
WHERE author_id = viewer_id
ORDER BY id;
SELECT tweet_id
FROM Tweets
WHERE length(content) > 15

Basic Joins

SELECT unique_id, name
FROM Employees
LEFT JOIN EmployeeUNI
ON EmployeeUNI.id = Employees.id
SELECT product_name, year, price
FROM Sales s
LEFT JOIN Product p
ON s.product_id = p.product_id
SELECT V.customer_id, COUNT(V.customer_id) AS count_no_trans
FROM Visits V
LEFT JOIN Transactions T
ON V.visit_id = T.visit_id
Where transaction_id IS NULL
GROUP BY V.customer_id
SELECT id
FROM Weather T1
WHERE temperature >
    (
        SELECT temperature
        FROM Weather T2
        WHERE T2.recordDate = DATE_SUB(T1.recordDate, INTERVAL 1 DAY)
        --WHERE T2.recordDate = DATE_ADD(T1.recordDate, INTERVAL -1 DAY)
        --WHERE T2.recordDate = SUBDATE(T1.recordDate, 1)
        --WHERE T2.recordDate = ADDDATED(T1.recordDate, -1)
    )
SELECT T1.machine_id, ROUND(AVG(T2.timestamp - T1.timestamp), 3) AS processing_time
FROM Activity T1
Join Activity T2
ON T1.machine_id = T2.machine_id AND
   T1.process_id = T2.process_id AND
   T1.activity_type = 'start' AND
   T2.activity_type = 'end'
GROUP BY machine_id
SELECT name, bonus
FROM Employee e
LEFT JOIN Bonus b
ON e.empId = b.empId
WHERE bonus < 1000 OR bonus IS NULL
SELECT s.student_id, student_name, sub.subject_name,
       COUNT(e.student_id) AS attended_exams
FROM Students s
CROSS JOIN Subjects sub
LEFT JOIN Examinations e
ON s.student_id = e.student_id AND sub.subject_name = e.subject_name
GROUP BY s.student_id, sub.subject_name
ORDER BY s.student_id, sub.subject_name;
SELECT name
FROM Employee
WHERE id IN
    (
        SELECT managerId
        FROM Employee
        GROUP BY managerId
        HAVING COUNT(managerId) >= 5
    )
SELECT s.user_id,
       ROUND(AVG(IF(action='confirmed', 1, 0)), 2) AS confirmation_rate
FROM Signups s
LEFT JOIN Confirmations c
ON s.user_id = c.user_id
GROUP BY s.user_id

Basic Aggregate Functions

SELECT *
FROM Cinema
WHERE (id % 2) = 1 AND description <> "boring"
ORDER BY rating DESC;
SELECT p.product_id, IFNULL(ROUND(SUM(units * price) / SUM(units), 2), 0) AS average_price
FROM Prices p
LEFT JOIN UnitsSold u
ON (p.product_id = u.product_id) AND (purchase_date BETWEEN start_date AND end_date)
GROUP BY product_id
SELECT project_id, ROUND(AVG(experience_years), 2) AS average_years
FROM Project p
LEFT JOIN Employee e
ON p.employee_id = e.employee_id
GROUP BY project_id

--OR
-- SELECT project_id, ROUND(SUM(experience_years)/ COUNT(p.employee_id), 2) AS average_years
-- FROM Project p
-- LEFT JOIN Employee e
-- ON p.employee_id = e.employee_id
-- GROUP BY project_id
SELECT contest_id, ROUND(COUNT(r.user_id) / (SELECT COUNT(user_id) FROM Users) * 100, 2) AS percentage
FROM Register r
GROUP BY contest_id
ORDER BY percentage DESC, contest_id ASC;
SELECT query_name,
    ROUND(SUM(rating / position) / COUNT(query_name), 2) AS quality,
    ROUND(SUM(IF(rating < 3, 1, 0)) / COUNT(query_name) * 100, 2) AS poor_query_percentage
FROM Queries
WHERE query_name IS NOT NULL
GROUP BY query_name
SELECT LEFT(trans_date, 7) AS month, country,
    COUNT(id) AS trans_count,
    SUM(state = 'approved') AS approved_count,
    SUM(amount) AS trans_total_amount ,
    SUM(amount * (state = 'approved')) AS approved_total_amount
FROM Transactions
GROUP BY month, country
SELECT ROUND(AVG(order_date = customer_pref_delivery_date) * 100, 2) AS immediate_percentage
FROM Delivery
WHERE (customer_id, order_date) IN (
    SELECT customer_id, MIN(order_date)
    FROM Delivery
    GROUP BY customer_id
)
SELECT ROUND( COUNT(player_id) / (SELECT COUNT(DISTINCT player_id) FROM Activity), 2) AS fraction
FROM Activity
WHERE
    (player_id, DATE_SUB(event_date, INTERVAL 1 DAY))
    IN(
            SELECT player_id, MIN(event_date) AS first_login
            FROM Activity
            GROUP BY player_id
    )

Sorting and Grouping

SELECT teacher_id, COUNT(DISTINCT subject_id) AS cnt
FROM Teacher
GROUP BY teacher_id
SELECT activity_date AS day, COUNT(DISTINCT user_id) AS active_users
FROM Activity
WHERE activity_date BETWEEN '2019-06-28' AND '2019-07-27'
GROUP BY activity_date
SELECT product_id, year AS first_year, quantity, price
FROM Sales
WHERE (product_id, year) IN (
    SELECT product_id, MIN(year)
    FROM Sales
    GROUP BY product_id
)
SELECT class
FROM Courses
GROUP BY class
HAVING COUNT(student) >= 5
SELECT user_id, COUNT(follower_id) AS followers_count
FROM Followers
GROUP BY user_id
ORDER BY user_id
SELECT IF(COUNT(num) = 1, num, NULL) AS num
FROM MyNumbers
GROUP BY num
ORDER BY num DESC
LIMIT 1

--OR
-- SELECT MAX(num) AS num
-- FROM (
--     SELECT num
--     FROM MyNumbers
--     GROUP BY num
--     HAVING COUNT(num) = 1
--     ) myTable;
SELECT customer_id
FROM Customer
GROUP BY customer_id
HAVING COUNT(DISTINCT product_key) = (SELECT COUNT(*) FROM Product)

Advanced Select and Joins

SELECT mgr.employee_id, mgr.name,
    COUNT(e1.employee_id) AS reports_count,
    ROUND(AVG(e1.age), 0) AS average_age
FROM Employees mgr
JOIN Employees e1
ON mgr.employee_id = e1.reports_to
GROUP BY mgr.employee_id
ORDER BY mgr.employee_id
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(employee_id) = 1
        )
SELECT x, y, z,
    CASE
        WHEN x + y > z AND y + z > x AND x + z > y THEN 'Yes'
        ELSE 'No'
    END AS triangle
FROM Triangle;
SELECT DISTINCT l1.num AS ConsecutiveNums
FROM Logs l1, Logs l2, Logs l3
WHERE l1.id = l2.id + 1 AND l2.id = l3.id + 1 AND
      l1.num = l2.num AND l2.num = l3.num
SELECT distinct product_id, 10 as price
FROM Products
GROUP BY product_id
HAVING MIN(change_date) > "2019-08-16"

UNION

SELECT product_id, new_price as price
FROM Products
WHERE (product_id, change_date) IN (
    SELECT product_id, max(change_date) as recent_date
    FROM Products
    WHERE change_date <= "2019-08-16"
    GROUP BY product_id
)

GROUP BY product_id
HAVING MAX(change_date) <= "2019-08-16"
SELECT person_name
FROM Queue q1
WHERE 1000 >= (
    SELECT SUM(weight)
    FROM Queue q2
    WHERE q2.turn <= q1.turn
)
ORDER BY turn DESC
LIMIT 1;
(SELECT 'Low Salary' AS category, COUNT(*) AS accounts_count FROM Accounts WHERE income < 20000)
UNION
(SELECT 'Average Salary' AS category, COUNT(*) AS accounts_count FROM Accounts WHERE income >= 20000 AND income <= 50000)
UNION
(SELECT 'High Salary' AS category, COUNT(*) AS accounts_count FROM Accounts WHERE income > 50000)

Subqueries

SELECT employee_id
FROM Employees
WHERE salary < 30000 AND manager_id NOT IN(
    SELECT employee_id
    FROM Employees
)
ORDER BY employee_id
SELECT IF (id < (SELECT MAX(id) FROM Seat),
            IF(id % 2 = 0, id - 1, id + 1),
            IF(id % 2 = 0, id - 1, id)
        ) AS id, student
FROM Seat
ORDER BY id;
(SELECT name AS results
FROM Users u
JOIN MovieRating mr
ON u.user_id = mr.user_id
GROUP BY name
ORDER BY COUNT(rating) DESC, name
LIMIT 1)

UNION ALL

(SELECT title AS results
FROM Movies m
JOIN MovieRating mr
ON m.movie_id = mr.movie_id
WHERE EXTRACT(YEAR_MONTH FROM created_at) = 202002
GROUP BY title
ORDER BY AVG(rating) DESC, title
LIMIT 1)
SELECT visited_on,
    (
        SELECT SUM(amount)
        FROM Customer
        WHERE visited_on BETWEEN DATE_SUB(c.visited_on, INTERVAL 6 DAY) AND c.visited_on
    ) AS amount,
    ROUND(
        (
        SELECT SUM(amount) / 7
        FROM Customer
        WHERE visited_on BETWEEN DATE_SUB(c.visited_on, INTERVAL 6 DAY) AND c.visited_on
        )
    , 2) AS average_amount
FROM Customer c
WHERE visited_on >= (
    SELECT DATE_ADD(MIN(visited_on), INTERVAL 6 DAY)
    FROM Customer
)
GROUP BY visited_on;
WITH base AS(
    SELECT requester_id id FROM RequestAccepted
    UNION ALL
    SELECT accepter_id id FROM RequestAccepted
)

SELECT id, COUNT(id) num FROM base
GROUP BY id
ORDER BY num DESC
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(tiv_2015) > 1
) AND (lat, lon) IN (
    SELECT lat, lon
    FROM Insurance
    GROUP BY lat, lon
    HAVING COUNT(lat) = 1
)
SELECT d.name AS Department,
    e.name AS Employee,
    e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
WHERE 3 > (
    SELECT COUNT(DISTINCT e2.salary)
    FROM Employee e2
    WHERE e.departmentId = e2.departmentId AND
        e2.salary > e.salary
)
ORDER BY Department, Salary DESC;

Advanced String Functions / Regex / Clause

SELECT user_id,
    CONCAT(UPPER(SUBSTRING(name, 1, 1)), LOWER(SUBSTRING(name, 2))) AS name
FROM Users
ORDER BY user_id
SELECT *
FROM Patients
WHERE conditions LIKE "% DIAB1%" OR conditions LIKE "DIAB1%"
DELETE p1 FROM Person p1, Person p2
WHERE  p1.email = p2.email AND p1.id > p2.id
SELECT
(SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1
OFFSET 1) AS SecondHighestSalary
SELECT sell_date,
    COUNT(DISTINCT product) AS num_sold,
    GROUP_CONCAT(DISTINCT product ORDER BY product ASC separator ',')AS products
FROM Activities
GROUP BY sell_date
ORDER BY sell_date
SELECT product_name, SUM(unit) AS unit
FROM Orders o
LEFT JOIN Products p
ON o.product_id = p.product_id
WHERE order_date BETWEEN '2020-02-01' AND '2020-02-029'
GROUP BY p.product_id
HAVING SUM(unit) >= 100
SELECT *
FROM Users
WHERE mail regexp '^[a-zA-Z][a-zA-Z0-9_.-]*@leetcode\\.com$'

About

My solutions to the Top 50 SQL questions from LeetCode

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published