嵌入一个SELECT的语句称为子查询语句。虽然内连接也可以代替子查询,但是内连接效率不高。而且我个人觉得子查询更好理解。


单值子查询

果子查询返回单值,则可以使用关系运算符,例如,等于(=)、不等于(<>)等,将其与主查询结合起来。下面通过例题举例说明。

例 查询所有学生“心理学”的考试成绩,并以考试成绩降序进行排序。

分析:考试成绩在score表中,而该表中没有课名只有课号,所以首先必须从course表中查询“心理学”的课号,然后再从score表中根据查到的课号查询考试成绩。下面列出使用子查询完成查询任务的语句。

SELECT  s_id AS 学号, result1 AS 考试成绩 FROM    score
WHERE   c_id=(SELECT c_id  FROM course  WHERE course='心理学')
ORDER BY result1 DESC;

本例也可以使用内连接查询编写查询语句,具体语句如下所示。

SELECT  s_id AS 学号, result1 AS 考试成绩 FROM    score AS s,course AS c
WHERE   c.course='心理学'  AND s.c_id=c.ID
ORDER BY result1 DESC;
SELECT  s_id AS 学号, result1 AS 考试成绩
FROM    score AS s INNER JOIN course AS c ON s.c_id=c.ID
WHERE   c.course='心理学'
ORDER BY result1 DESC;

子查询与聚合函数的配合使用

查询和聚合函数配合使用,其实是当前子查询的最大用途。因为,聚合函数通常都在SELECT子句字段列表处出现,而WHERE子句中又不能包含聚合函数,所以,通常是使用子查询获得聚合函数的返回值,然后将该返回值放到主查询中,最后再执行结合好后的查询语句。

例 查询出生日期最小(年龄最大)的学生的所有信息。

SELECT  * FROM   student
WHERE  birthday=(SELECT MIN(birthday) FROM student);

例 查询“心理学”考试成绩大于其考试成绩平均分的所有学生的学号、平时成绩和考试成绩。

SELECT s_id AS 学号, result2 AS 平时成绩, result1 AS 考试成绩 FROM   score
WHERE c_id=(SELECT ID FROM course WHERE course='心理学')
AND   result1>(SELECT AVG(result1) FROM  score WHERE c_id=(SELECT ID FROM course WHERE course='心理学'))
ORDER BY result1 DESC;

将学生姓名也加上, 此时便需要将student表连接进来,

SELECT st.ID AS 学号, st.name AS 姓名,result2 AS 平时成绩, result1 AS 考试成绩
FROM  student AS st, score AS s, (SELECT ID FROM course  WHERE course='心理学') AS a
WHERE result1>(SELECT AVG(result1) FROM  score WHERE c_id=a.ID)
AND s.c_id=a.ID AND st.ID=s.s_id
ORDER BY result1 DESC;


列值子查询

查询所有课程类型为“必修”的学生的考试成绩,并按照课号进行升序排序。

如果使用子查询,本例的查询任务可以仅用一条语句完成,下面列出其具体语句。

SELECT  * FROM    score
WHERE  c_id IN (SELECT  ID FROM   course WHERE type='必修')
ORDER BY c_id, s_id;

 例 查询没有参加任何考试的学生的学号、姓名和所属院

SELECT  ID AS 学号, name AS 姓名, institute AS 所属院系 FROM    student
WHERE   ID NOT IN (SELECT DISTINCT s_id FROM     score)
ORDER BY ID;


相关子查询

相关子查询在子查询语句中调用了主查询用到的表字段。下面通过举例说明相关子查询的用法和其执行原理。

例 从student表中,查询计科系所有学生的学号、姓名和考试总成绩,并按照考试总成绩降序排序。

SELECT ID AS 学号, name AS 姓名,(SELECT SUM(result1)FROM   score AS s WHERE s.s_id=st.ID) AS 考试总成绩
FROM   student AS st WHERE  institute='计算机学院'
ORDER BY 考试总成绩 DESC;

如果使用表连接查询编写本例的查询语句,则其具体语句如下所示。

SELECT st.ID AS 学号,st.name AS 姓名,SUM(s.result1) AS 考试总成绩
FROM   student AS st,score AS s
WHERE  institute='计算机学院' AND    s.s_id=st.ID
GROUP BY st.ID, st.name
ORDER BY 考试总成绩 DESC;

运行结果同上。

若某个学生没有考试信息,那么就可能查不到。所以如果想查询所有计科系学生的考试信息,则应当使用左外连接,则其语句如下所示。

SELECT st.ID AS 学号,st.name AS 姓名,SUM(s.result1) AS 考试总成绩
FROM   student AS st LEFT JOIN score AS s ON s.s_id=st.ID
WHERE  institute='计算机学院'
GROUP BY st.ID, st.name
ORDER BY 考试总成绩 DESC;

运行结果同上。

MySQL数据库11——子查询语句相关推荐

  1. mysql数据库表子查询语句_MySQL使用子查询教程

    #MYSQL#这是我MyySQL教程的第四篇了,可能对于一些大神来说这些都是小儿科,但是我还是相信这些东西会对一些人有帮助的,本篇主要会介绍上面是子查询以及如何使用它们.大概会从,什么是子查询,利用子 ...

  2. mysql 单表子查询语句_MySQL基本SQL查询语句:多表查询和子查询示例

    一.简单查询:基本语法: 代码如下 SELECT * FROM tb_name; 查询全部 代码如下 SELECT field1,field2 FROM tb_name; 投影 代码如下 SELECT ...

  3. Mysql数据库-使用的查询语句大全

    查询所有字段:select * from 表名; 查询指定字段:select 列1,列2,... from 表名; 使用 as 给字段起别名: select 字段 as 名字.... from 表名; ...

  4. MySQL数据库高级SQL查询语句(单表查询,多表联合查询)

    目录 SQL查询语句 基础查询 条件查询 模糊查询 字段控制查询 排序 聚合函数 分组查询 having子句 limit分页查询 多表连接查询 SQL查询语句 数据查询语言. 数据库执行DQL语句不会 ...

  5. mysql 数据库连表查询语句_数据库连表查询sql语句

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. mysql case 嵌套子查询语句_SQL查询语句SELECT中带有case when嵌套子查询判断的问题...

    展开全部 1.创建两张测试表 create table test_case1(id number, value varchar2(200)); create table test_case2(id n ...

  7. MySQL 数据库 之 高级 SQL 语句(常用查询,正则表达式,运算符,库函数,存储过程)

    文章目录 前言 一 . 常用查询介绍 1.按关键字排序 1.1默认升序 1.2 降序 1.3 多字段的排序 2. 对结果进行分组 2.1 分组统计 3.限制结果条目 3.1 查看前4行 3.2 查看第 ...

  8. mysql数据库多表查询(内连接,外连接,自连接,子查询及案例分析)

    mysql数据库多表查询 之前接触的项目或者自己涉及的部分对于多表查询的使用都比较的少,常常是自己更具案例进行学习,最近见到的比较的多,所以今天就好好的总结一下,为下一步学习做准备! 1.多表查询关系 ...

  9. MySQL中的常见子查询语句

    一.子查询语句格式 基本语法:SELECT 字段列表/* + FROM + 表名 +[WHERE 条件]; 完整语法:SELECT [SELECT 选项] + 字段列表[字段别名] /* + FROM ...

最新文章

  1. 【leetcode】力扣刷题(3):无重复字符的最长子串(go语言)
  2. bootstraptable设置行高度_条码打印软件中不干胶卷纸的标签设置方法
  3. Python中hasattr() getattr() setattr() 函数的使用
  4. JSON数据格式详解
  5. 巴铁 无人驾驶_巴铁?Clip-air?请查收汽车的最新玩法
  6. 小米营销教父的滚烫十年
  7. LIRe 源代码分析 3:基本接口(ImageSearcher)
  8. WeChat8Xposed通用hook框架适配新版微信-单元测试适配新微信
  9. C语言--指针实现字符串逆序输出
  10. word文档更新目录为什么更新不了?
  11. 自动驾驶仿真测试的意义
  12. JPBC库的使用实例——BLS签名
  13. P4231 三步必杀
  14. 深化学习(RL)概念应用以及基于表格型、神经网络型、策略梯度、连续动作空间求解RL​​​​​​​
  15. python推箱子代码详细讲解_Python使用tkinter模块实现推箱子游戏
  16. Java 菜鸟入门 | 深入浅出 Java 注解
  17. 限时免费 | 学习成本超低的Python数据分析手册
  18. 等保2.0(信息安全等级保护)全面解读
  19. HeadFirst设计模式读书笔记--观察者模式(2)(二)
  20. deny和revoke的区别

热门文章

  1. php 精湛技术,【名医风采】范学民:用精湛技术温暖患者
  2. 终极WordPress页面构建器:WPBakery
  3. C++ - 求一个正整数的二进制表示中1的个数
  4. 从零接入微信公众号(Java实现 附源码)
  5. 2021年软件开发趋势大预测
  6. Oracle日志挖掘之LogMiner
  7. 如何获得免费的全SSD云主机?
  8. PHP isset()与empty()的区别
  9. easypoi导出excel不设置样式_EasyPOI 导出excel设置边框,背景颜色,字体样式
  10. 肾有多好,就有多年轻