所以,我正在练习考试(高中水平),虽然我们从未想过 SQL,但在处理 MS Access 时有必要了解一点.
任务是选择名称与其所属城镇不对应的区域ID。
解决方案中有以下示例:
SELECT name
FROM area
WHERE id not in (SELECT areaid
FROM area, town, conn
WHERE town.id = conn.townid
AND area.id = conn.areaid AND
area.name like "*"+town.name+"*");
与 INNER JOINS 相同,只是说明,因为 Access 以这种方式建立表之间的连接。
它完美地工作(好吧,它在解决方案中),但我不明白的是为什么我们需要“不在”部分以及为什么我们不能只使用“不喜欢”而不是“like”,一步查询。
我以这种方式重写了它(没有“不在”部分)并且它给出了完全不同的结果。如果我把“喜欢”改成“不喜欢”,那不是相反,而是一堆混合数据。为什么?这是如何运作的?请问有人可以解释一下吗?
编辑(在最佳答案之后):这更像是一个关于 SQL 查询如何工作的理论问题,不需要具体的解决方案,而是对过程的解释。 (因此我觉得 sql 标签属于这里)
最佳答案
会产生差异的一件事是考虑这个例子
areaid areaname townname
1 AA AA
1 AA BB
因此您的第一个查询将从结果中排除这两个记录。因为内部查询会将 areaid =1
识别为要排除的对象之一。因此,这两条记录都不会出现在输出中。
然而,使用 not like
会排除第一条记录并返回给您第二条记录。因为第一个记录满足条件 not like 但第二个不满足条件。
换句话说,第一个查询将排除任何具有至少一个类似于区域名称的城镇名称的区域(和相应的记录)。第二种方法将仅排除 areaname 类似于 townname 的事件,但不一定排除该区域的所有记录。
关于SQL:Not Like 产生的结果与 Like 的相反结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30127552/