MySQL任务四

行程和用户(难度:困难)

Trips 表中存所有出租车的行程信息。每段行程有唯一键 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键。Status 是枚举类型,枚举成员为 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)。

+----+-----------+-----------+---------+------------------------+------------+ 
| Id | Client_Id | Driver_Id | City_Id |        Status          | Request_at | 
+----+-----------+-----------+---------+------------------------+------------+ 
| 1  |     1     |     10    |    1    | completed              | 2013-10-01 | 
| 2  |     2     |     11    |    1    | cancelled_by_driver    | 2013-10-01 | 
| 3  |     3     |     12    |    6    | completed              | 2013-10-01 | 
| 4  |     4     |     13    |    6    | cancelled_by_client    | 2013-10-01 | 
| 5  |     1     |     10    |    1    | completed              | 2013-10-02 | 
| 6  |     2     |     11    |    6    | completed              | 2013-10-02 | 
| 7  |     3     |     12    |    6    | completed              | 2013-10-02 | 
| 8  |     2     |     12    |    12   | completed              | 2013-10-03 | 
| 9  |     3     |     10    |    12   | completed              | 2013-10-03 | 
| 10 |     4     |     13    |    12   | cancelled_by_driver    | 2013-10-03 | 
+----+-----------+-----------+---------+------------------------+------------+ 

Users 表存所有用户。每个用户有唯一键 Users_Id。Banned 表示这个用户是否被禁止,Role 则是一个表示(‘client’, ‘driver’, ‘partner’)的枚举类型。

+----------+--------+--------+ 
| Users_Id | Banned | Role   | 
+----------+--------+--------+ 
|    1     |   No   | client | 
|    2     |   Yes  | client | 
|    3     |   No   | client | 
|    4     |   No   | client | 
|   10     |   No   | driver | 
|   11     |   No   | driver | 
|   12     |   No   | driver | 
|   13     |   No   | driver | 
+----------+--------+--------+ 

写一段 SQL 语句查出 2013年10月1日2013年10月3日 期间非禁止用户的取消率。基于上表,你的 SQL 语句应返回如下结果,取消率(Cancellation Rate)保留两位小数。

+------------+-------------------+ 
|     Day    | Cancellation Rate | 
+------------+-------------------+ 
| 2013-10-01 |       0.33        | 
| 2013-10-02 |       0.00        | 
| 2013-10-03 |       0.50        | 
+------------+-------------------+

题目意思本身很简单,难点在于如何同时计算取消的数量和总数量。
总数量很简单,就是COUNT(*),

同时计算取消数量可以用SUM(CASE END)来实现。对status列计算数量,如果是cancel就记1,complete记为0。

P.S. 如果需要userID 匹配 clientID和driverID两列,需要写两个Lef Join。 但是可以通过CASE …END 在最终结果只显示一列。
在这里插入图片描述


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

将项目7中的employee表清空,重新插入以下数据(其实是多插入5,6两行):

+----+-------+--------+-------------+ 
| Id | Name  | Salary | DepartmentId| 
+----+-------+--------+-------------+ 
| 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 查询,找出每个部门工资前三高的员工。例如,根据上述给定的表格,查询结果应返回:

+------------+----------+--------+ 
| Department | Employee | Salary | 
+------------+----------+--------+ 
|     IT     |   Max    | 90000  | 
|     IT     |   Randy  | 85000  | 
|     IT     |   Joe    | 70000  | 
|    Sales   |   Henry  | 80000  | 
|    Sales   |   Sam    | 60000  | 
+------------+----------+--------+

此外,请考虑实现各部门前N高工资的员工功能。
在这里插入图片描述

  1. 思路一:
    因为只有两个部门,我们可以取巧分别对每个部门按工资降序排名,取前三行,然后UNION。
    需要注意的是,ORDER BY 和 LIMIT本身不支持在子查询中使用。所以需要加上括号形成独立的几个表而不是UNION的子查询。
    在这里插入图片描述

  1. 思路二:
    也是大家普遍在网上搜到的答案。
    和分数排名的思想类似,用到了辅助表。
    emp1是我们的基础表,emp2是辅助表。
    将emp1里的每个salary和整张emp2比较。下面来捋下过程。
    以IT部门为例,emp1的salary有 6.9万,7万,8.5万,9万四个数
    ① emp1工资是6.9万的时候,emp2表里的 count是3,说明有三个大于它的(间接说明它是第四大)
    ② emp1工资是7万的时候,emp2表里的count是2,说明有两个大于它的(间接说明它是第三大)
    ③emp1工资是8.5万的时候,emp2表里的count是1,说明有1个大于它的(间接说明它是第二大)
    ④emp1工资是9万的时候,emp2表里的count是0,说明没有大于它的(间接说明它是最大的)
    在code里就是emp2.Salary > (emp1.Salary =6.9),然后我们要求的是前三大,所以是COUNT() < 3。

在这里插入图片描述


分数排名 - (难度:中等)

依然是昨天的分数表,实现排名功能,但是排名是非连续的,如下:

+-------+------+ 
| Score | Rank | 
+-------+------+ 
| 4.00  |   1  | 
| 4.00  |   1  | 
| 3.85  |   3  | 
| 3.65  |   4  | 
| 3.65  |   4  | 
| 3.50  |   6  | 
+-------+------+

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的 熟悉MySQL环境的使用,掌握在MySQL中创建数据库和表的方法,理解MySQL支持的数据类型、数据完整性在MySQL下的表现形式,练习MySQL数据库服务器的使用,练习CREATE TABLE,SHOW TABLES,DESCRIBE TABLE,ALTER TABLE,DROP TABLE语句的操作方法。 实验内容: 【实验1-1】MySQL的安装与配置。 参见4.1节内容,完成MySQL数据库的安装与配置。 【实验1-2】创建“汽车用品网上商城系统”数据库。 用CREATE DATABASE语句创建Shopping数据库,或者通过MySQL Workbench图形化工具创建Shopping数据库。 【实验1-3】在Shopping数据库下,参见3.5节,创建表3-4~表3-11的八个表。 可以使用CREATE TABLE语句,也可以用MySQL Workbench创建表。 【实验1-4】使用SHOW、DESCRIBE语句查看表。 【实验1-5】使用ALTER TABLE、RENAME TABLE语句管理表。 【实验1-6】使用DROP TABLE语句删除表,也可以使用MySQL Workbench删除表。 (注意:删除前最好对已经创建的表进行复制。) 【实验1-7】连接、断开MySQL服务器,启动、停止MySQL服务器。 【实验1-8】使用SHOW DATABASE、USE DATABASE、DROP DATABASE语句管理“网上商城系统” Shopping数据库。 实验训练2:数据查询操作 请到电脑端查看 实验目的: 基于实验1创建的汽车用品网上商城数据库Shopping,理解MySQL运算符、函数、谓词,练习Select语句的操作方法。 实验内容: 1.单表查询 【实验2.1】字段查询 (1)查询商品名称为“挡风玻璃”的商品信息。 分析:商品信息存在于商品表,而且商品表中包含商品名称此被查询信息,因此这是只需要涉及一个表就可以完成简单单表查询。 (2)查询ID为1的订单。 分析:所有的订单信息存在于订单表中,而且订单用户ID也存在于此表中,因此这是只需要查询订单表就可以完成的查询。 【实验2.2】多条件查询 查询所有促销的价格小于1000的商品信息。 分析:此查询过程包含两个条件,第一个是是否促销,第二个是价格,在商品表中均有此信息,因此这是一个多重条件的查询。 【实验2.3】DISTINCT (1)查询所有对商品ID为1的商品发表过评论的用户ID。 分析:条件和查询对象存在于评论表中,对此商品发表过评论的用户不止一个,而且一个用户可以对此商品发表多个评论,因此,结果需要进行去重,这里使用DISTINCT实现。 (2)查询此汽车用品网上商城会员的创建时间段,1年为一段。 分析:通过用户表可以完成查询,每年可能包含多个会员,如果把此表中的创建年份都列出来会有重复,因此使用DISTINCT去重。 【实验2.4】ORDER BY (1)查询类别ID为1的所有商品,结果按照商品ID降序排列。 分析:从商品表中可以查询出所有类别ID为1的商品信息,结果按照商品ID的降序排列,因此使用ORDER BY语句,降序使用DESC关键字。 (2)查询今年新增的所有会员,结果按照用户名字排序。 分析:在用户表中可以完成查询,创建日期条件设置为今年,此处使用语句ORDER BY。 【实验2.5】GROUP BY (1)查询每个用户的消费总金额(所有订单)。 分析:订单表中包含每个订单的订单总价和用户ID。现在需要将每个用户的所有订单提取出来分为一类,通过SUM()函数取得总金额。此处使用GROUP BY语句和SUM()函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值