45道SQL题目陆续更新
文章目录
- 学习视频
- 配置环境
- 第一天
- 内连接 + 外连接
- 第二天
- 第三天
学习视频
学习视频
配置环境
- 四张表
- 配置四张表的sql语句
#创建发据库
create database frogdata charset=utf8;use frogdata;# 学生表 Student
create table Student(
SId varchar(10),
Sname varchar(10),
Sage datetime,
Ssex varchar(10));# 教师表 Teacher
create table Teacher(
TId varchar(10),
Tname varchar(10));# 科目表 Course
create table Course(
CID varchar(10),
Cname nvarchar(10),
TId varchar(10)
);# 成绩表 SC
create table SC(
SId varchar(10),
CId varchar(10),
score decimal(18,1));# 学生表
insert into Student values('01','赵雷','1990-01-01','男');
insert into Student values('02','钱电','1990-12-21','男');
insert into Student values('03','孙风','1990-05-20','男');
insert into Student values('04' ,'李云','1990-08-06','男');
insert into Student values('05','周梅','1991-12-01','女');
insert into Student values('06','吴兰','1992-03-01','女');
insert into Student values('07','郑竹','1999-07-01','女');
insert into Student values('09','张三','2017-12-20','女');
insert into Student values('10','李四','2017-12-25','女');
insert into Student values('11','李四','2017-12-30','女');
insert into Student values('12','赵六','2017-01-01','女');
insert into Student values('13','孙七','2018-01-01','女');# 教师表
insert into Teacher values('01','张三');
insert into Teacher values('02','李四');
insert into Teacher values('03','王五');# 科目表Course
insert into Course values('01','语文','02');
insert into Course values('02','数学','01');
insert into Course values('03','英语','03');# 成绩表SC
insert into SC values('01', '01', 80),('01', '02', 90),('01', '03', 99),('02', '01', 70),('02', '02', 60),('02', '03', 80),('03', '01', 80),('03', '02', 80),('03', '03', 80),('04', '01', 50),('04', '02', 30),('04', '03', 20),('05', '01', 76),('05', '02', 87),('06', '01', 31),('06', '03', 34),('07', '02', 89),('07', '03', 98);
- 配置好的环境
第一天
- from 后面紧接的基础表会放在开头
- on 后面放与基础表的条件
1-1 查询01课程比02课程成绩高的学生信息和课程分数
# 第一步:通过Sid主键连接学生表和成绩表
select* from Student a inner join SC b on a.SId = b.SId;# 第二步:进行同一学生不同成绩比较,利用Sid相同,Cid不同进行关联
select* from Student a
inner join SC b on a.SId = b.SId inner join SC c on a.SId = c.SId
and b.CId = '01' and c.CId = '02';# 最后:回到题目,利用where比较分数即可
select* from Student a
inner join SC b on a.SId = b.SId inner join SC c on a.SId = c.SId
and b.CId = '01' and c.CId = '02'
where b.score > c.score;
1-2 查询存在 01 课程但可能不存在 02 课程的情况(不存在的时候显示为null)
# 第一步:实现1名学生的2门课程在同一行,左边的Cid等于 01 课程, 右边Cid等于 02 课程
select * from SC a
inner join SC b on a.SId = b.SId
where a.cid = '01' and b.CId = '02';# 最后:需要用到left JOIN,实现1个学生两个课程在同一行,左边 01 课程,右边 02 课程
# and b.CId = '02'; 表示 a 这个表只显示01课程若无则显示null
# where a.CId = '01'; 这是一个显示条件,若无就不显示
select * from SC a
left join SC b on a.SId = b.SId
and a.CId = '01'and b.CId = '02'
where a.CId = '01';
1-3 查询不存在 01 课程但存在 02 课程的情况
# 第一步:筛选出存在 01 课程的学生
select sid from SC where cid = '01';
# 最后:使用not in 筛选出不存在 01 课程,但是存在 02 课程的学生
select* from SC
where sid not in(select sid from SC where cid = '01') and cid = '02';
补充知识点:
内连接 + 外连接
从网上偷的图:
sql执行顺序
from->on->join->where->group by->having+聚合函数->select->order by->limit
- on的优先级高于join,那就说明在联表前,会对表提前进行过滤,形成一张更小的临时表,然后再进行join联表,接着就对连表的结果进行where过滤
- 在使用内连接的情况下on和where差别不大,
- 但是使用外连接的时候就会有差距了,那么来看看join是怎么执行的,我们的优化器首先会选中一个表作为驱动表,然后我们的执行器从存储引擎中取出这个表中的所有数据,这个表中的每一行数据会去另一个表进行连表操作,如果我们能提前用on条件去缩小我们的这张驱动表,这样连表的速度就会更快。
第二天
2-1 查询平均成绩大于等于60分的同学的学生编号,学生姓名,平均成绩。
提示:要求查询平均成绩大于等于60分的同学信息,首先确定是在成绩表里面找,找到了这样的同学后,是不是用sid去学生信息表里面关联就可以得到学生的姓名信息,在这里的关键就是找sid。
select a.sid,a.Sname,b.avg_score
from student as a
inner join
(select sid,avg(score) as avg_score from SC
group by SId having avg_score>=60) as b
on a.sid = b.sid;
- 子语句可以查询成绩表中平均成绩大于60的sid
知识点补充:
- group by 的用法
select 聚合函数,列(要求出现在group by的后面)
from 表
where 筛选条件
group by 分组的列表
order by 子句
注意:除了出现在group by后面的字段,如果要在select后查询其他字段,必须用聚合函数进行聚合
-
特点:分组查询中的筛选条件分为两类:
- where:对分组前的表进行筛选,所以放在group by前面
- having:对分组后的表进行筛选,所以放在group by后面
-
因为执行顺序:
from->on->join->where->group by->having+聚合函数->select->order by->limit
3-1、查询在sc表存在成绩的学生信息
提示:成绩表肯定都是有学生的,所以用左关联就可以得到学生的信息。
select b.*from (
select SId
from sc
group by SId) as aleft join student as b
on a.SId = b.SId
- 子语句可以查询所有成绩表中的SId,结果作为主表。
4-1:查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为null)
解法一:子查询
select a.SId,a.sname,b.counts,b.sums
from student as a
left join
(SELECT SId,count(CId) as counts,sum(score) as sums
from sc
group by SId) as b
on a.SId = b.SId;
- 子语句使用聚合函数,算出:选课总数、所有课程的总成绩,根据SId分组
解法二:
select a.SId,a.sname,count(b.CId) as counts,sum(b.score) as sums
from student as a
left join sc as b
on a.SId = b.SId
group by a.SId;
- 除了出现在group by后面的字段,如果要在select后查询其他字段,必须用聚合函数进行聚合。
- 所以这个代码运行错误,但是如果修改一下mysql的配置还是可以使用的。
- 我这里没有修改,如果以后有需要再修改。
第三天
5-1 查询所有李姓老师的数量
select count(a.Tname) as nums
from teacher as a
where a.Tname LIKE '李%';
- like:模糊查找
- ‘李%’:李后面可以加的文字不限定个数
6-1 查询学过【张三】老师授课的同学的信息
select
b.*
from( select SId from sc
inner join course on sc.CId = course.CId
inner join teacher on course.TId = teacher.TId
where teacher.Tname = '张三') as ainner join student as b
on a.SId = b.Sid;
子句主要作用是从sc表中找出张三学生的SId,然后通过SId关联到学生表,找到学生信息
7-1查询没有,学全所有课程的同学的信息
select b.*
from(select sc.SId from sc
group by sc.SId
having count(sc.CId) < (select count(CId)from course )) AS ainner join student as b
on a.SId = b.SId;
- count(sc.CId) < (select count(CId)from course ):课程总数大于学生选择数
- 子句主要是找出没有学全所有课程的SId
8-1:查询至少一门课与学号为01的同学所学相同的同学的信息
- 关键点:先查询到01同学所学的课程CId,IN DISTINCT 也可以用group by 代替DISTINCT
select distinct a.*
from student a
inner join sc b on a.SId = b.SIdwhere b.CId IN (select sc.CId from sc where sc.SId = '01');
子句主要是查询01学生所学的所有课程
9-1:查询和01号同学学习课程完全相同的其他同学信息
- 关键点:1、要没有学习01号同学以外的其他课程 (1)01号同学学习了哪些课程,(2)找到学习1号同学以外课程的同学
- SELECT cid from sc where sid = ‘01’ :01号同学学习课程
- SELECT sid FROM sc WHERE cid NOT IN (SELECT cid from sc where sid = ‘01’ ):筛选出与01课程同学所学不一样的同学的信息。
- 两次用NOT IN 第一次筛选出与01课程同学所学不一样的同学的信息,第二次把这些不一样的同学筛选掉留下一样的,然后再用group by 保证课程个数一样
2、课程的数量要保持一致
select a.*
from student a
inner join sc b
on a.SId = b.SId
where b.SId not in (select sc.SId from sc where sc.CId not in
(select CId from sc where SId = '01')) and b.SId != '01'group by a.SId
having COUNT(*) = (select COUNT(*) from sc where SId = '01');
10-1:查询没有学过“张三”老师讲授任意一门课程的学生姓名
select student.* from student
where student.SId not in
(
select c.Sid from teacher as a
inner join course as b on a.TId = b.TId
inner join sc as c on b.CId = c.CId
where a.Tname = '张三'
);
- 子句是查询张三老师教的学生Sid
- inner join course as b on a.TId = b.TId:找出与老师相匹配的课程 形成一个表
- inner join sc as c on b.CId = c.CId;再刚刚形成表的基础上找到相应的学生
相关文章:

45道SQL题目陆续更新
文章目录 学习视频配置环境第一天内连接 外连接第二天第三天 学习视频 学习视频 配置环境 四张表 配置四张表的sql语句 #创建发据库 create database frogdata charsetutf8;use frogdata;# 学生表 Student create table Student( SId varchar(10), Sname var…...

在线PS软件有哪些不错的推荐
许多新的UI设计合作伙伴非常关心在线ps工具的选择。现在市场上有各种各样的ps网页替代工具,数量众多,令人眼花缭乱。本文简要介绍了10个在线PS工具,我相信一定有一个适合你! 1.即时设计 即时设计是一款在线 UI 设计工具…...

Java实现天气预报功能
如果要实现类似百度天气、手机App这样的天气预报功能该如何实现?首先想到的是百度... 背景: 最近公司做了一个项目,天气预报的功能也做上去了,不仅有实时天气、未来7天预报的功能、还有气象预警的功能。 天气包括基本天气、白天夜…...
python循环语句
while循环 Python中,while循环只要在条件(表达式)为真的情况下,就会一直重复执行相应的循环代码块。 while语句的语法格式如下: while 条件表达式:代码块while语句执行的具体流程为:首先判断…...
多线程基础(一)线程基础信息、synchronized 锁概念
1. 基本概念: 程序: 程序是一些保存在磁盘上的指令的有序集合,是静态的。程序包括:内存资源、IO资源、信号处理等。(如:XX.exe) 进程: 进程是程序执行的过程,包括了动态…...

JAVA期末考内容知识点的梳理
作者的话 前言:这些都是很基本的,还有很多没有写出来,重点在于考试复习,包括后四章的内容 前面内容请参考JAVA阶段考内容知识点的梳理 一、集合、流 课堂总结1集合 集合概念: 保存和盛装数据的容器,将许多…...

为什么要使用Thrift与Protocol Buffers?
编码数据的格式 程序通常(至少)使用两种形式的数据: 在内存中,数据保存在对象、结构体、列表、数组、散列表、树等中。 这些数据结构针对 CPU 的高效访问和操作进行了优化(通常使用指针)。如果要将数据写…...

oa是什么意思?oa系统哪个好用?
一、oa是什么意思 oa(Office Automation办公自动化)是一种将智能化科技应用于企业管理中的应用系统。它可以通过电脑网络、互联网等技术手段,将企业的各种业务流程、各种业务数据进行集成和处理,将各种业务流程和各种业务数据统一…...
Linq和C# Lambda表达式
什么是Linq 简介 Linq (Language Integrated Query) 是一种语言集成的查询技术,可以在C#和其他.NET语言中使用。Linq允许我们使用一种类SQL的语言来查询数据,这使得代码更加简洁和易于阅读。Linq提供了一种通用的查询接口,可以用于查询各种…...

蓝桥:前端开发笔面必刷题——Day2 数组(三)
文章目录 📋前言🎯两数之和 II📚题目内容✅解答 🎯移除元素📚题目内容✅解答 🎯有序数组的平方📚题目内容✅解答 🎯三数之和📚题目内容✅解答 📝最后 &#x…...
人工智能专栏第四讲——人工智能的未来展望与机遇
目录 一、人工智能的未来展望 二、人工智能在各领域的应用 三、人工智能的机遇 四、总结...
Unity阴影(Shadow)、Shadowmap
Unity阴影(Shadow) 在Unity中,阴影(Shadow)是用于模拟场景中物体之间相互遮挡和光照效果的特性。阴影可以增加场景的真实感,并在视觉上提供深度和空间感。 Unity提供了几种阴影投射和接收的方法和技术&am…...
编程语言的四种错误处理方法,你知道几种?
错误处理是编程的一个基本要素。除非你写的是“hello world”,否则就必须处理代码中的错误。在本文中,我将讨论各种编程语言在处理错误时使用的最常见的四种方法,并分析它们的优缺点。 关注不同设计方案的语法、代码可读性、演变过程、运行效…...

ContOS7单机安装Hadoop
安装Hadoop 1,准备环节 因为Hadoop是由java编写的,所以需要Java的环境支持,作为开发者我们需要安装jdk。 安装jdk的教程http://t.csdn.cn/6qJKg 下载Hadoop的安装包 Hadoop官网:http://hadoop.apache.org/ Hadoop版本下载地…...
抓取动态网页的数据的具体操作方法
抓取动态网页的数据的具体操作方法 动态网页是指在用户交互过程中,网页内容不断更新和变化的网页。抓取动态网页的数据需要了解以下具体操作方法: 使用浏览器开发者工具:在浏览器中打开目标网页后,按下F12键,打开开发…...

Windows 和 Linux 环境下 ProtoBuf 的安装
文章目录 一、ProtoBuf 在 Windows 环境中的安装二、ProtoBuf 在 Linux 环境中的安装 ProtoBuf在GitHub上的下载地址 一、ProtoBuf 在 Windows 环境中的安装 首先选择自己要下载的版本,我选择的是v21.11: 点进去在最下面选择Windows的版本࿰…...
商用密码应用安全性测评方案编制流程
密评方案编制的目标是完成测评准备活动中获取的信息系统相关资料整理,为现场测评活动提供最基本的文档和指导方案。 按照《GM-T 0116-2021 信息系统密码应用测评过程指南》标准,密评方案编制包括5项关键任务,简要汇总如下表。 编号任务输入文…...

Elasticsearch 集群部署插件管理及副本分片概念介绍
Elasticsearch 集群配置版本均为8以上 安装前准备 CPU 2C 内存4G或更多 操作系统: Ubuntu20.04,Ubuntu18.04,Rocky8.X,Centos 7.X 操作系统盘50G 主机名设置规则为nodeX.qingtong.org 生产环境建议准备单独的数据磁盘主机名 #各自服务器配置自己的主机名 hostnamectl set-ho…...

Liunx 套接字编程(2)TCP接口通信程序
1.TCP通信程序的编写 面向连接、可靠传输、提供字节流传输服务 客户端向服务器发送一个连接建立的请求流程,上图中服务端第三步详细流程 2.TCP接口 socket--创建套接字 int socket(int domain, int type, int protocol); bind---绑定 intbind(int sockfd, struct s…...

8年开发经验,浅谈 API 管理
随着信息化飞速增长的还有各信息系统中的应用接口(API),API作为信息系统内部及不同信息系统之间进行数据传输的渠道,其数量随着软件系统的不断庞大而呈指数型增长,如何管理这些API已经在业界变得越来越重要,…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...

goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...