--- title: SQL常è§é¢è¯é¢æ»ç»ï¼3ï¼ description: SQL常è§é¢è¯é¢æ»ç»ç¬¬ä¸ç¯ï¼æ·±å ¥è®²è§£èå彿°COUNTãSUMãAVGãMAXãMINç使ç¨ï¼ä»¥åGROUP BYåç»ãHAVINGè¿æ»¤ãæªæå¹³åå¼è®¡ç®çè¿é¶æå·§ã category: æ°æ®åº tag: - æ°æ®åºåºç¡ - SQL head: - - meta - name: keywords content: SQLé¢è¯é¢,èå彿°,COUNT,SUM,AVG,MAX,MIN,GROUP BY,HAVING,æªæå¹³åå¼ --- > é¢ç®æ¥æºäºï¼[ç客é¢é¸ - SQL è¿é¶ææ](https://www.nowcoder.com/exam/oj?page=1&tab=SQL%E7%AF%87&topicId=240) è¾é¾æè å°é¾çé¢ç®å¯ä»¥æ ¹æ®èªèº«å®é æ åµåé¢è¯éè¦æ¥å³å®æ¯å¦è¦è·³è¿ã ## èå彿° ### SQL ç±»å«é«é¾åº¦è¯å·å¾åçæªæå¹³åå¼ï¼è¾é¾ï¼ **æè¿°**ï¼ ç客çè¿è¥å妿³è¦æ¥çå¤§å®¶å¨ SQL ç±»å«ä¸é«é¾åº¦è¯å·çå¾åæ åµã è¯·ä½ å¸®å¥¹ä»`exam_record`æ°æ®è¡¨ä¸è®¡ç®ææç¨æ·å®æ SQL ç±»å«é«é¾åº¦è¯å·å¾åçæªæå¹³åå¼ï¼å»æä¸ä¸ªæå¤§å¼åä¸ä¸ªæå°å¼åçå¹³åå¼ï¼ã ç¤ºä¾æ°æ®ï¼`examination_info`ï¼`exam_id` è¯å· ID, tag è¯å·ç±»å«, `difficulty` è¯å·é¾åº¦, `duration` èè¯æ¶é¿, `release_time` å叿¶é´ï¼ | id | exam_id | tag | difficulty | duration | release_time | | --- | ------- | ---- | ---------- | -------- | ------------------- | | 1 | 9001 | SQL | hard | 60 | 2020-01-01 10:00:00 | | 2 | 9002 | ç®æ³ | medium | 80 | 2020-08-02 10:00:00 | ç¤ºä¾æ°æ®ï¼`exam_record`ï¼uid ç¨æ· ID, exam_id è¯å· ID, start_time å¼å§ä½çæ¶é´, submit_time äº¤å·æ¶é´, score å¾åï¼ | id | uid | exam_id | start_time | submit_time | score | | --- | ---- | ------- | ------------------- | ------------------- | ------ | | 1 | 1001 | 9001 | 2020-01-02 09:01:01 | 2020-01-02 09:21:01 | 80 | | 2 | 1001 | 9001 | 2021-05-02 10:01:01 | 2021-05-02 10:30:01 | 81 | | 3 | 1001 | 9001 | 2021-06-02 19:01:01 | 2021-06-02 19:31:01 | 84 | | 4 | 1001 | 9002 | 2021-09-05 19:01:01 | 2021-09-05 19:40:01 | 89 | | 5 | 1001 | 9001 | 2021-09-02 12:01:01 | (NULL) | (NULL) | | 6 | 1001 | 9002 | 2021-09-01 12:01:01 | (NULL) | (NULL) | | 7 | 1002 | 9002 | 2021-02-02 19:01:01 | 2021-02-02 19:30:01 | 87 | | 8 | 1002 | 9001 | 2021-05-05 18:01:01 | 2021-05-05 18:59:02 | 90 | | 9 | 1003 | 9001 | 2021-09-07 12:01:01 | 2021-09-07 10:31:01 | 50 | | 10 | 1004 | 9001 | 2021-09-06 10:01:01 | (NULL) | (NULL) | æ ¹æ®è¾å ¥ä½ çæ¥è¯¢ç»æå¦ä¸ï¼ | tag | difficulty | clip_avg_score | | --- | ---------- | -------------- | | SQL | hard | 81.7 | ä»`examination_info`表å¯ç¥ï¼è¯å· 9001 为é«é¾åº¦ SQL è¯å·ï¼è¯¥è¯å·è¢«ä½ççå¾åæ[80,81,84,90,50]ï¼å»é¤æé«ååæä½åå为[80,81,84]ï¼å¹³åå为 81.6666667ï¼ä¿çä¸ä½å°æ°å为 81.7 **è¾å ¥æè¿°ï¼** è¾å ¥æ°æ®ä¸è³å°æ 3 个ææåæ° **æè·¯ä¸ï¼** è¦æ¾åºé«é¾åº¦ sql è¯å·ï¼è¯å®éè¦è examination_info è¿å¼ 表ï¼ç¶åæ¾åºé«é¾åº¦ç课ç¨ï¼ç± examination_info å¾ç¥ï¼é«é¾åº¦ sql ç exam_id 为 9001ï¼é£ä¹çä¸å°±ä»¥ exam_id = 9001 ä½ä¸ºæ¡ä»¶å»æ¥è¯¢ï¼ å æ¾åº 9001 å·èè¯ `select * from exam_record where exam_id = 9001` ç¶åï¼æ¾åºæé«å `select max(score) æé«å from exam_record where exam_id = 9001` æ¥çï¼æ¾åºæä½å `select min(score) æä½å from exam_record where exam_id = 9001` 卿¥è¯¢åºæ¥çåæ°ç»æéå½ä¸ï¼å»ææé«ååæä½åï¼æç´è§è½æ³å°çå°±æ¯ NOT IN æè ç¨ NOT EXISTS ä¹è¡ï¼è¿é以 NOT IN æ¥å é¦å å°ä¸»ä½ååºæ¥`select tag, difficulty, round(avg(score), 1) clip_avg_score from examination_info info INNER JOIN exam_record record` **å° tips** : MYSQL ç `ROUND()` 彿° ,`ROUND(X)`è¿ååæ° X æè¿ä¼¼çæ´æ° `ROUND(X,D)`è¿å X ,å ¶å¼ä¿çå°å°æ°ç¹å D ä½,第 D ä½çä¿çæ¹å¼ä¸ºåèäºå ¥ã åå°ä¸é¢ç "ç¢ç" è¯å¥æ¼åèµ·æ¥å³å¯ï¼ 注æå¨ NOT IN ä¸ä¸¤ä¸ªåæ¥è¯¢ç¨ UNION ALL æ¥å ³èï¼ç¨ union æ max å min çç»æéä¸å¨ä¸è¡å½ä¸ï¼è¿æ ·å½¢æä¸åå¤è¡çææã **çæ¡ä¸ï¼** ```sql SELECT tag, difficulty, ROUND(AVG(score), 1) clip_avg_score FROM examination_info info INNER JOIN exam_record record WHERE info.exam_id = record.exam_id AND record.exam_id = 9001 AND record.score NOT IN( SELECT MAX(score) FROM exam_record WHERE exam_id = 9001 UNION ALL SELECT MIN(score) FROM exam_record WHERE exam_id = 9001 ) ``` è¿æ¯æç´è§ï¼ä¹æ¯æå®¹ææ³å°çè§£æ³ï¼ä½æ¯è¿æå¾ æ¹è¿ï¼è¿ç®æ¯ææºåå·§è¿å ³ï¼å ¶å®ä¸¥æ ¼æç §é¢ç®è¦æ±åºè¯¥è¿ä¹åï¼ ```sql SELECT tag, difficulty, ROUND(AVG(score), 1) clip_avg_score FROM examination_info info INNER JOIN exam_record record WHERE info.exam_id = record.exam_id AND record.exam_id = (SELECT examination_info.exam_id FROM examination_info WHERE tag = 'SQL' AND difficulty = 'hard' ) AND record.score NOT IN (SELECT MAX(score) FROM exam_record WHERE exam_id = (SELECT examination_info.exam_id FROM examination_info WHERE tag = 'SQL' AND difficulty = 'hard' ) UNION ALL SELECT MIN(score) FROM exam_record WHERE exam_id = (SELECT examination_info.exam_id FROM examination_info WHERE tag = 'SQL' AND difficulty = 'hard' ) ) ``` ç¶èä½ ä¼åç°ï¼éå¤çè¯å¥é常å¤ï¼æä»¥å¯ä»¥å©ç¨`WITH`æ¥æ½åå ¬å ±é¨å **`WITH` åå¥ä»ç»**ï¼ `WITH` åå¥ï¼ä¹ç§°ä¸ºå ¬å ±è¡¨è¡¨è¾¾å¼ï¼Common Table Expressionï¼CTEï¼ï¼æ¯å¨ SQL æ¥è¯¢ä¸å®ä¹ä¸´æ¶è¡¨çæ¹å¼ãå®å¯ä»¥è®©æä»¬å¨æ¥è¯¢ä¸å建ä¸ä¸ªä¸´æ¶å½åçç»æéï¼å¹¶ä¸å¯ä»¥å¨å䏿¥è¯¢ä¸å¼ç¨è¯¥ç»æéã åºæ¬ç¨æ³ï¼ ```sql WITH cte_name (column1, column2, ..., columnN) AS ( -- æ¥è¯¢ä½ SELECT ... FROM ... WHERE ... ) -- 主æ¥è¯¢ SELECT ... FROM cte_name WHERE ... ``` `WITH` åå¥ç±ä»¥ä¸å 个é¨åç»æï¼ - `cte_name`: ç»ä¸´æ¶è¡¨èµ·ä¸ä¸ªåç§°ï¼å¯ä»¥å¨ä¸»æ¥è¯¢ä¸å¼ç¨ã - `(column1, column2, ..., columnN)`: å¯éï¼æå®ä¸´æ¶è¡¨çååã - `AS`: å¿ éï¼è¡¨ç¤ºå¼å§å®ä¹ä¸´æ¶è¡¨ã - `CTE æ¥è¯¢ä½`: å®é çæ¥è¯¢è¯å¥ï¼ç¨äºå®ä¹ä¸´æ¶è¡¨ä¸çæ°æ®ã `WITH` åå¥ç主è¦ç¨éä¹ä¸æ¯å¢å¼ºæ¥è¯¢çå¯è¯»æ§åå¯ç»´æ¤æ§ï¼å°¤å ¶å¨æ¶åå¤ä¸ªåµå¥åæ¥è¯¢æéè¦éå¤ä½¿ç¨ç¸åçæ¥è¯¢é»è¾æ¶ãéè¿å°è¿äºé»è¾æ¾å¨ä¸ä¸ªå½åç临æ¶è¡¨ä¸ï¼æä»¬å¯ä»¥æ´æ¸ æ°å°ç»ç»æ¥è¯¢ï¼å¹¶æ¶é¤éå¤ä»£ç ã æ¤å¤ï¼`WITH` åå¥è¿å¯ä»¥å¨å¤æçæ¥è¯¢ä¸å®ç°é彿¥è¯¢ãé彿¥è¯¢å 许æä»¬å¨å个æ¥è¯¢ä¸æ§è¡å¯¹åä¸è¡¨ç夿¬¡è¿ä»£ï¼éæ¥æå»ºç»æéãè¿å¨å¤ç屿¬¡ç»ææ°æ®ãç»ç»ç»æåæ ç¶ç»æçåºæ¯ä¸é常æç¨ã **å°ç»è**ï¼MySQL 5.7 çæ¬ä»¥åä¹åççæ¬ä¸æ¯æå¨ `WITH` åå¥ä¸ç´æ¥ä½¿ç¨å«åã ä¸é¢æ¯æ¹è¿åççæ¡ï¼ ```sql WITH t1 AS (SELECT record.*, info.tag, info.difficulty FROM exam_record record INNER JOIN examination_info info ON record.exam_id = info.exam_id WHERE info.tag = "SQL" AND info.difficulty = "hard" ) SELECT tag, difficulty, ROUND(AVG(score), 1) FROM t1 WHERE score NOT IN (SELECT max(score) FROM t1 UNION SELECT min(score) FROM t1) ``` **æè·¯äºï¼** - çé SQL é«é¾åº¦è¯å·ï¼`where tag="SQL" and difficulty="hard"` - è®¡ç®æªæå¹³åå¼ï¼`(å-æå¤§å¼-æå°å¼) / (æ»ä¸ªæ°-2)`: - `(sum(score) - max(score) - min(score)) / (count(score) - 2)` - æä¸ä¸ªç¼ºç¹å°±æ¯ï¼å¦ææå¤§å¼åæå°å¼æå¤ä¸ªï¼è¿ä¸ªæ¹æ³å°±å¾é¾çéåºæ¥, 使¯é¢ç®ä¸è¯´äº----->**`廿ä¸ä¸ªæå¤§å¼åä¸ä¸ªæå°å¼åçå¹³åå¼`**, æä»¥è¿éå¯ä»¥ç¨è¿ä¸ªå ¬å¼ã **çæ¡äºï¼** ```sql SELECT info.tag, info.difficulty, ROUND((SUM(record.score)- MIN(record.score)- MAX(record.score)) / (COUNT(record.score)- 2), 1) AS clip_avg_score FROM examination_info info, exam_record record WHERE info.exam_id = record.exam_id AND info.tag = "SQL" AND info.difficulty = "hard"; ``` ### ç»è®¡ä½çæ¬¡æ° æä¸ä¸ªè¯å·ä½çè®°å½è¡¨ `exam_record`ï¼è¯·ä»ä¸ç»è®¡åºæ»ä½çæ¬¡æ° `total_pv`ãè¯å·å·²å®æä½çæ° `complete_pv`ã已宿çè¯å·æ° `complete_exam_cnt`ã ç¤ºä¾æ°æ® `exam_record` 表ï¼`uid` ç¨æ· ID, `exam_id` è¯å· ID, `start_time` å¼å§ä½çæ¶é´, `submit_time` äº¤å·æ¶é´, `score` å¾åï¼ï¼ | id | uid | exam_id | start_time | submit_time | score | | --- | ---- | ------- | ------------------- | ------------------- | ------ | | 1 | 1001 | 9001 | 2020-01-02 09:01:01 | 2020-01-02 09:21:01 | 80 | | 2 | 1001 | 9001 | 2021-05-02 10:01:01 | 2021-05-02 10:30:01 | 81 | | 3 | 1001 | 9001 | 2021-06-02 19:01:01 | 2021-06-02 19:31:01 | 84 | | 4 | 1001 | 9002 | 2021-09-05 19:01:01 | 2021-09-05 19:40:01 | 89 | | 5 | 1001 | 9001 | 2021-09-02 12:01:01 | (NULL) | (NULL) | | 6 | 1001 | 9002 | 2021-09-01 12:01:01 | (NULL) | (NULL) | | 7 | 1002 | 9002 | 2021-02-02 19:01:01 | 2021-02-02 19:30:01 | 87 | | 8 | 1002 | 9001 | 2021-05-05 18:01:01 | 2021-05-05 18:59:02 | 90 | | 9 | 1003 | 9001 | 2021-09-07 12:01:01 | 2021-09-07 10:31:01 | 50 | | 10 | 1004 | 9001 | 2021-09-06 10:01:01 | (NULL) | (NULL) | 示ä¾è¾åºï¼ | total_pv | complete_pv | complete_exam_cnt | | -------- | ----------- | ----------------- | | 10 | 7 | 2 | è§£éï¼è¡¨ç¤ºæªæ¢å½åï¼æ 10 次è¯å·ä½çè®°å½ï¼å·²å®æçä½ç次æ°ä¸º 7 次ï¼ä¸ééåºç为æªå®æç¶æï¼å ¶äº¤å·æ¶é´å份æ°ä¸º NULLï¼ï¼å·²å®æçè¯å·æ 9001 å 9002 两份ã **æè·¯**ï¼ è¿é¢ä¸çå°ç»è®¡æ¬¡æ°ï¼è¯å®ç¬¬ä¸æ¶é´å°±è¦æ³å°ç¨`COUNT`è¿ä¸ªå½æ°æ¥è§£å³ï¼é®é¢æ¯è¦ç»è®¡ä¸åçè®°å½ï¼è¯¥æä¹æ¥åï¼ä½¿ç¨åæ¥è¯¢å°±è½è§£å³è¿ä¸ªé¢ç®(è¿é¢ç¨ case when ä¹è½ååºæ¥ï¼è§£æ³ç±»ä¼¼ï¼é»è¾ä¸åèå·²)ï¼é¦å å¨åè¿ä¸ªé¢ä¹åï¼è®©æä»¬å æ¥äºè§£ä¸ä¸`COUNT`çåºæ¬ç¨æ³ï¼ `COUNT()` 彿°çåºæ¬è¯æ³å¦ä¸æç¤ºï¼ ```sql COUNT(expression) ``` å ¶ä¸ï¼`expression` å¯ä»¥æ¯ååã表达å¼ã常éæéé 符ãä¸é¢æ¯ä¸äºå¸¸è§çç¨æ³ç¤ºä¾ï¼ 1. 计ç®è¡¨ä¸ææè¡çæ°éï¼ ```sql SELECT COUNT(*) FROM table_name; ``` 2. 计ç®ç¹å®åé空ï¼ä¸ä¸º NULLï¼å¼çæ°éï¼ ```sql SELECT COUNT(column_name) FROM table_name; ``` 3. è®¡ç®æ»¡è¶³æ¡ä»¶çè¡æ°ï¼ ```sql SELECT COUNT(*) FROM table_name WHERE condition; ``` 4. ç»å `GROUP BY` 使ç¨ï¼è®¡ç®åç»åæ¯ä¸ªç»çè¡æ°ï¼ ```sql SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name; ``` 5. 计ç®ä¸ååç»åçå¯ä¸ç»åæ°ï¼ ```sql SELECT COUNT(DISTINCT column_name1, column_name2) FROM table_name; ``` å¨ä½¿ç¨ `COUNT()` 彿°æ¶ï¼å¦æä¸æå®ä»»ä½åæ°æè ä½¿ç¨ `COUNT(*)`ï¼å°ä¼è®¡ç®ææè¡çæ°éãèå¦æä½¿ç¨ååï¼ååªä¼è®¡ç®è¯¥åé空å¼çæ°éã å¦å¤ï¼`COUNT()` 彿°çç»ææ¯ä¸ä¸ªæ´æ°å¼ãå³ä½¿ç»ææ¯é¶ï¼ä¹ä¸ä¼è¿å NULLï¼è¿ç¹éè¦è°¨è®°ã **çæ¡**ï¼ ```sql SELECT count(*) total_pv, ( SELECT count(*) FROM exam_record WHERE submit_time IS NOT NULL ) complete_pv, ( SELECT COUNT( DISTINCT exam_id, score IS NOT NULL OR NULL ) FROM exam_record ) complete_exam_cnt FROM exam_record ``` è¿éçé说ä¸ä¸`COUNT( DISTINCT exam_id, score IS NOT NULL OR NULL )`è¿ä¸å¥ï¼å¤æ score æ¯å¦ä¸º null ï¼å¦ææ¯å³ä¸ºçï¼å¦æä¸æ¯è¿å nullï¼æ³¨æè¿é妿ä¸å `or null` å¨ä¸æ¯ null çæ åµä¸åªä¼è¿å false ä¹å°±æ¯è¿å 0ï¼ `COUNT`æ¬èº«æ¯ä¸å¯ä»¥å¯¹å¤åæ±è¡æ°çï¼`distinct`çå å ¥æ¯çå¤åæä¸ºä¸ä¸ªæ´ä½ï¼å¯ä»¥æ±åºç°çè¡æ°äº;`count distinct`å¨è®¡ç®æ¶åªè¿åé null çè¡, è¿ä¸ªä¹è¦æ³¨æï¼ å¦å¤éè¿æ¬é¢ get å°äº------>count å æ¡ä»¶å¸¸ç¨å¥å¼`count( å夿 or null)` ### å¾åä¸å°äºå¹³ååçæä½å **æè¿°**ï¼ è¯·ä»è¯å·ä½çè®°å½è¡¨ä¸æ¾å° SQL è¯å·å¾åä¸å°äºè¯¥ç±»è¯å·å¹³åå¾åçç¨æ·æä½å¾åã ç¤ºä¾æ°æ® exam_record 表ï¼uid ç¨æ· ID, exam_id è¯å· ID, start_time å¼å§ä½çæ¶é´, submit_time äº¤å·æ¶é´, score å¾åï¼ï¼ | id | uid | exam_id | start_time | submit_time | score | | --- | ---- | ------- | ------------------- | ------------------- | ------ | | 1 | 1001 | 9001 | 2020-01-02 09:01:01 | 2020-01-02 09:21:01 | 80 | | 2 | 1002 | 9001 | 2021-09-05 19:01:01 | 2021-09-05 19:40:01 | 89 | | 3 | 1002 | 9002 | 2021-09-02 12:01:01 | (NULL) | (NULL) | | 4 | 1002 | 9003 | 2021-09-01 12:01:01 | (NULL) | (NULL) | | 5 | 1002 | 9001 | 2021-02-02 19:01:01 | 2021-02-02 19:30:01 | 87 | | 6 | 1002 | 9002 | 2021-05-05 18:01:01 | 2021-05-05 18:59:02 | 90 | | 7 | 1003 | 9002 | 2021-02-06 12:01:01 | (NULL) | (NULL) | | 8 | 1003 | 9003 | 2021-09-07 10:01:01 | 2021-09-07 10:31:01 | 86 | | 9 | 1004 | 9003 | 2021-09-06 12:01:01 | (NULL) | (NULL) | `examination_info` 表ï¼`exam_id` è¯å· ID, `tag` è¯å·ç±»å«, `difficulty` è¯å·é¾åº¦, `duration` èè¯æ¶é¿, `release_time` å叿¶é´ï¼ | id | exam_id | tag | difficulty | duration | release_time | | --- | ------- | ---- | ---------- | -------- | ------------------- | | 1 | 9001 | SQL | hard | 60 | 2020-01-01 10:00:00 | | 2 | 9002 | SQL | easy | 60 | 2020-02-01 10:00:00 | | 3 | 9003 | ç®æ³ | medium | 80 | 2020-08-02 10:00:00 | 示ä¾è¾åºæ°æ®ï¼ | min_score_over_avg | | ------------------ | | 87 | **è§£é**ï¼è¯å· 9001 å 9002 为 SQL ç±»å«ï¼ä½çè¿ä¸¤ä»½è¯å·çå¾åæ[80,89,87,90]ï¼å¹³åå为 86.5ï¼ä¸å°äºå¹³ååçæå°åæ°ä¸º 87 **æè·¯**ï¼è¿ç±»é¢ç®ç¬¬ä¸ç¼çç¡®å®å¾å¤æï¼ å 为ä¸ç¥éä»åªå ¥æï¼ä½æ¯å½æä»¬ä»ç»è¯»é¢å®¡é¢åï¼è¦å¦ä¼æä½é¢å¹²ä¸çå ³é®ä¿¡æ¯ã以æ¬é¢ä¸ºä¾ï¼`请ä»è¯å·ä½çè®°å½è¡¨ä¸æ¾å°SQLè¯å·å¾åä¸å°äºè¯¥ç±»è¯å·å¹³åå¾åçç¨æ·æä½å¾åã`ä½ è½ä¸ç¼ä»ä¸æååªäºææä¿¡æ¯æ¥ä½ä¸ºè§£é¢æè·¯ï¼ ç¬¬ä¸æ¡ï¼æ¾å°==SQL==è¯å·å¾å ç¬¬äºæ¡ï¼è¯¥ç±»è¯å·==å¹³åå¾å== ç¬¬ä¸æ¡ï¼è¯¥ç±»è¯å·ç==ç¨æ·æä½å¾å== ç¶åä¸é´ç âæ¡¥æ¢â å°±æ¯==ä¸å°äº== å°æ¡ä»¶æååï¼å 鿥宿 ```sql -- æ¾åºtag为âSQLâçå¾å ã80, 89,87,90ã -- åç®åºè¿ä¸ç»çå¹³åå¾å select ROUND(AVG(score), 1) from examination_info info INNER JOIN exam_record record where info.exam_id = record.exam_id and tag= 'SQL' ``` ç¶ååæ¾åºè¯¥ç±»è¯å·çæä½å¾åï¼æ¥çå°ç»æé`ã80, 89,87,90ã` å»åå¹³å忰使¯è¾ï¼æ¹å¯å¾åºæç»çæ¡ã **çæ¡**ï¼ ```sql SELECT MIN(score) AS min_score_over_avg FROM examination_info info INNER JOIN exam_record record WHERE info.exam_id = record.exam_id AND tag= 'SQL' AND score >= (SELECT ROUND(AVG(score), 1) FROM examination_info info INNER JOIN exam_record record WHERE info.exam_id = record.exam_id AND tag= 'SQL' ) ``` å ¶å®è¿ç±»é¢ç®ç»åºçè¦æ±çä¼¼å¾ âç»âï¼ä½å ¶å®ä»ç»æ¢³çä¸éï¼å°å¤§æ¡ä»¶æåæå°æ¡ä»¶ï¼é个æåå®ä»¥åï¼æåå°æææ¡ä»¶æ¼åèµ·æ¥ã忣åªè¦è®°ä½ï¼**æä¸»å¹²ï¼ç忝**ï¼é®é¢ä¾¿è¿åèè§£ã ## åç»æ¥è¯¢ ### 平忴»è·å¤©æ°åææ´»äººæ° **æè¿°**ï¼ç¨æ·å¨ç客è¯å·ä½çåºä½çè®°å½åå¨å¨è¡¨ `exam_record` ä¸ï¼å 容å¦ä¸ï¼ `exam_record` 表ï¼`uid` ç¨æ· ID, `exam_id` è¯å· ID, `start_time` å¼å§ä½çæ¶é´, `submit_time` äº¤å·æ¶é´, `score` å¾åï¼ | id | uid | exam_id | start_time | submit_time | score | | --- | ---- | ------- | ------------------- | ------------------- | ------ | | 1 | 1001 | 9001 | 2021-07-02 09:01:01 | 2021-07-02 09:21:01 | 80 | | 2 | 1002 | 9001 | 2021-09-05 19:01:01 | 2021-09-05 19:40:01 | 81 | | 3 | 1002 | 9002 | 2021-09-02 12:01:01 | (NULL) | (NULL) | | 4 | 1002 | 9003 | 2021-09-01 12:01:01 | (NULL) | (NULL) | | 5 | 1002 | 9001 | 2021-07-02 19:01:01 | 2021-07-02 19:30:01 | 82 | | 6 | 1002 | 9002 | 2021-07-05 18:01:01 | 2021-07-05 18:59:02 | 90 | | 7 | 1003 | 9002 | 2021-07-06 12:01:01 | (NULL) | (NULL) | | 8 | 1003 | 9003 | 2021-09-07 10:01:01 | 2021-09-07 10:31:01 | 86 | | 9 | 1004 | 9003 | 2021-09-06 12:01:01 | (NULL) | (NULL) | | 10 | 1002 | 9003 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 81 | | 11 | 1005 | 9001 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 88 | | 12 | 1006 | 9002 | 2021-09-02 12:11:01 | 2021-09-02 12:31:01 | 89 | | 13 | 1007 | 9002 | 2020-09-02 12:11:01 | 2020-09-02 12:31:01 | 89 | è¯·è®¡ç® 2021 å¹´æ¯ä¸ªæéè¯å·ä½çåºç¨æ·å¹³åææ´»è·å¤©æ° `avg_active_days` åæåº¦æ´»è·äººæ° `mau`ï¼ä¸é¢æ°æ®ç示ä¾è¾åºå¦ä¸ï¼ | month | avg_active_days | mau | | ------ | --------------- | --- | | 202107 | 1.50 | 2 | | 202109 | 1.25 | 4 | **è§£é**ï¼2021 å¹´ 7 ææ 2 人活è·ï¼å ±æ´»è·äº 3 天ï¼1001 æ´»è· 1 天ï¼1002 æ´»è· 2 天ï¼ï¼å¹³åæ´»è·å¤©æ° 1.5ï¼2021 å¹´ 9 ææ 4 人活è·ï¼å ±æ´»è·äº 5 天ï¼å¹³åæ´»è·å¤©æ° 1.25ï¼ç»æä¿ç 2 ä½å°æ°ã æ³¨ï¼æ¤å¤æ´»è·ææ==交å·==è¡ä¸ºã **æè·¯**ï¼è¯»å®é¢å 注æé«äº®é¨åï¼ä¸è¬æ±å¤©æ°åææ´»è·äººæ°é©¬ä¸å°±è¦æ³å°ç¸å ³çæ¥æå½æ°ï¼è¿ä¸é¢æä»¬åæ ·æ¥è¿è¡æåï¼æé®é¢ç»ååè§£å³ï¼é¦å æ±æ´»è·äººæ°ï¼è¯å®è¦ç¨å°`COUNT()`ï¼é£è¿éé¦å å°±æä¸ä¸ªåï¼ä¸ç¥é大家注æäºæ²¡æï¼ç¨æ· 1002 å¨ 9 æä»½åäºä¸¤ç§ä¸åçè¯å·ï¼æä»¥è¿éè¦æ³¨æå»éï¼ä¸ç¶å¨ç»è®¡çæ¶åï¼æ´»è·äººæ°æ¯éçï¼ç¬¬äºä¸ªå°±æ¯è¦ç¥éæ¥æçæ ¼å¼åï¼å¦ä¸è¡¨ï¼é¢ç®è¦æ±ä»¥`202107`è¿ç§æ¥ææ ¼å¼å±ç°ï¼è¦ç¨å°`DATE_FORMAT`æ¥è¿è¡æ ¼å¼åã åºæ¬ç¨æ³ï¼ `DATE_FORMAT(date_value, format)` - `date_value` åæ°æ¯å¾ æ ¼å¼åçæ¥æææ¶é´å¼ã - `format` åæ°æ¯æå®çæ¥æææ¶é´æ ¼å¼ï¼è¿ä¸ªå Java éé¢çæ¥ææ ¼å¼ä¸æ ·ï¼ã **çæ¡**ï¼ ```sql SELECT DATE_FORMAT(submit_time, '%Y%m') MONTH, round(count(DISTINCT UID, DATE_FORMAT(submit_time, '%Y%m%d')) / count(DISTINCT UID), 2) avg_active_days, COUNT(DISTINCT UID) mau FROM exam_record WHERE YEAR (submit_time) = 2021 GROUP BY MONTH ``` è¿éå¤è¯´ä¸å¥, 使ç¨`COUNT(DISTINCT uid, DATE_FORMAT(submit_time, '%Y%m%d'))` å¯ä»¥ç»è®¡å¨ `uid` åå `submit_time` åæç §å¹´ä»½ãæä»½åæ¥æè¿è¡æ ¼å¼ååçç»åå¼çæ°éã ### ææ»å·é¢æ°åæ¥åå·é¢æ° **æè¿°**ï¼ç°æä¸å¼ é¢ç®ç»ä¹ è®°å½è¡¨ `practice_record`ï¼ç¤ºä¾å 容å¦ä¸ï¼ | id | uid | question_id | submit_time | score | | --- | ---- | ----------- | ------------------- | ----- | | 1 | 1001 | 8001 | 2021-08-02 11:41:01 | 60 | | 2 | 1002 | 8001 | 2021-09-02 19:30:01 | 50 | | 3 | 1002 | 8001 | 2021-09-02 19:20:01 | 70 | | 4 | 1002 | 8002 | 2021-09-02 19:38:01 | 70 | | 5 | 1003 | 8002 | 2021-08-01 19:38:01 | 80 | 请ä»ä¸ç»è®¡åº 2021 å¹´æ¯ä¸ªæéç¨æ·çææ»å·é¢æ° `month_q_cnt` 忥åå·é¢æ° `avg_day_q_cnt`ï¼ææä»½ååºæåºï¼ä»¥åè¯¥å¹´çæ»ä½æ åµï¼ç¤ºä¾æ°æ®è¾åºå¦ä¸ï¼ | submit_month | month_q_cnt | avg_day_q_cnt | | ------------ | ----------- | ------------- | | 202108 | 2 | 0.065 | | 202109 | 3 | 0.100 | | 2021 æ±æ» | 5 | 0.161 | **è§£é**ï¼2021 å¹´ 8 æå ±æ 2 次å·é¢è®°å½ï¼æ¥åå·é¢æ°ä¸º 2/31=0.065ï¼ä¿ç 3 ä½å°æ°ï¼ï¼2021 å¹´ 9 æå ±æ 3 次å·é¢è®°å½ï¼æ¥åå·é¢æ°ä¸º 3/30=0.100ï¼2021 å¹´å ±æ 5 次å·é¢è®°å½ï¼å¹´åº¦æ±æ»å¹³åæ å®é æä¹ï¼è¿éæä»¬æç § 31 天æ¥ç® 5/31=0.161ï¼ > ç客已ç»éç¨ææ°ç Mysql çæ¬ï¼å¦ææ¨è¿è¡ç»æåºç°é误ï¼ONLY_FULL_GROUP_BYï¼æææ¯ï¼å¯¹äº GROUP BY èåæä½ï¼å¦æå¨ SELECT ä¸çåï¼æ²¡æå¨ GROUP BY ä¸åºç°ï¼é£ä¹è¿ä¸ª SQL æ¯ä¸åæ³çï¼å 为åä¸å¨ GROUP BY ä»å¥ä¸ï¼ä¹å°±æ¯è¯´æ¥åºæ¥çåå¿ é¡»å¨ group by åé¢åºç°å¦å就伿¥éï¼æè è¿ä¸ªå段åºç°å¨èå彿°éé¢ã **æè·¯ï¼** çå°å®ä¾æ°æ®å°±è¦é©¬ä¸èæ³å°ç¸å ³ç彿°ï¼æ¯å¦`submit_month`å°±è¦ç¨å°`DATE_FORMAT`æ¥æ ¼å¼åæ¥æãç¶åæ¥åºæ¯æçå·é¢æ°éã æ¯æçå·é¢æ°é ```sql SELECT MONTH ( submit_time ), COUNT( question_id ) FROM practice_record GROUP BY MONTH (submit_time) ``` æ¥ç第ä¸åè¿éè¦ç¨å°`DAY(LAST_DAY(date_value))`彿°æ¥æ¥æ¾ç»å®æ¥æçæä»½ä¸ç天æ°ã 示ä¾ä»£ç å¦ä¸ï¼ ```sql SELECT DAY(LAST_DAY('2023-07-08')) AS days_in_month; -- è¾åºï¼31 SELECT DAY(LAST_DAY('2023-02-01')) AS days_in_month; -- è¾åºï¼28 (é°å¹´ä¸çäºæä»½) SELECT DAY(LAST_DAY(NOW())) AS days_in_current_month; -- è¾åºï¼31 ï¼å½åæä»½ç天æ°ï¼ ``` ä½¿ç¨ `LAST_DAY()` 彿°è·åç»å®æ¥æç彿æåä¸å¤©ï¼ç¶åä½¿ç¨ `DAY()` 彿°æåè¯¥æ¥æç天æ°ãè¿æ ·å°±è½è·å¾æå®æä»½ç天æ°ã éè¦æ³¨æçæ¯ï¼`LAST_DAY()` 彿°è¿åçæ¯æ¥æå¼ï¼è `DAY()` 彿°ç¨äºæåæ¥æå¼ä¸ç天æ°é¨åã æäºä¸è¿°çåæä¹åï¼å³å¯é©¬ä¸ååºçæ¡ï¼è¿é¢å¤æå°±å¤æå¨å¤çæ¥æä¸ï¼å ¶ä¸çé»è¾å¹¶ä¸é¾ã **çæ¡**ï¼ ```sql SELECT DATE_FORMAT(submit_time, '%Y%m') submit_month, count(question_id) month_q_cnt, ROUND(COUNT(question_id) / DAY (LAST_DAY(submit_time)), 3) avg_day_q_cnt FROM practice_record WHERE DATE_FORMAT(submit_time, '%Y') = '2021' GROUP BY submit_month UNION ALL SELECT '2021æ±æ»' AS submit_month, count(question_id) month_q_cnt, ROUND(COUNT(question_id) / 31, 3) avg_day_q_cnt FROM practice_record WHERE DATE_FORMAT(submit_time, '%Y') = '2021' ORDER BY submit_month ``` å¨å®ä¾æ°æ®è¾åºä¸å 为æåä¸è¡éè¦å¾åºæ±æ»æ°æ®ï¼æä»¥è¿éè¦ `UNION ALL`å å°ç»æéä¸ï¼å«å¿äºæåè¦æåºï¼ ### æªå®æè¯å·æ°å¤§äº 1 çææç¨æ·ï¼è¾é¾ï¼ **æè¿°**ï¼ç°æè¯å·ä½çè®°å½è¡¨ `exam_record`ï¼`uid` ç¨æ· ID, `exam_id` è¯å· ID, `start_time` å¼å§ä½çæ¶é´, `submit_time` äº¤å·æ¶é´, `score` å¾åï¼ï¼ç¤ºä¾æ°æ®å¦ä¸ï¼ | id | uid | exam_id | start_time | submit_time | score | | --- | ---- | ------- | ------------------- | ------------------- | ------ | | 1 | 1001 | 9001 | 2021-07-02 09:01:01 | 2021-07-02 09:21:01 | 80 | | 2 | 1002 | 9001 | 2021-09-05 19:01:01 | 2021-09-05 19:40:01 | 81 | | 3 | 1002 | 9002 | 2021-09-02 12:01:01 | (NULL) | (NULL) | | 4 | 1002 | 9003 | 2021-09-01 12:01:01 | (NULL) | (NULL) | | 5 | 1002 | 9001 | 2021-07-02 19:01:01 | 2021-07-02 19:30:01 | 82 | | 6 | 1002 | 9002 | 2021-07-05 18:01:01 | 2021-07-05 18:59:02 | 90 | | 7 | 1003 | 9002 | 2021-07-06 12:01:01 | (NULL) | (NULL) | | 8 | 1003 | 9003 | 2021-09-07 10:01:01 | 2021-09-07 10:31:01 | 86 | | 9 | 1004 | 9003 | 2021-09-06 12:01:01 | (NULL) | (NULL) | | 10 | 1002 | 9003 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 81 | | 11 | 1005 | 9001 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 88 | | 12 | 1006 | 9002 | 2021-09-02 12:11:01 | 2021-09-02 12:31:01 | 89 | | 13 | 1007 | 9002 | 2020-09-02 12:11:01 | 2020-09-02 12:31:01 | 89 | è¿æä¸å¼ è¯å·ä¿¡æ¯è¡¨ `examination_info`ï¼`exam_id` è¯å· ID, `tag` è¯å·ç±»å«, `difficulty` è¯å·é¾åº¦, `duration` èè¯æ¶é¿, `release_time` å叿¶é´ï¼ï¼ç¤ºä¾æ°æ®å¦ä¸ï¼ | id | exam_id | tag | difficulty | duration | release_time | | --- | ------- | ---- | ---------- | -------- | ------------------- | | 1 | 9001 | SQL | hard | 60 | 2020-01-01 10:00:00 | | 2 | 9002 | SQL | easy | 60 | 2020-02-01 10:00:00 | | 3 | 9003 | ç®æ³ | medium | 80 | 2020-08-02 10:00:00 | 请ç»è®¡ 2021 å¹´æ¯ä¸ªæªå®æè¯å·ä½çæ°å¤§äº 1 çææç¨æ·çæ°æ®ï¼ææç¨æ·æå®æè¯å·ä½çæ°è³å°ä¸º 1 䏿ªå®ææ°å°äº 5ï¼ï¼è¾åºç¨æ· IDãæªå®æè¯å·ä½çæ°ã宿è¯å·ä½çæ°ãä½çè¿çè¯å· tag éåï¼ææªå®æè¯å·æ°éç±å¤å°å°æåºãç¤ºä¾æ°æ®çè¾åºç»æå¦ä¸ï¼ | uid | incomplete_cnt | complete_cnt | detail | | ---- | -------------- | ------------ | --------------------------------------------------------------------------- | | 1002 | 2 | 4 | 2021-09-01:ç®æ³;2021-07-02:SQL;2021-09-02:SQL;2021-09-05:SQL;2021-07-05:SQL | **è§£é**ï¼2021 å¹´çä½çè®°å½ä¸ï¼é¤äº 1004ï¼å ¶ä»ç¨æ·å满足ææç¨æ·å®ä¹ï¼ä½åªæ 1002 æªå®æè¯å·æ°å¤§äº 1ï¼å æ¤åªè¾åº 1002ï¼detail 䏿¯ 1002 ä½çè¿çè¯å·{æ¥æ:tag}éåï¼æ¥æå tag é´ç¨ **:** è¿æ¥ï¼å¤å ç´ é´ç¨ **;** è¿æ¥ã **æè·¯ï¼** ä»ç»è¯»é¢åï¼åæåºï¼é¦å è¦è表ï¼å 为åé¢è¦è¾åº`tag`ï¼ çéåº 2021 å¹´çæ°æ® ```sql SELECT * FROM exam_record er LEFT JOIN examination_info ei ON er.exam_id = ei.exam_id WHERE YEAR (er.start_time)= 2021 ``` æ ¹æ® uid è¿è¡åç»ï¼ç¶å对æ¯ä¸ªç¨æ·è¿è¡æ¡ä»¶è¿è¡å¤æï¼é¢ç®ä¸è¦æ±`宿è¯å·æ°è³å°ä¸º1,æªå®æè¯å·æ°è¦å¤§äº1ï¼å°äº5` é£ä¹çä¼å¿å sql çæ¶åæ¡ä»¶åºè¯¥æ¯ï¼`æªå®æ > 1 and 已宿 >=1 and æªå®æ < 5` å 为æåè¦ç¨å°åç¬¦ä¸²çæ¼æ¥ï¼èä¸è¿è¦ç»åæ¼æ¥ï¼è¿ä¸ªå¯ä»¥ç¨`GROUP_CONCAT`彿°ï¼ä¸é¢ç®åä»ç»ä¸ä¸è¯¥å½æ°çç¨æ³ï¼ åºæ¬æ ¼å¼ï¼ ```sql GROUP_CONCAT([DISTINCT] expr [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [, ...]] [SEPARATOR sep]) ``` - `expr`ï¼è¦è¿æ¥çåæè¡¨è¾¾å¼ã - `DISTINCT`ï¼å¯éåæ°ï¼ç¨äºå»éã彿å®äº `DISTINCT`ï¼ç¸åçå¼åªä¼åºç°ä¸æ¬¡ã - `ORDER BY`ï¼å¯éåæ°ï¼ç¨äºæåºè¿æ¥åçå¼ãå¯ä»¥éæ©ååº (`ASC`) æéåº (`DESC`) æåºã - `SEPARATOR sep`ï¼å¯éåæ°ï¼ç¨äºè®¾ç½®è¿æ¥åçå¼çåé符ãï¼æ¬é¢è¦ç¨è¿ä¸ªåæ°è®¾ç½® ; å· ï¼ `GROUP_CONCAT()` 彿°å¸¸ç¨äº `GROUP BY` åå¥ä¸ï¼å°ä¸ç»è¡çå¼è¿æ¥ä¸ºä¸ä¸ªå符串ï¼å¹¶å¨ç»æéä¸ä»¥èåçå½¢å¼è¿åã **çæ¡**ï¼ ```sql SELECT a.uid, SUM(CASE WHEN a.submit_time IS NULL THEN 1 END) AS incomplete_cnt, SUM(CASE WHEN a.submit_time IS NOT NULL THEN 1 END) AS complete_cnt, GROUP_CONCAT(DISTINCT CONCAT(DATE_FORMAT(a.start_time, '%Y-%m-%d'), ':', b.tag) ORDER BY start_time SEPARATOR ";") AS detail FROM exam_record a LEFT JOIN examination_info b ON a.exam_id = b.exam_id WHERE YEAR (a.start_time)= 2021 GROUP BY a.uid HAVING incomplete_cnt > 1 AND complete_cnt >= 1 AND incomplete_cnt < 5 ORDER BY incomplete_cnt DESC ``` - `SUM(CASE WHEN a.submit_time IS NULL THEN 1 END)` ç»è®¡äºæ¯ä¸ªç¨æ·æªå®æçè®°å½æ°éã - `SUM(CASE WHEN a.submit_time IS NOT NULL THEN 1 END)` ç»è®¡äºæ¯ä¸ªç¨æ·å·²å®æçè®°å½æ°éã - `GROUP_CONCAT(DISTINCT CONCAT(DATE_FORMAT(a.start_time, '%Y-%m-%d'), ':', b.tag) ORDER BY a.start_time SEPARATOR ';')` å°æ¯ä¸ªç¨æ·çèè¯æ¥æåæ ç¾ä»¥éå·åéçå½¢å¼è¿æ¥æä¸ä¸ªå符串ï¼å¹¶æèè¯å¼å§æ¶é´è¿è¡æåºã ## åµå¥åæ¥è¯¢ ### æå宿è¯å·æ°ä¸å°äº 3 çç¨æ·ç±ä½ççç±»å«ï¼è¾é¾ï¼ **æè¿°**ï¼ç°æè¯å·ä½çè®°å½è¡¨ `exam_record`ï¼`uid`ï¼ç¨æ· ID, `exam_id`ï¼è¯å· ID, `start_time`ï¼å¼å§ä½çæ¶é´, `submit_time`ï¼äº¤å·æ¶é´ï¼æ²¡æäº¤çè¯ä¸º NULL, `score`ï¼å¾åï¼ï¼ç¤ºä¾æ°æ®å¦ä¸ï¼ | id | uid | exam_id | start_time | submit_time | score | | --- | ---- | ------- | ------------------- | ------------------- | ------ | | 1 | 1001 | 9001 | 2021-07-02 09:01:01 | (NULL) | (NULL) | | 2 | 1002 | 9003 | 2021-09-01 12:01:01 | 2021-09-01 12:21:01 | 60 | | 3 | 1002 | 9002 | 2021-09-02 12:01:01 | 2021-09-02 12:31:01 | 70 | | 4 | 1002 | 9001 | 2021-09-05 19:01:01 | 2021-09-05 19:40:01 | 81 | | 5 | 1002 | 9002 | 2021-07-06 12:01:01 | (NULL) | (NULL) | | 6 | 1003 | 9003 | 2021-09-07 10:01:01 | 2021-09-07 10:31:01 | 86 | | 7 | 1003 | 9003 | 2021-09-08 12:01:01 | 2021-09-08 12:11:01 | 40 | | 8 | 1003 | 9001 | 2021-09-08 13:01:01 | (NULL) | (NULL) | | 9 | 1003 | 9002 | 2021-09-08 14:01:01 | (NULL) | (NULL) | | 10 | 1003 | 9003 | 2021-09-08 15:01:01 | (NULL) | (NULL) | | 11 | 1005 | 9001 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 88 | | 12 | 1005 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 88 | | 13 | 1005 | 9002 | 2021-09-02 12:11:01 | 2021-09-02 12:31:01 | 89 | è¯å·ä¿¡æ¯è¡¨ `examination_info`ï¼`exam_id`ï¼è¯å· ID, `tag`ï¼è¯å·ç±»å«, `difficulty`ï¼è¯å·é¾åº¦, `duration`ï¼èè¯æ¶é¿, `release_time`ï¼å叿¶é´ï¼ï¼ç¤ºä¾æ°æ®å¦ä¸ï¼ | id | exam_id | tag | difficulty | duration | release_time | | --- | ------- | ---- | ---------- | -------- | ------------------- | | 1 | 9001 | SQL | hard | 60 | 2020-01-01 10:00:00 | | 2 | 9002 | C++ | easy | 60 | 2020-02-01 10:00:00 | | 3 | 9003 | ç®æ³ | medium | 80 | 2020-08-02 10:00:00 | 请ä»è¡¨ä¸ç»è®¡åº â彿å宿è¯å·æ°âä¸å°äº 3 çç¨æ·ä»¬ç±ä½ççç±»å«åä½ç次æ°ï¼ææ¬¡æ°éåºè¾åºï¼ç¤ºä¾è¾åºå¦ä¸ï¼ | tag | tag_cnt | | ---- | ------- | | C++ | 4 | | SQL | 2 | | ç®æ³ | 1 | **è§£é**ï¼ç¨æ· 1002 å 1005 å¨ 2021 å¹´ 09 æç宿è¯å·æ°ç®å为 3ï¼å ¶ä»ç¨æ·åå°äº 3ï¼ç¶åç¨æ· 1002 å 1005 ä½çè¿çè¯å· tag åå¸ç»ææä½ç次æ°éåºæåºä¾æ¬¡ä¸º C++ãSQLãç®æ³ã **æè·¯**ï¼è¿é¢èå¯èååæ¥è¯¢ï¼éç¹å¨äº`æååç>=3`, 使¯ä¸ªäººè®¤ä¸ºè¿é没æè¡¨è¿°æ¸ æ¥ï¼åºè¯¥ç´æ¥è¯´æ¥ 9 æç就容æçè§£å¤äºï¼è¿é䏿¯æ¯ä¸ªæé½è¦>=3 æè æ¯ææç颿¬¡æ°/ç颿份ãä¸è¦çè§£é误äºã å æ¥è¯¢åºåªäºç¨æ·æåçé¢å¤§äºä¸æ¬¡ ```sql SELECT UID FROM exam_record record GROUP BY UID, MONTH (start_time) HAVING count(submit_time) >= 3 ``` æäºè¿ä¸æ¥ä¹ååè¿è¡æ·±å ¥ï¼åªè¦è½çè§£ä¸ä¸æ¥(æçæææ¯ä¸è¢«é¢ç®ä¸çæåæå°æ°)ï¼ç¶ååå¥ä¸ä¸ªåæ¥è¯¢ï¼æ¥åªäºç¨æ·å å«å ¶ä¸ï¼ç¶åæ¥åºé¢ç®ä¸æéçåå³å¯ãè®°å¾æåºï¼ï¼ ```sql SELECT tag, count(start_time) AS tag_cnt FROM exam_record record INNER JOIN examination_info info ON record.exam_id = info.exam_id WHERE UID IN (SELECT UID FROM exam_record record GROUP BY UID, MONTH (start_time) HAVING count(submit_time) >= 3) GROUP BY tag ORDER BY tag_cnt DESC ``` ### è¯å·åå¸å½å¤©ä½ç人æ°åå¹³åå **æè¿°**ï¼ç°æç¨æ·ä¿¡æ¯è¡¨ `user_info`ï¼`uid` ç¨æ· IDï¼`nick_name` æµç§°, `achievement` æå°±å¼, `level` ç级, `job` è䏿¹å, `register_time` æ³¨åæ¶é´ï¼ï¼ç¤ºä¾æ°æ®å¦ä¸ï¼ | id | uid | nick_name | achievement | level | job | register_time | | --- | ---- | --------- | ----------- | ----- | ---- | ------------------- | | 1 | 1001 | ç客 1 å· | 3100 | 7 | ç®æ³ | 2020-01-01 10:00:00 | | 2 | 1002 | ç客 2 å· | 2100 | 6 | ç®æ³ | 2020-01-01 10:00:00 | | 3 | 1003 | ç客 3 å· | 1500 | 5 | ç®æ³ | 2020-01-01 10:00:00 | | 4 | 1004 | ç客 4 å· | 1100 | 4 | ç®æ³ | 2020-01-01 10:00:00 | | 5 | 1005 | ç客 5 å· | 1600 | 6 | C++ | 2020-01-01 10:00:00 | | 6 | 1006 | ç客 6 å· | 3000 | 6 | C++ | 2020-01-01 10:00:00 | **éä¹**ï¼ç¨æ· 1001 æµç§°ä¸ºç客 1 å·ï¼æå°±å¼ä¸º 3100ï¼ç¨æ·ççº§æ¯ 7 级ï¼è䏿¹åä¸ºç®æ³ï¼æ³¨åæ¶é´ 2020-01-01 10:00:00 è¯å·ä¿¡æ¯è¡¨ `examination_info`ï¼`exam_id` è¯å· ID, `tag` è¯å·ç±»å«, `difficulty` è¯å·é¾åº¦, `duration` èè¯æ¶é¿, `release_time` å叿¶é´ï¼ ç¤ºä¾æ°æ®å¦ä¸ï¼ | id | exam_id | tag | difficulty | duration | release_time | | --- | ------- | ---- | ---------- | -------- | ------------------- | | 1 | 9001 | SQL | hard | 60 | 2021-09-01 06:00:00 | | 2 | 9002 | C++ | easy | 60 | 2020-02-01 10:00:00 | | 3 | 9003 | ç®æ³ | medium | 80 | 2020-08-02 10:00:00 | è¯å·ä½çè®°å½è¡¨ `exam_record`ï¼`uid` ç¨æ· ID, `exam_id` è¯å· ID, `start_time` å¼å§ä½çæ¶é´, `submit_time` äº¤å·æ¶é´, `score` å¾åï¼ ç¤ºä¾æ°æ®å¦ä¸ï¼ | id | uid | exam_id | start_time | submit_time | score | | --- | ---- | ------- | ------------------- | ------------------- | ------ | | 1 | 1001 | 9001 | 2021-07-02 09:01:01 | 2021-09-01 09:41:01 | 70 | | 2 | 1002 | 9003 | 2021-09-01 12:01:01 | 2021-09-01 12:21:01 | 60 | | 3 | 1002 | 9002 | 2021-09-02 12:01:01 | 2021-09-02 12:31:01 | 70 | | 4 | 1002 | 9001 | 2021-09-01 19:01:01 | 2021-09-01 19:40:01 | 80 | | 5 | 1002 | 9003 | 2021-08-01 12:01:01 | 2021-08-01 12:21:01 | 60 | | 6 | 1002 | 9002 | 2021-08-02 12:01:01 | 2021-08-02 12:31:01 | 70 | | 7 | 1002 | 9001 | 2021-09-01 19:01:01 | 2021-09-01 19:40:01 | 85 | | 8 | 1002 | 9002 | 2021-07-06 12:01:01 | (NULL) | (NULL) | | 9 | 1003 | 9002 | 2021-09-07 10:01:01 | 2021-09-07 10:31:01 | 86 | | 10 | 1003 | 9003 | 2021-09-08 12:01:01 | 2021-09-08 12:11:01 | 40 | | 11 | 1003 | 9003 | 2021-09-01 13:01:01 | 2021-09-01 13:41:01 | 70 | | 12 | 1003 | 9001 | 2021-09-08 14:01:01 | (NULL) | (NULL) | | 13 | 1003 | 9002 | 2021-09-08 15:01:01 | (NULL) | (NULL) | | 14 | 1005 | 9001 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 90 | | 15 | 1005 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 88 | | 16 | 1005 | 9002 | 2021-09-02 12:11:01 | 2021-09-02 12:31:01 | 89 | è¯·è®¡ç®æ¯å¼ SQL ç±»å«è¯å·åå¸åï¼å½å¤© 5 级以ä¸çç¨æ·ä½ççäººæ° `uv` åå¹³åå `avg_score`ï¼æäººæ°éåºï¼ç¸å人æ°çæå¹³ååååºï¼ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | exam_id | uv | avg_score | | ------- | --- | --------- | | 9001 | 3 | 81.3 | è§£éï¼åªæä¸å¼ SQL ç±»å«çè¯å·ï¼è¯å· ID 为 9001ï¼åå¸å½å¤©ï¼2021-09-01ï¼æ 1001ã1002ã1003ã1005 ä½çè¿ï¼ä½æ¯ 1003 æ¯ 5 çº§ç¨æ·ï¼å ¶ä» 3 ä½ä¸º 5 级以ä¸ï¼ä»ä»¬ä¸çå¾åæ[70,80,85,90]ï¼å¹³åå为 81.3ï¼ä¿ç 1 ä½å°æ°ï¼ã **æè·¯**ï¼è¿é¢çä¼¼å¾å¤æï¼ä½æ¯å 鿥å°âå¤è¾¹âæ¡ä»¶æåï¼ç¶å忢å°ä¸èµ·ï¼çæ¡å°±åºæ¥ï¼å¤è¡¨æ¥è¯¢åæ£è®°ä½ï¼ç±å¤åéï¼æ½ä¸å¥è§ã å æä¸ç§è¡¨è¿èµ·æ¥ï¼åæ¶ç»å®ä¸äºæ¡ä»¶ï¼æ¯å¦é¢ç®ä¸è¦æ±`ç级> 5`çç¨æ·ï¼é£ä¹å¯ä»¥å æ¥åºæ¥ ```sql SELECT DISTINCT u_info.uid FROM examination_info e_info INNER JOIN exam_record record INNER JOIN user_info u_info WHERE e_info.exam_id = record.exam_id AND u_info.uid = record.uid AND u_info.LEVEL > 5 ``` æ¥ç注æé¢ç®ä¸è¦æ±ï¼`æ¯å¼ sqlç±»å«è¯å·åå¸åï¼å½å¤©ä½çç¨æ·`ï¼æ³¨æå ¶ä¸ç==å½å¤©==ï¼é£æä»¬é©¬ä¸å°±è¦æ³å°è¦ç¨å°æ¶é´çæ¯è¾ã 对è¯å·å叿¥æåå¼å§èè¯æ¥æè¿è¡æ¯è¾ï¼`DATE(e_info.release_time) = DATE(record.start_time)`ï¼ä¸ç¨æ å¿`submit_time` 为 null çé®é¢ï¼åç»å¨ where ä¸ä¼ç»è¿æ»¤æã **çæ¡**ï¼ ```sql SELECT record.exam_id AS exam_id, COUNT(DISTINCT u_info.uid) AS uv, ROUND(SUM(record.score) / COUNT(u_info.uid), 1) AS avg_score FROM examination_info e_info INNER JOIN exam_record record INNER JOIN user_info u_info WHERE e_info.exam_id = record.exam_id AND u_info.uid = record.uid AND DATE (e_info.release_time) = DATE (record.start_time) AND submit_time IS NOT NULL AND tag = 'SQL' AND u_info.LEVEL > 5 GROUP BY record.exam_id ORDER BY uv DESC, avg_score ASC ``` 注ææåçåç»æåºï¼å æäººæ°æï¼è¥ä¸è´ï¼æå¹³ååæã ### ä½çè¯å·å¾å大äºè¿ 80 ç人çç¨æ·ç级åå¸ **æè¿°**ï¼ ç°æç¨æ·ä¿¡æ¯è¡¨ `user_info`ï¼`uid` ç¨æ· IDï¼`nick_name` æµç§°, `achievement` æå°±å¼, `level` ç级, `job` è䏿¹å, `register_time` æ³¨åæ¶é´ï¼ï¼ | id | uid | nick_name | achievement | level | job | register_time | | --- | ---- | --------- | ----------- | ----- | ---- | ------------------- | | 1 | 1001 | ç客 1 å· | 3100 | 7 | ç®æ³ | 2020-01-01 10:00:00 | | 2 | 1002 | ç客 2 å· | 2100 | 6 | ç®æ³ | 2020-01-01 10:00:00 | | 3 | 1003 | ç客 3 å· | 1500 | 5 | ç®æ³ | 2020-01-01 10:00:00 | | 4 | 1004 | ç客 4 å· | 1100 | 4 | ç®æ³ | 2020-01-01 10:00:00 | | 5 | 1005 | ç客 5 å· | 1600 | 6 | C++ | 2020-01-01 10:00:00 | | 6 | 1006 | ç客 6 å· | 3000 | 6 | C++ | 2020-01-01 10:00:00 | è¯å·ä¿¡æ¯è¡¨ `examination_info`ï¼`exam_id` è¯å· ID, `tag` è¯å·ç±»å«, `difficulty` è¯å·é¾åº¦, `duration` èè¯æ¶é¿, `release_time` å叿¶é´ï¼ï¼ | id | exam_id | tag | difficulty | duration | release_time | | --- | ------- | ---- | ---------- | -------- | ------------------- | | 1 | 9001 | SQL | hard | 60 | 2021-09-01 06:00:00 | | 2 | 9002 | C++ | easy | 60 | 2021-09-01 06:00:00 | | 3 | 9003 | ç®æ³ | medium | 80 | 2021-09-01 10:00:00 | è¯å·ä½çä¿¡æ¯è¡¨ `exam_record`ï¼`uid` ç¨æ· ID, `exam_id` è¯å· ID, `start_time` å¼å§ä½çæ¶é´, `submit_time` äº¤å·æ¶é´, `score` å¾åï¼ï¼ | id | uid | exam_id | start_time | submit_time | score | | --- | ---- | ------- | ------------------- | ------------------- | ------ | | 1 | 1001 | 9001 | 2021-09-01 09:01:01 | 2021-09-01 09:41:01 | 79 | | 2 | 1002 | 9003 | 2021-09-01 12:01:01 | 2021-09-01 12:21:01 | 60 | | 3 | 1002 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 70 | | 4 | 1002 | 9001 | 2021-09-01 19:01:01 | 2021-09-01 19:40:01 | 80 | | 5 | 1002 | 9003 | 2021-08-01 12:01:01 | 2021-08-01 12:21:01 | 60 | | 6 | 1002 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 70 | | 7 | 1002 | 9001 | 2021-09-01 19:01:01 | 2021-09-01 19:40:01 | 85 | | 8 | 1002 | 9002 | 2021-09-01 12:01:01 | (NULL) | (NULL) | | 9 | 1003 | 9002 | 2021-09-07 10:01:01 | 2021-09-07 10:31:01 | 86 | | 10 | 1003 | 9003 | 2021-09-08 12:01:01 | 2021-09-08 12:11:01 | 40 | | 11 | 1003 | 9003 | 2021-09-01 13:01:01 | 2021-09-01 13:41:01 | 81 | | 12 | 1003 | 9001 | 2021-09-01 14:01:01 | (NULL) | (NULL) | | 13 | 1003 | 9002 | 2021-09-08 15:01:01 | (NULL) | (NULL) | | 14 | 1005 | 9001 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 90 | | 15 | 1005 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 88 | | 16 | 1005 | 9002 | 2021-09-02 12:11:01 | 2021-09-02 12:31:01 | 89 | ç»è®¡ä½ç SQL ç±»å«çè¯å·å¾å大äºè¿ 80 ç人çç¨æ·ç级åå¸ï¼ææ°ééåºæåºï¼ä¿è¯æ°éé½ä¸åï¼ãç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | level | level_cnt | | ----- | --------- | | 6 | 2 | | 5 | 1 | è§£éï¼9001 为 SQL ç±»è¯å·ï¼ä½ç该è¯å·å¤§äº 80 åç人æ 1002ã1003ã1005 å ± 3 人ï¼6 级两人ï¼5 级ä¸äººã **æè·¯ï¼**è¿é¢åä¸ä¸é¢é½æ¯ä¸æ ·çæ°æ®ï¼åªæ¯æ¥è¯¢æ¡ä»¶æ¹åäºèå·²ï¼ä¸ä¸é¢çè§£äºï¼è¿é¢ååéååºæ¥ã **çæ¡**ï¼ ```sql SELECT u_info.LEVEL AS LEVEL, count(u_info.uid) AS level_cnt FROM examination_info e_info INNER JOIN exam_record record INNER JOIN user_info u_info WHERE e_info.exam_id = record.exam_id AND u_info.uid = record.uid AND record.score > 80 AND submit_time IS NOT NULL AND tag = 'SQL' GROUP BY LEVEL ORDER BY level_cnt DESC ``` ## åå¹¶æ¥è¯¢ ### æ¯ä¸ªé¢ç®åæ¯ä»½è¯å·è¢«ä½çç人æ°åæ¬¡æ° **æè¿°**ï¼ ç°æè¯å·ä½çè®°å½è¡¨ exam_recordï¼uid ç¨æ· ID, exam_id è¯å· ID, start_time å¼å§ä½çæ¶é´, submit_time äº¤å·æ¶é´, score å¾åï¼ï¼ | id | uid | exam_id | start_time | submit_time | score | | --- | ---- | ------- | ------------------- | ------------------- | ------ | | 1 | 1001 | 9001 | 2021-09-01 09:01:01 | 2021-09-01 09:41:01 | 81 | | 2 | 1002 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 70 | | 3 | 1002 | 9001 | 2021-09-01 19:01:01 | 2021-09-01 19:40:01 | 80 | | 4 | 1002 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 70 | | 5 | 1004 | 9001 | 2021-09-01 19:01:01 | 2021-09-01 19:40:01 | 85 | | 6 | 1002 | 9002 | 2021-09-01 12:01:01 | (NULL) | (NULL) | é¢ç®ç»ä¹ 表 practice_recordï¼uid ç¨æ· ID, question_id é¢ç® ID, submit_time æäº¤æ¶é´, score å¾åï¼ï¼ | id | uid | question_id | submit_time | score | | --- | ---- | ----------- | ------------------- | ----- | | 1 | 1001 | 8001 | 2021-08-02 11:41:01 | 60 | | 2 | 1002 | 8001 | 2021-09-02 19:30:01 | 50 | | 3 | 1002 | 8001 | 2021-09-02 19:20:01 | 70 | | 4 | 1002 | 8002 | 2021-09-02 19:38:01 | 70 | | 5 | 1003 | 8001 | 2021-08-02 19:38:01 | 70 | | 6 | 1003 | 8001 | 2021-08-02 19:48:01 | 90 | | 7 | 1003 | 8002 | 2021-08-01 19:38:01 | 80 | 请ç»è®¡æ¯ä¸ªé¢ç®åæ¯ä»½è¯å·è¢«ä½çç人æ°å次æ°ï¼åå«æç §"è¯å·"å"é¢ç®"ç uv & pv éåºæ¾ç¤ºï¼ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | tid | uv | pv | | ---- | --- | --- | | 9001 | 3 | 3 | | 9002 | 1 | 3 | | 8001 | 3 | 5 | | 8002 | 2 | 2 | **è§£é**ï¼âè¯å·âæ 3 äººå ±ç»ä¹ 3 次è¯å· 9001ï¼1 人ä½ç 3 次 9002ï¼âå·é¢âæ 3 äººå· 5 次 8001ï¼æ 2 äººå· 2 次 8002 **æè·¯**ï¼è¿é¢çé¾ç¹åæéç¹å¨äº`UNION`å`ORDER BY` åæ¶ä½¿ç¨çé®é¢ æä»¥ä¸å ç§æ åµï¼ä½¿ç¨`union`åå¤ä¸ª`order by`ä¸å æ¬å·ï¼æ¥éï¼ `order by`å¨`union`è¿æ¥çåå¥ä¸ä¸èµ·ä½ç¨ï¼ æ¯å¦ä¸å æ¬å·ï¼ ```sql SELECT exam_id AS tid, COUNT(DISTINCT UID) AS uv, COUNT(UID) AS pv FROM exam_record GROUP BY exam_id ORDER BY uv DESC, pv DESC UNION SELECT question_id AS tid, COUNT(DISTINCT UID) AS uv, COUNT(UID) AS pv FROM practice_record GROUP BY question_id ORDER BY uv DESC, pv DESC ``` ç´æ¥æ¥è¯æ³é误ï¼å¦ææ²¡ææ¬å·ï¼åªè½æä¸ä¸ª`order by` è¿æä¸ç§`order by`ä¸èµ·ä½ç¨çæ åµï¼ä½æ¯è½å¨åå¥çåå¥ä¸èµ·ä½ç¨ï¼è¿éçè§£å³æ¹æ¡å°±æ¯å¨å¤é¢åå¥ä¸å±æ¥è¯¢ã **çæ¡**ï¼ ```sql SELECT * FROM (SELECT exam_id AS tid, COUNT(DISTINCT exam_record.uid) uv, COUNT(*) pv FROM exam_record GROUP BY exam_id ORDER BY uv DESC, pv DESC) t1 UNION SELECT * FROM (SELECT question_id AS tid, COUNT(DISTINCT practice_record.uid) uv, COUNT(*) pv FROM practice_record GROUP BY question_id ORDER BY uv DESC, pv DESC) t2; ``` ### å嫿»¡è¶³ä¸¤ä¸ªæ´»å¨ç人 **æè¿°**ï¼ ä¸ºäºä¿è¿æ´å¤ç¨æ·å¨ç客平å°å¦ä¹ åå·é¢è¿æ¥ï¼æä»¬ä¼ç»å¸¸ç»ä¸äºæ¢æ´»è·å表ç°ä¸éçç¨æ·åæ¾ç¦å©ãå使以åæä»¬æä¸¤æ¨è¿è¥æ´»å¨ï¼åå«ç»æ¯æ¬¡è¯å·å¾åé½è½å° 85 åç人ï¼activity1ï¼ãè³å°æä¸æ¬¡ç¨äºä¸åæ¶é´å°±å®æé«é¾åº¦è¯å·ä¸åæ°å¤§äº 80 ç人ï¼activity2ï¼åäºç¦å©å¸ã ç°å¨ï¼éè¦ä½ 䏿¬¡æ§å°è¿ä¸¤ä¸ªæ´»å¨æ»¡è¶³ç人çéåºæ¥ï¼äº¤ç»è¿è¥åå¦ã请ååºä¸ä¸ª SQL å®ç°ï¼è¾åº 2021 å¹´éï¼æææ¯æ¬¡è¯å·å¾åé½è½å° 85 åç人以åè³å°æä¸æ¬¡ç¨äºä¸åæ¶é´å°±å®æé«é¾åº¦è¯å·ä¸åæ°å¤§äº 80 ç人ç id åæ´»å¨å·ï¼æç¨æ· ID æåºè¾åºã ç°æè¯å·ä¿¡æ¯è¡¨ `examination_info`ï¼`exam_id` è¯å· ID, `tag` è¯å·ç±»å«, `difficulty` è¯å·é¾åº¦, `duration` èè¯æ¶é¿, `release_time` å叿¶é´ï¼ï¼ | id | exam_id | tag | difficulty | duration | release_time | | --- | ------- | ---- | ---------- | -------- | ------------------- | | 1 | 9001 | SQL | hard | 60 | 2021-09-01 06:00:00 | | 2 | 9002 | C++ | easy | 60 | 2021-09-01 06:00:00 | | 3 | 9003 | ç®æ³ | medium | 80 | 2021-09-01 10:00:00 | è¯å·ä½çè®°å½è¡¨ `exam_record`ï¼`uid` ç¨æ· ID, `exam_id` è¯å· ID, `start_time` å¼å§ä½çæ¶é´, `submit_time` äº¤å·æ¶é´, `score` å¾åï¼ï¼ | id | uid | exam_id | start_time | submit_time | score | | --- | ---- | ------- | ------------------- | ------------------- | ------ | | 1 | 1001 | 9001 | 2021-09-01 09:01:01 | 2021-09-01 09:31:00 | 81 | | 2 | 1002 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 70 | | 3 | 1003 | 9001 | 2021-09-01 19:01:01 | 2021-09-01 19:40:01 | **86** | | 4 | 1003 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 89 | | 5 | 1004 | 9001 | 2021-09-01 19:01:01 | 2021-09-01 19:30:01 | 85 | ç¤ºä¾æ°æ®è¾åºç»æï¼ | uid | activity | | ---- | --------- | | 1001 | activity2 | | 1003 | activity1 | | 1004 | activity1 | | 1004 | activity2 | **è§£é**ï¼ç¨æ· 1001 æå°åæ° 81 䏿»¡è¶³æ´»å¨ 1ï¼ä½ 29 å 59 ç§å®æäº 60 åéé¿çè¯å·å¾å 81ï¼æ»¡è¶³æ´»å¨ 2ï¼1003 æå°åæ° 86 æ»¡è¶³æ´»å¨ 1ï¼å®ææ¶é¿é½å¤§äºè¯å·æ¶é¿çä¸åï¼ä¸æ»¡è¶³æ´»å¨ 2ï¼ç¨æ· 1004 å好ç¨äºä¸åæ¶é´ï¼30 åéæ´ï¼å®æäºè¯å·å¾å 85ï¼æ»¡è¶³æ´»å¨ 1 åæ´»å¨ 2ã **æè·¯**ï¼ è¿ä¸é¢éè¦æ¶åå°æ¶é´çåæ³ï¼éè¦ç¨å° `TIMESTAMPDIFF()` 彿°è®¡ç®ä¸¤ä¸ªæ¶é´æ³ä¹é´çåéå·®å¼ã ä¸é¢æä»¬æ¥çä¸ä¸åºæ¬ç¨æ³ 示ä¾ï¼ ```sql TIMESTAMPDIFF(MINUTE, start_time, end_time) ``` `TIMESTAMPDIFF()` 彿°ç第ä¸ä¸ªåæ°æ¯æ¶é´åä½ï¼è¿éæä»¬éæ© `MINUTE` 表示è¿ååéå·®å¼ã第äºä¸ªåæ°æ¯è¾æ©çæ¶é´æ³ï¼ç¬¬ä¸ä¸ªåæ°æ¯è¾æçæ¶é´æ³ã彿°ä¼è¿åå®ä»¬ä¹é´çåéå·®å¼ äºè§£äºè¿ä¸ªå½æ°çç¨æ³ä¹åï¼æä»¬ååè¿å¤´æ¥ç`activity1`çè¦æ±ï¼æ±åæ°å¤§äº 85 å³å¯ï¼é£æä»¬è¿æ¯å æè¿ä¸ªååºæ¥ï¼åç»æè·¯å°±ä¼æ¸ æ°å¾å¤ ```sql SELECT DISTINCT UID FROM exam_record WHERE score >= 85 AND YEAR (start_time) = '2021' ``` æ ¹æ®æ¡ä»¶ 2ï¼æ¥çååº`å¨ä¸åæ¶é´å 宿é«é¾åº¦è¯å·ä¸åæ°å¤§äº80ç人` ```sql SELECT UID FROM examination_info info INNER JOIN exam_record record WHERE info.exam_id = record.exam_id AND (TIMESTAMPDIFF(MINUTE, start_time, submit_time)) < (info.duration / 2) AND difficulty = 'hard' AND score >= 80 ``` ç¶ååæä¸¤è `UNION` èµ·æ¥å³å¯ãï¼è¿éç¹å«è¦æ³¨ææ¬å·é®é¢å`order by`ä½ç½®ï¼å ·ä½ç¨æ³å¨ä¸ä¸ç¯ä¸å·²æåï¼ **çæ¡**ï¼ ```sql SELECT DISTINCT UID UID, 'activity1' activity FROM exam_record WHERE UID not in (SELECT UID FROM exam_record WHERE score<85 AND YEAR(submit_time) = 2021 ) UNION SELECT DISTINCT UID UID, 'activity2' activity FROM exam_record e_r LEFT JOIN examination_info e_i ON e_r.exam_id = e_i.exam_id WHERE YEAR(submit_time) = 2021 AND difficulty = 'hard' AND TIMESTAMPDIFF(SECOND, start_time, submit_time) <= duration *30 AND score>80 ORDER BY UID ``` ## è¿æ¥æ¥è¯¢ ### 满足æ¡ä»¶çç¨æ·çè¯å·å®ææ°åé¢ç®ç»ä¹ æ°ï¼å°é¾ï¼ **æè¿°**ï¼ ç°æç¨æ·ä¿¡æ¯è¡¨ user_infoï¼uid ç¨æ· IDï¼nick_name æµç§°, achievement æå°±å¼, level ç级, job è䏿¹å, register_time æ³¨åæ¶é´ï¼ï¼ | id | uid | nick_name | achievement | level | job | register_time | | --- | ---- | --------- | ----------- | ----- | ---- | ------------------- | | 1 | 1001 | ç客 1 å· | 3100 | 7 | ç®æ³ | 2020-01-01 10:00:00 | | 2 | 1002 | ç客 2 å· | 2300 | 7 | ç®æ³ | 2020-01-01 10:00:00 | | 3 | 1003 | ç客 3 å· | 2500 | 7 | ç®æ³ | 2020-01-01 10:00:00 | | 4 | 1004 | ç客 4 å· | 1200 | 5 | ç®æ³ | 2020-01-01 10:00:00 | | 5 | 1005 | ç客 5 å· | 1600 | 6 | C++ | 2020-01-01 10:00:00 | | 6 | 1006 | ç客 6 å· | 2000 | 6 | C++ | 2020-01-01 10:00:00 | è¯å·ä¿¡æ¯è¡¨ examination_infoï¼exam_id è¯å· ID, tag è¯å·ç±»å«, difficulty è¯å·é¾åº¦, duration èè¯æ¶é¿, release_time å叿¶é´ï¼ï¼ | id | exam_id | tag | difficulty | duration | release_time | | --- | ------- | ---- | ---------- | -------- | ------------------- | | 1 | 9001 | SQL | hard | 60 | 2021-09-01 06:00:00 | | 2 | 9002 | C++ | hard | 60 | 2021-09-01 06:00:00 | | 3 | 9003 | ç®æ³ | medium | 80 | 2021-09-01 10:00:00 | è¯å·ä½çè®°å½è¡¨ exam_recordï¼uid ç¨æ· ID, exam_id è¯å· ID, start_time å¼å§ä½çæ¶é´, submit_time äº¤å·æ¶é´, score å¾åï¼ï¼ | id | uid | exam_id | start_time | submit_time | score | | --- | ---- | ------- | ------------------- | ------------------- | ----- | | 1 | 1001 | 9001 | 2021-09-01 09:01:01 | 2021-09-01 09:31:00 | 81 | | 2 | 1002 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 | 81 | | 3 | 1003 | 9001 | 2021-09-01 19:01:01 | 2021-09-01 19:40:01 | 86 | | 4 | 1003 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:51 | 89 | | 5 | 1004 | 9001 | 2021-09-01 19:01:01 | 2021-09-01 19:30:01 | 85 | | 6 | 1005 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:02 | 85 | | 7 | 1006 | 9003 | 2021-09-07 10:01:01 | 2021-09-07 10:21:01 | 84 | | 8 | 1006 | 9001 | 2021-09-07 10:01:01 | 2021-09-07 10:21:01 | 80 | é¢ç®ç»ä¹ è®°å½è¡¨ practice_recordï¼uid ç¨æ· ID, question_id é¢ç® ID, submit_time æäº¤æ¶é´, score å¾åï¼ï¼ | id | uid | question_id | submit_time | score | | --- | ---- | ----------- | ------------------- | ----- | | 1 | 1001 | 8001 | 2021-08-02 11:41:01 | 60 | | 2 | 1002 | 8001 | 2021-09-02 19:30:01 | 50 | | 3 | 1002 | 8001 | 2021-09-02 19:20:01 | 70 | | 4 | 1002 | 8002 | 2021-09-02 19:38:01 | 70 | | 5 | 1004 | 8001 | 2021-08-02 19:38:01 | 70 | | 6 | 1004 | 8002 | 2021-08-02 19:48:01 | 90 | | 7 | 1001 | 8002 | 2021-08-02 19:38:01 | 70 | | 8 | 1004 | 8002 | 2021-08-02 19:48:01 | 90 | | 9 | 1004 | 8002 | 2021-08-02 19:58:01 | 94 | | 10 | 1004 | 8003 | 2021-08-02 19:38:01 | 70 | | 11 | 1004 | 8003 | 2021-08-02 19:48:01 | 90 | | 12 | 1004 | 8003 | 2021-08-01 19:38:01 | 80 | è¯·ä½ æ¾å°é«é¾åº¦ SQL è¯å·å¾åå¹³åå¼å¤§äº 80 并䏿¯ 7 级ç红å大佬ï¼ç»è®¡ä»ä»¬ç 2021 å¹´è¯å·æ»å®ææ¬¡æ°åé¢ç®æ»ç»ä¹ 次æ°ï¼åªä¿ç 2021 å¹´æè¯å·å®æè®°å½çç¨æ·ãç»ææè¯å·å®ææ°ååºï¼æé¢ç®ç»ä¹ æ°éåºã ç¤ºä¾æ°æ®è¾åºå¦ä¸ï¼ | uid | exam_cnt | question_cnt | | ---- | -------- | ------------ | | 1001 | 1 | 2 | | 1003 | 2 | 0 | è§£éï¼ç¨æ· 1001ã1003ã1004ã1006 满足é«é¾åº¦ SQL è¯å·å¾åå¹³åå¼å¤§äº 80ï¼ä½åªæ 1001ã1003 æ¯ 7 级红å大佬ï¼1001 å®æäº 1 次è¯å· 1001ï¼ç»ä¹ äº 2 次é¢ç®ï¼1003 å®æäº 2 次è¯å· 9001ã9002ï¼æªç»ä¹ é¢ç®ï¼å æ¤è®¡æ°ä¸º 0ï¼ **æè·¯ï¼** å å°æ¡ä»¶è¿è¡åæ¥çéï¼æ¯å¦å æ¥åºåè¿é«é¾åº¦ sql è¯å·çç¨æ· ```sql SELECT record.uid FROM exam_record record INNER JOIN examination_info e_info ON record.exam_id = e_info.exam_id JOIN user_info u_info ON record.uid = u_info.uid WHERE e_info.tag = 'SQL' AND e_info.difficulty = 'hard' ``` ç¶åæ ¹æ®é¢ç®è¦æ±ï¼æ¥çåå¾éå æ¡ä»¶å³å¯ï¼ 使¯è¿éåè¦æ³¨æï¼ 第ä¸ï¼ä¸è½`YEAR(submit_time)= 2021`è¿ä¸ªæ¡ä»¶æ¾å°æåï¼è¦å¨`ON`æ¡ä»¶éï¼å ä¸ºå·¦è¿æ¥åå¨è¿åå·¦è¡¨å ¨é¨è¡ï¼å³è¡¨ä¸º null çæ å½¢ï¼æ¾å¨ `JOIN`æ¡ä»¶ç `ON` åå¥ä¸çç®çæ¯ä¸ºäºç¡®ä¿å¨è¿æ¥ä¸¤ä¸ªè¡¨æ¶ï¼åªææ»¡è¶³å¹´ä»½æ¡ä»¶çè®°å½ä¼è¿è¡è¿æ¥ãè¿æ ·å¯ä»¥é¿å å ¶ä»å¹´ä»½çè®°å½è¢«å å«å¨ç»æä¸ãå³ 1001 åè¿ 2021 å¹´çè¯å·ï¼ä½æ²¡æç»ä¹ è¿ï¼å¦æææ¡ä»¶æ¾å°æåï¼å°±ä¼æé¤æè¿ç§æ åµã 第äºï¼å¿ é¡»æ¯`COUNT(distinct er.exam_id) exam_cnt, COUNT(distinct pr.id) question_cntï¼`è¦å distinctï¼å 为æå·¦è¿æ¥äº§çå¾å¤éå¤å¼ã **çæ¡**ï¼ ```sql SELECT er.uid AS UID, count(DISTINCT er.exam_id) AS exam_cnt, count(DISTINCT pr.id) AS question_cnt FROM exam_record er LEFT JOIN practice_record pr ON er.uid = pr.uid AND YEAR (er.submit_time)= 2021 AND YEAR (pr.submit_time)= 2021 WHERE er.uid IN (SELECT er.uid FROM exam_record er LEFT JOIN examination_info ei ON er.exam_id = ei.exam_id LEFT JOIN user_info ui ON er.uid = ui.uid WHERE tag = 'SQL' AND difficulty = 'hard' AND LEVEL = 7 GROUP BY er.uid HAVING avg(score) > 80) GROUP BY er.uid ORDER BY exam_cnt, question_cnt DESC ``` å¯è½ç»å¿çå°ä¼ä¼´ä¼åç°ï¼ä¸ºä»ä¹ææå°æ¡ä»¶éå¶äº`tag = 'SQL' AND difficulty = 'hard'`ï¼ä½æ¯ç¨æ· 1003 ä»ç¶è½æ¥åºä¸¤æ¡èè¯è®°å½ï¼å ¶ä¸ä¸æ¡çèè¯`tag`为 `C++`; è¿æ¯ç±äº`LEFT JOIN`çç¹æ§ï¼å³ä½¿æ²¡æä¸å³è¡¨å¹é çè¡ï¼å·¦è¡¨çææè®°å½ä»ç¶ä¼è¢«ä¿çã ### æ¯ä¸ª 6/7 çº§ç¨æ·æ´»è·æ åµï¼å°é¾ï¼ **æè¿°**ï¼ ç°æç¨æ·ä¿¡æ¯è¡¨ `user_info`ï¼`uid` ç¨æ· IDï¼`nick_name` æµç§°, `achievement` æå°±å¼, `level` ç级, `job` è䏿¹å, `register_time` æ³¨åæ¶é´ï¼ï¼ | id | uid | nick_name | achievement | level | job | register_time | | --- | ---- | --------- | ----------- | ----- | ---- | ------------------- | | 1 | 1001 | ç客 1 å· | 3100 | 7 | ç®æ³ | 2020-01-01 10:00:00 | | 2 | 1002 | ç客 2 å· | 2300 | 7 | ç®æ³ | 2020-01-01 10:00:00 | | 3 | 1003 | ç客 3 å· | 2500 | 7 | ç®æ³ | 2020-01-01 10:00:00 | | 4 | 1004 | ç客 4 å· | 1200 | 5 | ç®æ³ | 2020-01-01 10:00:00 | | 5 | 1005 | ç客 5 å· | 1600 | 6 | C++ | 2020-01-01 10:00:00 | | 6 | 1006 | ç客 6 å· | 2600 | 7 | C++ | 2020-01-01 10:00:00 | è¯å·ä¿¡æ¯è¡¨ `examination_info`ï¼`exam_id` è¯å· ID, `tag` è¯å·ç±»å«, `difficulty` è¯å·é¾åº¦, `duration` èè¯æ¶é¿, `release_time` å叿¶é´ï¼ï¼ | id | exam_id | tag | difficulty | duration | release_time | | --- | ------- | ---- | ---------- | -------- | ------------------- | | 1 | 9001 | SQL | hard | 60 | 2021-09-01 06:00:00 | | 2 | 9002 | C++ | easy | 60 | 2021-09-01 06:00:00 | | 3 | 9003 | ç®æ³ | medium | 80 | 2021-09-01 10:00:00 | è¯å·ä½çè®°å½è¡¨ `exam_record`ï¼`uid` ç¨æ· ID, `exam_id` è¯å· ID, `start_time` å¼å§ä½çæ¶é´, `submit_time` äº¤å·æ¶é´, `score` å¾åï¼ï¼ | uid | exam_id | start_time | submit_time | score | | ---- | ------- | ------------------- | ------------------- | ------ | | 1001 | 9001 | 2021-09-01 09:01:01 | 2021-09-01 09:31:00 | 78 | | 1001 | 9001 | 2021-09-01 09:01:01 | 2021-09-01 09:31:00 | 81 | | 1005 | 9001 | 2021-09-01 19:01:01 | 2021-09-01 19:30:01 | 85 | | 1005 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:02 | 85 | | 1006 | 9003 | 2021-09-07 10:01:01 | 2021-09-07 10:21:59 | 84 | | 1006 | 9001 | 2021-09-07 10:01:01 | 2021-09-07 10:21:01 | 81 | | 1002 | 9001 | 2020-09-01 13:01:01 | 2020-09-01 13:41:01 | 81 | | 1005 | 9001 | 2021-09-01 14:01:01 | (NULL) | (NULL) | é¢ç®ç»ä¹ è®°å½è¡¨ `practice_record`ï¼`uid` ç¨æ· ID, `question_id` é¢ç® ID, `submit_time` æäº¤æ¶é´, `score` å¾åï¼ï¼ | uid | question_id | submit_time | score | | ---- | ----------- | ------------------- | ----- | | 1001 | 8001 | 2021-08-02 11:41:01 | 60 | | 1004 | 8001 | 2021-08-02 19:38:01 | 70 | | 1004 | 8002 | 2021-08-02 19:48:01 | 90 | | 1001 | 8002 | 2021-08-02 19:38:01 | 70 | | 1004 | 8002 | 2021-08-02 19:48:01 | 90 | | 1006 | 8002 | 2021-08-04 19:58:01 | 94 | | 1006 | 8003 | 2021-08-03 19:38:01 | 70 | | 1006 | 8003 | 2021-08-02 19:48:01 | 90 | | 1006 | 8003 | 2020-08-01 19:38:01 | 80 | 请ç»è®¡æ¯ä¸ª 6/7 çº§ç¨æ·æ»æ´»è·æä»½æ°ã2021 å¹´æ´»è·å¤©æ°ã2021 å¹´è¯å·ä½çæ´»è·å¤©æ°ã2021 å¹´ç颿´»è·å¤©æ°ï¼æç §æ»æ´»è·æä»½æ°ã2021 å¹´æ´»è·å¤©æ°éåºæåºãç±ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | uid | act_month_total | act_days_2021 | act_days_2021_exam | | ---- | --------------- | ------------- | ------------------ | | 1006 | 3 | 4 | 1 | | 1001 | 2 | 2 | 1 | | 1005 | 1 | 1 | 1 | | 1002 | 1 | 0 | 0 | | 1003 | 0 | 0 | 0 | **è§£é**ï¼6/7 çº§ç¨æ·å ±æ 5 个ï¼å ¶ä¸ 1006 å¨ 202109ã202108ã202008 å ± 3 ä¸ªææ´»è·è¿ï¼2021 å¹´æ´»è·çæ¥ææ 20210907ã20210804ã20210803ã20210802 å ± 4 天ï¼2021 å¹´å¨è¯å·ä½çåº 20210907 æ´»è· 1 天ï¼å¨é¢ç®ç»ä¹ åºæ´»è·äº 3 天ã **æè·¯ï¼** è¿é¢çå ³é®å¨äº`CASE WHEN THEN`ç使ç¨ï¼ä¸ç¶è¦åå¾å¤ç`left join` å 为ä¼äº§çå¾å¤çç»æéã `CASE WHEN THEN`è¯å¥æ¯ä¸ç§æ¡ä»¶è¡¨è¾¾å¼ï¼ç¨äºå¨ SQL 䏿 ¹æ®æ¡ä»¶æ§è¡ä¸åçæä½æè¿åä¸åçç»æã è¯æ³ç»æå¦ä¸ï¼ ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE result END ``` å¨è¿ä¸ªç»æä¸ï¼å¯ä»¥æ ¹æ®éè¦æ·»å å¤ä¸ª`WHEN`åå¥ï¼æ¯ä¸ª`WHEN`åå¥åé¢è·çä¸ä¸ªæ¡ä»¶ï¼conditionï¼åä¸ä¸ªç»æï¼resultï¼ãæ¡ä»¶å¯ä»¥æ¯ä»»ä½é»è¾è¡¨è¾¾å¼ï¼å¦ææ»¡è¶³æ¡ä»¶ï¼å°è¿å对åºçç»æã æåç`ELSE`å奿¯å¯éçï¼ç¨äºæå®å½ææåé¢çæ¡ä»¶é½ä¸æ»¡è¶³æ¶çé»è®¤è¿åç»æãå¦ææ²¡ææä¾`ELSE`åå¥ï¼åé»è®¤è¿å`NULL`ã ä¾å¦ï¼ ```sql SELECT score, CASE WHEN score >= 90 THEN 'ä¼ç§' WHEN score >= 80 THEN 'è¯å¥½' WHEN score >= 60 THEN 'åæ ¼' ELSE 'ä¸åæ ¼' END AS grade FROM student_scores; ``` å¨ä¸è¿°ç¤ºä¾ä¸ï¼æ ¹æ®å¦çæç»©ï¼scoreï¼çä¸åèå´ï¼ä½¿ç¨ CASE WHEN THEN è¯å¥è¿åç¸åºçç级ï¼gradeï¼ã妿æç»©å¤§äºçäº 90ï¼åè¿å"ä¼ç§"ï¼å¦ææç»©å¤§äºçäº 80ï¼åè¿å"è¯å¥½"ï¼å¦ææç»©å¤§äºçäº 60ï¼åè¿å"åæ ¼"ï¼å¦åè¿å"ä¸åæ ¼"ã é£äºè§£å°äºä¸è¿°çç¨æ³ä¹åï¼åè¿å¤´çç该é¢ï¼è¦æ±ååºä¸åçæ´»è·å¤©æ°ã ```sql count(distinct act_month) as act_month_total, count(distinct case when year(act_time)='2021'then act_day end) as act_days_2021, count(distinct case when year(act_time)='2021' and tag='exam' then act_day end) as act_days_2021_exam, count(distinct case when year(act_time)='2021' and tag='question'then act_day end) as act_days_2021_question ``` è¿éç tag æ¯å ç»æ è®°ï¼æ¹ä¾¿å¯¹æ¥è¯¢è¿è¡åºåï¼å°èè¯åçé¢åå¼ã æ¾åºè¯å·ä½çåºçç¨æ· ```sql SELECT uid, exam_id AS ans_id, start_time AS act_time, date_format( start_time, '%Y%m' ) AS act_month, date_format( start_time, '%Y%m%d' ) AS act_day, 'exam' AS tag FROM exam_record ``` ç´§æ¥çå°±æ¯çé¢ä½çåºçç¨æ· ```sql SELECT uid, question_id AS ans_id, submit_time AS act_time, date_format( submit_time, '%Y%m' ) AS act_month, date_format( submit_time, '%Y%m%d' ) AS act_day, 'question' AS tag FROM practice_record ``` æåå°ä¸¤ä¸ªç»æè¿è¡`UNION` æåå«å¿äºå°ç»æè¿è¡æåº ï¼è¿é¢æç¹ç±»ä¼¼äºåæ²»æ³çææ³ï¼ **çæ¡**ï¼ ```sql SELECT user_info.uid, count(DISTINCT act_month) AS act_month_total, count(DISTINCT CASE WHEN YEAR (act_time)= '2021' THEN act_day END) AS act_days_2021, count(DISTINCT CASE WHEN YEAR (act_time)= '2021' AND tag = 'exam' THEN act_day END) AS act_days_2021_exam, count(DISTINCT CASE WHEN YEAR (act_time)= '2021' AND tag = 'question' THEN act_day END) AS act_days_2021_question FROM (SELECT UID, exam_id AS ans_id, start_time AS act_time, date_format(start_time, '%Y%m') AS act_month, date_format(start_time, '%Y%m%d') AS act_day, 'exam' AS tag FROM exam_record UNION ALL SELECT UID, question_id AS ans_id, submit_time AS act_time, date_format(submit_time, '%Y%m') AS act_month, date_format(submit_time, '%Y%m%d') AS act_day, 'question' AS tag FROM practice_record) total RIGHT JOIN user_info ON total.uid = user_info.uid WHERE user_info.LEVEL IN (6, 7) GROUP BY user_info.uid ORDER BY act_month_total DESC, act_days_2021 DESC ```