首页 > 数据库 >SQL常用思维总结

SQL常用思维总结

时间:2024-08-16 09:53:15浏览次数:15  
标签:总结 思维 name course score student SQL id select

1. 将复杂查询拆分为子查询

子查询指的是:一个查询语句嵌套在另一个查询语句内部的查询,作为上级查询的查询条件之一

--查询课程1分数比课程2分数高的学生的学生信息、课程1分数、课程2分数
select student.*,score1,score2 from student join
(select t1.s_id,t1.s_score score1,t2.s_score score2 from
(select * from score where c_id=1) t1 join --子查询1:课程1的分数情况
(select * from score where c_id=2) t2 on t1.s_id=t2.s_id --子查询2:课程2的分数情况
where t1.s_score>t2.s_score) t3 on student.s_id=t3.s_id --子查询3:课程1的分数比课程2的分数高的数据情况

2. group by having条件查询不显示null值,如需显示null需要另加条件

select student.s_id,student.s_name,isnull(AVG(s_score),0) avg_score --使用isnull将聚合函数中的null值显示为0值
from student left join score on student.s_id=score.s_id
group by student.s_id,student.s_name having(AVG(s_score)<60 or AVG(s_score) is null) --需要另加条件以显示null值

3. 聚合函数不显示null值,需要另加isnull

select student.s_id,student.s_name,COUNT(*) coure_num,isnull(SUM(s_score),0) score_sum from --isnull将聚合函数的null值显示为0值
student  left join score on student.s_id=score.s_id
group by student.s_id,student.s_name

4. 内连接(join/inner join)取二者交集,所以内连接可以作为一种条件筛选方法使用

--查询与学号为1的同学所学课程完全相同的学生的信息
select * from student where s_id in
(select sc1.s_id from score sc1 join 
(select * from score where s_id=1) t1 on sc1.c_id=t1.c_id --内连接被用来作为筛选条件:与1学号同学课程相同
where sc1.s_id!=1
group by sc1.s_id having(COUNT(*)=(select COUNT(*) from score where s_id=1))) --group by having被用来进行同值数据计数

5. group by having条件查询前,还可以加where,以此来增加筛选条件

select student.s_id,student.s_name,avg_score from student join
(select s_id,AVG(s_score) avg_score from score where s_score<60 group by s_id having(COUNT(*)>=2)) t1 on student.s_id=t1.s_id
-- group by having 执行的先行条件为s_score<60

6. case when then可以将数据库的行项目拆分成列项目,并进行数值统计

select student.s_id,student.s_name,
SUM(case c_id when 1 then s_score else 0 end) 语文,
SUM(case c_id when 2 then s_score else 0 end) 数学,
SUM(case c_id when 3 then s_score else 0 end) 英语, --将c_id列的行数据拆分为列,并进行数值统计
isnull(AVG(s_score),0) 平均成绩
from student left join score on student.s_id=score.s_id
group by student.s_id,student.s_name
order by 平均成绩 desc

7. case when then可以依据条件进行计数

select course.c_id,course.c_name,
MAX(s_score) 最高分,MIN(s_score) 最低分,AVG(s_score) 平均分,
cast(convert(decimal(18,2),SUM(case when s_score>=60 then 1 else 0 end)/(COUNT(*)+0.0)*100) as varchar)+'%' 及格率,
cast(convert(decimal(18,2),SUM(case when s_score between 70 and 80 then 1 else 0 end)/(COUNT(*)+0.0)*100) as varchar)+'%' 中等率,
cast(convert(decimal(18,2),SUM(case when s_score between 80 and 90 then 1 else 0 end)/(COUNT(*)+0.0)*100) as varchar)+'%' 优良率,
cast(convert(decimal(18,2),SUM(case when s_score>=90 then 1 else 0 end)/(COUNT(*)+0.0)*100) as varchar)+'%' 优秀率 --行数据拆分为列数据,并依据条件进行数值统计
from score join course on score.c_id=course.c_id
group by course.c_id,course.c_name

8. union select可以合并列名相同的查询结果

select * from
(select top 3 course.c_id c_id,course.c_name c_name,student.s_id s_id,student.s_name s_name,score.s_score score from
course join score on course.c_id=score.c_id join student on student.s_id=score.s_id
where course.c_id=1 order by s_score desc) table1
union select * from --数据列相同,数据可以合并查询
(select top 3 course.c_id c_id,course.c_name c_name,student.s_id s_id,student.s_name s_name,score.s_score score from
course join score on course.c_id=score.c_id join student on student.s_id=score.s_id
where course.c_id=2 order by s_score desc) table2
union select * from
(select top 3 course.c_id c_id,course.c_name c_name,student.s_id s_id,student.s_name s_name,score.s_score score from
course join score on course.c_id=score.c_id join student on student.s_id=score.s_id
where course.c_id=3 order by s_score desc) table3

9. 可以利用group by having筛选同值数据

--查询姓名相同且性别相同的学生的姓名,性别以及人数
select s_name,s_sex,COUNT(*) num from student group by s_name,s_sex having(COUNT(*)>1) --group by统计同值数据,having限定同值数据的筛选条件

10. 内连接作为数据筛选条件,group by having统计同值数据记录并执行筛选功能

--查询不同课程分数相同的学生的学号、课程号和成绩
select sc1.s_id,sc1.c_id,sc1.s_score from score sc1 join score sc2 on sc1.s_score=sc2.s_score --内连接作为数据筛选条件:分数相同
group by sc1.s_id,sc1.c_id,sc1.s_score having(COUNT(*)>1) --group by统计同值数据,having限定筛选条件,以实现“不同课程”的查询功能

 

标签:总结,思维,name,course,score,student,SQL,id,select
From: https://www.cnblogs.com/yangzhehan/p/18362301

相关文章

  • SpringBoot的事务/调度/缓存/邮件发送和一些Spring知识点总结
    目录1、SpringBoot的事务管理2、SpringBoot的异步任务3、SpringBoot定时任务调度4、SpringBoot整合Mail发送邮件5、Spring框架中的Bean的作用域6、Spring框架中的Bean的线程安全7、Spring框架中的Bean生命周期8、Spring框架如何解决循环依赖?9、Spring框架中有哪些注......
  • 嵌入式开发应该具备的思维方式
    能从PC机器编程去看嵌入式问题,那是第一步;学会用嵌入式编程思想,那是第二步;用PC的思想和嵌入式的思想结合在一起,应用于实际的项目,那是第三步。很多朋友都是从PC编程转向嵌入式编程的。在中国,嵌入式编程的朋友很少是正儿八经从计算机专业毕业的,都是从自动控制啊,电子相关的专......
  • MySQL:查询(万字超详细版)
       ......
  • mysql数据库中decimal数据类型比较大小
    在MySQL中,DECIMAL数据类型用于存储精确的数值,它非常适合用于需要高精度计算的场景,如金融应用。当我们需要在MySQL数据库中比较DECIMAL类型数据的大小时,可以使用标准的比较运算符,如>,<,>=,<=,=和<>(或!=)。以下是一个详细的示例,说明如何在MySQL中使用DECIMAL数据类型并比较......
  • mysql数据库中decimal数据类型比较大小
    在MySQL中,DECIMAL数据类型用于存储精确的数值,它非常适合用于需要高精度计算的场景,如金融应用。当我们需要在MySQL数据库中比较DECIMAL类型数据的大小时,可以使用标准的比较运算符,如>,<,>=,<=,=和<>(或!=)。以下是一个详细的示例,说明如何在MySQL中使用DECIMAL数据类型并比较它......
  • 广度优先算法 BFS总结(算法详解+模板+例题)
    一.bfs是什么广度优先搜索(Breadth-FirstSearch,简称BFS),是一种图遍历算法。它从给定的起始节点开始,逐层地向外扩展,先访问起始节点的相邻节点,然后再访问相邻节点的相邻节点,以此类推,直到遍历完所有可达节点。二.基本思路1.一直往前走,直到到达终点。2.遇到分岔路口直接分出几条......
  • 【待做】Mysql攻击之UDF提权
    一、前置知识1.1secure_file_privUDF是mysql的一个拓展接口,UDF(Userdefinedfunction)可翻译为用户自定义函数,这个是用来拓展Mysql的技术手段。这就意味着,我们可以通过udf为mysql添加任意功能,包括自定义sql函数,tcp开发,http请求,甚至直接调用系统命令;一、前置知识1.1......
  • SQL— DDL语句学习【后端 10】
    SQL—DDL语句学习在数据管理的广阔领域中,SQL(StructuredQueryLanguage)作为操作关系型数据库的编程语言,扮演着举足轻重的角色。它不仅定义了操作所有关系型数据库的统一标准,还为我们提供了强大的工具来管理、查询和修改数据库中的数据。今天,我们将一起走进SQL的世界,了解其......
  • 终端命令(常用版)(白话文)(自总结)<每2日续写>
    终端命令(常用版)(白话文)(自总结)看前说明:1.命令没有前后加括号【】说明需加内容的,默认只需要输入命令然后回车即可。2.中间有“【空格】”即为命令与调用参数之间的需要输入“单空格”。3.个别命令说明,解释在前,用法在后,其他默认直接输入。【直接正题】          ......
  • sqli-labs靶场通关攻略
    Less-1sql手工注入攻击流程步骤一:确定攻击点,确定网站可以注入的参数http://127.0.0.1/Less-1/?id=1步骤二:判断闭合方式'--+步骤三:判断字段列数orderby1.http://127.0.0.1/Less-1/?id=1'orderby3--+页面正常说明存在3列2.http://127.0.0.1/Less-1/?id=1'or......