为了完成本关任务,你需要掌握: 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 07:55:23 浏览: 151
【3.18数据库作业8】SQL练习8 – SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询)
5星 · 资源好评率100%
以下是能够实现任务要求的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` 关键字去重,并按照人员姓名顺序进行排序。
阅读全文