查询供应了全部物资的公司编号。 请分别用 全称量词转exists的嵌套查询 和 带group+having中嵌套子查询的方式 完成此查询!!! 在答案中分别注明两类查询!
时间: 2024-06-06 15:08:02 浏览: 76
全称量词转exists的嵌套查询:
SELECT DISTINCT s.company_id
FROM supplies s
WHERE NOT EXISTS (
SELECT *
FROM materials m
WHERE NOT EXISTS (
SELECT *
FROM supplies s2
WHERE s2.material_id = m.material_id AND s2.company_id = s.company_id
)
);
带group having中嵌套子查询的方式:
SELECT s.company_id
FROM supplies s
GROUP BY s.company_id
HAVING COUNT(DISTINCT s.material_id) = (
SELECT COUNT(*)
FROM materials
);
相关问题
使用存在量词[not] exists的嵌套查询时,何时外层查询的where条件为真?何时为假?
### 回答1:
当使用包含不存在字段的查询时,使用WHERE语句的条件应该是真实的条件。如果使用假条件,则可能会返回错误的结果。例如,使用WHERE NOT EXISTS (SELECT * FROM table)时,应该什么也不返回,因为表中没有任何记录。如果使用WHERE 1=0,则可能返回整个表的内容。
### 回答2:
在使用存在量词[not] exists的嵌套查询时,外层查询的where条件为真与否是与内层查询结果有关的。
首先,存在量词是用来判断子查询的结果集中是否存在符合条件的数据,如果存在,则返回true,否则返回false。因此,在嵌套查询中,内层查询的结果集中存在满足条件的数据时,外层查询的where条件为真;反之,内层查询的结果集中不存在满足条件的数据时,外层查询的where条件为假。
举个例子,假设有如下两张表:
表1:学生表
| 学生编号 | 姓名 | 年龄 |
| -------- | ---- | ---- |
| 1 | 张三 | 18 |
| 2 | 李四 | 20 |
| 3 | 王五 | 22 |
表2:选课表
| 学生编号 | 课程编号 |
| -------- | -------- |
| 1 | 10001 |
| 1 | 10002 |
| 2 | 10001 |
| 3 | 10003 |
假设现在需要查找未选过编号为10001的课程的学生姓名,可以使用如下SQL语句实现:
```
SELECT 姓名 FROM 学生表 WHERE NOT EXISTS
(SELECT NULL FROM 选课表 WHERE 学生表.学生编号 = 选课表.学生编号 AND 课程编号 = 10001)
```
以上SQL语句中的内层查询可以得到选过编号为10001的课程的学生编号,如果查询结果为空,则说明没有学生选过该门课程;因此,外层查询的where条件为真,会返回所有的学生姓名。反之,如果查询结果不为空,则说明有学生选过该门课程,外层查询的where条件为假,不会返回任何学生姓名。
综上所述,使用存在量词[not] exists的嵌套查询时,外层查询的where条件为真与否是与内层查询结果有关的,需要根据实际情况进行判断和调整。
### 回答3:
使用存在量词[not] exists的嵌套查询时,外层查询的where条件为真或为假取决于内层查询的结果。
在使用exists关键字的嵌套查询中,如果内层查询返回了至少一行结果,那么exists返回真,相应的,外层查询的where条件也为真。反之,如果内层查询没有返回任何结果,那么exists返回假,外层查询的where条件也为假。
在使用not exists关键字的嵌套查询中,逻辑与exists相反,在内层查询返回至少一行结果时,not exists返回假,外层查询的where条件为假;而当内层查询没有返回任何结果时,not exists返回真,外层查询的where条件也为真。
在实际应用中,exists和not exists的嵌套查询常常用于测试子查询是否包含某些行或不包含某些行。除了这种用法,exists和not exists也可以用于提高查询效率,如在联合查询中进行条件限制等。
总之,在使用exists和not exists的嵌套查询时,应当考虑内层查询的结果是否符合预期,从而决定外层查询的where条件为真或为假。
阅读全文