数据库——SQL实验二

本文详细讲解了SQL实验中的集合操作,如‘至少’筛选和‘至少存在’查询,以及如何使用IN和DISTINCT。还介绍了聚合函数如平均值、最高分计数,通过实例演示如何结合分组和子查询。最后展示了如何运用LIKE、substr和COUNT等函数进行字符串处理和数据筛选。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL实验二


2-2

“至少” 表示 “存在” 可以用 in 来表达
1. 选出这个学生的选课表(可以考虑重修情况,但是课程号唯一
2. 对每一条选课信息对判断,如果课程号在表中,则保留人名
注意:关系本身就是一个集合,也可以使用 distinct
craete or replace view test2_02 as (
	select sid, name 
	from pub.student
	where sid in (
		select sid 
		from pub.sudent_course
		where cid in (
			select cid
			from pub.student_course
			where sid=200900130417
		)
	)
)
minus (
	select sid, name
	from pub.student
	where sid=200900130417
);

2-3

"至少" 表示 “存在”
模式和上一题一样:先找一个参考表,再依据参考表筛选
solution 1:
select sid, name 
from pub.student
where sid in (
	select sid
	from pub.student_course
	where cid in (
		select cid
		from pub.course
		where fcid=300002
	)
);

solution 2:
select sid, name
from pub.student_course natural join pub.student
where cid in (
	select cid
	from pub.course
	where fcid=300002
);

2-4

select sid, name
from pub.student natural join pub.student_course
where sid in (
	select sid 
	from pub.student_course
	where cid = 300002
) and sid in (
	select sid 
	from pub.student_course
	where cid = 300005
) and sid not in (
	from pub.student_course
	where cid = 300001
);

2-5

“平均值”: 分组聚集
1. 找到分组标准
2. 明确聚集函数类型再计算
注意:SQL的书面写法更名要有 as ,即 avg(score) as avg_score
select sid, name, round(avg(score)) avg_score, sum(sore) sum_score
from pub.student natural join pub.student_course
where age=20
group by sid, name

2-6

“最高”:可以用 max,也可以用笛卡尔积的原始方法
“计数”:count
拆分任务:
	1. 使用 cid 聚集,找出每门课最大值
	2. 再上一基础上选出分数和课程号相同的记录,再做count 聚集
	3. 将1,2表连起来
select a.cid, a.name, max_score, max_score_count
from (
	  select cid, name
	  from pub.course
) a, (
	select sc.cid, count(distinct sid) max_score_count
	from pub.student_course
	group by cid
) b, (
	select sc.cid, count(distinct sid) max_score_count
	from pub.student_course sc,
	( 
		select cid,max(score) max_score from pub.student_course
		group by cid 
	) max_sc
	where sc.cid=max_sc.cid and sc.score=max_sc.max_score
	group by sc.cid
) d
where a.cid = b.cid and b.cid = d.cid

2-7

like 语句
select sid, name
from pub.student
minus (
	select sid,name
	from pub.student
	where name like '张%' or name like '李%' or name like '王%'
);

2-8

字串函数 substr(pos, len)
count(*) 为自己计数
select substr(name,1,1)second_name, count(*) p_count
from pub.student
group by substr(name,1,1)

2-9

select sid, name, score
from pub.student natural join pub.student_course
where cid = 300003;

2-10

本质还是计数的聚合,就是外面再套一层选择
select sid, name
from pub.student
where sid in (
	select sid 
	from (
		select sc.sid, sc.cid, count(*) count
		from pub.student_course sc
		where score < 60
		group by sc.sid, sc.cid
	)
	where count >= 2
);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值