# 阿里云天池龙珠计划 SQL 训练营 - Task06 part2
老铁们集合了今天继续TASK06。SQL训练营的内容我们已经全部学完了TASK06主要是练习题帮大家掌握知识点。使用的数据都是真实数据。更贴近我们的实际工作情况。今天是第二部分没有看第一部分的老铁不用着急点击下方链接即可查看第一堂课的内容。第一部分内容 6.1话不多说我们继续上课。今天来看第二题“请使用 Wine Quality Data 数据集《winequality-red.csv》找出 pH3.03的所有红葡萄酒然后对其 citric acid 进行中式排名相同排名的下一个名次应该是下一个连续的整数值。换句话说名次之间不应该有“间隔””。我们先看对应的数据集如下我这里主要把列名都现实全表格一共有1599条数据数据太多就布全显示了。我来讲一下各个列名的含义让大家对表格有一个总体认识。字段名 中文解释 说明fixed acidity 固定酸度 酒石酸等不挥发性酸含量单位 g/dm³影响葡萄酒的酸味和结构感volatile acidity 挥发酸度 醋酸等挥发性酸含量单位 g/dm³过高会产生醋味是变质指标citric acid 柠檬酸 柠檬酸含量单位 g/dm³少量添加可增加清爽感residual sugar 残留糖分 发酵后剩余的糖分含量单位 g/dm³干红通常 4g/Lchlorides 氯化物 盐分含量单位 g/dm³过高可能有咸味free sulfur dioxide 游离二氧化硫 未结合的 SO₂ 含量单位 mg/L起抗氧化和抑菌作用total sulfur dioxide 总二氧化硫 游离态 结合态 SO₂ 的总和单位 mg/L受法规限量约束density 密度 葡萄酒的密度单位 g/cm³与酒精含量、糖分有关pH pH 值 酸碱度指标范围通常 3.0~3.6影响口感、稳定性和颜色sulphates 硫酸盐 硫酸钾等含量单位 g/dm³影响葡萄酒的保鲜能力和口感alcohol 酒精含量 体积百分比单位 %vol典型范围 9.5~14.5%quality 质量评分 目标变量0~10 分通常 3~8 分由专家感官评价得出这里有几个说明要注意一下1alcohol酒精含量就是我们日常喝酒时候说的酒精度也叫度数。我们说这瓶酒多少度二锅头56度天之蓝42度。指的就是酒精含量而且是体积的百分比不是质量的百分比。比如一瓶酒精度为12%的葡萄酒意味着100毫升的酒中纯酒精占了12毫升。当你看到alcohol 字段数值为9.5或14.0时可以直接理解为酒精度数百分比。2citric acid这个是柠檬酸含量少量添加可以提升果香和清新感但过量会使酒变得过于尖锐。3volatile acidity挥发酸度这个是判断葡萄酒是否变质的核心指标。高挥发酸度的酒通常评分较低。4sulphates硫酸盐硫酸盐有助于保鲜和提升口感适量使用可提升品质。以上四个指标使判断酒品质好坏的主要依据。一般来说做好酒alcohol要高volatile acidity 要底sulphates和citric acid要适中。好的了解完了背景知识我们回到题目。要求找出ph3.03的所有红葡萄酒这个使条件即where ph3.03。对citric acid进行中式排名相同排名的下一个名次应该是下一个连续的整数值。换句话说名次之间不应该有“间隔”。即如下排名排名 数学分数1 992 963 903 904 865 80大家注意看排名“3”两个90分第三名并列有两个但是下一名86分的是排名“4”。即排名连续相同数值的排名一致。题目里面出现了“ph”和“citric acid”那么我们也只查询这两个字段。这道题目不难我直接上答案SELECTpH,citric acid,DENSE_RANK()OVER(ORDERBYcitric acidDESC)ASranknFROMwinequality-redWHEREpH3.03;下面为结果· PH citric acid dense_rank() over (order bycitric aciddesc)1 3.03 0.65 12 3.03 0.59 23 3.03 0.52 34 3.03 0.51 45 3.03 0.51 46 3.03 0.48 5我们看到有两个“0.51”并列排名第四下面一个0.48排名第五。符合题目要求。有的同学可能会问“dense_rank() over (order bycitric aciddesc)”这一例名称太长了可不可以简化一下比如“rank。答案是OK的可以改成rank也可以改成其它名称。我们优化一下语句selectPH,citric acid,dense_rank()over(orderbycitric aciddesc)rankfromwinequality-redwhereph3.03;我们看到在dense_rank后面我加上了‘rank’中间有空格这样的语句对我们结果有什么影响我们运行看我们看到那个长长的名称“ dense_rank() over (order bycitric aciddesc)”不见了取而代之的是’rank’。有同学可能会问那我去掉单引号直接rank可以不。大家可以试一下。去掉单引号完了运行看是否可以。不出意外rank下面会有红色波浪线部分字体也会变红运行不会通过会有如下提示这个问题的主要原因是rank为mysql关键字rank()是一个窗口函数当我们敲入rank时mysql会误认为函数调用从而导致语法错误。解决方案就是rank加上单引号或者不用mysql关键字用一个非关键字代换。其实我们只要加一个“s”就可以变为ranks。解决了关键字问题列名也好懂。优化后如下selectPH,citric acid,dense_rank()over(orderbycitric aciddesc)ranksfromwinequality-redwhereph3.03;结果如下这里我们变更了一个列名另外两个可以变更吗当然可以只要变更的名称不是关键字就可以。如果是关键字最简单的办法就是后面加“s”。比我我们把“ph”变成“p”语句如下selectPH p,citric acid,dense_rank()over(orderbycitric aciddesc)ranksfromwinequality-redwhereph3.03;“ph”后面加空格一定要有空格加一个字母p就可以。mysql就知道p是ph的别名。当然除了p改成其它非关键字都可以。结果如下我们可以看到列名变了为P。除了列名还有一点需要大家注意就是排名方式。我们刚才的排名方式就是3445叫中式排名。在其它场合我们应该见过其它类型的排名。mysql一共提供了三种排名除了我们刚才使用的还有两种。我们先看第二种语句如下selectPH,citric acid,row_number()over(orderbycitric aciddesc)ranks-- 变为row_numberfromwinequality-redwhereph3.03;关键字dense_rank变为row_number结果如下我们看到排名这一列数字都是连续的两个0.51的排名分别为4、5。即row_number排名是连续的且唯一的。至于4、5的两个排名对应的内容哪一个在上面4哪一个在下面不确定都有可能每一次查询结果可能会变。如果你的业务逻辑不关心相同值之间的顺序只是让每行都有一个编号那就可以直接用row_number。如果你希望排名结果稳定结果相同可以增加其它排名条件比如表格里面的density等语句如下selectPH,density-- 增加选择条件,citric acid,row_number()over(orderbycitric aciddesc,densityasc)ranks-- 增加排名条件densityfromwinequality-redwhereph3.03;增加排名条件意为当citric acid相同时按照density排名当然后面还可以增加条件但一般没有必要。这样每次查询都会输出稳定结果。我们来看最后一种排名方式就是排名不唯一不连续好比这种12335。并列第三有两个那么下一个就是第五不是第四。语句如下selectPH,citric acid,rank()over(orderbycitric aciddesc)ranksfromwinequality-redwhereph3.03;结果如下我们可以看到并列第四有两个下面一个为第六。以上就是三种排名方式我做一下总结关键字 特点 示例dense_rank() 排名连续且不唯一 123345row_number() 排名连续且唯一 123456rank() 排名不连续不唯一 123356大家可以结合实际业务场景选择排名方式。今天总结一下课程1关于红酒酒精度是指体积比不是质量比。2列可以起别名但是不要用关键字如果一定要用可以在关键字后面加s。3mysql给出了三种排名方式大家可以根据实际情况选择一种。好了今天的课程就到这。大家有什么想说的可以评论区留言。也欢迎大家点赞关注。