--- title: SQL常è§é¢è¯é¢æ»ç»ï¼5ï¼ description: SQL常è§é¢è¯é¢æ»ç»ç¬¬äºç¯ï¼è¯¦è§£NULL空å¼å¤çæå·§ï¼å æ¬IFNULLãCOALESCE彿°ï¼ä»¥å使ç¨CASE WHENè¿è¡æ¡ä»¶ç»è®¡å宿ç计ç®ã category: æ°æ®åº tag: - æ°æ®åºåºç¡ - SQL head: - - meta - name: keywords content: SQLé¢è¯é¢,NULL空å¼å¤ç,IFNULL,COALESCE,CASE WHEN,æ¡ä»¶ç»è®¡,宿çè®¡ç® --- > é¢ç®æ¥æºäºï¼[ç客é¢é¸ - SQL è¿é¶ææ](https://www.nowcoder.com/exam/oj?page=1&tab=SQL%E7%AF%87&topicId=240) è¾é¾æè å°é¾çé¢ç®å¯ä»¥æ ¹æ®èªèº«å®é æ åµåé¢è¯éè¦æ¥å³å®æ¯å¦è¦è·³è¿ã ## 空å¼å¤ç ### ç»è®¡ææªå®æç¶æçè¯å·çæªå®ææ°åæªå®æç **æè¿°**ï¼ ç°æè¯å·ä½çè®°å½è¡¨ `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-09-02 12:01:01 | (NULL) | (NULL) | 请ç»è®¡ææªå®æç¶æçè¯å·çæªå®ææ° incomplete_cnt åæªå®æç incomplete_rateãç±ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | exam_id | incomplete_cnt | complete_rate | | ------- | -------------- | ------------- | | 9001 | 1 | 0.333 | è§£éï¼è¯å· 9001 æ 3 次被ä½ççè®°å½ï¼å ¶ä¸ä¸¤æ¬¡å®æï¼1 次æªå®æï¼å æ¤æªå®ææ°ä¸º 1ï¼æªå®æç为 0.333ï¼ä¿ç 3 ä½å°æ°ï¼ **æè·¯**ï¼ è¿é¢åªéè¦æ³¨æä¸ä¸ªæ¯ææ¡ä»¶éå¶ï¼ä¸ä¸ªæ¯æ²¡æ¡ä»¶éå¶çï¼è¦ä¹å嫿¥è¯¢æ¡ä»¶ï¼ç¶ååå¹¶ï¼è¦ä¹ç´æ¥å¨ select éé¢è¿è¡æ¡ä»¶å¤æã **çæ¡**ï¼ åæ³ 1ï¼ ```sql SELECT exam_id, (COUNT(*) - COUNT(submit_time)) AS incomplete_cnt, ROUND((COUNT(*) - COUNT(submit_time)) / COUNT(*), 3) AS incomplete_rate FROM exam_record GROUP BY exam_id HAVING (COUNT(*) - COUNT(submit_time)) > 0; ``` å©ç¨ `COUNT(*)`ç»è®¡åç»å çæ»è®°å½æ°ï¼`COUNT(submit_time)` åªç»è®¡ `submit_time` åæ®µä¸ä¸º NULL çè®°å½æ°ï¼å³å·²å®ææ°ï¼ã两è ç¸åï¼å°±æ¯æªå®ææ°ã åæ³ 2ï¼ ```sql SELECT exam_id, COUNT(CASE WHEN submit_time IS NULL THEN 1 END) AS incomplete_cnt, ROUND(COUNT(CASE WHEN submit_time IS NULL THEN 1 END) / COUNT(*), 3) AS incomplete_rate FROM exam_record GROUP BY exam_id HAVING COUNT(CASE WHEN submit_time IS NULL THEN 1 END) > 0; ``` ä½¿ç¨ `CASE` 表达å¼ï¼å½æ¡ä»¶æ»¡è¶³æ¶è¿åä¸ä¸ªé `NULL` å¼ï¼ä¾å¦ 1ï¼ï¼å¦åè¿å `NULL`ãç¶åç¨ `COUNT` 彿°æ¥ç»è®¡é `NULL` å¼çæ°éã åæ³ 3ï¼ ```sql SELECT exam_id, SUM(submit_time IS NULL) AS incomplete_cnt, ROUND(SUM(submit_time IS NULL) / COUNT(*), 3) AS incomplete_rate FROM exam_record GROUP BY exam_id HAVING incomplete_cnt > 0; ``` å©ç¨ `SUM` 彿°å¯¹ä¸ä¸ªè¡¨è¾¾å¼æ±åãå½ `submit_time` 为 `NULL` æ¶ï¼è¡¨è¾¾å¼ `(submit_time IS NULL)` çå¼ä¸º 1 (TRUE)ï¼å¦å为 0 (FALSE)ãå°è¿äº 1 å 0 å èµ·æ¥ï¼å°±å¾å°äºæªå®æçæ°éã ### 0 çº§ç¨æ·é«é¾åº¦è¯å·çå¹³åç¨æ¶åå¹³åå¾å **æè¿°**ï¼ ç°æç¨æ·ä¿¡æ¯è¡¨ `user_info`ï¼`uid` ç¨æ· IDï¼`nick_name` æµç§°, `achievement` æå°±å¼, `level` ç级, `job` è䏿¹å, `register_time` æ³¨åæ¶é´ï¼ï¼æ°æ®å¦ä¸ï¼ | id | uid | nick_name | achievement | level | job | register_time | | --- | ---- | --------- | ----------- | ----- | ---- | ------------------- | | 1 | 1001 | ç客 1 å· | 10 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 2 | 1002 | ç客 2 å· | 2100 | 6 | ç®æ³ | 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 | 2020-01-01 10:00:00 | | 2 | 9002 | SQL | easy | 60 | 2020-01-01 10:00:00 | | 3 | 9004 | ç®æ³ | medium | 80 | 2020-01-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 | 2020-01-02 09:01:01 | 2020-01-02 09:21:59 | 80 | | 2 | 1001 | 9001 | 2021-05-02 10:01:01 | (NULL) | (NULL) | | 3 | 1001 | 9002 | 2021-02-02 19:01:01 | 2021-02-02 19:30:01 | 87 | | 4 | 1001 | 9001 | 2021-06-02 19:01:01 | 2021-06-02 19:32:00 | 20 | | 5 | 1001 | 9002 | 2021-09-05 19:01:01 | 2021-09-05 19:40:01 | 89 | | 6 | 1001 | 9002 | 2021-09-01 12:01:01 | (NULL) | (NULL) | | 7 | 1002 | 9002 | 2021-05-05 18:01:01 | 2021-05-05 18:59:02 | 90 | 请è¾åºæ¯ä¸ª 0 çº§ç¨æ·ææçé«é¾åº¦è¯å·èè¯å¹³åç¨æ¶åå¹³åå¾åï¼æªå®æçé»è®¤è¯å·æå¤§èè¯æ¶é¿å 0 åå¤çãç±ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | uid | avg_score | avg_time_took | | ---- | --------- | ------------- | | 1001 | 33 | 36.7 | è§£éï¼0 çº§ç¨æ·æ 1001ï¼é«é¾åº¦è¯å·æ 9001ï¼1001 ä½ç 9001 çè®°å½æ 3 æ¡ï¼åå«ç¨æ¶ 20 åéãæªå®æï¼è¯å·æ¶é¿ 60 åéï¼ã30 åéï¼æªæ»¡ 31 åéï¼ï¼åå«å¾å为 80 åãæªå®æï¼0 åå¤çï¼ã20 åãå æ¤ä»çå¹³åç¨æ¶ä¸º 110/3=36.7ï¼ä¿çä¸ä½å°æ°ï¼ï¼å¹³åå¾å为 33 åï¼åæ´ï¼ **æè·¯**ï¼è¿é¢ç¨`IF`æ¯å¤æçææ¹ä¾¿çï¼å 为æ¶åå° NULL å¼ç夿ãå½ç¶ `case when`ä¹å¯ä»¥ï¼å¤§åå°å¼ãè¿é¢çé¾ç¹å°±å¨äºç©ºå¼çå¤çï¼å ¶ä»çè¿äºæ¥è¯¢æ¡ä»¶ä»ä¹çï¼æç¸ä¿¡é¾ä¸å大家ã **çæ¡**ï¼ ```sql SELECT UID, round(avg(new_socre)) AS avg_score, round(avg(time_diff), 1) AS avg_time_took FROM (SELECT er.uid, IF (er.submit_time IS NOT NULL, TIMESTAMPDIFF(MINUTE, start_time, submit_time), ef.duration) AS time_diff, IF (er.submit_time IS NOT NULL,er.score,0) AS new_socre FROM exam_record er LEFT JOIN user_info uf ON er.uid = uf.uid LEFT JOIN examination_info ef ON er.exam_id = ef.exam_id WHERE uf.LEVEL = 0 AND ef.difficulty = 'hard' ) t GROUP BY UID 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 å· | 1000 | 2 | ç®æ³ | 2020-01-01 10:00:00 | | 2 | 1002 | ç客 2 å· | 1200 | 3 | ç®æ³ | 2020-01-01 10:00:00 | | 3 | 1003 | è¿å»ç 3 å· | 2200 | 5 | ç®æ³ | 2020-01-01 10:00:00 | | 4 | 1004 | ç客 4 å· | 2500 | 6 | ç®æ³ | 2020-01-01 10:00:00 | | 5 | 1005 | ç客 5 å· | 3000 | 7 | C++ | 2020-01-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 | 2020-01-02 09:01:01 | 2020-01-02 09:21:59 | 80 | | 3 | 1001 | 9002 | 2021-02-02 19:01:01 | 2021-02-02 19:30:01 | 87 | | 2 | 1001 | 9001 | 2021-05-02 10:01:01 | (NULL) | (NULL) | | 4 | 1001 | 9001 | 2021-06-02 19:01:01 | 2021-06-02 19:32:00 | 20 | | 6 | 1001 | 9002 | 2021-09-01 12:01:01 | (NULL) | (NULL) | | 5 | 1001 | 9002 | 2021-09-05 19:01:01 | 2021-09-05 19:40:01 | 89 | | 11 | 1002 | 9001 | 2020-01-01 12:01:01 | 2020-01-01 12:31:01 | 81 | | 12 | 1002 | 9002 | 2020-02-01 12:01:01 | 2020-02-01 12:31:01 | 82 | | 13 | 1002 | 9002 | 2020-02-02 12:11:01 | 2020-02-02 12:31:01 | 83 | | 7 | 1002 | 9002 | 2021-05-05 18:01:01 | 2021-05-05 18:59:02 | 90 | | 16 | 1002 | 9001 | 2021-09-06 12:01:01 | 2021-09-06 12:21:01 | 80 | | 17 | 1002 | 9001 | 2021-09-06 12:01:01 | (NULL) | (NULL) | | 18 | 1002 | 9001 | 2021-09-07 12:01:01 | (NULL) | (NULL) | | 8 | 1003 | 9003 | 2021-02-06 12:01:01 | (NULL) | (NULL) | | 9 | 1003 | 9001 | 2021-09-07 10:01:01 | 2021-09-07 10:31:01 | 89 | | 10 | 1004 | 9002 | 2021-08-06 12:01:01 | (NULL) | (NULL) | | 14 | 1005 | 9001 | 2021-02-01 11:01:01 | 2021-02-01 11:31:01 | 84 | | 15 | 1006 | 9001 | 2021-02-01 11:01:01 | 2021-02-01 11:31:01 | 84 | é¢ç®ç»ä¹ è®°å½è¡¨ `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 | 8002 | 2021-09-01 19:38:01 | 80 | 请æ¾å°æµç§°ä»¥ãç客ãå¼å¤´ãå·ãç»å°¾ãæå°±å¼å¨ 1200~2500 ä¹é´ï¼ä¸æè¿ä¸æ¬¡æ´»è·ï¼ç颿ä½çè¯å·ï¼å¨ 2021 å¹´ 9 æçç¨æ·ä¿¡æ¯ã ç±ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | uid | nick_name | achievement | | ---- | --------- | ----------- | | 1002 | ç客 2 å· | 1200 | **è§£é**ï¼æµç§°ä»¥ãç客ãå¼å¤´ãå·ãç»å°¾ä¸æå°±å¼å¨ 1200~2500 ä¹é´çæ 1002ã1004ï¼ 1002 æè¿ä¸æ¬¡è¯å·åºæ´»è·ä¸º 2021 å¹´ 9 æï¼æè¿ä¸æ¬¡é¢ç®åºæ´»è·ä¸º 2021 å¹´ 9 æï¼1004 æè¿ä¸æ¬¡è¯å·åºæ´»è·ä¸º 2021 å¹´ 8 æï¼é¢ç®åºæªæ´»è·ã å æ¤æç»æ»¡è¶³æ¡ä»¶çåªæ 1002ã **æè·¯**ï¼ å æ ¹æ®æ¡ä»¶ååºä¸»è¦æ¥è¯¢è¯å¥ æµç§°ä»¥ãç客ãå¼å¤´ãå·ãç»å°¾: `nick_name LIKE "ç客%å·"` æå°±å¼å¨ 1200~2500 ä¹é´ï¼`achievement BETWEEN 1200 AND 2500` 第ä¸ä¸ªæ¡ä»¶å 为éå®äºä¸º 9 æï¼æä»¥ç´æ¥åå°±è¡ï¼`( date_format( record.submit_time, '%Y%m' )= 202109 OR date_format( pr.submit_time, '%Y%m' )= 202109 )` **çæ¡**ï¼ ```sql SELECT DISTINCT u_info.uid, u_info.nick_name, u_info.achievement FROM user_info u_info LEFT JOIN exam_record record ON record.uid = u_info.uid LEFT JOIN practice_record pr ON u_info.uid = pr.uid WHERE u_info.nick_name LIKE "ç客%å·" AND u_info.achievement BETWEEN 1200 AND 2500 AND (date_format(record.submit_time, '%Y%m')= 202109 OR date_format(pr.submit_time, '%Y%m')= 202109) GROUP BY u_info.uid ``` ### çéæµç§°è§ååè¯å·è§åçä½çè®°å½ï¼è¾é¾ï¼ **æè¿°**ï¼ ç°æç¨æ·ä¿¡æ¯è¡¨ `user_info`ï¼`uid` ç¨æ· IDï¼`nick_name` æµç§°, `achievement` æå°±å¼, `level` ç级, `job` è䏿¹å, `register_time` æ³¨åæ¶é´ï¼ï¼ | id | uid | nick_name | achievement | level | job | register_time | | --- | ---- | ------------ | ----------- | ----- | ---- | ------------------- | | 1 | 1001 | ç客 1 å· | 1900 | 2 | ç®æ³ | 2020-01-01 10:00:00 | | 2 | 1002 | ç客 2 å· | 1200 | 3 | ç®æ³ | 2020-01-01 10:00:00 | | 3 | 1003 | ç客 3 å· â | 2200 | 5 | ç®æ³ | 2020-01-01 10:00:00 | | 4 | 1004 | ç客 4 å· | 2500 | 6 | ç®æ³ | 2020-01-01 10:00:00 | | 5 | 1005 | ç客 555 å· | 2000 | 7 | C++ | 2020-01-01 10:00:00 | | 6 | 1006 | 666666 | 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 | C++ | hard | 60 | 2020-01-01 10:00:00 | | 2 | 9002 | c# | hard | 80 | 2020-01-01 10:00:00 | | 3 | 9003 | SQL | medium | 70 | 2020-01-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 | 2020-01-02 09:01:01 | 2020-01-02 09:21:59 | 80 | | 2 | 1001 | 9001 | 2021-05-02 10:01:01 | (NULL) | (NULL) | | 4 | 1001 | 9001 | 2021-06-02 19:01:01 | 2021-06-02 19:32:00 | 20 | | 3 | 1001 | 9002 | 2021-02-02 19:01:01 | 2021-02-02 19:30:01 | 87 | | 5 | 1001 | 9002 | 2021-09-05 19:01:01 | 2021-09-05 19:40:01 | 89 | | 6 | 1001 | 9002 | 2021-09-01 12:01:01 | (NULL) | (NULL) | | 11 | 1002 | 9001 | 2020-01-01 12:01:01 | 2020-01-01 12:31:01 | 81 | | 16 | 1002 | 9001 | 2021-09-06 12:01:01 | 2021-09-06 12:21:01 | 80 | | 17 | 1002 | 9001 | 2021-09-06 12:01:01 | (NULL) | (NULL) | | 18 | 1002 | 9001 | 2021-09-07 12:01:01 | (NULL) | (NULL) | | 7 | 1002 | 9002 | 2021-05-05 18:01:01 | 2021-05-05 18:59:02 | 90 | | 12 | 1002 | 9002 | 2020-02-01 12:01:01 | 2020-02-01 12:31:01 | 82 | | 13 | 1002 | 9002 | 2020-02-02 12:11:01 | 2020-02-02 12:31:01 | 83 | | 9 | 1003 | 9001 | 2021-09-07 10:01:01 | 2021-09-07 10:31:01 | 89 | | 8 | 1003 | 9003 | 2021-02-06 12:01:01 | (NULL) | (NULL) | | 10 | 1004 | 9002 | 2021-08-06 12:01:01 | (NULL) | (NULL) | | 14 | 1005 | 9001 | 2021-02-01 11:01:01 | 2021-02-01 11:31:01 | 84 | | 15 | 1006 | 9001 | 2021-02-01 11:01:01 | 2021-09-01 11:31:01 | 84 | æ¾å°æµç§°ä»¥"ç客"+纯æ°å+"å·"æè 纯æ°åç»æçç¨æ·å¯¹äºåæ¯ c å¼å¤´çè¯å·ç±»å«ï¼å¦ C,C++,c#çï¼ç已宿çè¯å· ID åå¹³åå¾åï¼æç¨æ· IDãå¹³ååååºæåºãç±ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | uid | exam_id | avg_score | | ---- | ------- | --------- | | 1002 | 9001 | 81 | | 1002 | 9002 | 85 | | 1005 | 9001 | 84 | | 1006 | 9001 | 84 | è§£éï¼æµç§°æ»¡è¶³æ¡ä»¶çç¨æ·æ 1002ã1004ã1005ã1006ï¼ c å¼å¤´çè¯å·æ 9001ã9002ï¼ æ»¡è¶³ä¸è¿°æ¡ä»¶çä½çè®°å½ä¸ï¼1002 宿 9001 çå¾åæ 81ã80ï¼å¹³åå为 81ï¼80.5 åæ´åèäºå ¥å¾ 81ï¼ï¼ 1002 宿 9002 çå¾åæ 90ã82ã83ï¼å¹³åå为 85ï¼ **æè·¯**ï¼ è¿æ¯èæ ·åï¼æ¢ç¶ç»åºäºæ¡ä»¶ï¼å°±å æå个æ¡ä»¶å ååºæ¥ æ¾å°æµç§°ä»¥"ç客"+纯æ°å+"å·"æè 纯æ°åç»æçç¨æ·ï¼ ææå¼å§æ¯è¿ä¹åçï¼`nick_name LIKE 'ç客%å·' OR nick_name REGEXP '^[0-9]+$'`ï¼å¦æè¡¨ä¸æä¸ª âç客 H å·â ï¼é£ä¹è½éè¿ã æä»¥è¿éè¿å¾ç¨æ£åï¼ `nick_name LIKE '^ç客[0-9]+å·'` 对äºåæ¯ c å¼å¤´çè¯å·ç±»å«ï¼ `e_info.tag LIKE 'c%'` æè `tag regexp '^c|^C'` 第ä¸ä¸ªä¹è½å¹é å°å¤§å C **çæ¡**ï¼ ```sql SELECT UID, exam_id, ROUND(AVG(score), 0) avg_score FROM exam_record WHERE UID IN (SELECT UID FROM user_info WHERE nick_name RLIKE "^ç客[0-9]+å· $" OR nick_name RLIKE "^[0-9]+$") AND exam_id IN (SELECT exam_id FROM examination_info WHERE tag RLIKE "^[cC]") AND score IS NOT NULL GROUP BY UID,exam_id ORDER BY UID,avg_score; ``` ### æ ¹æ®æå®è®°å½æ¯å¦åå¨è¾åºä¸åæ åµï¼å°é¾ï¼ **æè¿°**ï¼ ç°æç¨æ·ä¿¡æ¯è¡¨ `user_info`ï¼`uid` ç¨æ· IDï¼`nick_name` æµç§°, `achievement` æå°±å¼, `level` ç级, `job` è䏿¹å, `register_time` æ³¨åæ¶é´ï¼ï¼ | id | uid | nick_name | achievement | level | job | register_time | | --- | ---- | ----------- | ----------- | ----- | ---- | ------------------- | | 1 | 1001 | ç客 1 å· | 19 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 2 | 1002 | ç客 2 å· | 1200 | 3 | ç®æ³ | 2020-01-01 10:00:00 | | 3 | 1003 | è¿å»ç 3 å· | 22 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 4 | 1004 | ç客 4 å· | 25 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 5 | 1005 | ç客 555 å· | 2000 | 7 | C++ | 2020-01-01 10:00:00 | | 6 | 1006 | 666666 | 3000 | 6 | C++ | 2020-01-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 | 2020-01-02 09:01:01 | 2020-01-02 09:21:59 | 80 | | 2 | 1001 | 9001 | 2021-05-02 10:01:01 | (NULL) | (NULL) | | 3 | 1001 | 9002 | 2021-02-02 19:01:01 | 2021-02-02 19:30:01 | 87 | | 4 | 1001 | 9002 | 2021-09-01 12:01:01 | (NULL) | (NULL) | | 5 | 1001 | 9003 | 2021-09-02 12:01:01 | (NULL) | (NULL) | | 6 | 1001 | 9004 | 2021-09-03 12:01:01 | (NULL) | (NULL) | | 7 | 1002 | 9001 | 2020-01-01 12:01:01 | 2020-01-01 12:31:01 | 99 | | 8 | 1002 | 9003 | 2020-02-01 12:01:01 | 2020-02-01 12:31:01 | 82 | | 9 | 1002 | 9003 | 2020-02-02 12:11:01 | (NULL) | (NULL) | | 10 | 1002 | 9002 | 2021-05-05 18:01:01 | (NULL) | (NULL) | | 11 | 1002 | 9001 | 2021-09-06 12:01:01 | (NULL) | (NULL) | | 12 | 1003 | 9003 | 2021-02-06 12:01:01 | (NULL) | (NULL) | | 13 | 1003 | 9001 | 2021-09-07 10:01:01 | 2021-09-07 10:31:01 | 89 | è¯·ä½ çé表ä¸çæ°æ®ï¼å½æä»»æä¸ä¸ª 0 çº§ç¨æ·æªå®æè¯å·æ°å¤§äº 2 æ¶ï¼è¾åºæ¯ä¸ª 0 çº§ç¨æ·çè¯å·æªå®ææ°åæªå®æçï¼ä¿ç 3 ä½å°æ°ï¼ï¼è¥ä¸åå¨è¿æ ·çç¨æ·ï¼åè¾åºæææä½çè®°å½çç¨æ·çè¿ä¸¤ä¸ªææ ãç»æææªå®æçååºæåºã ç±ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | uid | incomplete_cnt | incomplete_rate | | ---- | -------------- | --------------- | | 1004 | 0 | 0.000 | | 1003 | 1 | 0.500 | | 1001 | 4 | 0.667 | **è§£é**ï¼0 çº§ç¨æ·æ 1001ã1003ã1004ï¼ä»ä»¬ä½çè¯å·æ°åæªå®ææ°åå«ä¸ºï¼6:4ã2:1ã0:0ï¼ åå¨ 1001 è¿ä¸ª 0 çº§ç¨æ·æªå®æè¯å·æ°å¤§äº 2ï¼å æ¤è¾åºè¿ä¸ä¸ªç¨æ·çæªå®ææ°åæªå®æçï¼1004 æªä½çè¿è¯å·ï¼æªå®æçé»è®¤å¡« 0ï¼ä¿ç 3 ä½å°æ°åæ¯ 0.000ï¼ï¼ ç»ææç §æªå®æçååºæåºã éï¼å¦æ 1001 䏿»¡è¶³ãæªå®æè¯å·æ°å¤§äº 2ãï¼åéè¦è¾åº 1001ã1002ã1003 çè¿ä¸¤ä¸ªææ ï¼å 为è¯å·ä½çè®°å½è¡¨éåªæè¿ä¸ä¸ªç¨æ·çä½çè®°å½ã **æè·¯**ï¼ å æå¯è½æ»¡è¶³æ¡ä»¶**â0 çº§ç¨æ·æªå®æè¯å·æ°å¤§äº 2â**ç SQL ååºæ¥ ```sql SELECT ui.uid UID FROM user_info ui LEFT JOIN exam_record er ON ui.uid = er.uid WHERE ui.uid IN (SELECT ui.uid FROM user_info ui LEFT JOIN exam_record er ON ui.uid = er.uid WHERE er.submit_time IS NULL AND ui.LEVEL = 0 ) GROUP BY ui.uid HAVING sum(IF(er.submit_time IS NULL, 1, 0)) > 2 ``` ç¶åååå«ååºä¸¤ç§æ åµç SQL æ¥è¯¢è¯å¥ï¼ æ åµ 1. æ¥è¯¢å卿¡ä»¶è¦æ±ç 0 çº§ç¨æ·çè¯å·æªå®æç ```sql SELECT tmp1.uid uid, sum( IF ( er.submit_time IS NULL AND er.start_time IS NOT NULL, 1, 0 )) incomplete_cnt, round( sum( IF ( er.submit_time IS NULL AND er.start_time IS NOT NULL, 1, 0 ))/ count( tmp1.uid ), 3 ) incomplete_rate FROM ( SELECT DISTINCT ui.uid FROM user_info ui LEFT JOIN exam_record er ON ui.uid = er.uid WHERE er.submit_time IS NULL AND ui.LEVEL = 0 ) tmp1 LEFT JOIN exam_record er ON tmp1.uid = er.uid GROUP BY tmp1.uid ORDER BY incomplete_rate ``` æ åµ 2. æ¥è¯¢ä¸å卿¡ä»¶è¦æ±æ¶æææä½çè®°å½ç yong ç¨æ·çè¯å·æªå®æç ```sql SELECT ui.uid uid, sum( CASE WHEN er.submit_time IS NULL AND er.start_time IS NOT NULL THEN 1 ELSE 0 END ) incomplete_cnt, round( sum( IF ( er.submit_time IS NULL AND er.start_time IS NOT NULL, 1, 0 ))/ count( ui.uid ), 3 ) incomplete_rate FROM user_info ui JOIN exam_record er ON ui.uid = er.uid GROUP BY ui.uid ORDER BY incomplete_rate ``` æ¼å¨ä¸èµ·ï¼å°±æ¯çæ¡ ```sql WITH host_user AS (SELECT ui.uid UID FROM user_info ui LEFT JOIN exam_record er ON ui.uid = er.uid WHERE ui.uid IN (SELECT ui.uid FROM user_info ui LEFT JOIN exam_record er ON ui.uid = er.uid WHERE er.submit_time IS NULL AND ui.LEVEL = 0 ) GROUP BY ui.uid HAVING sum(IF (er.submit_time IS NULL, 1, 0))> 2), tt1 AS (SELECT tmp1.uid UID, sum(IF (er.submit_time IS NULL AND er.start_time IS NOT NULL, 1, 0)) incomplete_cnt, round(sum(IF (er.submit_time IS NULL AND er.start_time IS NOT NULL, 1, 0))/ count(tmp1.uid), 3) incomplete_rate FROM (SELECT DISTINCT ui.uid FROM user_info ui LEFT JOIN exam_record er ON ui.uid = er.uid WHERE er.submit_time IS NULL AND ui.LEVEL = 0 ) tmp1 LEFT JOIN exam_record er ON tmp1.uid = er.uid GROUP BY tmp1.uid ORDER BY incomplete_rate), tt2 AS (SELECT ui.uid UID, sum(CASE WHEN er.submit_time IS NULL AND er.start_time IS NOT NULL THEN 1 ELSE 0 END) incomplete_cnt, round(sum(IF (er.submit_time IS NULL AND er.start_time IS NOT NULL, 1, 0))/ count(ui.uid), 3) incomplete_rate FROM user_info ui JOIN exam_record er ON ui.uid = er.uid GROUP BY ui.uid ORDER BY incomplete_rate) (SELECT tt1.* FROM tt1 LEFT JOIN (SELECT UID FROM host_user) t1 ON 1 = 1 WHERE t1.uid IS NOT NULL ) UNION ALL (SELECT tt2.* FROM tt2 LEFT JOIN (SELECT UID FROM host_user) t2 ON 1 = 1 WHERE t2.uid IS NULL) ``` V2 çæ¬ï¼æ ¹æ®ä¸é¢ååºçæ¹è¿ï¼çæ¡ç¼©çäºï¼é»è¾æ´å¼ºï¼ï¼ ```sql SELECT ui.uid, SUM( IF ( start_time IS NOT NULL AND score IS NULL, 1, 0 )) AS incomplete_cnt,#3.è¯å·æªå®ææ° ROUND( AVG( IF ( start_time IS NOT NULL AND score IS NULL, 1, 0 )), 3 ) AS incomplete_rate #4.æªå®æç FROM user_info ui LEFT JOIN exam_record USING ( uid ) WHERE CASE WHEN (#1.彿任æä¸ä¸ª0çº§ç¨æ·æªå®æè¯å·æ°å¤§äº2æ¶ SELECT MAX( lv0_incom_cnt ) FROM ( SELECT SUM( IF ( score IS NULL, 1, 0 )) AS lv0_incom_cnt FROM user_info JOIN exam_record USING ( uid ) WHERE LEVEL = 0 GROUP BY uid ) table1 )> 2 THEN uid IN ( #1.1æ¾åºæ¯ä¸ª0çº§ç¨æ· SELECT uid FROM user_info WHERE LEVEL = 0 ) ELSE uid IN ( #2.è¥ä¸åå¨è¿æ ·çç¨æ·ï¼æ¾åºæä½çè®°å½çç¨æ· SELECT DISTINCT uid FROM exam_record ) END GROUP BY ui.uid ORDER BY incomplete_rate #5.ç»æææªå®æçååºæåº ``` ### åç¨æ·ç级çä¸åå¾å表ç°å æ¯ï¼è¾é¾ï¼ **æè¿°**ï¼ ç°æç¨æ·ä¿¡æ¯è¡¨ `user_info`ï¼`uid` ç¨æ· IDï¼`nick_name` æµç§°, `achievement` æå°±å¼, `level` ç级, `job` è䏿¹å, `register_time` æ³¨åæ¶é´ï¼ï¼ | id | uid | nick_name | achievement | level | job | register_time | | --- | ---- | ------------ | ----------- | ----- | ---- | ------------------- | | 1 | 1001 | ç客 1 å· | 19 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 2 | 1002 | ç客 2 å· | 1200 | 3 | ç®æ³ | 2020-01-01 10:00:00 | | 3 | 1003 | ç客 3 å· â | 22 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 4 | 1004 | ç客 4 å· | 25 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 5 | 1005 | ç客 555 å· | 2000 | 7 | C++ | 2020-01-01 10:00:00 | | 6 | 1006 | 666666 | 3000 | 6 | C++ | 2020-01-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 | 2020-01-02 09:01:01 | 2020-01-02 09:21:59 | 80 | | 2 | 1001 | 9001 | 2021-05-02 10:01:01 | (NULL) | (NULL) | | 3 | 1001 | 9002 | 2021-02-02 19:01:01 | 2021-02-02 19:30:01 | 75 | | 4 | 1001 | 9002 | 2021-09-01 12:01:01 | 2021-09-01 12:11:01 | 60 | | 5 | 1001 | 9003 | 2021-09-02 12:01:01 | 2021-09-02 12:41:01 | 90 | | 6 | 1001 | 9001 | 2021-06-02 19:01:01 | 2021-06-02 19:32:00 | 20 | | 7 | 1001 | 9002 | 2021-09-05 19:01:01 | 2021-09-05 19:40:01 | 89 | | 8 | 1001 | 9004 | 2021-09-03 12:01:01 | (NULL) | (NULL) | | 9 | 1002 | 9001 | 2020-01-01 12:01:01 | 2020-01-01 12:31:01 | 99 | | 10 | 1002 | 9003 | 2020-02-01 12:01:01 | 2020-02-01 12:31:01 | 82 | | 11 | 1002 | 9003 | 2020-02-02 12:11:01 | 2020-02-02 12:41:01 | 76 | 为äºå¾å°ç¨æ·è¯å·ä½çç宿§è¡¨ç°ï¼æä»¬å°è¯å·å¾åæåçç¹[90,75,60]å为ä¼è¯ä¸å·®å个å¾åç级ï¼åçç¹ååå°å·¦åºé´ï¼ï¼è¯·ç»è®¡ä¸åç¨æ·ç级ç人å¨å®æè¿çè¯å·ä¸åå¾åççº§å æ¯ï¼ç»æä¿ç 3 ä½å°æ°ï¼ï¼æªå®æè¿è¯å·çç¨æ·æ éè¾åºï¼ç»ææç¨æ·ç级éåºãå æ¯éåºæåºã ç±ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | level | score_grade | ratio | | ----- | ----------- | ----- | | 3 | è¯ | 0.667 | | 3 | ä¼ | 0.333 | | 0 | è¯ | 0.500 | | 0 | ä¸ | 0.167 | | 0 | ä¼ | 0.167 | | 0 | å·® | 0.167 | è§£éï¼å®æè¿è¯å·çç¨æ·æ 1001ã1002ï¼å®æäºçè¯å·å¯¹åºçç¨æ·ç级ååæ°ç级å¦ä¸ï¼ | uid | exam_id | score | level | score_grade | | ---- | ------- | ----- | ----- | ----------- | | 1001 | 9001 | 80 | 0 | è¯ | | 1001 | 9002 | 75 | 0 | è¯ | | 1001 | 9002 | 60 | 0 | ä¸ | | 1001 | 9003 | 90 | 0 | ä¼ | | 1001 | 9001 | 20 | 0 | å·® | | 1001 | 9002 | 89 | 0 | è¯ | | 1002 | 9001 | 99 | 3 | ä¼ | | 1002 | 9003 | 82 | 3 | è¯ | | 1002 | 9003 | 76 | 3 | è¯ | å æ¤ 0 çº§ç¨æ·ï¼åªæ 1001ï¼çååæ°ç级æ¯ä¾ä¸ºï¼ä¼ 1/6ï¼è¯ 1/6ï¼ä¸ 1/6ï¼å·® 3/6ï¼3 çº§ç¨æ·ï¼åªæ 1002ï¼ååæ°ç级æ¯ä¾ä¸ºï¼ä¼ 1/3ï¼è¯ 2/3ãç»æä¿ç 3 ä½å°æ°ã **æè·¯**ï¼ å æ **âå°è¯å·å¾åæåçç¹[90,75,60]å为ä¼è¯ä¸å·®å个å¾åç级â**è¿ä¸ªæ¡ä»¶ååºæ¥ï¼è¿éå¯ä»¥ç¨å°`case when` ```sql CASE WHEN a.score >= 90 THEN 'ä¼' WHEN a.score < 90 AND a.score >= 75 THEN 'è¯' WHEN a.score < 75 AND a.score >= 60 THEN 'ä¸' ELSE 'å·®' END ``` è¿é¢çå ³é®ç¹å°±å¨äºè¿ï¼å ¶ä»å©ä¸çå°±æ¯æ¡ä»¶æ¼æ¥äº **çæ¡**ï¼ ```sql SELECT a.LEVEL, a.score_grade, ROUND(a.cur_count / b.total_num, 3) AS ratio FROM (SELECT b.LEVEL AS LEVEL, (CASE WHEN a.score >= 90 THEN 'ä¼' WHEN a.score < 90 AND a.score >= 75 THEN 'è¯' WHEN a.score < 75 AND a.score >= 60 THEN 'ä¸' ELSE 'å·®' END) AS score_grade, count(1) AS cur_count FROM exam_record a LEFT JOIN user_info b ON a.uid = b.uid WHERE a.submit_time IS NOT NULL GROUP BY b.LEVEL, score_grade) a LEFT JOIN (SELECT b.LEVEL AS LEVEL, count(b.LEVEL) AS total_num FROM exam_record a LEFT JOIN user_info b ON a.uid = b.uid WHERE a.submit_time IS NOT NULL GROUP BY b.LEVEL) b ON a.LEVEL = b.LEVEL ORDER BY a.LEVEL DESC, ratio DESC ``` ## ééæ¥è¯¢ ### æ³¨åæ¶é´ææ©çä¸ä¸ªäºº **æè¿°**ï¼ ç°æç¨æ·ä¿¡æ¯è¡¨ `user_info`ï¼`uid` ç¨æ· IDï¼`nick_name` æµç§°, `achievement` æå°±å¼, `level` ç级, `job` è䏿¹å, `register_time` æ³¨åæ¶é´ï¼ï¼ | id | uid | nick_name | achievement | level | job | register_time | | --- | ---- | ------------ | ----------- | ----- | ---- | ------------------- | | 1 | 1001 | ç客 1 å· | 19 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 2 | 1002 | ç客 2 å· | 1200 | 3 | ç®æ³ | 2020-02-01 10:00:00 | | 3 | 1003 | ç客 3 å· â | 22 | 0 | ç®æ³ | 2020-01-02 10:00:00 | | 4 | 1004 | ç客 4 å· | 25 | 0 | ç®æ³ | 2020-01-02 11:00:00 | | 5 | 1005 | ç客 555 å· | 4000 | 7 | C++ | 2020-01-11 10:00:00 | | 6 | 1006 | 666666 | 3000 | 6 | C++ | 2020-11-01 10:00:00 | 请ä»ä¸æ¾å°æ³¨åæ¶é´ææ©ç 3 个人ãç±ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | uid | nick_name | register_time | | ---- | ------------ | ------------------- | | 1001 | ç客 1 | 2020-01-01 10:00:00 | | 1003 | ç客 3 å· â | 2020-01-02 10:00:00 | | 1004 | ç客 4 å· | 2020-01-02 11:00:00 | è§£éï¼ææ³¨åæ¶é´æåºåéååä¸åï¼è¾åºå ¶ç¨æ· IDãæµç§°ãæ³¨åæ¶é´ã **çæ¡**ï¼ ```sql SELECT uid, nick_name, register_time FROM user_info ORDER BY register_time LIMIT 3 ``` ### 注åå½å¤©å°±å®æäºè¯å·çåå第ä¸é¡µï¼è¾é¾ï¼ **æè¿°**ï¼ç°æç¨æ·ä¿¡æ¯è¡¨ `user_info`ï¼`uid` ç¨æ· IDï¼`nick_name` æµç§°, `achievement` æå°±å¼, `level` ç级, `job` è䏿¹å, `register_time` æ³¨åæ¶é´ï¼ï¼ | id | uid | nick_name | achievement | level | job | register_time | | --- | ---- | ------------ | ----------- | ----- | ---- | ------------------- | | 1 | 1001 | ç客 1 | 19 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 2 | 1002 | ç客 2 å· | 1200 | 3 | ç®æ³ | 2020-01-01 10:00:00 | | 3 | 1003 | ç客 3 å· â | 22 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 4 | 1004 | ç客 4 å· | 25 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 5 | 1005 | ç客 555 å· | 4000 | 7 | ç®æ³ | 2020-01-11 10:00:00 | | 6 | 1006 | ç客 6 å· | 25 | 0 | ç®æ³ | 2020-01-02 11:00:00 | | 7 | 1007 | ç客 7 å· | 25 | 0 | ç®æ³ | 2020-01-02 11:00:00 | | 8 | 1008 | ç客 8 å· | 25 | 0 | ç®æ³ | 2020-01-02 11:00:00 | | 9 | 1009 | ç客 9 å· | 25 | 0 | ç®æ³ | 2020-01-02 11:00:00 | | 10 | 1010 | ç客 10 å· | 25 | 0 | ç®æ³ | 2020-01-02 11:00:00 | | 11 | 1011 | 666666 | 3000 | 6 | C++ | 2020-01-02 10:00:00 | è¯å·ä¿¡æ¯è¡¨ examination_infoï¼exam_id è¯å· ID, tag è¯å·ç±»å«, difficulty è¯å·é¾åº¦, duration èè¯æ¶é¿, release_time å叿¶é´ï¼ï¼ | id | exam_id | tag | difficulty | duration | release_time | | --- | ------- | ---- | ---------- | -------- | ------------------- | | 1 | 9001 | ç®æ³ | hard | 60 | 2020-01-01 10:00:00 | | 2 | 9002 | ç®æ³ | hard | 80 | 2020-01-01 10:00:00 | | 3 | 9003 | SQL | medium | 70 | 2020-01-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 | 2020-01-02 09:01:01 | 2020-01-02 09:21:59 | 80 | | 2 | 1002 | 9003 | 2020-01-20 10:01:01 | 2020-01-20 10:10:01 | 81 | | 3 | 1002 | 9002 | 2020-01-01 12:11:01 | 2020-01-01 12:31:01 | 83 | | 4 | 1003 | 9002 | 2020-01-01 19:01:01 | 2020-01-01 19:30:01 | 75 | | 5 | 1004 | 9002 | 2020-01-01 12:01:01 | 2020-01-01 12:11:01 | 60 | | 6 | 1005 | 9002 | 2020-01-01 12:01:01 | 2020-01-01 12:41:01 | 90 | | 7 | 1006 | 9001 | 2020-01-02 19:01:01 | 2020-01-02 19:32:00 | 20 | | 8 | 1007 | 9002 | 2020-01-02 19:01:01 | 2020-01-02 19:40:01 | 89 | | 9 | 1008 | 9003 | 2020-01-02 12:01:01 | 2020-01-02 12:20:01 | 99 | | 10 | 1008 | 9001 | 2020-01-02 12:01:01 | 2020-01-02 12:31:01 | 98 | | 11 | 1009 | 9002 | 2020-01-02 12:01:01 | 2020-01-02 12:31:01 | 82 | | 12 | 1010 | 9002 | 2020-01-02 12:11:01 | 2020-01-02 12:41:01 | 76 | | 13 | 1011 | 9001 | 2020-01-02 10:01:01 | 2020-01-02 10:31:01 | 89 |  æ¾å°æ±èæ¹åä¸ºç®æ³å·¥ç¨å¸ï¼ä¸æ³¨åå½å¤©å°±å®æäºç®æ³ç±»è¯å·çäººï¼æåå è¿çææèè¯æé«å¾åæåãæåæ¦å¾é¿ï¼æä»¬å°éç¨å页å±ç¤ºï¼æ¯é¡µ 3 æ¡ï¼ç°å¨éè¦ä½ ååºç¬¬ 3 页ï¼é¡µç ä» 1 å¼å§ï¼ç人çä¿¡æ¯ã ç±ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | uid | level | register_time | max_score | | ---- | ----- | ------------------- | --------- | | 1010 | 0 | 2020-01-02 11:00:00 | 76 | | 1003 | 0 | 2020-01-01 10:00:00 | 75 | | 1004 | 0 | 2020-01-01 11:00:00 | 60 | è§£éï¼é¤äº 1011 å ¶ä»ç¨æ·çæ±èæ¹åé½ä¸ºç®æ³å·¥ç¨å¸ï¼ç®æ³ç±»è¯å·æ 9001 å 9002ï¼11 ä¸ªç¨æ·æ³¨åå½å¤©é½å®æäºç®æ³ç±»è¯å·ï¼è®¡ç®ä»ä»¬çææèè¯æå¤§åæ¶ï¼åªæ 1002 å 1008 宿äºä¸¤æ¬¡èè¯ï¼å ¶ä»äººåªå®æäºä¸åºèè¯ï¼1002 两åºèè¯æé«å为 81ï¼1008 æé«å为 99ã ææé«åæåå¦ä¸ï¼ | uid | level | register_time | max_score | | ---- | ----- | ------------------- | --------- | | 1008 | 0 | 2020-01-02 11:00:00 | 99 | | 1005 | 7 | 2020-01-01 10:00:00 | 90 | | 1007 | 0 | 2020-01-02 11:00:00 | 89 | | 1002 | 3 | 2020-01-01 10:00:00 | 83 | | 1009 | 0 | 2020-01-02 11:00:00 | 82 | | 1001 | 0 | 2020-01-01 10:00:00 | 80 | | 1010 | 0 | 2020-01-02 11:00:00 | 76 | | 1003 | 0 | 2020-01-01 10:00:00 | 75 | | 1004 | 0 | 2020-01-01 11:00:00 | 60 | | 1006 | 0 | 2020-01-02 11:00:00 | 20 | æ¯é¡µ 3 æ¡ï¼ç¬¬ä¸é¡µä¹å°±æ¯ç¬¬ 7~9 æ¡ï¼è¿å 1010ã1003ã1004 çè¡è®°å½å³å¯ã **æè·¯**ï¼ 1. æ¯é¡µä¸æ¡ï¼å³éè¦ååºç¬¬ä¸é¡µç人çä¿¡æ¯ï¼è¦ç¨å°`limit` 2. ç»è®¡æ±èæ¹åä¸ºç®æ³å·¥ç¨å¸ä¸æ³¨åå½å¤©å°±å®æäºç®æ³ç±»è¯å·ç人ç**ä¿¡æ¯åæ¯æ¬¡è®°å½çå¾å**ï¼å æ±æ»¡è¶³æ¡ä»¶çç¨æ·ï¼åç¨ left join åè¿æ¥æ¥æ¾ä¿¡æ¯åæ¯æ¬¡è®°å½çå¾å **çæ¡**ï¼ ```sql SELECT t1.uid, LEVEL, register_time, max(score) AS max_score FROM exam_record t JOIN examination_info USING (exam_id) JOIN user_info t1 ON t.uid = t1.uid AND date(t.submit_time) = date(t1.register_time) WHERE job = 'ç®æ³' AND tag = 'ç®æ³' GROUP BY t1.uid, LEVEL, register_time ORDER BY max_score DESC LIMIT 6,3 ``` ## ææ¬è½¬æ¢å½æ° ### ä¿®å¤ä¸²åäºçè®°å½ **æè¿°**ï¼ç°æè¯å·ä¿¡æ¯è¡¨ `examination_info`ï¼`exam_id` è¯å· ID, `tag` è¯å·ç±»å«, `difficulty` è¯å·é¾åº¦, `duration` èè¯æ¶é¿, `release_time` å叿¶é´ï¼ï¼ | id | exam_id | tag | difficulty | duration | release_time | | --- | ------- | -------------- | ---------- | -------- | ------------------- | | 1 | 9001 | ç®æ³ | hard | 60 | 2021-01-01 10:00:00 | | 2 | 9002 | ç®æ³ | hard | 80 | 2021-01-01 10:00:00 | | 3 | 9003 | SQL | medium | 70 | 2021-01-01 10:00:00 | | 4 | 9004 | ç®æ³,medium,80 | | 0 | 2021-01-01 10:00:00 | å½é¢å妿䏿¬¡æè¯¯å°é¨åè®°å½çè¯é¢ç±»å« tagãé¾åº¦ãæ¶é¿åæ¶å½å ¥å°äº tag åæ®µï¼è¯·å¸®å¿æ¾åºè¿äºå½éäºçè®°å½ï¼å¹¶æååææ£ç¡®çåç±»åè¾åºã ç±ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | exam_id | tag | difficulty | duration | | ------- | ---- | ---------- | -------- | | 9004 | ç®æ³ | medium | 80 | **æè·¯**ï¼ å æ¥å¦ä¹ 䏿¬é¢è¦ç¨å°ç彿° `SUBSTRING_INDEX` 彿°ç¨äºæååç¬¦ä¸²ä¸æå®åé符çé¨åã宿¥åä¸ä¸ªåæ°ï¼åå§å符串ãåé符åæå®è¦è¿åçé¨åçæ°éã 以䏿¯ `SUBSTRING_INDEX` 彿°çè¯æ³ï¼ ```sql SUBSTRING_INDEX(str, delimiter, count) ``` - `str`ï¼è¦è¿è¡åå²çåå§å符串ã - `delimiter`ï¼ç¨ä½åå²çå符串æå符ã - `count`ï¼æå®è¦è¿åçé¨åçæ°éã - 妿 `count` å¤§äº 0ï¼åè¿åä»å·¦è¾¹å¼å§çå `count` 个é¨åï¼ä»¥åé符为çï¼ã - 妿 `count` å°äº 0ï¼åè¿åä»å³è¾¹å¼å§çå `count` 个é¨åï¼ä»¥åé符为çï¼ï¼å³ä»å³ä¾§å左计æ°ã ä¸é¢æ¯ä¸äºç¤ºä¾ï¼æ¼ç¤ºäº `SUBSTRING_INDEX` 彿°ç使ç¨ï¼ 1. æåå符串ä¸ç第ä¸ä¸ªé¨åï¼ ```sql SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', 1); -- è¾åºç»æï¼'apple' ``` 2. æåå符串ä¸çæåä¸ä¸ªé¨åï¼ ```sql SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', -1); -- è¾åºç»æï¼'cherry' ``` 3. æåå符串ä¸çå两个é¨åï¼ ```sql SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', 2); -- è¾åºç»æï¼'apple,banana' ``` 4. æåå符串ä¸çæå两个é¨åï¼ ```sql SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', -2); -- è¾åºç»æï¼'banana,cherry' ``` **çæ¡**ï¼ ```sql SELECT exam_id, substring_index( tag, ',', 1 ) tag, substring_index( substring_index( tag, ',', 2 ), ',',- 1 ) difficulty, substring_index( tag, ',',- 1 ) duration FROM examination_info WHERE difficulty = '' ``` ### 对è¿é¿çæµç§°æªåå¤ç **æè¿°**ï¼ç°æç¨æ·ä¿¡æ¯è¡¨ `user_info`ï¼`uid` ç¨æ· IDï¼`nick_name` æµç§°, `achievement` æå°±å¼, `level` ç级, `job` è䏿¹å, `register_time` æ³¨åæ¶é´ï¼ï¼ | id | uid | nick_name | achievement | level | job | register_time | | --- | ---- | ---------------------- | ----------- | ----- | ---- | ------------------- | | 1 | 1001 | ç客 1 | 19 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 2 | 1002 | ç客 2 å· | 1200 | 3 | ç®æ³ | 2020-01-01 10:00:00 | | 3 | 1003 | ç客 3 å· â | 22 | 0 | ç®æ³ | 2020-01-01 10:00:00 | | 4 | 1004 | ç客 4 å· | 25 | 0 | ç®æ³ | 2020-01-01 11:00:00 | | 5 | 1005 | ç客 5678901234 å· | 4000 | 7 | ç®æ³ | 2020-01-11 10:00:00 | | 6 | 1006 | ç客 67890123456789 å· | 25 | 0 | ç®æ³ | 2020-01-02 11:00:00 | æçç¨æ·çæµç§°ç¹å«é¿ï¼å¨ä¸äºå±ç¤ºåºæ¯ä¼å¯¼è´æ ·å¼æ··ä¹±ï¼å æ¤éè¦å°ç¹å«é¿çæµç§°è½¬æ¢ä¸ä¸åè¾åºï¼è¯·è¾åºå符æ°å¤§äº 10 çç¨æ·ä¿¡æ¯ï¼å¯¹äºå符æ°å¤§äº 13 çç¨æ·è¾åºå 10 个å符ç¶åå ä¸ä¸ä¸ªç¹å·ï¼ã...ãã ç±ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | uid | nick_name | | ---- | ------------------ | | 1005 | ç客 5678901234 å· | | 1006 | ç客 67890123... | è§£éï¼å符æ°å¤§äº 10 çç¨æ·æ 1005 å 1006ï¼é¿åº¦åå«ä¸º 13ã17ï¼å æ¤éè¦å¯¹ 1006 çæµç§°æªæè¾åºã **æè·¯**ï¼ è¿é¢æ¶åå°å符ç计ç®ï¼è¦è®¡ç®å符串çå符æ°ï¼å³å符串çé¿åº¦ï¼ï¼å¯ä»¥ä½¿ç¨ `LENGTH` 彿°æ `CHAR_LENGTH` 彿°ãè¿ä¸¤ä¸ªå½æ°çåºå«å¨äºå¯¹å¾ å¤åèåç¬¦çæ¹å¼ã 1. `LENGTH` 彿°ï¼å®è¿åç»å®å符串çåèæ°ã对äºå å«å¤åèå符çåç¬¦ä¸²ï¼æ¯ä¸ªå符é½ä¼è¢«å½ä½ä¸ä¸ªåèæ¥è®¡ç®ã 示ä¾ï¼ ```sql SELECT LENGTH('ä½ å¥½'); -- è¾åºç»æï¼6ï¼å 为 'ä½ å¥½' ä¸çæ¯ä¸ªæ±åæ¯ä¸ªå 3个åè ``` 1. `CHAR_LENGTH` 彿°ï¼å®è¿åç»å®å符串çå符æ°ã对äºå å«å¤åèå符çåç¬¦ä¸²ï¼æ¯ä¸ªå符ä¼è¢«å½ä½ä¸ä¸ªå符æ¥è®¡ç®ã 示ä¾ï¼ ```sql SELECT CHAR_LENGTH('ä½ å¥½'); -- è¾åºç»æï¼2ï¼å 为 'ä½ å¥½' ä¸æä¸¤ä¸ªå符ï¼å³ä¸¤ä¸ªæ±å ``` **çæ¡**ï¼ ```sql SELECT uid, CASE WHEN CHAR_LENGTH( nick_name ) > 13 THEN CONCAT( SUBSTR( nick_name, 1, 10 ), '...' ) ELSE nick_name END AS nick_name FROM user_info WHERE CHAR_LENGTH( nick_name ) > 10 GROUP BY uid; ``` ### 大å°åæ··ä¹±æ¶ççéç»è®¡ï¼è¾é¾ï¼ **æè¿°**ï¼ ç°æè¯å·ä¿¡æ¯è¡¨ `examination_info`ï¼`exam_id` è¯å· ID, `tag` è¯å·ç±»å«, `difficulty` è¯å·é¾åº¦, `duration` èè¯æ¶é¿, `release_time` å叿¶é´ï¼ï¼ | id | exam_id | tag | difficulty | duration | release_time | | --- | ------- | ---- | ---------- | -------- | ------------------- | | 1 | 9001 | ç®æ³ | hard | 60 | 2021-01-01 10:00:00 | | 2 | 9002 | C++ | hard | 80 | 2021-01-01 10:00:00 | | 3 | 9003 | C++ | hard | 80 | 2021-01-01 10:00:00 | | 4 | 9004 | sql | medium | 70 | 2021-01-01 10:00:00 | | 5 | 9005 | C++ | hard | 80 | 2021-01-01 10:00:00 | | 6 | 9006 | C++ | hard | 80 | 2021-01-01 10:00:00 | | 7 | 9007 | C++ | hard | 80 | 2021-01-01 10:00:00 | | 8 | 9008 | SQL | medium | 70 | 2021-01-01 10:00:00 | | 9 | 9009 | SQL | medium | 70 | 2021-01-01 10:00:00 | | 10 | 9010 | SQL | medium | 70 | 2021-01-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 | 2020-01-01 09:01:01 | 2020-01-01 09:21:59 | 80 | | 2 | 1002 | 9003 | 2020-01-20 10:01:01 | 2020-01-20 10:10:01 | 81 | | 3 | 1002 | 9002 | 2020-02-01 12:11:01 | 2020-02-01 12:31:01 | 83 | | 4 | 1003 | 9002 | 2020-03-01 19:01:01 | 2020-03-01 19:30:01 | 75 | | 5 | 1004 | 9002 | 2020-03-01 12:01:01 | 2020-03-01 12:11:01 | 60 | | 6 | 1005 | 9002 | 2020-03-01 12:01:01 | 2020-03-01 12:41:01 | 90 | | 7 | 1006 | 9001 | 2020-05-02 19:01:01 | 2020-05-02 19:32:00 | 20 | | 8 | 1007 | 9003 | 2020-01-02 19:01:01 | 2020-01-02 19:40:01 | 89 | | 9 | 1008 | 9004 | 2020-02-02 12:01:01 | 2020-02-02 12:20:01 | 99 | | 10 | 1008 | 9001 | 2020-02-02 12:01:01 | 2020-02-02 12:31:01 | 98 | | 11 | 1009 | 9002 | 2020-02-02 12:01:01 | 2020-01-02 12:43:01 | 81 | | 12 | 1010 | 9001 | 2020-01-02 12:11:01 | (NULL) | (NULL) | | 13 | 1010 | 9001 | 2020-02-02 12:01:01 | 2020-01-02 10:31:01 | 89 | è¯å·çç±»å« tag å¯è½åºç°å¤§å°åæ··ä¹±çæ åµï¼è¯·å çéåºè¯å·ä½çæ°å°äº 3 çç±»å« tagï¼ç»è®¡å°å ¶è½¬æ¢ä¸ºå¤§åå对åºç忬è¯å·ä½çæ°ã å¦æè½¬æ¢å tag 并没æåçååï¼ä¸è¾åºè¯¥æ¡ç»æã ç±ç¤ºä¾æ°æ®ç»æè¾åºå¦ä¸ï¼ | tag | answer_cnt | | --- | ---------- | | C++ | 6 | è§£éï¼è¢«ä½çè¿çè¯å·æ 9001ã9002ã9003ã9004ï¼ä»ä»¬ç tag å被ä½ç次æ°å¦ä¸ï¼ | exam_id | tag | answer_cnt | | ------- | ---- | ---------- | | 9001 | ç®æ³ | 4 | | 9002 | C++ | 6 | | 9003 | c++ | 2 | | 9004 | sql | 2 | ä½ç次æ°å°äº 3 ç tag æ c++å sqlï¼è转为大åååªæ C++æ¬æ¥å°±æä½çæ°ï¼äºæ¯è¾åº c++转å大ååçä½ç次æ°ä¸º 6ã **æè·¯**ï¼ é¦å ï¼è¿é¢æç¹æ··ä¹±ï¼9004 æ ¹æ®ç¤ºä¾æ°æ®æ¥åºæ¥åªæ 1 次ï¼è¿éæ¾ç¤ºæ 2 次ã å çä¸ä¸å¤§å°å转æ¢å½æ°ï¼ 1.`UPPER(s)`æ`UCASE(s)`彿°å¯ä»¥å°å符串 s ä¸ç忝åç¬¦å ¨é¨è½¬æ¢æå¤§ååæ¯ï¼ 2.`LOWER(s)`æè `LCASE(s)`彿°å¯ä»¥å°å符串 s ä¸ç忝åç¬¦å ¨é¨è½¬æ¢æå°å忝ã é¾ç¹å¨äºç¸å表åè¿æ¥è¦æ¥è¯¢ä¸åçå¼ **çæ¡**ï¼ ```sql WITH a AS (SELECT tag, COUNT(start_time) AS answer_cnt FROM exam_record er JOIN examination_info ei ON er.exam_id = ei.exam_id GROUP BY tag) SELECT a.tag, b.answer_cnt FROM a INNER JOIN a AS b ON UPPER(a.tag)= b.tag #aå°å b大å AND a.tag != b.tag WHERE a.answer_cnt < 3; ```