SQL-聚合函数-1211.查询结果的质量和占比
select query_name, round(avg(rating/position), 2) as quality, round(sum(rating<3)*100/count(query_name), 2) as poor_query_percentage from Queries group by query_name;
注意:
1. SUM函数是用于计算指定列中的所有数值的总和,是聚合函数之一,通常与group by子句一起使用,对数据进行分组和计算汇总值。
SUM(column_name)
例如:
SELECT SUM(salary) AS total_salary FROM employees;
如果想按照某个列进行分组,并计算每个组的总和,可以结合使用sum和group by。
SELECT department, SUM(salary) AS department_salary FROM employees GROUP BY department;
在我们的 SQL 查询中,`SUM(rating < 3)` 的含义是计算满足条件 `rating < 3` 的行的数量。在这种情况下,它会将每一行的 `rating` 值是否小于 3 转换为布尔值(1 表示 true,0 表示 false),然后将这些值相加以计算满足条件的行的总数。
具体来说,`rating < 3` 的结果为布尔值(true 或 false),而在 SQL 中,true 被视为 1,false 被视为 0。因此,`SUM(rating < 3)` 的结果就是所有满足条件 `rating < 3` 的行的数量。
在你的查询中,这部分的目的是计算 `rating` 值小于 3 的行的数量,用于后续计算 `poor_query_percentage`,即差劲查询的百分比。
2. COUNT函数用于计算指定列中非NULL值的行数,通常与group by一起按组计数。
COUNT(column_name)
column_name
是你要计算非NULL值行数的列的名称,或者你可以使用 *
来计算所有行的数量。
-- 计算 employees 表中的记录数量 SELECT COUNT(*) AS total_records FROM employees;
-- 计算 department 列的不同值的数量,即部门的数量 SELECT COUNT(DISTINCT department) AS distinct_departments FROM employees;
3. 为什么不使用count计算rating < 3的行数呢,因为在sql中“rating < 3”的结果是一个布尔值,true为1,false为0。如果使用COUNT(rating<3),则只会计数不为null的行,所有行都会被计数,结果错误。如果想用count实现相同的功能,可以使用如下的代码:
COUNT(CASE WHEN rating < 3 THEN 1 ELSE END)
case会检查每一行的rating是否小于3,如果是则返回1,否则返回null。
CASE是SQL中实现条件逻辑的表达式,有两种形式:
-- 简单形式 CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE else_result END
condition1
,condition2
, ...:条件表达式,当某个条件为真时,对应的result
将被返回。result1
,result2
, ...:每个条件为真时返回的结果。else_result
:如果所有条件都不为真,则返回else_result
。
例如:
SELECT column_name, CASE WHEN column_name > 0 THEN 'Positive' WHEN column_name < 0 THEN 'Negative' ELSE 'Zero' END AS category FROM your_table;
这个查询使用 CASE
表达式根据列 column_name
的值判断其正负性,并返回相应的分类。
-- 搜索形式 CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE else_result END
expression
:要进行匹配的表达式。value1
,value2
, ...:匹配表达式的值。result1
,result2
, ...:每个匹配值对应的结果。else_result
:如果没有匹配的值,则返回else_result
。
例如:
SELECT column_name, CASE column_name WHEN 1 THEN 'One' WHEN 2 THEN 'Two' ELSE 'Other' END AS number_word FROM your_table;
此外mysql还有一些类似于if-else的语法,例如IF()函数:
SELECT column_name, IF(column_name > 0, 'Positive', 'Non-Positive') AS category FROM your_table;
在这个例子中,IF()
函数接受一个条件和两个值,如果条件为真,则返回第一个值,否则返回第二个值。