# 外连接 select up.device_id, up.university, COALESCE(COUNT(qpd.question_id), 0) AS question_cnt, COALESCE(SUM(CASE WHEN qpd.result = 'right' THEN 1 ELSE 0 END), 0) AS right_question_cnt # COALESCE(COUNT(IF(qpd.result = 'right',1,NULL)),0) AS right_question_cnt 写法2 FROM user_profile AS up LEFT JOIN question_practice_detail AS qpd ON up.device_id = qpd.device_id AND month(qpd.date) = 8 #8月的 WHERE up.university = '复旦大学' #复旦大学 GROUP BY device_id #id进行分组
这是外连接,外连接会返回左表所有的行,即使在右表找不到记录。如果把复旦大学 放ON
里面,起不到过滤作用,返回的结果还是包括其他所有的大学,这个条件实际上是应用在连接两个表的过程中,而不是用于过滤左表的结果。
COALESCE
是一个SQL函数,用于返回参数列表中的第一个非NULL值。它接受多个参数,从左到右逐个检查,返回第一个非NULL的值。
语法如下:
COALESCE(value1, value2, ..., valuen)
value1, value2, ..., valuen
:要检查的多个值。
COALESCE
函数将返回第一个非NULL的值。如果所有值都是NULL,那么COALESCE
将返回NULL。
例如,假设有一个表user_profile
,其中包含age
列:
SELECT COALESCE(age, 0) AS adjusted_age FROM user_profile;
在这个例子中,如果age
列的值为NULL,COALESCE
将返回0,否则返回age
的实际值。这样可以在需要处理NULL值的情况下提供默认值。
COALESCE(SUM(CASE WHEN qpd.result = 'right' THEN 1 ELSE 0 END), 0) AS right_question_cnt
SUM((CASE WHEN qpd.result = 'right' THEN 1 ELSE 0 END)
对回答正确的次数进行统计,当条件为真时,CASE
表达式返回1,否则返回0。SUM
函数将所有这些1和0加总,从而得到满足条件的行数。
用if,count也同理,条件为真,返回1,否则返回NULL ,count只统计不为NULL 的行数
COALESCE(COUNT(IF(qpd.result = 'right',1,NULL)),0) AS right_question_cnt