mysql中的一些例题

表格数据如下图所示,此处省略建表语句与导入数据的过程

针对上述表格分享一些sql中的例题

1:查询本周过⽣⽇的学⽣

思路:在sql中呢有很多内置的时间函数,如year,mouth ,week 可以将字符串转换为时间类型,在实际的生活当中也很常见。那该如何查询本周过生日的学生呢,首先我们得知道本周是从第几天到第几天得出一个范围,然后再搜索是否有生日在这范围中的学生。以下是代码示例

select 
	*	 
from 
	(select *
		,WEEKDAY(CURRENT_DATE)
		,DATE_FORMAT(DATE_ADD(CURRENT_DATE,interval -WEEKDAY(CURRENT_DATE) day),"%m%d") wb -- 本周开始日
		,DATE_FORMAT(DATE_ADD(CURRENT_DATE,interval 6-WEEKDAY(CURRENT_DATE) day),"%m%d") we -- 本周结束日
		,DATE_FORMAT(Sage,"%m%d") md 
	from Student) t1
where t1.md<=t1.we and t1.md>=t1.wb

2:查询各科成绩前三名的记录

思路:这里涉及的MySQL5中一个特有的写法就是 设置变量(在其他的mysql版本中完全可以用rank函数来解决)首先select SC表中的的数据,并以cid和score降序排序并设别名为t1,其次重点来了,在排序的过程当中如何按照cid重新排序呢,这时只需设置一个变量为@last_c,这行代码if(@last_c!=cid,@j:=1,@j:=@j+1)表示了cid不相等时便会重新排序。

set @i:=0;
set @last_c:='00';
set @last_sco:=0;
set @j:=0;
select 
	t1.* 
	,@last_c
	,@last_sco
	,if(@last_c!=cid,@j:=1,@j:=@j+1) 
	,if(@last_c!=cid,@i:=1,if(@last_sco=t1.score,@i,@i:=@j)) as rank
	,@last_c:=t1.cid
	,@last_sco:=t1.score
from 
	(select * from SC order by cid,score desc ) t1

3:查询下⽉过⽣⽇的学⽣

思路:用mouth函数直接取出字段中的月份,然后再使用date_add函数增加到下个月,最后select表中是否有符合条件的。

select 
	* 
	,month(Sage)
	,month(DATE_ADD(CURRENT_DATE,INTERVAL 1 month))
from Student
where month(Sage) = month(DATE_ADD(CURRENT_DATE,INTERVAL 1 month))

4:查询和" 01 "号的同学学习的课程完全相同的其他同学的信息

思路: 先找出和01课程相同的课程,然后再找到和01课程相同的课程总数,最后再保证所有的选课数要和和刚才 01相同课程的总数一致(ps:最后一条很重要,因为如果有其他同学学的课程数就比01课程多那么没有最后一条的话就不会被筛选出来)

select 
	t1.sid
from 
	(select 
		sid
		,count(cid) cnt
	from SC 
	where
	 cid in (
		select cid from SC WHERE sid = '01') 
	and sid!='01'
	group by sid
	having cnt = 
		(select count(*) from SC where sid ='01') -- 和01课程相同的课程总数
) t1 
join 	
	(select sid,count(*) cnt from SC group by sid) t2
on t1.sid=t2.sid and t1.cnt=t2.cnt

5:查询⾄少有⼀⻔课与学号为" 01 "的同学所学相同的同学的信息

思路:先找出所有01学的课程再过滤所有学过这些课程的同学这里有一个点就是不能带上01自己


select distinct sid from SC where cid in (
	select cid from SC WHERE sid = '01') and sid!='01'

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值