开发者社区 问答 正文

MySQL“ NOT IN”查询3个表?mysql

我有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时,则没有输出。

展开
收起
保持可爱mmm 2020-05-17 14:29:25 592 分享 版权
1 条回答
写回答
取消 提交回答
  • 避免NOT IN像瘟疫一样

    SELECT ID_Courses FROM Evaluation where NAME='JOHN' and Year=1 可能包含NULL。而是使用NOT EXISTS或Left Joins

    使用显式联接,而不是使用WHERE子句的1980年代风格的联接

    为了说明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 ); 块1:

    truncate table people; insert people (fullName,status) values ('John Henry','single'); select * from mstatus where status not in (select status from people); ** 3行,符合预期**

    块2:

    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的存在驱动,而NULL是表示缺少(或UNKNOWN)信息的非值。使用NOT IN,Chunk2时,其翻译如下:

    status NOT IN ('married', 'divorced', 'widowed', NULL) 这等效于:

    NOT(status='single' OR status='married' OR status='widowed' OR status=NULL) 表达式“ status = NULL”的计算结果为UNKNOWN,根据三值逻辑规则,NOT UNKNOWN的计算结果也为UNKNOWN。结果,所有行都被过滤掉,查询返回一个空集。

    可能的解决方案包括:

    select s.status from mstatus s left join people p on p.status=s.status where p.status is null 或使用 not exists来源:stack overflow

    2020-05-17 14:30:07
    赞同 展开评论