力扣-高频 SQL 50 题(基础版)-1211. 查询结果的质量和占比 一、完整建表 SQLMySQL 语法CREATE TABLE IF NOT EXISTS Queries ( query_name VARCHAR(255), result VARCHAR(255), position INT, rating INT ); 此表可能有重复的行。 此表包含了一些从数据库中收集的查询信息。 “位置”position列的值为 1 到 500 。 “评分”rating列的值为 1 到 5 。评分小于 3 的查询被定义为质量很差的查询。INSERT INTO Queries (query_name, result, position, rating) VALUES (Dog, Golden Retriever, 1, 5), (Dog, German Shepherd, 2, 5), (Dog, Mule, 200, 1), (Cat, Shirazi, 5, 2), (Cat, Siamese, 3, 3), (Cat, Sphynx, 7, 4);二、需求将查询结果的质量quality定义为各查询结果的评分与其位置之间比率的平均值。将劣质查询百分比poor_query_percentage定义为评分小于 3 的查询结果占全部查询结果的百分比。编写解决方案找出每次的query_name、quality和poor_query_percentage。quality和poor_query_percentage都应四舍五入到小数点后两位。以任意顺序返回结果表。结果格式如下所示三、 思路与解题很简单的查询逻辑语句下面展示符合编程逻辑的错误答案# Write your MySQL query statement below select query_name,round(avg(rating/position),2) quality,round(count(rating 3)/count(*)*100,2) poor_query_percentage from Queries group by query_name1.错误写法很多新手第一反应写出SQL不支持这种语法round(count(rating 3)/count(*)*100,2)2.正确标准写法力扣这道查询质量题标准答案round(sum(if(rating3,1,0))/count(*)*100,2)3.底层原理COUNT 函数的统计规则核心根源COUNT(表达式)统计规则只判断表达式是否为 NULL不判断真假表达式结果 NULL → 不计入统计表达式结果 任意数字 / 字符串0、1、false、true→ 全部统计rating 3布尔运算返回结果 MySQL 中布尔值本质是数字成立 1不成立 0 不管满足劣质条件与否结果都是数字永远不会出现 NULL分组内有 3 条数据rating 分别是5、5、1rating3 的结果依次是 0、0、1执行count(rating3) → 三个值都不是 NULL统计总数 3和count(*)完全一样永远算不出劣质行数逻辑彻底失效4.SUMIF 为什么能正确统计符合条件数据SUM(IF(rating 3, 1, 0))IF 分支满足条件返回数字 1不满足返回数字 0SUM 累加只会把 1 累加0 不会增加总和最终总和 当前分组满足rating3的记录条数完美实现条件计数5.拓展两种替代合法写法效果完全一致写法 1 CASE WHEN可读性更高SUM(CASE WHEN rating 3 THEN 1 ELSE 0 END)写法 2 COUNT 配合 NULL小众不推荐新手利用 COUNT 忽略 NULL 的特性不满足返回 NULL只统计返回 1 的行COUNT(IF(rating 3, 1, NULL))四、总结统计符合条件行数不要用 COUNT (条件)布尔 0/1 不会被过滤条件计数首选SUM(IF(条件,1,0))分组场景通用