# 数据库SQL语言实战（二）

## 检索查询

### 题目一

select sid,name
from pub.student
where sid in (
(
select sid
from pub.student
)
minus
(
select distinct sid
from pub.student_course
)
)

1、没有选修任何课的学生=所有学生-选了课的学生

2、减号就是minus关键字

### 题目二

select sid,name
from pub.student
where sid in(
(
select distinct sid
from pub.student_course
where cid in (
select cid
from pub.student_course
where sid='200900130417'
)
)
minus
(
select sid
from pub.student
where sid='200900130417'
)
)

### 题目三

select sid, name
from  pub.student
where sid in(
select sid
from pub.student_course
where cid in (
select cid
from pub.student_course
where pcid='300002'
)
)

1、找先行课程号为“300002”号的课程——》找pub.student_course中cid在前面课程中的选课记录——》拿出sid在pub.student中进一步获取name

2、题目二和题目三的思路是相似的

### 题目四

select sid，name
from pub.student
where sid in
(
(
select sid
from pub.student_course
where cid=(
select cid
from pub.course
where name='操作系统'
)
)
intersect
(
select sid
from pub.student_course
where cid=(
select cid
from pub.course
where name='数据结构'
)
)
minus
(
select sid
from pub.student_course
where cid=(
select cid
from pub.course
where name='程序设计语言'
)
)
)

1、干了A，并且干了B，但没有干C=A的结果 交 B的结果 减 C的结果

2、intersect关键字：取交集

### 题目五

create view test3 as
select sid，cid,pub.course_name,score
from pub.student natural join pub.student_course natural join pub.course
where pub.student_name='李龙'
create view test2_05 as
select sid,cid,name,score
from pub.student_course natural join pub.course
where sid in
(
select sid
from pub.student
where name='李龙'
)

1、 第一个代码是错误的。因为pub.student和pub.course中都有name属性，而这两者自然连接显然是不合理的

2、将三个自然连接拆为：两个自然连接+一个嵌套select语句

### 题目六

select sid,name,score
from pub.student_course natural join pub.student
where class='2010' and dname='计算机科学与技术学院' and cid=(
select cid
from pub.course
where name='操作系统'
)

1、同样考察自然连接的应用

### 题目七

select sid,name
from pub.student
where name not like '张%'
and name not like '李%'
and name not like '王%'

1、 不姓A=not like ‘A%'

2、 名字不叫B=not like ‘%B’

### 题目八

select cid ,name
from pub.course
where fcid in (
select cid
from pub.course
where fcid is not NULL
)

1、 不为空=is not NULL

2、间接关系的处理（例：祖孙关系）

### 题目九（本篇最难的题目）

#### 实现（两种方式）

select sid,name
from pub.student
where not exists(
select cid
from pub.course
where not exists(
select *
from pub.student_course
where pub.student_course.cid=pub.course.cid and
pub.student_course.sid=pub.student.sid
)
)

select sid,name
from pub.student
where not exists(
(
select cid
from pub.course
)
minus
(
select cid
from pub.student_course
where pub.student_course.sid=pub.student.sid
)
)

#### 模板

SELECT * FROM S
WHERE NOT EXISTS(
SELECT * FROM C WHERE C.cno IN ('C001','C002')
AND NOT EXISTS(
SELECT * FROM SC
WHERE SC.cno = C.cno AND SC.sno = S.sno

)
)

## 总结

|
4天前
|

14 1
|
3天前
|
SQL 关系型数据库 MySQL

12 0
|
4天前
|
SQL 关系型数据库 数据管理
Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
【5月更文挑战第14天】Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
16 2
|
4天前
|
SQL Oracle 关系型数据库

7 2
|
4天前
|
SQL 数据库

11 0
|
4天前
|

docker MySQL删除数据库时的错误（errno: 39）
docker MySQL删除数据库时的错误（errno: 39）
24 0
|
4天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件，Excel表格导入数据库的接口（下）
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件，Excel表格导入数据库的接口
13 0
|
4天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件，Excel表格导入数据库的接口（上）
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件，Excel表格导入数据库的接口
20 0
|
2天前
|

16 0
|
4天前
|

【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
26 0