# 外连接
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