LeetCode Database题目总结

一、两表连接题
175、 Combine Two Tables

select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId

181、 Employees Earning More Than Their Managers

SELECT a.Name AS Employee
FROM Employee a JOIN Employee b
ON a.ManagerId = b.Id
WHERE a.Salary > b.Salary;

180、Consecutive Numbers

SELECT *
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

197、 Rising Temperature

SELECT
    weather.id AS 'Id'
FROM
    weather
        JOIN
    weather w ON DATEDIFF(weather.date, w.date) = 1
        AND weather.Temperature > w.Temperature

601、 Human Traffic of Stadium

select distinct t1.*
from stadium t1, stadium t2, stadium t3
where t1.people >= 100 and t2.people >= 100 and t3.people >= 100
and
(
     (t1.id - t2.id = 1 and t1.id - t3.id = 2 and t2.id - t3.id =1) #t1, t2, t3
    or
    (t2.id - t1.id = 1 and t2.id - t3.id = 2 and t1.id - t3.id =1)  #t2, t1, t3
    or
    (t3.id - t2.id = 1 and t2.id - t1.id =1 and t3.id - t1.id = 2)  #t3, t2, t1
)
order by t1.id

184、Department Highest Salary

SELECT
    Department.name AS 'Department',
    Employee.name AS 'Employee',
    Salary
FROM
    Employee
        JOIN
    Department ON Employee.DepartmentId = Department.Id
WHERE
    (Employee.DepartmentId , Salary) IN
    (   SELECT
            DepartmentId, MAX(Salary)
        FROM
            Employee
        GROUP BY DepartmentId
    )

知识点总结:假设有A,B两表,A为左边表,B为右边表
1.inner join(等值连接):只返回两个表中联接字段相等的行, 产生的结果是两表的交集;
SELECT * FROM Table A INNER JOIN Table B ON TableA.name = TableB.name
2.left [outer] join (左连接):以A表为基础,输出为A表的全部数据,B表有的组合。没有的为null
SELECT * FROM Table A LEFT OUTER JOIN Table B ON TableA.name = TableB.name
3.right [outer] join(右连接):以B表为基础,输出为B表的全部数据,A表的有的组合。没有的为null
SELECT * FROM Table A RIGHT OUTER JOIN Table B ON TableA.name = TableB.name
4.full [outer] join(全连接):产生A和B的并集。对于没有匹配的记录,则会以null做为值。
SELECT * FROM Table A FULL OUTER JOIN Table B ON TableA.name = TableB.name
5. cross join(交叉连接,笛卡尔积) 把表A和表B的数据进行一个N*M的组合,即笛卡尔积。由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢。
SELECT * FROM Table A CROSS JOIN Table B


二、Delete语句
196、Delete Duplicate Emails

DELETE p1
FROM Person p1, Person p2
WHERE p1.Email = p2.Email AND p1.Id > p2.Id;

格式:DELETE [*] FROM table_name;


三、Update语句
627、Swap Salary

UPDATE salary
SET sex = CASE sex
        WHEN 'm' THEN 'f'
        ELSE 'm'
    END;

626、 Exchange Seats

SELECT
    (CASE
        WHEN MOD(id, 2) != 0 AND counts != id THEN id + 1
        WHEN MOD(id, 2) != 0 AND counts = id THEN id
        ELSE id - 1
    END) AS id,
    student
FROM
    seat,
    (SELECT
        COUNT(*) AS counts
    FROM
        seat) AS seat_counts
ORDER BY id ASC;

  • update格式:
    UPDATE table_name
    SET column1 = value1, column2 = value2, …
    WHERE condition;
  • CASE 格式:
    CASE input_expression
    WHEN when_expression THEN result_expression
    [ …n ]
    ELSE else_result_expression
    END

四、排等级类题
176、Second Highest Salary

SELECT
    (SELECT DISTINCT
            Salary
        FROM
            Employee
        ORDER BY Salary DESC
        LIMIT 1 OFFSET 1) AS SecondHighestSalary
;

177、Nth Highest Salary

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
DECLARE M INT;
SET M=N-1;
  RETURN (
      # Write your MySQL query statement below.
      SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT M, 1
  );
END

178、Rank Scores

SELECT
  Score,
  (SELECT count(*) FROM (SELECT distinct Score s FROM Scores) tmp WHERE s >= Score) Rank
FROM Scores
ORDER BY Score desc

185、Department Top Three Salaries

SELECT
    d.Name AS 'Department', e1.Name AS 'Employee', e1.Salary
FROM
    Employee e1
        JOIN
    Department d ON e1.DepartmentId = d.Id
WHERE
    3 > (SELECT
            COUNT(DISTINCT e2.Salary)
        FROM
            Employee e2
        WHERE
            e2.Salary > e1.Salary
                AND e1.DepartmentId = e2.DepartmentId
        )

五、基础知识点题目
182、Duplicate Emails

select Email
from Person
group by Email
having count(Email) > 1;

183、 Customers Who Never Order

select customers.name as 'Customers'
from customers
where customers.id not in
(
    select customerid from orders
);

595、Big Countries

SELECT
    name, population, area
FROM
    world
WHERE
    area > 3000000 OR population > 25000000

596、Classes More Than 5 Students

SELECT
    class
FROM
    courses
GROUP BY class
HAVING COUNT(DISTINCT student) >= 5

620、Not Boring Movies

select *
from cinema
where mod(id, 2) = 1 and description != 'boring'
order by rating DESC

猜你喜欢

转载自blog.csdn.net/qq_33186949/article/details/79920686