auto commit

This commit is contained in:
CyC2018 2018-06-03 21:57:52 +08:00
parent 76034e67bd
commit e6cb1e0eb5

View File

@ -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;
```