DataWhale- MySQL --Task3

4.1 MySQL 实战

1. 学习内容

数据导入导出
将之前创建的任意一张MySQL表导出,且是CSV格式
再将CSV表导入数据库

简答:

导出命令: select * from table into outfile “d:/tmp/data/1.csv”;
导入命令: load data infile “d:/tmp/data/1/csv” into table address ;
出现问题:

  1. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
    查看secure_file_priv的变量的地址,使用命令  select  variables like '%secure%';  
    注意变量名为secure-file-priv, 不是下划线
    
  2. 1 (HY000): Can’t create/write to file ‘c:\1.csv’ (OS errno 13 - Permission denied)
    修改对应的权限,允许用户可以创建文件
    是否对C盘权限只开放了administrators组的权限,如是,请打开C:\windows\TEMP赋予该目录Everyone所有的权限.重新测试
    或者 设置其他目录  d:/
    

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

2.OVER(PARTITION BY)函数介绍

摘抄至https://www.cnblogs.com/lcngu/p/5335170.html文章内容。

1、over函数的写法:

  over(partition by class order by sroce) 按照sroce排序进行累计,order by是个默认的开窗函数,按照class分区。

2、开窗的窗口范围:

  over(order by sroce range between 5 preceding and 5 following):窗口范围为当前行数据幅度减5加5后的范围内的。

  over(order by sroce rows between 5 preceding and 5 following):窗口范围为当前行前后各移动5行。
	
	**ORDER BY子句的语法**
	ORDER BY 字段名 RANGE|ROWS BETWEEN 边界规则1 AND 边界规则2
	RANGE表示按照值的范围进行范围的定义,而ROWS表示按照行的范围进行范围的定义;边界规则的可取值见下表:

在这里插入图片描述

	“RANGE|ROWS BETWEEN 边界规则1 AND 边界规则2”部分用来定位聚合计算范围,这个子句又被称为定位框架。
	

  
3、与over()函数结合的函数的介绍
		 SELECT * FROM (select t.name,t.class,t.sroce,rank() over(partition by t.class order by t.sroce desc) mm from T2_TEMP t) where mm = 1;
		(1)求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果。
			SELECT * FROM (select t.name,t.class,t.sroce,row_number() over(partition by t.class order by t.sroce desc) mm from T2_TEMP t) where mm = 1;
		(2)rank()和dense_rank()可以将所有的都查找出来,rank可以将并列第一名的都查找出来;rank()和dense_rank()区别:rank()是跳跃排序,有两个第二名时接下来就是第四名。
		rank(), dense_rank()是用于排名, 处理并列排序的方式不同,dence_rank在并列关系是,相关等级不会跳过。rank则跳过。 
		rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) 
		dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。
		
			select t.name,t.class,t.sroce,rank() over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;
			select t.name,t.class,t.sroce,dense_rank() over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;
			## dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
		 (3)sum()over()的使用
			 ##根据班级进行分数求和
			 select t.name,t.class,t.sroce,sum(t.sroce) over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;
		 (4)  first_value() over()和last_value() over()的使用 
			 ##分别求出第一个和最后一个成绩。
		 	select t.name,t.class,t.sroce,first_value(t.sroce) over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;
		 	select t.name,t.class,t.sroce,last_value(t.sroce) over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;
		(5)sum() over()的使用
			select t.name,t.class,t.sroce,sum(t.sroce) over(partition by t.class order by t.sroce desc) mm from T2_TEMP t;
				-------------------
				count() over(partition by ... order by ...):求分组后的总数。
		  max() over(partition by ... order by ...):求分组后的最大值。
		  min() over(partition by ... order by ...):求分组后的最小值。
		  avg() over(partition by ... order by ...):求分组后的平均值。
		  lag() over(partition by ... order by ...):取出前n行数据。  
		  lead() over(partition by ... order by ...):取出后n行数据。
		  ratio_to_report() over(partition by ... order by ...):Ratio_to_report() 括号中就是分子,over() 括号中就是分母。
  			percent_rank() over(partition by ... order by ...):

			(6)rank(),dense_rank()语法:
					RANK()
					dense_rank()
					【语法】RANK ( ) OVER ( [query_partition_clause] order_by_clause )
					    dense_RANK ( ) OVER ( [query_partition_clause] order_by_clause )
					
					【功能】聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。
					【参数】dense_rank与rank()用法相当,
					【区别】dence_rank在并列关系是,相关等级不会跳过。rank则跳过
					rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) 
					dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。
			(7)row_number() 函数语法:
				ROW_NUMBER()
					【语法】ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) 
					【功能】表示根据COL1分组,在分组内部根据 COL2排序,而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的) 
					row_number() 返回的主要是“行”的信息,并没有排名
					【参数】
					【说明】Oracle分析函数
					
					主要功能:用于取前几名,或者最后几名等

3. over partition by与group by的区别:

group by是对检索结果的保留行进行单纯分组,一般和聚合函数一起使用例如max、min、sum、avg、count等一块用。partition by虽然也具有分组功能,但同时也具有其他的高级功能。

作业

项目七: 各部门工资最高的员工(难度:中等)

创建 Employee 表,包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。

IdNameSalaryDepartmentId
1Joe700001
2Henry800002
3Sam600002
4Max900001

创建 Department 表,包含公司所有部门的信息。

IdName
1IT
2Sales
编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。
DepartmentEmployeeSalary
ITMax90000
SalesHenry80000

简单

在这里插入图片描述

项目八: 换座位(难度:中等)

小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。
其中纵列的 id 是连续递增的
小美想改变相邻俩学生的座位。
你能不能帮她写一个 SQL query 来输出小美想要的结果呢?
请创建如下所示 seat 表:
示例:

idstudent
1Abbot
2Doris
3Emerson
4Green
5Jeames

假如数据输入的是上表,则输出结果如下:

idstudent
1Doris
2Abbot
3Green
4Emerson
5Jeames

注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。

简答

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

项目九: 分数排名(难度:中等)

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

IdScore
13.50
23.65
34.00
43.85
54.00
63.65

例如,根据上述给定的 scores 表,你的查询应该返回(按分数从高到低排列):

ScoreRank
4.001
4.001
3.852
3.653
3.653
3.504

简答

在这里插入图片描述

4.2 MySQL 实战 - 复杂项目

作业

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

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

IdClient_IdDriver_IdCity_IdStatusRequest_at
11101completed2013-10-01
22111cancelled_by_driver2013-10-01
33126completed2013-10-01
44136cancelled_by_client2013-10-01
51101completed2013-10-02
62116completed2013-10-02
73126completed2013-10-02
821212completed2013-10-03
931012completed2013-10-03
1041312cancelled_by_driver2013-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)保留两位小数。

DayCancellation Rate
2013-10-010.33
2013-10-020.00
2013-10-030.50

简答

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

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

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

IdNameSalaryDepartmentId
1Joe700001
2Henry800002
3Sam600002
4Max900001
5Janet690001
6Randy850001

编写一个 SQL 查询,找出每个部门工资前三高的员工。例如,根据上述给定的表格,查询结果应返回:

DepartmentEmployeeSalary
ITMax90000
ITRandy85000
ITJoe70000
SalesHenry80000
SalesSam60000

此外,请考虑实现各部门前N高工资的员工功能。

在这里插入图片描述

项目十二 分数排名 - (难度:中等)

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

ScoreRank
4.001
4.001
3.853
3.654
3.654
3.506

简答

asdasd

引用:

  1. https://blog.csdn.net/sinat_38640606/article/details/83072570
  2. https://blog.csdn.net/wenqiwenqi123/article/details/82466598
  3. https://blog.csdn.net/sphinx1122/article/details/84189855
  4. https://blog.csdn.net/caoxiaohong1005/article/details/69228592
  5. https://www.cnblogs.com/lcngu/p/5335170.html
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

evanth_2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值