首页 > 数据库 >MySQL第四章,SQL高级二子查询

MySQL第四章,SQL高级二子查询

时间:2024-11-11 08:50:53浏览次数:3  
标签:SQL 查询 选修 课程 第四章 student MySQL id SELECT

子查询的定义

子查询(Subquery)是嵌套在其他SQL语句中的查询,也称为内查询(Inner Query)或嵌套查询(Nested Query)。子查询可以放在SELECT、INSERT、UPDATE、DELETE等语句中,并且支持多层嵌套,即子查询中还可以包含其他子查询。

子查询的作用

子查询的主要作用包括:

  1. 结构化查询:子查询允许将查询分解为更小的部分,从而使查询更加结构化和易于理解。
  2. 替代复杂连接:在某些情况下,子查询可以替代复杂的连接操作,使查询更加简洁。
  3. 提供灵活的查询条件:子查询可以用于提供动态的查询条件,使查询更加灵活和强大。

子查询的类型

根据子查询返回的结果类型,子查询可以分为以下几类:

  1. 标量子查询:返回单个值的子查询,通常用于比较操作。例如,(SELECT MAX(salary) FROM employees) 返回员工表中的最高工资。
  2. 列级子查询:返回一列值的子查询,通常用于IN或NOT IN等操作符中。例如,(SELECT department_id FROM employees WHERE salary > 5000) 返回工资大于5000的员工的部门ID列表。
  3. 行级子查询:返回一行多列值的子查询,通常用于与主查询中的行进行比较。例如,(SELECT department_id, MAX(salary) FROM employees GROUP BY department_id) 返回每个部门的最高工资及其对应的部门ID。
  4. 表级子查询:返回多行多列值的子查询,通常用于FROM子句中将子查询结果作为临时表使用。例如,SELECT * FROM (SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id) AS avg_salaries 将每个部门的平均工资作为临时表进行查询。

注意事项

  1. 性能问题:子查询可能会影响查询性能,特别是在处理大数据集时。因此,在使用子查询时需要注意性能优化。
  2. 可读性:虽然子查询可以使查询更加灵活和强大,但过多的嵌套和复杂的子查询可能会降低代码的可读性。因此,在使用子查询时需要权衡可读性和性能之间的关系。

综上所述,子查询是MySQL中一种强大的查询工具,可以帮助用户实现更加复杂和灵活的查询需求。在使用子查询时需要注意性能优化和可读性等问题。

IN 子查询

IN 子查询用于测试一个值是否存在于子查询的结果集中。如果子查询返回的结果集中包含该值,则条件为真。

这里是一些语法:

SELECT column_name(s)
FROM table_name
WHERE column_name IN (SELECT statement);

示例
假设有两个表 students 和 coursesstudents 表包含学生的信息,courses 表包含学生选修的课程信息。我们想要找出选修了课程ID为101或102的所有学生。

SELECT student_name
FROM students
WHERE student_id IN (SELECT student_id FROM courses WHERE course_id IN (101, 102));

在这个例子中,子查询 (SELECT student_id FROM courses WHERE course_id IN (101, 102)) 返回选修了课程ID为101或102的所有学生的ID,然后外层查询根据这些ID找出对应的学生姓名。

EXISTS 子查询

EXISTS 子查询用于测试子查询是否返回任何行。如果子查询返回至少一行,则条件为真。

SELECT column_name(s)
FROM table_name
WHERE EXISTS (SELECT statement);

示例
假设我们想要找出至少选修了一门课程的所有学生。

SELECT student_name
FROM students s
WHERE EXISTS (SELECT 1 FROM courses c WHERE c.student_id = s.student_id);

在这个例子中,子查询 (SELECT 1 FROM courses c WHERE c.student_id = s.student_id) 检查是否存在与 students 表中的 student_id 相匹配的 courses 表中的行。如果存在,则 EXISTS 条件为真,外层查询返回该学生的姓名。

综合查询

综合查询通常涉及多个表之间的连接(JOIN)、子查询、聚合函数(如 SUMCOUNTAVG 等)以及分组(GROUP BY)和排序(ORDER BY)。

示例
假设我们想要找出每个学生选修的课程数量,并按课程数量降序排列。

SELECT s.student_name, COUNT(c.course_id) AS course_count
FROM students s
LEFT JOIN courses c ON s.student_id = c.student_id
GROUP BY s.student_id, s.student_name
ORDER BY course_count DESC;

在这个例子中,我们使用了 LEFT JOIN 来连接 students 和 courses 表,GROUP BY 来按学生分组,COUNT 来计算每个学生选修的课程数量,ORDER BY 来按课程数量降序排列结果。

子查询练习题

  1. 找出选修了最多课程的学生
    • 假设 courses 表包含 student_id 和 course_id 列。
    • 编写一个查询来找出选修了最多课程的学生ID和姓名(假设学生姓名在 students 表中)。
  2. 找出没有选修任何课程的学生
    • 使用 EXISTS 子查询来找出没有选修任何课程的学生姓名。
  3. 计算每个课程的平均成绩,并找出平均成绩高于80分的课程
    • 假设 grades 表包含 student_idcourse_id 和 grade 列。
    • 编写一个查询来计算每个课程的平均成绩,并只返回平均成绩高于80分的课程ID和平均成绩。
  4. 找出至少有两个学生选修的课程
    • 使用 GROUP BY 和 HAVING 子句来找出至少有两个学生选修的课程ID。
  5. 找出每个学生选修的课程中成绩最高的那门课程的成绩
    • 使用子查询和 MAX 函数来找出每个学生选修的课程中成绩最高的那门课程的成绩。

这些练习题涵盖了 IN 子查询、EXISTS 子查询、连接、聚合函数、分组和排序等SQL综合查询的各个方面。希望这些示例和练习题能帮助您更好地理解和应用SQL子查询和综合查询。

标签:SQL,查询,选修,课程,第四章,student,MySQL,id,SELECT
From: https://blog.csdn.net/it_s_raining/article/details/143570031

相关文章

  • 基于Python电影票房数据分析可视化系统 Flask框架 豆瓣电影票房 MySQL数据库 大数据毕
    博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌>......
  • [GXYCTF2019]BabySQli
    题目链接:[GXYCTF2019]BabySQli。个人认为这道题是脑洞题(当然也跟基础业务知识不够有关)。打开题目后环境如下。只有一个登录框,因此常规操作,先测试一下看看。通过多次输入不同的UserName、password发现,存在admin用户,并且可以遍历UserName。接下来尝试注入,发现似乎只有......
  • SQL注入攻击及其在SpringBoot中使用MyBatisPlus的防范策略
    SQL注入攻击及其在SpringBoot中使用MyBatisPlus的防范策略随着互联网技术的飞速发展,Web应用的安全问题日益凸显,其中SQL注入攻击是最常见的安全威胁之一。SQL注入攻击不仅可能导致敏感数据泄露,还可能引发数据篡改、服务中断等严重后果。本文将详细介绍SQL注入攻击的基本概念......
  • 第四章 数据编码与演化
    应用程序总是增增改改,而修改程序大多数情况下也在修改存储的数据数据格式发生改变时,需要代码更改:服务端:rollingupdate/stagedrollout,即灰度发布客户端:用户可能相当长一段时间都不会升级软件存在问题:新旧版本的代码,以及新旧版本数据格式在系统中同时共存。为了系统正常运......
  • win10安装与配置Mysql9.1时执行net start mysql显示服务名无效请输入NET HELPMSG 2185
    几年的时间mysql从5.0到9.x了,在windows系统上安装两种方式,MSI安装程序和ZIP压缩包。这里不讲安装教程,只说说安装报错的原因。最近用zip压缩包下载解压配置,下载社区版本,在官网下载对应的版本。https://downloads.mysql.com/archives/community/在前面修改my.ini文件,以及执行......
  • 在VMware已安装的CentOS7.9上编译安装mysql5.6
    VMware已安装的CentOS7.9上编译安装mysql5.6目录1、安装依赖2、下载MySQL源码3、解压源码包4、编译MySQL4.1、编译前,cmake生成Makefile4.2、编译MySQL5、安装MySQL6、配置MySQL6.1、创建MySQL的用户和组6.2、创建数据目录并设置权限6.3、初始化MySQL数据库7、......
  • postgresql事务与oracle中的事务差异
    事务事务ID及回卷参见postgresql中的事务回卷原理及预防措施。子事务(事务处理:概念与技术4.7)  子事务具有ACI特性,但是不具有D特性。只会在主事务提交时,才会提交,无法单独提交。pg不支持子事务。xact保存点保存点是不支持子事务/嵌套事务时的折中实现,但它是ANSISQL......
  • DBeaver如何一次性执行多条sql语句,原来和单条不一样!
    前言我之前一直是用Navicat来连接数据库的,说实话,用起来真的很舒服。但是,后来,我离职了,换了一家新公司。新公司有一个规定,不准使用Navicat,其中的原因众所周知。由于Navicat是付费的,而公司又不想付这笔钱。而且,也不能使用破解的。于是,公司给我们推荐了DBeaver这款连接工具。好吧......
  • 揭秘MySQL数据一致性:从原理到实践,助你征服大厂面试官
    ......
  • python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表
    python-26-PythonORM系列之pymysql实现对数据库的增删改查及新建表一.简介在Python基础系列ORM部分我们为大家介绍了如何搭建MySQL数据和MySQL一些访问配置,同时细节的同学应该已经了解到了ORM的2个库pymysql和sqlalchemy;PyMySQL—MySQL数据库驱动,用于与MySQL数据库......