ROUND((SUM(er.score)-MIN(er.score)-MAX(er.score)) / (COUNT(er.score)-2),1) AS clip_avg_score
FROM examination_info ei join exam_record er
on ei.exam_id = er.exam_id
where ei.tag = "SQL"
AND ei.difficulty = "hard";
复制代码
标准正确代码:
使用in子句将最大值和最小值排除掉,再求平均值
懒人写法,可以用with...as句式将要多次使用的表只写1次即可(WITH AS 语法是MySQL中的一种临时结果集,它可以在SELECT、INSERT、UPDATE或DELETE语句中使用。通过使用WITH AS语句,可以将一个查询的结果存储在一个临时表中,然后在后续的查询中引用这个临时表。这样可以简化复杂的查询,提高代码的可读性和可维护性。但是不知道哪个MySQL版本开始支持with...as句式的,我的本地电脑里面是Navicat 15 for MySQL,不支持)
(1)where和having是在临时表生产之后,对临时表中的数据进行过滤用的。
如SQL语句:select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
(2) on是在生成中临时表之前就去作用的,它会在数据源那里就把不符合要求的数据给过滤掉,即是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据所以on运行的速度最快。
如SQL语句:select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)
from exam_record er,(select count(exam_id) from exam_record
group by exam_id) t2
复制代码
正确代码1:
主要在于已完成的试卷数的统计,因为这个带有条件,且需要统计聚合结果,可以使用 聚合函数与case when 结合。count中是可以加条件的
select
count(*) total_pv,
count(score) complete_pv,
count(distinct case when score is null then null else exam_id end) complete_exam_cnt
from exam_record
复制代码
复习case when:
(1)case expr when v1 then r1 [when v2 then r2] ...[else rn] end
例如:case 2 when 1 then 'one' when 2 then 'two' else 'more' end 返回two
case后面的值为2,与第二条分支语句when后面的值相等相等,因此返回two
(2)case when v1 then r1 [when v2 then r2]...[else rn] end
例如:case when 1<0 then 'T' else 'F' end返回F
1<0的结果为false,因此函数返回值为else后面的F
正确代码2:
select count(*) as total_pv,
count(score) as complete_pv,
count(distinct exam_id,score IS NOT NULL or null) as complete_exam_cnt
# 是逗号,连接不是and连接
from exam_record
复制代码
在select和count后面都可以加条件的,但是要明白内核:
count(distinct exam_id,score IS NOT NULL or null) as complete_exam_cnt (正确)
不能是
count(distinct exam_id and score IS NOT NULL or null) as complete_exam_cnt (错误,结果永远为2, 这个题只是碰巧结果为2,改一个数据就不对了)
1 用and:
(1)一般在where后筛选过滤,还是得到的满足条件的score
(2)如果在select后直接加条件判断:这里的score is not null 是判断
符合条件的返回 true ,即为1
不符合的返回 false ,即为0
(3) 加上exam_id,进行and逻辑运算
exam_id 本身为值,可以理解为真 在 and 逻辑下,所以上一步的1,0并不会变化,后面加上or NULL,否则会把0也计算上。