mysql学习--day06

项目十:行程和用户(难度:困难)

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;

结果为:

项目十一:各部门前3高工资的员工(难度:中等)

将昨天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;

猜你喜欢

转载自blog.csdn.net/nowfuture/article/details/88116385