MYSQL学习(三)

通过MYSQL的实战来复习自己的快要遗忘的mysql知识,然后希望李某人也能找回曾经爱学习时的状态!!

1.

开始实战:

定义表结构:

插入数据:

展现数据:

创建Department表:

查询每个部门工资最高的员工:

 

2.

小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。

其中纵列的 id 是连续递增的

小美想改变相邻俩学生的座位。

你能不能帮她写一个 SQL query 来输出小美想要的结果呢?

我们先来定义一个表吧:

创建好的表就是这样,这里注意的是如果学生人数为奇数,那么最后一个学生就不用换位置。如果不是奇数就不用改变。

 

3.

编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

创建表:

create table if not exists score(id int not null primary key,score decimal(3,2) not null);

decimal(3,2) 2表示小数点后面保留几位小数,3表示整数部分与小数部分加起来的总长度.

查询返回:

 

 

复杂的题:

1.

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

 

这里会用到一个枚举函数 ENUM()可以将枚举成员放进去,还有这里涉及到一个Users表,所以就让我们先创建一个Users表吧。

创建Users表:

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

nsert 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');

 

创建Trips表:

insert into Trips values(1,1,10,1,'completed','2013-10-01');
insert into Trips values(2,2,11,1,'cancelled_by_driver','2013-10-01');
insert into Trips values(3,3,12,6,'completed','2013-10-01');
insert into Trips values(4,4,13,6,'cancelled_by_client','2013-10-01');
insert into Trips values(5,1,10,1,'completed','2013-10-02');
insert into Trips values(6,2,11,6,'completed','2013-10-02');
insert into Trips values(7,3,12,6,'completed','2013-10-02');
insert into Trips values(8,2,12,12,'completed','2013-10-03');
insert into Trips values(9,3,10,12,'completed','2013-10-03');
insert into Trips values(10,4,13,12,'cancelled_by_driver','2013-10-03');

 

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

select Request_at as Day,Round(count(if(Status !='completed',True,Null))/count(*),2) as 'Cancellation Rate' from Trips where Request_at between '2013-10-01' and '2013-10-03' and  Client_id in (select User_id from Users where Banned ='No') group by Request_at;

 

2.

各部门前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高工资的员工功能。

 

实现:

SELECT Department.Name AS Department, e1.Name AS Employee, e1.Salary AS Salary
FROM Employee e1
JOIN Department
ON e1.DepartmentId = Department.Id
WHERE 3 >   (
            SELECT COUNT(DISTINCT e2.Salary) 
            FROM Employee e2
            WHERE e2.Salary > e1.Salary AND e1.DepartmentId = e2.DepartmentId
            )
ORDER BY Department.Name, e1.Salary DESC;

 

3.

依然是上面的一个分数表,实现排名功能,但是排名是非连续的

 

 select s.score,(select count(*)+1 from Score as s1 where s1.score > s.score) as ranks from Score s order by score desc;

 

总结:这次写的比较匆忙,好多知识点没遇到得,还有逻辑思维都没好好的总结,因为有着本身需要再规定时间完成的原因,所以明日(明日复明日????) 哈哈哈 。一定好好将这几天遇到的知识点,还有没有写在博客上的知识点,都写在笔记本上多翻看,加油!!!(李某人)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值