百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

MYSQL 50题其三

wptr33 2025-02-15 01:24 22 浏览

  1. 查询没有学全全部课程的同学

其实就是查询学生学习的课程的总数和总的课程总数不相等的学生

1SELECT?s.*
2FROM?student?s
3LEFT?JOIN?score?sc
4ON?s.s_id?=?sc.s_id
5GROUP?BY?s.s_id?HAVING?COUNT(s.s_id)?!=?
6(
7SELECT?COUNT(1)?FROM?course
8)

结果:

  1. 查询至少有一门课与学号为"01"的同学所学相同的同学的信息

这个题目可以理解为先找到01同学学习的总课程,其他的学生学的课程只有有一个在这个总课程里面就可以。

1select?*?
2from?student?
3where?s_id?in
4(
5?select?distinct?a.s_id?
6?from?score?a?
7where?a.c_id?
8in(select?a.c_id?from?score?a?where?a.s_id='01')
9????);

结果:

  1. 查询和"01"号的同学学习的课程完全相同的其他同学的信息
    解决这个问题之前,我们先学习一个函数 叫做 GROUP_CONCAT, 他可以将相同的行连接起来,并且可以指定连接的顺序(正序还是倒序),但是需要后面跟group by 或者条件
    比如说:
1select?GROUP_CONCAT(a.c_id?ORDER?BY?a.c_id)?from?score??a?GROUP?BY?a.s_id

结果:

还有另外两个函数 concat 和 concat-ws,concat指的是将多个值连接起来,concat-ws和concat功能一样,但是可以指定分隔符:

1select?concat(s.s_id,s.s_name)?from?student?s

结果:

1select?CONCAT_WS('-',s.s_id,s.s_name)?from?student?s

结果:


言归正传继续说那个题目,既然可以将结果连接起来,那么我们可以先将01同学学的的课程都连接起来,其他的同学学习的课程也连接起来,和01同学结果一样的,那就是和01同学学的课程一样。

1SELECT??s.*
2FROM?student?s?
3LEFT?JOIN?score?sc?
4ON?s.s_id?=?sc.s_id
5GROUP?BY?s.s_id?HAVING?GROUP_CONCAT(sc.c_id?ORDER?BY?sc.c_id)?=?
6(SELECT?GROUP_CONCAT(a.c_id?ORDER?BY?a.c_id)?FROM?score?a?WHERE?a.s_id='01')

结果:

  1. 查询没学过"张三"老师讲授的任一门课程的学生姓名
    关联 分数表,课程表和老师表,根据条件张三,查询出所有教过的学生id列表,在找出不在这个列表中的学生即可
1SELECT?*?FROM?student?s?WHERE?s.s_id?NOT?IN
2(
3SELECT?sc.s_id?FROM?score?sc?
4JOIN?course?c?ON?sc.c_id?=?c.c_id
5JOIN?teacher?t?ON?c.t_id?=?t.t_id
6WHERE?t.t_name?=?'张三'
7)

结果:

  1. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
    思路是先根据不及格过滤,剩下的进行分组,并统计科目的数量,找到大于等于2的同学的sid
1SELECT?sc.s_id?FROM?score?sc?
2WHERE?sc.s_score?<60
3GROUP?BY?sc.s_id?HAVING?COUNT(sc.c_id)?>=?2

找到sid了,就可以根据学生表和成绩进行联合查询,并求平均值AVG了

 1SELECT?s.*,AVG(c.s_score)
 2FROM?student?s
 3LEFT?JOIN?score?c
 4ON?s.s_id?=?c.s_id?
 5GROUP?BY?s.s_id?HAVING?s.s_id?IN
 6(
 7SELECT?sc.s_id?FROM?score?sc?
 8WHERE?sc.s_score?<60
 9GROUP?BY?sc.s_id?HAVING?COUNT(sc.c_id)?>=?2
10)

结果:

未完待续!

欢迎关注我的微信公众号: 北风中独行的蜗牛



参考:https://blog.csdn.net/fashion2014/article/details/78826299
https://www.cnblogs.com/coder-wf/p/11128033.html

相关推荐

什么是Java中的继承?如何实现继承?

什么是继承?...

Java 继承与多态:从基础到实战的深度解析

在面向对象编程(OOP)的三大支柱中,继承与多态是构建灵活、可复用代码的核心。无论是日常开发还是框架设计,这两个概念都扮演着至关重要的角色。本文将从基础概念出发,结合实例与图解,带你彻底搞懂Java...

Java基础教程:Java继承概述_java的继承

继承概述假如我们要定义如下类:学生类,老师类和工人类,分析如下。学生类属性:姓名,年龄行为:吃饭,睡觉老师类属性:姓名,年龄,薪水行为:吃饭,睡觉,教书班主任属性:姓名,年龄,薪水行为:吃饭,睡觉,管...

java4个技巧:从继承和覆盖,到最终的类和方法

日复一日,我们编写的大多数Java只使用了该语言全套功能的一小部分。我们实例化的每个流以及我们在实例变量前面加上的每个@Autowired注解都足以完成我们的大部分目标。然而,有些时候,我们必须求助于...

java:举例说明继承的概念_java继承的理解

在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物,同理,...

从零开始构建一款开源的 Vibe Coding 产品 Week1Day4:业界调研之 Agent 横向对比

前情回顾前面两天我们重点调研了了一下Cursor的原理和Cursor中一个关键的工具edit_file的实现,但是其他CodingAgent也需要稍微摸一下底,看看有没有优秀之处,下...

学会这几个插件,让你的Notepad++使用起来更丝滑

搞程序开发的小伙伴相信对Notepad++都不会陌生,是一个占用空间少、打开启动快的文件编辑器,很多程序员喜欢使用Notepad++进行纯文本编辑或者脚本开发,但是Notepad++的功能绝不止于此,...

将 node_modules 目录放入 Git 仓库的优点

推荐一篇文章Whyyoushouldcheck-inyournodedependencies[1]...

再度加码AI编程,腾讯发布AI CLI并宣布CodeBuddy IDE开启公测

“再熬一年,90%的程序员可能再也用不着写for循环。”凌晨两点半,王工还在公司敲键盘。他手里那份需求文档写了足足六页,产品经理反复改了三次。放在过去,光数据库建表、接口对接、单元测试就得写两三天。现...

git 如何查看stash的内容_git查看ssh key

1.查看Stash列表首先,使用gitstashlist查看所有已保存的stash:...

6万星+ Git命令懒人必备!lazygit 终端UI神器,效率翻倍超顺手!

项目概览lazygit是一个基于终端的Git命令可视化工具,通过简易的TUI(文本用户界面)提升Git操作效率。开发者无需记忆复杂命令,即可完成分支管理、提交、合并等操作。...

《Gemini CLI 实战系列》(一)Gemini CLI 入门:AI 上命令行的第一步

谷歌的Gemini模型最近热度很高,而它的...

deepin IDE新版发布:支持玲珑构建、增强AI智能化

IT之家8月7日消息,深度操作系统官方公众号昨日(8月6日)发布博文,更新推出新版deepin集成开发环境(IDE),重点支持玲珑构建。支持玲珑构建deepinIDE在本次重磅更...

狂揽82.7k的star,这款开源可视化神器,轻松创建流程图和图表

再不用Mermaid,你的技术文档可能已经在悄悄“腐烂”——图表版本对不上、同事改完没同步、评审会上被一句“这图哪来的”问得哑口无言。这不是危言耸听。GitHub2025年开发者报告显示,63%的新仓...

《Gemini CLI 实战系列》(五)打造专属命令行工具箱

在前几篇文章中,我们介绍了GeminiCLI的基础用法、效率提升、文件处理和与外部工具结合。今天我们进入第五篇...