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 ;