为了完成本关任务,你需要掌握: SELECT语句的用法: not exists, 多层嵌套查询。 表1 人员表(person) 字段名称 数据类型 备注 id int 人员编号,主码,主码约束名为pk_person fullname char(20) 姓名,不可空 telephone char(11) 手机号码,不可空。自己无号,填近亲属的 表2 地点表(location) 字段名称 数据类型 备注 id int 地点编号,主码,主码约束名为pk_location location_name char(20) 地点名称,不可空 表3 行程表(itinerary) 字段名称 数据类型 备注 id int 行程编号,主码,主码约束名为pk_itinerary p_id int 人员编号,外码,外码约束名为fk_itinerary_pid loc_id int 所在地点编号,外码,外码约束为fk_itinerary_lid s_time datetime 到达该地点的时间 e_time datetime 离开该地点的时间 编程要求 直接用一条语句写出能实现任务要求的SQL语句: 查询人员表去过所有地点的人员姓名。查询结果依人员姓名顺序排序。 你需要用2个not exists子查询才能完成该查询。至于第二层嵌套子查询,你应该有多种选择,你可以选择更简单的写法。我们不限定你怎么实现,只要求用一条语句。
时间: 2024-03-01 15:55:23 浏览: 157
以下是能够实现任务要求的SQL语句:
```
SELECT DISTINCT fullname
FROM person
WHERE NOT EXISTS (
SELECT *
FROM location
WHERE NOT EXISTS (
SELECT *
FROM itinerary
WHERE itinerary.p_id = person.id
AND itinerary.loc_id = location.id
)
)
ORDER BY fullname;
```
该语句使用了两个 `NOT EXISTS` 子查询,第一个子查询用于查询所有地点,第二个子查询用于查询每个人员是否去过该地点。如果该人员去过所有地点,则该人员的姓名将会被查询出来。最后,使用 `DISTINCT` 关键字去重,并按照人员姓名顺序进行排序。
相关问题
直接用一条语句写出能实现任务要求的SQL语句: 查询人员表去过所有地点的人员姓名。查询结果依人员姓名顺序排序。 你需要用2个not exists子查询才能完成该查询。至于第二层嵌套子查询,你应该有多种选择,你可以选择更简单的写法。我们不限定你怎么实现,只要求用一条语句。
以下是一条能实现任务要求的 SQL 查询语句:
```
SELECT name FROM person
WHERE NOT EXISTS (
SELECT location FROM location
WHERE NOT EXISTS (
SELECT location FROM visit WHERE visit.person_id = person.id AND visit.location = location.location
)
)
ORDER BY name;
```
这条 SQL 查询语句使用了两个 `NOT EXISTS` 子查询,第一个子查询用于找到去过所有地点的人员,第二个子查询用于在去过所有地点的人员中筛选出去过每个地点的人员。最后使用 `ORDER BY` 子句对结果按照人员姓名排序。
写一条带NOT EXISTS 子查询的SQL语句实现下述查询要求: -- 查询人员表中没有去过地点“Today便利店”的人数。请给统计出的人数命名为number。 -- 请用一条SQL语句实现该查询
假设人员表名为person,去过地点的记录存在于visit表中,visit表中有两个字段:person_id表示去过某个地点的人员ID,location表示地点名称。
SQL语句如下:
```
SELECT COUNT(*) AS number
FROM person p
WHERE NOT EXISTS (
SELECT 1
FROM visit v
WHERE v.person_id = p.person_id
AND v.location = 'Today便利店'
)
```
解释:首先从person表中查询人员记录,然后在子查询中查询visit表中是否存在person_id与当前person表记录相同且去过'Today便利店'的记录,如果不存在,则当前person记录符合条件,最后统计符合条件的记录数量并命名为number。
阅读全文