第1关:子查询本关任务 查询学生读者中目前没有借书的读者编号、姓名。 编程要求 希望用相关子查询(语句1)和不相关子查询(语句2)两种方法查询学生读者中目前没有借书的读者编号、姓名。 右侧编辑器中给出了语句1和语句2的部分内容,请将其补充完整,以实现查询任务应用1
时间: 2024-10-23 07:20:33 浏览: 45
在SQL中,我们通常需要从两个表关联查询,一个是`students`表(假设包含学生的相关信息),另一个是`borrowers`表(包含读者信息以及借书记录)。这里我们可以使用子查询(子句1)和不相关的两个单独查询(子句2)来完成这个任务。
首先,让我们看下子查询(语句1)的例子:
```sql
SELECT s.reader_id, s.name
FROM students s
LEFT JOIN borrow_records br ON s.reader_id = br.reader_id
WHERE br.reader_id IS NULL;
```
在这个子查询中,我们首先从`students`表选择出reader_id和name,然后通过LEFT JOIN与`borrow_records`表连接,条件是读者ID相等。如果读者在`borrow_records`中没有借书记录(br.reader_id IS NULL),那么该读者就是没有借书的。
对于不相关的子查询(语句2),我们需要先分别查询学生读者和他们的借阅记录,然后再合并结果:
```sql
-- 子查询1
(SELECT reader_id, name FROM students WHERE student_type = 'student') AS student_readers
-- 子查询2
(SELECT reader_id, NULL AS name FROM borrow_records) AS borrowed_records
-- 主查询
UNION ALL
(SELECT sr.reader_id, sr.name
FROM student_readers sr
LEFT JOIN borrowed_records br ON sr.reader_id = br.reader_id
WHERE br.reader_id IS NULL);
```
这里先分别提取了学生读者(排除非学生)的信息和所有借阅记录的读者ID,然后通过UNION ALL将两个子查询的结果合并,并过滤掉有借书记录的学生。
阅读全文