sql 经典查询50题 思路(一)
因为需要提高一下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='')as t1,
(select SId,score from study.dbo.SC where CId='')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='') as t1
left join
(select SId,score from study.dbo.SC where CId='') 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='') as t1
inner join
(select SId,score from study.dbo.SC where CId='') 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='') as t1
right join
(select SId,score from study.dbo.SC where CId='') 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
sql 经典查询50题 思路(一)的更多相关文章
- sql语句练习50题(Mysql版-详加注释)
表名和字段 1.学生表 Student(s_id,s_name,s_birth,s_sex) --学生编号,学生姓名, 出生年月,学生性别 2.课程表 Course(c_id, ...
- JAVA经典算法50题(转)
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51097928 JAVA经典算法50题 [程序1] 题目:古典问题:有一对兔子, ...
- 经典SQL语句基础50题
很全面的sql语句大全.都是很基础性的,今天特意整理了下.大家互相学习.大家有好的都可以分享出来, 分享也是一种快乐. --创建数据库 create database SQL50 --打开SQL50 ...
- sql查询50题
一个项目涉及到的50个Sql语句问题及描述:--1.学生表Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别--2 ...
- MySQL经典练习题及答案,常用SQL语句练习50题
表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id ...
- SQL高级查询——50句查询(含答案) ---参考别人的,感觉很好就记录下来留着自己看。
--一个题目涉及到的50个Sql语句 --(下面表的结构以给出,自己在数据库中建立表.并且添加相应的数据,数据要全面些. 其中Student表中,SId为学生的ID) ---------------- ...
- [转载]sql语句练习50题
Student(Sid,Sname,Sage,Ssex) 学生表 Course(Cid,Cname,Tid) 课程表 SC(Sid,Cid,score) 成绩表 Teacher(Tid,Tname) ...
- sql语句练习50题
Student(Sid,Sname,Sage,Ssex) 学生表 Course(Cid,Cname,Tid) 课程表 SC(Sid,Cid,score) 成绩表 Teacher(Tid,Tname) ...
- SQL高级查询——50句查询(含答案)
-一个题目涉及到的50个Sql语句 --(下面表的结构以给出,自己在数据库中建立表.并且添加相应的数据,数据要全面些. 其中Student表中,SId为学生的ID) ----------------- ...
随机推荐
- 初识PE文件结构
前言 目前网络上有关PE文件结构说明的文章太多了,自己的这篇文章只是单纯的记录自己对PE文件结构的学习.理解和总结. 基础概念 PE(Portable Executable:可移植的执行体)是Win3 ...
- 【系统设计】分布式唯一ID生成方案总结
目录 分布式系统中唯一ID生成方案 1. 唯一ID简介 2. 全局ID常见生成方案 2.1 UUID生成 2.2 数据库生成 2.3 Redis生成 2.4 利用zookeeper生成 2.5 雪花算 ...
- windows如何利用计划任务自动关机?
第一步打开控制面板,然后选择计划任务,打开它 选择创建基本任务 输入任务名称,描述,选择下一步 根据需要选择,我这里选择的是每天,然后选择下一步 选择任务开始时间,然后选择下一步 选择启动程序,然后选 ...
- 经典案例复盘——运维专家讲述如何实现K8S落地(摘抄)
以下是运满满K8s容器化进程记录,摘抄一下,方便以后查阅. 背景介绍 运满满自开始微服务改造以来,线上线下已有数千个微服务的 Java 实例在运行中.这些 Java 实例部署在数百台云服务器或虚机上, ...
- Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别
XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...
- javascript随机点名--案例
主要知识点涉及if选择结构判断语句.数组的定义.定时器.清除定时器.日期对象的使用. 1.HTML结构 <!DOCTYPE html> <html> <head> ...
- redis等缓存
文章出处 https://www.cnblogs.com/wupeiqi/articles/5246483.html Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: ...
- 04-04 AdaBoost算法代码(鸢尾花分类)
目录 AdaBoost算法代码(鸢尾花分类) 一.导入模块 二.导入数据 三.构造决策边界 四.训练模型 4.1 训练模型(n_e=10, l_r=0.8) 4.2 可视化 4.3 训练模型(n_es ...
- python编程基础之二十五
匿名函数:不用def 定义的函数,没有函数名 lambda只是一个表达式,函数体比def简单的多 lambda的函数体不再是代码块 lambda只有一行,增加运行效率 lambda [参数1][参数2 ...
- 【TencentOS tiny】 超详细的TencentOS tiny移植到STM32F103全教程
移植前的准备工作 1. 获取STM32的裸机工程模板 STM32的裸机工程模板直接使用野火STM32开发板配套的固件库例程即可.可以从我github上获取https://github.com/jiej ...