hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

sql 典范查询50题 思绪(一)

2019-11-18杂谈搜奇网26°c
A+ A-

由于须要进步一下sql的查询才能,固然最快的体式格局就是做一些现实的问题了。挑选了这个sql的50题,此次也许做了前10题摆布,把思绪放上来,也是一个总结。

详细问题见:

https://zhuanlan.zhihu.com/p/72223558

 

第一部份的问题重要运用的手艺是连表查询和子查询,难倒不难,重如果要把思绪转换过来。

起首画出一个各个表之间的关联图(没绘图之前关联总是搞不清)

 

 

 1.查询" 01 "课程比" 02 "课程结果高的门生的信息及课程分数

门生的信息在表1当中,课程结果在表4当中,固然要用到连表查询。

这里很有普遍性的一个问题是:要从表4中找出Sid雷同,然则Cid为1的score大于Cid为2的score的纪录。这里要运用子查询,离别限定前提为Cid=‘1’,Cid='2',变成两个表,再查满足前提的就很简朴了。

select Student.SId,Student.Sname,Student.Sage,Student.Ssex,r.科目一结果,r.科目二结果
from study.dbo.Student 
right join
(select t1.SId as 门生ID,t1.score as 科目一结果,t2.score as 科目二结果
from 
(select SId,score from study.dbo.SC where CId='01')as t1,
(select SId,score from study.dbo.SC where CId='02')as t2
where t1.SId=t2.SId and t1.score>t2.score) as r
on Student.SId=r.门生ID

 

join -- on这个也是经常使用的思绪,当要衔接两个某一列相干的表时。

 

1.1查询存在" 01 "课程但可能不存在" 02 "课程的状况(不存在时显现为 null )

和第一题思绪相似,注重以01课程为准,所以要用left join

select *
from    
(select SId,score from study.dbo.SC where CId='01') as t1
left join
(select SId,score from study.dbo.SC where CId='02') as t2
on t1.SId=t2.SId

 


1.2 查询同时存在01和02课程的状况

很简朴,用inner join,求两表交集

select t1.SId,t1.score,t2.score
from    
(select SId,score from study.dbo.SC where CId='01') as t1
inner join
(select SId,score from study.dbo.SC where CId='02') as t2
on t1.SId=t2.SId


1.3查询挑选了02课程但没有01课程的状况

我的思绪是照样用一个right join,然后推断NULL值,不晓得会不会比not in效力高

select t2.SId,t2.score
from    
(select SId,score from study.dbo.SC where CId='01') as t1
right join
(select SId,score from study.dbo.SC where CId='02') as t2
on t1.SId=t2.SId
where t1.score is null

 

2.查询均匀结果大于即是 60 分的同砚的门生编号和门生姓名和均匀结果

肯定要连表,有表一有表四。均匀结果涉及到group by,对均匀结果的限定涉及到having语句

select  t1.SId,t1.avg_score,t2.Sname
from
(
select SId,AVG(score) as avg_score
from study.dbo.SC
group by SId
having AVG(score)>60
) as t1
inner join study.dbo.Student as t2
on t1.SId=t2.SId

 

3.查询在 SC 表存在结果的门生信息
依然是连表查询,表一的sid即是表四的sid,去除反复值运用DISTINCT即可

select DISTINCT Student.SId,Student.Sname,Student.Sage,Student.Ssex
from study.dbo.SC
inner join Student
on SC.SId=Student.SId

 

4.查询一切同砚的门生编号、门生姓名、选课总数、一切课程的总结果(没结果的显现为 null )

依然是连表查询,left join

select Student.*,t2.count_id,t2.avg_score
from
Student
left join
(select SId,count(CId) as count_id ,avg(score)as avg_score from study.dbo.SC group by SId) as t2
on Student.SId=t2.SId

 

4.1 查有结果的门生信息

inner join,不赘述

select Student.*,t2.count_id,t2.avg_score
from
Student
inner join
(select SId,count(CId) as count_id ,avg(score)as avg_score from study.dbo.SC group by SId) as t2
on Student.SId=t2.SId

 

5.查询「李」姓先生的数目

最简朴的一题,晓得like这类隐约查询就行

select COUNT(*)
from Teacher
where Tname like '李%'

 

6.查询学过「张三」先生讲课的同砚的信息

这个有意思,代表着从一张表跳到另一张表找信息

第一个思绪固然是用join,多个表一个一个on衔接起来

select Student.*
from
(select tid from Teacher where Tname='张三') as t1
inner join Course on t1.tid=Course.TId
inner join SC on Course.CId=SC.CId
inner join Student on SC.SId=Student.SId

然则也有另一种写法

select study.dbo.Student.*
from teacher,study.dbo.Course  ,study.dbo.student,study.dbo.sc
where teacher.Tname='张三' and   teacher.TId=Course.TId and   Course.CId=sc.CId and   sc.SId=student.SId

直接from多个表,在where里写=

我查了一下,实在这类体式格局是用了隐式的inner join,效力差别不大

 

 

 


7.查询没有学全一切课程的同砚的信息

查到没有学全一切课程同砚的sid很简朴,在表4中查询。同砚的信息用inner join联表1查询完成。

SELECT *
FROM study.dbo.Student as t1
inner join
(select Student.SId from Student
left join
study.dbo.SC
on Student.SId=SC.SId
group by Student.SId
having COUNT(SC.CId)!=(select count(*) from study.dbo.Course)) as t2
on t1.SId=t2.SId

 

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
sql 典范查询50题 思绪(一)

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282158.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>