MySQL之子查询、连接查询(内&外)以及分页查询(实操)

这篇具有很好参考价值的文章主要介绍了MySQL之子查询、连接查询(内&外)以及分页查询(实操)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

续上篇博主MySQL之视图&索引&执行计划这篇给大家讲解MySQL之子查询、连接查询(内&外)以及分页查询

一、SQL脚本

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 80018
 Source Host           : localhost:3306
 Source Schema         : mybatis_ssm

 Target Server Type    : MySQL
 Target Server Version : 80018
 File Encoding         : 65001

 Date: 04/07/2023 23:53:33
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_mysql_course
-- ----------------------------
DROP TABLE IF EXISTS `t_mysql_course`;
CREATE TABLE `t_mysql_course`  (
  `cid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程编号',
  `cname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程名称',
  `tid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '教师编号',
  PRIMARY KEY (`cid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '课程信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_mysql_course
-- ----------------------------
INSERT INTO `t_mysql_course` VALUES ('01', '语文', '02');
INSERT INTO `t_mysql_course` VALUES ('02', '数学', '01');
INSERT INTO `t_mysql_course` VALUES ('03', '英语', '03');

-- ----------------------------
-- Table structure for t_mysql_score
-- ----------------------------
DROP TABLE IF EXISTS `t_mysql_score`;
CREATE TABLE `t_mysql_score`  (
  `sid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生编号,外键',
  `cid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程编号,外键',
  `score` float NULL DEFAULT 0 COMMENT '成绩',
  INDEX `sid`(`sid`) USING BTREE,
  INDEX `cid`(`cid`) USING BTREE,
  CONSTRAINT `t_mysql_score_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `t_mysql_student` (`sid`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  CONSTRAINT `t_mysql_score_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `t_mysql_course` (`cid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '成绩信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_mysql_score
-- ----------------------------
INSERT INTO `t_mysql_score` VALUES ('01', '01', 80);
INSERT INTO `t_mysql_score` VALUES ('01', '02', 90);
INSERT INTO `t_mysql_score` VALUES ('01', '03', 99);
INSERT INTO `t_mysql_score` VALUES ('02', '01', 70);
INSERT INTO `t_mysql_score` VALUES ('02', '02', 60);
INSERT INTO `t_mysql_score` VALUES ('02', '03', 80);
INSERT INTO `t_mysql_score` VALUES ('03', '01', 80);
INSERT INTO `t_mysql_score` VALUES ('03', '02', 80);
INSERT INTO `t_mysql_score` VALUES ('03', '03', 80);
INSERT INTO `t_mysql_score` VALUES ('04', '01', 50);
INSERT INTO `t_mysql_score` VALUES ('04', '02', 30);
INSERT INTO `t_mysql_score` VALUES ('04', '03', 20);
INSERT INTO `t_mysql_score` VALUES ('05', '01', 76);
INSERT INTO `t_mysql_score` VALUES ('05', '02', 87);
INSERT INTO `t_mysql_score` VALUES ('06', '01', 31);
INSERT INTO `t_mysql_score` VALUES ('06', '03', 34);
INSERT INTO `t_mysql_score` VALUES ('07', '02', 89);
INSERT INTO `t_mysql_score` VALUES ('07', '03', 98);

-- ----------------------------
-- Table structure for t_mysql_student
-- ----------------------------
DROP TABLE IF EXISTS `t_mysql_student`;
CREATE TABLE `t_mysql_student`  (
  `sid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生编号',
  `sname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生名称',
  `sage` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生年龄',
  `ssex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生性别',
  PRIMARY KEY (`sid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '学生信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_mysql_student
-- ----------------------------
INSERT INTO `t_mysql_student` VALUES ('01', '赵雷', '1990-01-01', '男');
INSERT INTO `t_mysql_student` VALUES ('02', '钱电', '1990-12-21', '男');
INSERT INTO `t_mysql_student` VALUES ('03', '孙风', '1990-12-20', '男');
INSERT INTO `t_mysql_student` VALUES ('04', '李云', '1990-12-06', '男');
INSERT INTO `t_mysql_student` VALUES ('05', '周梅', '1991-12-01', '女');
INSERT INTO `t_mysql_student` VALUES ('06', '吴兰', '1992-01-01', '女');
INSERT INTO `t_mysql_student` VALUES ('07', '郑竹', '1989-01-01', '女');
INSERT INTO `t_mysql_student` VALUES ('09', '张三', '2017-12-20', '女');
INSERT INTO `t_mysql_student` VALUES ('10', '李四', '2017-12-25', '女');
INSERT INTO `t_mysql_student` VALUES ('11', '李四', '2012-06-06', '女');
INSERT INTO `t_mysql_student` VALUES ('12', '赵六', '2013-06-13', '女');
INSERT INTO `t_mysql_student` VALUES ('13', '孙七', '2014-06-01', '女');

-- ----------------------------
-- Table structure for t_mysql_teacher
-- ----------------------------
DROP TABLE IF EXISTS `t_mysql_teacher`;
CREATE TABLE `t_mysql_teacher`  (
  `tid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '教师编号',
  `tname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '教师名称',
  PRIMARY KEY (`tid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '教师信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_mysql_teacher
-- ----------------------------
INSERT INTO `t_mysql_teacher` VALUES ('01', '张三');
INSERT INTO `t_mysql_teacher` VALUES ('02', '李四');
INSERT INTO `t_mysql_teacher` VALUES ('03', '王五');

SET FOREIGN_KEY_CHECKS = 1;

二、实操以及实现思路

  • 09)查询学过「张三」老师授课的同学的信息
SELECT
	s.*,
	c.cname,
	t.tname,
	sc.score 
FROM
	t_mysql_teacher t,
	t_mysql_course c,
	t_mysql_student s,
	t_mysql_score sc 
WHERE
	t.tid = c.tid 
	AND c.cid = sc.cid 
	AND sc.sid = s.sid 
	AND t.tname = '张三'

MySQL之子查询、连接查询(内&外)以及分页查询(实操),实施运维工程师,mysql,数据库

  • 10)查询没有学全所有课程的同学的信息
    分析:没有学全,学全了有多少门,统计一共有多少门学科
    统计每一个学生学了多少门
SELECT
	s.sid,
	s.sname,
	count( sc.score ) n 
FROM
	t_mysql_student s
	LEFT JOIN t_mysql_score sc ON s.sid = sc.sid 
GROUP BY
	s.sid,
	s.sname 
HAVING
	n <(
	SELECT
		count( 1 ) 
	FROM
	t_mysql_course)
	

MySQL之子查询、连接查询(内&外)以及分页查询(实操),实施运维工程师,mysql,数据库

  • 11)查询没学过"张三"老师讲授的任一门课程的学生姓名
    分析:子查询
    张三教了哪些课程
    找学过张三的课程有哪些人
SELECT
	s.sid,
	s.sname 
FROM
	t_mysql_score sc,
	t_mysql_student s 
WHERE
	s.sid = sc.sid 
	AND sc.cid NOT IN ( SELECT cid FROM t_mysql_course c, t_mysql_teacher t WHERE c.tid = t.tid AND t.tname = '张三' ) 
GROUP BY
	s.sid,
	s.sname

MySQL之子查询、连接查询(内&外)以及分页查询(实操),实施运维工程师,mysql,数据库

  • 12)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
    分析:聚合函数 内连接 要先筛选再分组
SELECT
	s.sid,
	s.sname,
	avg( sc.score ) 
FROM
	t_mysql_student s,
	t_mysql_score sc 
WHERE
	s.sid = sc.sid 
	AND sc.score < 60 
GROUP BY
	s.sid,
	s.sname

MySQL之子查询、连接查询(内&外)以及分页查询(实操),实施运维工程师,mysql,数据库

  • 13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息
SELECT
	s.*,
	sc.score 
FROM
	t_mysql_student s,
	t_mysql_score sc 
WHERE
	s.sid = sc.sid 
	AND sc.cid = '01' 
	AND sc.score < 60 
ORDER BY
	sc.score DESC

MySQL之子查询、连接查询(内&外)以及分页查询(实操),实施运维工程师,mysql,数据库

  • 14)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
    分析:聚合函数 GROUP BY
    从高到低 ORDER BY DESC
    所有学生的所有课程的成绩
    姓名 语文 数学 英语 平均成绩
SELECT
	s.sid,
	s.sname,
	sum((case when sc.cid='01' then sc.score end))语文,
	sum((case when sc.cid='02' then sc.score end))数学,
	sum((case when sc.cid='03' then sc.score END))英语,
	round(avg(sc.score),2) 平均分
 FROM
	t_mysql_score sc
	RIGHT JOIN t_mysql_student s ON sc.sid = s.sid 
GROUP BY
	s.sid,
	s.sname

MySQL之子查询、连接查询(内&外)以及分页查询(实操),实施运维工程师,mysql,数据库

	SELECT
	s.sid,
	s.sname,
	sum(if(sc.cid='01',sc.score,0))语文,
	sum(if(sc.cid='02',sc.score,0))数学,
	sum(if(sc.cid='03',sc.score,0))英语,
	round(avg(sc.score),2) 平均分
 FROM
	t_mysql_score sc
	RIGHT JOIN t_mysql_student s ON sc.sid = s.sid 
GROUP BY
	s.sid,
	s.sname

MySQL之子查询、连接查询(内&外)以及分页查询(实操),实施运维工程师,mysql,数据库

  • 15)查询各科成绩最高分、最低分和平均分:
    以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
    要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
    分析:聚合函数 GROUP BY
    大量使用函数
SELECT
	c.cid,c.cname,
	count(sc.score) 人数,
	max(sc.score) 最高分,
	min(sc.score) 最低分,
	round(avg(sc.score),2) 平均分,
	concat(round(sum(if(sc.score>=60,1,0))/(select count(1) from t_mysql_student)*100,2),'%') 及格率,
	concat(round(sum(if(sc.score>=70 and sc.score<=80,1,0))/(select count(1) from t_mysql_student)*100,2),'%') 中等率,
	concat(round(sum(if(sc.score>80 and sc.score<=90,1,0))/(select count(1) from t_mysql_student)*100,2),'%') 优良率,
	concat(round(sum(if(sc.score>=90,1,0))/(select count(1) from t_mysql_student)*100,2),'%') 优秀率
FROM
 t_mysql_score sc
	LEFT JOIN t_mysql_course c ON sc.cid = c.cid
group by
c.cid,c.cname

MySQL之子查询、连接查询(内&外)以及分页查询(实操),实施运维工程师,mysql,数据库文章来源地址https://www.toymoban.com/news/detail-817766.html

到了这里,关于MySQL之子查询、连接查询(内&外)以及分页查询(实操)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java springboot整合MyBatis实现分页查询以及带条件的分页查询

    之前的文章 java springboot整合MyBatis做数据库查询操作操作了springboot整合MyBatis,然后简单做了个按id查询的操作 那么 我们按上文搭建起的环境继续 我们直接在staffDao接口中声明一个分页函数 这里 我们直接在 sql语句中写limit 分页逻辑 参数是方法接收的 这个函数接收两个参数

    2024年02月10日
    浏览(35)
  • 数据库运维实操优质文章分享(含Oracle、MySQL等) | 2023年3月刊

    本文为大家整理了墨天轮数据社区2023年3月发布的优质技术文章,主题涵盖Oracle、MySQL、PostgreSQL等数据库的基础安装配置操作、故障处理、性能优化等日常实践操作,以及概念梳理、常用脚本等总结记录,分享给大家: Oracle优质技术文章 概念梳理基础配置 Oracle之数据文件和

    2023年04月21日
    浏览(45)
  • 数据库运维实操优质文章分享(含Oracle、MySQL等) | 2023年5月刊

    本文为大家整理了墨天轮数据社区2023年5月发布的优质技术文章,主题涵盖Oracle、MySQL、PostgreSQL等数据库的安装配置、故障处理、性能优化等日常实践操作,以及常用脚本、注意事项等总结记录,分享给大家: Oracle优质技术文章 概念梳理安装配置 Oracle的rwp之旅 Oracle之Hash J

    2024年02月10日
    浏览(31)
  • ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮)

    目录 一、基于 JavaRestClient 查询文档 1.1、查询 API 演示 1.1.1、查询基本框架 DSL 请求的对应格式 响应的解析 1.1.2、全文检索查询 1.1.3、精确查询 1.1.4、复合查询 1.1.5、排序和分页 1.1.6、高亮 1.1.1、查询基本框架 接下里通过一个 match_all 查询所有,来演示以下基本的 API. 由上可

    2024年02月07日
    浏览(38)
  • MySQL-分页查询

    应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求 limit语句放在查询语句的最后 公式: 要显示的页数 page,每页的条目数size select 查询列表 from 表 limit (page-1)*size,size; size=10 page 第一页 0-9 第二页 10-19 第三页 20-29 案例1:查询前五条员工信息 案例2:查询第11条

    2024年02月09日
    浏览(24)
  • MySQL——分页查询

            分页查询学习笔记:         课后习题:

    2024年02月09日
    浏览(24)
  • SQL语句之子查询

    子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。 SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,

    2023年04月27日
    浏览(33)
  • 【MybatisPlus】MP的分页查询、多条件查询以及查询过程中解决null的空值判定

    MP这样一款强大的持久层框架处理起来复杂的SQL来也是得心应手,效率极高,快快与我一同领略Plus的独特魅力吧 1.调用方法传入参数获取返回值 创建IPage分页对象,设置分页参数,1为当前页码,3为每页显示的记录数,执行分页查询并获取其结果 2.设置分页拦截器 将MP提供的分页

    2024年01月17日
    浏览(29)
  • MySQL分页查询的5种方法

    方式1: select * from table order by id limit m, n; 很简单,该语句的意思就是查询m+n条记录,去掉前m条,返回后n条。无疑该查询能够实现分页,但m越大,查询性能就越低,因为MySQL需要扫描全部m+n条记录。 方式2: select * from table where id #max_id# order by id limit n; 该查询同样会返回后n条

    2024年02月01日
    浏览(25)
  • MySQL分页查询慢怎么办

    今天看到一个问题。 MySQL分页查询慢怎么办? 第一反应是用limit限制返回的条数。 比如 实际上我们限制的只是返回的条数是100,并不是查询时就从第10条开始获取数据。 所以实际上MySQL会从第0条开始查询,得到10+100=110条数据,然后放弃掉前面10条数据,返回100条数据。 所以

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包