SQL:Not Like 产生的结果与 Like 的相反结果不同

标签 sql database ms-access

所以,我正在练习考试(高中水平),虽然我们从未想过 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/

相关文章:

php - 用户-项目关系的数据库设计

MySQL 查询到 MS Access 查询

php - 我如何在 mysql 中编写 Group By 查询日期时间字段

android - android中如何从mysql数据库下载数据并存储到本地数据库供离线使用?

java - 使用 Maven 从单个项目创建多个 jar 文件

ms-access - 在 VBA 事件中传递参数

ms-access - 将 Access 数据库部署为产品

mysql - SQL 多列索引

mysql - 查找过去 24 小时内具有日期字段的记录

mysql - 如果否则更新 sql 查询以组合多个查询