当前位置: 首页 > news >正文

sql-50练习题0-5

sql练习题0-5题

  • 前言
  • 数据库表结构介绍
    • 学生表
    • 课程表
    • 成绩表
    • 教师表
  • 0-1 查询"01"课程比"02"课程成绩高的学生的信息及课程分数
  • 0-2查询"01"课程比"02"课程成绩小的学生的信息及课程分数
  • 0-3查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
  • 0-4 查询平均成绩小于等于60分的同学的学生编号和学生姓名和平均成绩
  • 0-5 查询所有同学的学生编号,学生姓名,选课总数,所有课程的总成绩
    • 特别情况

前言

记录一下最近写过的sql的一些记录,从这篇开始每天更新5个题目,sql真的非常灵活,一个题目可能有很多很多种解法,我记录的只是我自己的一个解题思路,如果大家有更好的不同解法欢迎在评论区一起探讨
ps:有些题可能解法会重复,比如求大于,我们下一个题可能是求小于,大家如果第一遍没有做出来,看了我写的之后有了思路,可以试一下反面的解法。

数据库表结构介绍

学生表

在这里插入图片描述

课程表

在这里插入图片描述

成绩表

在这里插入图片描述

教师表

在这里插入图片描述

0-1 查询"01"课程比"02"课程成绩高的学生的信息及课程分数

写sql之前先分析,需要用到的表以及函数
student,score两张表
简单分析一下这个sql,因为01课程和02课程在同一个字段,所以我的思路是采用自连接来处理

SELECT
	c.*, 
	a.s_score score1,
	b.s_score score2
FROM
	score a,
	score b,
	student c
WHERE
	a.c_id = '1'
AND b.c_id = '2'
AND a.s_id = b.s_id
AND c.s_id = b.s_id
AND a.s_score > b.s_score;
	
	

结果如下:

在这里插入图片描述

0-2查询"01"课程比"02"课程成绩小的学生的信息及课程分数

同样的思路,再写一遍,巩固一下

SELECT
	c.*, 
	a.s_score score1,
	b.s_score score2
FROM
	score a,
	score b,
	student c
WHERE
	a.c_id = '1'
AND b.c_id = '2'
AND a.s_id = b.s_id
AND c.s_id = b.s_id
AND a.s_score < b.s_score;

结果如下:
在这里插入图片描述

0-3查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

需要用的表为student,score
题目需要查询到学生姓名,需要利用子查询
函数为age求平均值函数
需要分组

SELECT
	b.s_id,
	(
		SELECT
			s.s_name
		FROM
			student s
		WHERE
			b.s_id = s.s_id
	) s_name,
	AVG(b.s_score) avg_score
FROM
	score b
GROUP BY
	b.s_id
HAVING
	AVG(b.s_score) >= 60

结果如下:
在这里插入图片描述

0-4 查询平均成绩小于等于60分的同学的学生编号和学生姓名和平均成绩

思路和上面一模一样

SELECT
	a.s_id,
	(
		SELECT
			s.s_name
		FROM
			student s
		WHERE
			a.s_id = s.s_id
	),
	avg(a.s_score)
FROM
	score a
GROUP BY
	a.s_id
HAVING
	avg(a.s_score) <= 60;

结果如下
在这里插入图片描述

0-5 查询所有同学的学生编号,学生姓名,选课总数,所有课程的总成绩

从题目的意思可以看出来,我们需要两个表student,score
用到的函数为,count,sum
和上一个题的思路其实很像
ps:我个人比较喜欢子查询的方式,其实很多人比较喜欢用内连接,其实没有啥本质上区别,看个人习惯吧

子查询:
SELECT
	s.s_id,
	(
		SELECT
			a.s_name
		FROM
			student a
		WHERE
			a.s_id=s.s_id
	),
	COUNT(s.c_id),
	SUM(s.s_score)
FROM
	score s
GROUP BY
	s.s_id;
显式内连接:

SELECT
	a.s_id,
	s.s_name,
	COUNT(a.c_id),
	SUM(a.s_score)
FROM
	score a
INNER JOIN student s ON s.s_id = a.s_id
GROUP BY
	a.s_id;


结果如下:
在这里插入图片描述

特别情况

不知道有没有细心的小伙伴发现,我们这张成绩表中缺少id为8的同学的成绩,可能因为某些情况缺考了导致我们在上面的查询中也查不到她的信息,那么如果我们也需要将他的信息查询出来应该如何做呢?

student中有的数据而score中没有,可以使用外连接来做

SELECT
	s.s_id,
	s.s_name,
	COUNT(a.c_id) count_cid,
	IFNULL(SUM(a.s_score), 0) sum_score
FROM
	score a
RIGHT JOIN student s ON s.s_id = a.s_id
GROUP BY
	a.s_id
ORDER BY
	s_id ASC;

结果如下:
在这里插入图片描述

相关文章:

  • 图神经网络及其在知识图谱的应用
  • C语言实现通讯录
  • 一台服务器最大能支持多少条 TCP 连接
  • 修改svc的LoadBalancer的IP引发的惨案
  • 分布式理论和分布式锁知识点总结
  • 【Linux】权限完结
  • linux入门---多线程的控制
  • leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间
  • yo!这里是进程间通信
  • 苍穹外卖-01
  • Linux Ubunto Nginx安装
  • vscode中如何将cmd设置为默认终端
  • 使用Spring Data Elasticsearch 进行索引的增、删、改、查
  • 【计算机网络】(谢希仁第八版)第一章课后习题答案
  • Win10中Pro/E鼠标滚轮不能缩放该怎么办?
  • RabbitMQ原理(五):消费者的可靠性
  • MIT Kimera-VIO-ROS 安装
  • rm -rf,删了文件空间却没释放?
  • java - IDEA IDE - 设置字符串断点
  • vue笔记(三)
  • 长三角铁路今日预计发送390万人次,昨日客发量同比增长10.5%
  • 专家分析丨乌美签署矿产协议,展现美外交困境下的无奈
  • 五一期间全国高速日均流量6200万辆,同比增长8.1%
  • 魔都眼|静安光影派对五一启幕:苏河湾看徐悲鸿艺术画作
  • 辽宁辽阳市白塔区一饭店发生火灾,当地已启动应急响应机制
  • 上海“模速空间”:将形成人工智能“北斗七星”和群星态势