Trips 表中存所有出租车的行程信息。每段行程有唯一键 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键。Status 是枚举类型,枚举成员为 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)。
Users 表存所有用户。每个用户有唯一键 Users_Id。Banned 表示这个用户是否被禁止,Role 则是一个表示(‘client’, ‘driver’, ‘partner’)的枚举类型。
新建表和插入数据
CREATE TABLE IF NOT EXISTS Trips (
Id INT,
Client_Id INT,
Driver_Id INT,
City_Id INT,
Status ENUM('completed', 'cancelled_by_driver', 'cancelled_by_client'),
Request_at VARCHAR(50)
);
CREATE TABLE IF NOT EXISTS Users (
Users_Id INT,
Banned VARCHAR(50),
Role ENUM('client', 'driver', 'partner')
);
TRUNCATE TABLE Trips;
INSERT INTO Trips (Id, Client_Id, Driver_Id, City_Id, Status, Request_at) VALUES ('1', '1', '10', '1', 'completed', '2013-10-01');
INSERT INTO Trips (Id, Client_Id, Driver_Id, City_Id, Status, Request_at) VALUES ('2', '2', '11', '1', 'cancelled_by_driver', '2013-10-01');
INSERT INTO Trips (Id, Client_Id, Driver_Id, City_Id, Status, Request_at) VALUES ('3', '3', '12', '6', 'completed', '2013-10-01');
INSERT INTO Trips (Id, Client_Id, Driver_Id, City_Id, Status, Request_at) VALUES ('4', '4', '13', '6', 'cancelled_by_client', '2013-10-01');
INSERT INTO Trips (Id, Client_Id, Driver_Id, City_Id, Status, Request_at) VALUES ('5', '1', '10', '1', 'completed', '2013-10-02');
INSERT INTO Trips (Id, Client_Id, Driver_Id, City_Id, Status, Request_at) VALUES ('6', '2', '11', '6', 'completed', '2013-10-02');
INSERT INTO Trips (Id, Client_Id, Driver_Id, City_Id, Status, Request_at) VALUES ('7', '3', '12', '6', 'completed', '2013-10-02');
INSERT INTO Trips (Id, Client_Id, Driver_Id, City_Id, Status, Request_at) VALUES ('8', '2', '12', '12', 'completed', '2013-10-03');
INSERT INTO Trips (Id, Client_Id, Driver_Id, City_Id, Status, Request_at) VALUES ('9', '3', '10', '12', 'completed', '2013-10-03');
INSERT INTO Trips (Id, Client_Id, Driver_Id, City_Id, Status, Request_at) VALUES ('10', '4', '13', '12', 'cancelled_by_driver', '2013-10-03');
TRUNCATE TABLE Users;
INSERT INTO Users (Users_Id, Banned, Role) VALUES ('1', 'No', 'client');
INSERT INTO Users (Users_Id, Banned, Role) VALUES ('2', 'Yes', 'client');
INSERT INTO Users (Users_Id, Banned, Role) VALUES ('3', 'No', 'client');
INSERT INTO Users (Users_Id, Banned, Role) VALUES ('4', 'No', 'client');
INSERT INTO Users (Users_Id, Banned, Role) VALUES ('10', 'No', 'driver');
INSERT INTO Users (Users_Id, Banned, Role) VALUES ('11', 'No', 'driver');
INSERT INTO Users (Users_Id, Banned, Role) VALUES ('12', 'No', 'driver');
INSERT INTO Users (Users_Id, Banned, Role) VALUES ('13', 'No', 'driver');
写一段 SQL 语句查出 2013年10月1日 至 2013年10月3日 期间非禁止用户的取消率。基于上表,你的 SQL 语句应返回如下结果,取消率(Cancellation Rate)保留两位小数。
select table2.Request_at,FORMAT(IFNULL(cancled_num/request_num,0),2) AS Cancellation_Rate
from
(SELECT n.Request_at,COUNT(n.Request_at) AS cancled_num
FROM
(SELECT t.Status,t.Request_at,u.Banned
FROM trips t
INNER JOIN users u
WHERE (t.Request_at BETWEEN '2013-10-01' AND '2013-10-03')
AND (t.Client_Id = u.Users_Id )
AND u.Banned = 'No') AS n
WHERE n.Status !='completed'
GROUP BY n.Request_at) AS table1
RIGHT JOIN
(SELECT COUNT(n1.Request_at)AS request_num,Request_at
FROM
(SELECT t.Status,t.Request_at,u.Banned
FROM trips t
INNER JOIN users u
WHERE (t.Request_at BETWEEN '2013-10-01' AND '2013-10-03')
AND (t.Client_Id = u.Users_Id )
AND u.Banned = 'No')AS n1
GROUP BY Request_at)AS table2
on table1.Request_at = table2.Request_at;
结果为:
将昨天employee表清空,重新插入以下数据(其实是多插入5,6两行):
INSERT INTO employee VALUES(1,'joe',70000,1),
(2,'henry',80000,2),
(3,'sam',60000,2),
(4,'max',90000,1),
(5,'janet',69000,1),
(6,'randy',85000,1);
结果为:
编写一个 SQL 查询,找出每个部门工资前三高的员工。例如,根据上述给定的表格,查询结果应返回
SELECT *
FROM
((SELECT *
FROM
(SELECT d.Name AS department,e.Name AS Emoloyee,e.Salary
FROM employee e
INNER JOIN department d
WHERE e.DepartmentId = d.Id
ORDER BY Salary DESC)AS n
WHERE department = 'IT'
LIMIT 3)
UNION
(SELECT *
FROM
(SELECT d.Name AS department,e.Name AS Emoloyee,e.Salary
FROM employee e
INNER JOIN department d
WHERE e.DepartmentId = d.Id
ORDER BY Salary DESC)AS n
WHERE department = 'Sales'
LIMIT 3))as table1;
结果为:
依然是昨天的分数表,如下:
实现排名功能,但是排名是非连续的,
SELECT Score,(SELECT COUNT(Score)+1 FROM score WHERE Score>s.Score) AS 'rank'
from score s
ORDER BY Score DESC;