MySQL“NOT IN”查询3个表格

我有3桌课程,成绩和评价。 我想比较两个表的等级和评价。 如果表评分中的数据不存在,则数据将出现(输出)

表和输出

" select Grade.ID_Courses,Course.ID_Courses,Grade.NAME, Course.NAME, Grade.ID_Courses, Evaluation.NAME, Evaluation.Year, Grade.Year from Grade, Course, Evaluation WHERE Grade.ID_Courses=Course.ID_Courses AND Grade.NAME=JOHN and Grade.Year=1 and Evaluation.NAME=GRADE.NAME and Grade.ID_Courses NOT IN (SELECT ID_Courses FROM Evaluation where NAME=JOHN and Year=1 ) GROUP BY Grade.ID_Courses" 

问题是当名字john不在表格评估中,那么没有输出。

避免NOT IN像瘟疫一样

 SELECT ID_Courses FROM Evaluation where `NAME`='JOHN' and Year=1 

可以包含NULL。 相反,使用NOT EXISTS或左连接

使用显式连接,而不是1980年代使用WHERE子句的样式连接

为了说明NOT IN的不幸之处:

SQL NOT IN()危险

 create table mStatus ( id int auto_increment primary key, status varchar(10) not null ); insert mStatus (status) values ('single'),('married'),('divorced'),('widow'); create table people ( id int auto_increment primary key, fullName varchar(100) not null, status varchar(10) null ); 

Chunk1:

 truncate table people; insert people (fullName,`status`) values ('John Henry','single'); select * from mstatus where `status` not in (select status from people); 

** 3行,如预期**

Chunk2:

 truncate table people; insert people (fullName,`status`) values ('John Henry','single'),('Kim Billings',null); select * from mstatus where status not in (select status from people); 

没有行,是吧?

显然这是'不正确的'。 它来源于SQL使用三值逻辑,由NULL的存在驱动,一个非值表示缺less(或未知)的信息。 用NOT IN,Chunk2就是这样翻译的:

 status NOT IN ('married', 'divorced', 'widowed', NULL) 

这相当于:

 NOT(status='single' OR status='married' OR status='widowed' OR status=NULL) 

expression式“status = NULL”的计算结果为UNKNOWN,根据三值逻辑的规则,NOT UNKNOWN也计算为UNKNOWN。 因此,所有行都被过滤掉,查询返回一个空集。

可能的解决scheme包

 select s.status from mstatus s left join people p on p.status=s.status where p.status is null 

或使用not exists

尝试使用连接来解决这个问题

 select g.*, e.*,c.* from grade g inner join evaluation e on g.ID_COURSES <> e.ID_COURSES and g.year <> e.year inner join COURSE c on c.ID_COURSES = g.ID_COURSES ;