首页 文章

IS NULL未在列MYSQL中找到所有空值

提问于
浏览
0
UPDATE student as s
LEFT JOIN takes as t ON s.ID = t.ID
LEFT JOIN course as c ON t.course_id = c.course_id
SET s.tot_cred = s.tot_cred - COALESCE(c.credits, 0)
WHERE t.grade = 'F'
OR
t.grade IS NULL

我试图通过减去学生失败的任何课程的学分值来更新学生中的tot_cred,成绩为关系='F',或者当前正在考虑,考试成绩等级为IS NULL .

上述查询适用于'take'关系中的单个'F'等级 . 但是它只适用于成绩列中'take'关系中的4个NULL值之一 .

对SQL很新,我觉得查询中的某些内容只是查找第一个NULL值而不是所有值 .

表:

mysql> select ID, tot_cred
    -> from student;
+-------+----------+
| ID    | tot_cred |
+-------+----------+
| 00128 |      102 |
| 12345 |       32 |
| 19991 |       80 |
| 23121 |      110 |
| 44553 |       56 |
| 45678 |       38 |
| 54321 |       54 |
| 55739 |       38 |
| 70557 |        0 |
| 76543 |       58 |
| 76653 |       60 |
| 98765 |       98 |
| 98988 |      112 |
+-------+----------+

如果相应的等级为F或NULL,我想在这里更改tot_cred

mysql> select ID, course_id, grade
    -> from takes
    -> order by grade;
+-------+-----------+-------+
| ID    | course_id | grade |
+-------+-----------+-------+
| 76543 | CS-001    | NULL  |
| 54321 | CS-001    | NULL  |
| 12345 | CS-001    | NULL  |
| 98988 | BIO-301   | NULL  |
| 98988 | BIO-101   | A     |
| 76543 | CS-319    | A     |
| 76543 | CS-101    | A     |
| 00128 | CS-101    | A     |
| 12345 | CS-190    | A     |
| 12345 | CS-315    | A     |
| 54321 | CS-101    | A-    |
| 55739 | MU-199    | A-    |
| 45678 | CS-319    | B     |
| 19991 | HIS-351   | B     |
| 98765 | CS-315    | B     |
| 45678 | CS-101    | B+    |
| 54321 | CS-190    | B+    |
| 44553 | PHY-101   | B-    |
| 12345 | CS-101    | C     |
| 76653 | EE-181    | C     |
| 23121 | FIN-201   | C+    |
| 98765 | CS-101    | C-    |
| 45678 | CS-101    | F     |
+-------+-----------+-------+

这是等级的地方 . 有4个NULL值和1个F.

mysql> select course_id, credits
    -> from course;
+-----------+---------+
| course_id | credits |
+-----------+---------+
| BIO-101   |       4 |
| BIO-301   |       4 |
| CS-101    |       4 |
| CS-190    |       4 |
| CS-315    |       3 |
| CS-319    |       3 |
| CS-347    |       3 |
| EE-181    |       3 |
| FIN-201   |       3 |
| HIS-351   |       3 |
| MU-199    |       3 |
| PHY-101   |       4 |
+-----------+---------+

这是我获得学分数的地方 .

刚刚意识到3个NULL值来自实验室中的上一个问题 . 这些条目未在课程关系中表示 . 我的问题解决了 . 所有浪费的时间都让我感到非常抱歉 .

3 回答

  • 0

    尝试将其更改为:

    UPDATE student as s
    INNER JOIN takes as t ON s.ID = t.ID 
    INNER JOIN course as c ON t.course_id = c.course_id
    SET s.tot_cred = s.tot_cred - COALESCE(c.credits, 0)
    WHERE t.grade = 'F'
    OR
    t.grade IS NULL
    
  • 0

    我没有意识到3个NULL值没有在课程关系中表示 . 这个查询工作正常,抱歉所有浪费的时间 .

  • 0

    检查是否要替换为INNER JOIN而不是LEFT JOIN,因为您可能只想更新那些作为匹配记录的记录 .

    UPDATE student s
    LEFT JOIN takes as t ON s.ID = t.ID and t.grade = 'F' OR t.grade is NULL
    LEFT JOIN course as c ON t.course_id = c.course_id
    SET tot_cred = tot_cred - COALESCE(c.credits, 0);
    

    检查小提琴here

相关问题