为什么这两句我看似一样的SQL输出的结果不一样?

SELECT splname FROM qspl
WHERE splno NOT IN
(SELECT splno FROM qdel
WHERE itemname = 'Compass'
OR itemname = 'Geopositioning System'); 

Select splname
From qdel a,qspl b
Where a.splno=b.splno
And (a.itemname != ('Compass') or a.itemname != ('Geopositioning System'))

这是ERD图
图片说明

只是看起来一样而已,,,

第二句判断条件or改为and

第一条SQL为子查询,第二条SQL为连接查询

看似一样,看你判断条件所导致的结果是不一样的。

第一条中的 NOT IN 排除了 itemname 为('Compass') 和 ('Geopositioning System')

第二条 And 后面的意思是itemname不能为('Compass')或者 ('Geopositioning System'),

所以第二条的or 应该改为 and

楼主没有理清楚SQL的含义。
第一句:NOT IN 表示查询值qspl.splno不在子查询(SELECT splno FROM qdel .....)中的
第二句:两表关联,使用的是等值连接,所以左右表互相具有过滤效果。
但是楼主的第一个WHERE条件表示:qdel.splno等于qspl.splno,这啥意思?就是说你的qdel.splno存在于qspl.splno这个中,
这就相当于:IN的作用了:FROM qspl WHERE splno IN (SELECT splno FROM qdel)
后面两个条件正确
改写后的正确SQL:

 SELECT splname
  FROM qspl b
  LEFT JOIN qdel a
    ON b.splno = a.splno
   AND (a.itemname = ('Compass') OR  
        a.itemname = ('Geopositioning System'))
 WHERE b.splno IS NOT NULL;

总结,这是一道将NOT IN 改写成 JOIN的操作,建议楼主深入的体会下:NOT IN 、NOT EXISTS、LEFT JOIN+ NOT NULL。这三者的用法。并且有啥限制,这才是问题的根本

假如not in的子查询里有null就不一样了