auto commit
This commit is contained in:
parent
76034e67bd
commit
e6cb1e0eb5
@ -3,7 +3,10 @@
|
|||||||
* [181. Employees Earning More Than Their Managers](#181-employees-earning-more-than-their-managers)
|
* [181. Employees Earning More Than Their Managers](#181-employees-earning-more-than-their-managers)
|
||||||
* [183. Customers Who Never Order](#183-customers-who-never-order)
|
* [183. Customers Who Never Order](#183-customers-who-never-order)
|
||||||
* [184. Department Highest Salary](#184-department-highest-salary)
|
* [184. Department Highest Salary](#184-department-highest-salary)
|
||||||
* [未完待续...](#未完待续)
|
* [176. Second Highest Salary](#176-second-highest-salary)
|
||||||
|
* [177. Nth Highest Salary](#177-nth-highest-salary)
|
||||||
|
* [178. Rank Scores](#178-rank-scores)
|
||||||
|
* [180. Consecutive Numbers](#180-consecutive-numbers)
|
||||||
<!-- GFM-TOC -->
|
<!-- GFM-TOC -->
|
||||||
|
|
||||||
|
|
||||||
@ -45,9 +48,13 @@ AddressId is the primary key column for this table.
|
|||||||
## SQL Schema
|
## SQL Schema
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
DROP TABLE Person;
|
DROP TABLE
|
||||||
|
IF
|
||||||
|
EXISTS Person;
|
||||||
CREATE TABLE Person ( PersonId INT, FirstName VARCHAR ( 255 ), LastName VARCHAR ( 255 ) );
|
CREATE TABLE Person ( PersonId INT, FirstName VARCHAR ( 255 ), LastName VARCHAR ( 255 ) );
|
||||||
DROP TABLE Address;
|
DROP TABLE
|
||||||
|
IF
|
||||||
|
EXISTS Address;
|
||||||
CREATE TABLE Address ( AddressId INT, PersonId INT, City VARCHAR ( 255 ), State VARCHAR ( 255 ) );
|
CREATE TABLE Address ( AddressId INT, PersonId INT, City VARCHAR ( 255 ), State VARCHAR ( 255 ) );
|
||||||
INSERT INTO Person ( PersonId, LastName, FirstName )
|
INSERT INTO Person ( PersonId, LastName, FirstName )
|
||||||
VALUES
|
VALUES
|
||||||
@ -62,9 +69,14 @@ VALUES
|
|||||||
使用左外连接。
|
使用左外连接。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT FirstName, LastName, City, State
|
SELECT
|
||||||
FROM Person AS P LEFT JOIN Address AS A
|
FirstName,
|
||||||
ON P.PersonId = A.PersonId;
|
LastName,
|
||||||
|
City,
|
||||||
|
State
|
||||||
|
FROM
|
||||||
|
Person AS P
|
||||||
|
LEFT JOIN Address AS A ON P.PersonId = A.PersonId;
|
||||||
```
|
```
|
||||||
|
|
||||||
# 181. Employees Earning More Than Their Managers
|
# 181. Employees Earning More Than Their Managers
|
||||||
@ -86,12 +98,12 @@ Employee 表:
|
|||||||
+----+-------+--------+-----------+
|
+----+-------+--------+-----------+
|
||||||
```
|
```
|
||||||
|
|
||||||
查找所有员工,它们的薪资大于其经理薪资。
|
查找所有员工,他们的薪资大于其经理薪资。
|
||||||
|
|
||||||
## SQL Schema
|
## SQL Schema
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
DROP TABLE Employee;
|
DROP TABLE IF EXISTS Employee;
|
||||||
CREATE TABLE Employee ( Id INT, NAME VARCHAR ( 255 ), Salary INT, ManagerId INT );
|
CREATE TABLE Employee ( Id INT, NAME VARCHAR ( 255 ), Salary INT, ManagerId INT );
|
||||||
INSERT INTO Employee ( Id, NAME, Salary, ManagerId )
|
INSERT INTO Employee ( Id, NAME, Salary, ManagerId )
|
||||||
VALUES
|
VALUES
|
||||||
@ -104,9 +116,12 @@ VALUES
|
|||||||
## Solution
|
## Solution
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT E1.Name AS Employee
|
SELECT
|
||||||
FROM Employee AS E1, Employee AS E2
|
E1.NAME AS Employee
|
||||||
WHERE E1.ManagerId = E2.Id AND E1.Salary > E2.Salary;
|
FROM
|
||||||
|
Employee AS E1
|
||||||
|
INNER JOIN Employee AS E2 ON E1.ManagerId = E2.Id
|
||||||
|
AND E1.Salary > E2.Salary;
|
||||||
```
|
```
|
||||||
|
|
||||||
# 183. Customers Who Never Order
|
# 183. Customers Who Never Order
|
||||||
@ -153,9 +168,9 @@ Orders 表:
|
|||||||
## SQL Schema
|
## SQL Schema
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
DROP TABLE Customers;
|
DROP TABLE IF EXISTS Customers;
|
||||||
CREATE TABLE Customers ( Id INT, NAME VARCHAR ( 255 ) );
|
CREATE TABLE Customers ( Id INT, NAME VARCHAR ( 255 ) );
|
||||||
DROP TABLE Orders;
|
DROP TABLE IF EXISTS Orders;
|
||||||
CREATE TABLE Orders ( Id INT, CustomerId INT );
|
CREATE TABLE Orders ( Id INT, CustomerId INT );
|
||||||
INSERT INTO Customers ( Id, NAME )
|
INSERT INTO Customers ( Id, NAME )
|
||||||
VALUES
|
VALUES
|
||||||
@ -174,21 +189,24 @@ VALUES
|
|||||||
左外链接
|
左外链接
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT C.Name AS Customers
|
SELECT
|
||||||
FROM Customers AS C LEFT JOIN Orders AS O
|
C.NAME AS Customers
|
||||||
ON C.Id = O.CustomerId
|
FROM
|
||||||
WHERE O.CustomerId IS NULL;
|
Customers AS C
|
||||||
|
LEFT JOIN Orders AS O ON C.Id = O.CustomerId
|
||||||
|
WHERE
|
||||||
|
O.CustomerId IS NULL;
|
||||||
```
|
```
|
||||||
|
|
||||||
子查询
|
子查询
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT C.Name AS Customers
|
SELECT
|
||||||
FROM Customers AS C
|
C.NAME AS Customers
|
||||||
WHERE C.Id NOT IN (
|
FROM
|
||||||
SELECT CustomerId
|
Customers AS C
|
||||||
FROM Orders
|
WHERE
|
||||||
);
|
C.Id NOT IN ( SELECT CustomerId FROM Orders );
|
||||||
```
|
```
|
||||||
|
|
||||||
# 184. Department Highest Salary
|
# 184. Department Highest Salary
|
||||||
@ -235,9 +253,9 @@ Department 表:
|
|||||||
## SQL Schema
|
## SQL Schema
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
DROP TABLE Employee;
|
DROP TABLE IF EXISTS Employee;
|
||||||
CREATE TABLE Employee ( Id INT, NAME VARCHAR ( 255 ), Salary INT, DepartmentId INT );
|
CREATE TABLE Employee ( Id INT, NAME VARCHAR ( 255 ), Salary INT, DepartmentId INT );
|
||||||
DROP TABLE Department;
|
DROP TABLE IF EXISTS Department;
|
||||||
CREATE TABLE Department ( Id INT, NAME VARCHAR ( 255 ) );
|
CREATE TABLE Department ( Id INT, NAME VARCHAR ( 255 ) );
|
||||||
INSERT INTO Employee ( Id, NAME, Salary, DepartmentId )
|
INSERT INTO Employee ( Id, NAME, Salary, DepartmentId )
|
||||||
VALUES
|
VALUES
|
||||||
@ -253,15 +271,226 @@ VALUES
|
|||||||
|
|
||||||
## Solution
|
## Solution
|
||||||
|
|
||||||
|
创建一个临时表,包含了部门员工的最大薪资。可以对部门进行分组,然后使用 MAX() 汇总函数取得最大薪资。
|
||||||
|
|
||||||
|
之后使用连接将找到一个部门中薪资等于临时表中最大薪资的员工。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT D.Name AS Department, E.Name AS Employee, E.Salary
|
SELECT
|
||||||
FROM Employee AS E, Department AS D,
|
D.NAME AS Department,
|
||||||
(SELECT DepartmentId, MAX(Salary) AS Salary
|
E.NAME AS Employee,
|
||||||
FROM Employee
|
E.Salary
|
||||||
GROUP BY DepartmentId) AS M
|
FROM
|
||||||
WHERE E.DepartmentId = D.Id
|
Employee AS E,
|
||||||
|
Department AS D,
|
||||||
|
( SELECT DepartmentId, MAX( Salary ) AS Salary FROM Employee GROUP BY DepartmentId ) AS M
|
||||||
|
WHERE
|
||||||
|
E.DepartmentId = D.Id
|
||||||
AND E.DepartmentId = M.DepartmentId
|
AND E.DepartmentId = M.DepartmentId
|
||||||
AND E.Salary = M.Salary;
|
AND E.Salary = M.Salary;
|
||||||
```
|
```
|
||||||
|
|
||||||
# 未完待续...
|
# 176. Second Highest Salary
|
||||||
|
|
||||||
|
https://leetcode.com/problems/second-highest-salary/description/
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
```html
|
||||||
|
+----+--------+
|
||||||
|
| Id | Salary |
|
||||||
|
+----+--------+
|
||||||
|
| 1 | 100 |
|
||||||
|
| 2 | 200 |
|
||||||
|
| 3 | 300 |
|
||||||
|
+----+--------+
|
||||||
|
```
|
||||||
|
|
||||||
|
查找工资第二高的员工。
|
||||||
|
|
||||||
|
```html
|
||||||
|
+---------------------+
|
||||||
|
| SecondHighestSalary |
|
||||||
|
+---------------------+
|
||||||
|
| 200 |
|
||||||
|
+---------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
如果没有找到,那么就返回 null 而不是不返回数据。
|
||||||
|
|
||||||
|
## SQL Schema
|
||||||
|
|
||||||
|
```sql
|
||||||
|
DROP TABLE
|
||||||
|
IF
|
||||||
|
EXISTS Employee;
|
||||||
|
CREATE TABLE Employee ( Id INT, Salary INT );
|
||||||
|
INSERT INTO Employee ( Id, Salary )
|
||||||
|
VALUES
|
||||||
|
( '1', '100' ),
|
||||||
|
( '2', '200' ),
|
||||||
|
( '3', '300' );
|
||||||
|
```
|
||||||
|
|
||||||
|
## Solution
|
||||||
|
|
||||||
|
为了在没有查找到数据时返回 null,需要在查询结果外面再套一层 SELECT。
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT
|
||||||
|
( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1, 1 ) AS SecondHighestSalary;
|
||||||
|
```
|
||||||
|
|
||||||
|
# 177. Nth Highest Salary
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
查找工资第 N 高的员工。
|
||||||
|
|
||||||
|
## SQL Schema
|
||||||
|
|
||||||
|
同 176。
|
||||||
|
|
||||||
|
## Solution
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE FUNCTION getNthHighestSalary ( N INT ) RETURNS INT BEGIN
|
||||||
|
|
||||||
|
SET N = N - 1;
|
||||||
|
RETURN ( SELECT ( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT N, 1 ) );
|
||||||
|
|
||||||
|
END
|
||||||
|
```
|
||||||
|
|
||||||
|
# 178. Rank Scores
|
||||||
|
|
||||||
|
https://leetcode.com/problems/rank-scores/description/
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
得分表:
|
||||||
|
|
||||||
|
```html
|
||||||
|
+----+-------+
|
||||||
|
| Id | Score |
|
||||||
|
+----+-------+
|
||||||
|
| 1 | 3.50 |
|
||||||
|
| 2 | 3.65 |
|
||||||
|
| 3 | 4.00 |
|
||||||
|
| 4 | 3.85 |
|
||||||
|
| 5 | 4.00 |
|
||||||
|
| 6 | 3.65 |
|
||||||
|
+----+-------+
|
||||||
|
```
|
||||||
|
|
||||||
|
将得分排序,并统计排名。
|
||||||
|
|
||||||
|
```html
|
||||||
|
+-------+------+
|
||||||
|
| Score | Rank |
|
||||||
|
+-------+------+
|
||||||
|
| 4.00 | 1 |
|
||||||
|
| 4.00 | 1 |
|
||||||
|
| 3.85 | 2 |
|
||||||
|
| 3.65 | 3 |
|
||||||
|
| 3.65 | 3 |
|
||||||
|
| 3.50 | 4 |
|
||||||
|
+-------+------+
|
||||||
|
```
|
||||||
|
|
||||||
|
## SQL Schema
|
||||||
|
|
||||||
|
```sql
|
||||||
|
DROP TABLE
|
||||||
|
IF
|
||||||
|
EXISTS Scores;
|
||||||
|
CREATE TABLE Scores ( Id INT, Score DECIMAL ( 3, 2 ) );
|
||||||
|
INSERT INTO Scores ( Id, Score )
|
||||||
|
VALUES
|
||||||
|
( '1', '3.5' ),
|
||||||
|
( '2', '3.65' ),
|
||||||
|
( '3', '4.0' ),
|
||||||
|
( '4', '3.85' ),
|
||||||
|
( '5', '4.0' ),
|
||||||
|
( '6', '3.65' );
|
||||||
|
```
|
||||||
|
|
||||||
|
## Solution
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT
|
||||||
|
S1.score,
|
||||||
|
COUNT( DISTINCT S2.score ) AS Rank
|
||||||
|
FROM
|
||||||
|
Scores AS S1
|
||||||
|
INNER JOIN Scores AS S2 ON S1.score <= S2.score
|
||||||
|
GROUP BY
|
||||||
|
S1.id
|
||||||
|
ORDER BY
|
||||||
|
S1.score DESC;
|
||||||
|
```
|
||||||
|
|
||||||
|
# 180. Consecutive Numbers
|
||||||
|
|
||||||
|
https://leetcode.com/problems/consecutive-numbers/description/
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
数字表:
|
||||||
|
|
||||||
|
```html
|
||||||
|
+----+-----+
|
||||||
|
| Id | Num |
|
||||||
|
+----+-----+
|
||||||
|
| 1 | 1 |
|
||||||
|
| 2 | 1 |
|
||||||
|
| 3 | 1 |
|
||||||
|
| 4 | 2 |
|
||||||
|
| 5 | 1 |
|
||||||
|
| 6 | 2 |
|
||||||
|
| 7 | 2 |
|
||||||
|
+----+-----+
|
||||||
|
```
|
||||||
|
|
||||||
|
查找连续出现三次的数字。
|
||||||
|
|
||||||
|
```html
|
||||||
|
+-----------------+
|
||||||
|
| ConsecutiveNums |
|
||||||
|
+-----------------+
|
||||||
|
| 1 |
|
||||||
|
+-----------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
## SQL Schema
|
||||||
|
|
||||||
|
```sql
|
||||||
|
DROP TABLE
|
||||||
|
IF
|
||||||
|
EXISTS LOGS;
|
||||||
|
CREATE TABLE LOGS ( Id INT, Num INT );
|
||||||
|
INSERT INTO LOGS ( Id, Num )
|
||||||
|
VALUES
|
||||||
|
( '1', '1' ),
|
||||||
|
( '2', '1' ),
|
||||||
|
( '3', '1' ),
|
||||||
|
( '4', '2' ),
|
||||||
|
( '5', '1' ),
|
||||||
|
( '6', '2' ),
|
||||||
|
( '7', '2' );
|
||||||
|
```
|
||||||
|
|
||||||
|
## Solution
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT
|
||||||
|
DISTINCT L1.num AS ConsecutiveNums
|
||||||
|
FROM
|
||||||
|
Logs AS L1,
|
||||||
|
Logs AS L2,
|
||||||
|
Logs AS L3
|
||||||
|
WHERE L1.id = l2.id - 1
|
||||||
|
AND L2.id = L3.id - 1
|
||||||
|
AND L1.num = L2.num
|
||||||
|
AND l2.num = l3.num;
|
||||||
|
```
|
||||||
|
Loading…
x
Reference in New Issue
Block a user