关闭

史上最简单的 MySQL 教程(三十一)「子查询(上)」

标签: mysqlselect子查询
1904人阅读 评论(10) 收藏 举报
分类:

温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋StarFork,纠错。

子查询

子查询sub query,查询是在某个查询结果之上进行的,一条select语句内部包含了另外一条select语句。

分类

子查询有两种分类方式,分别为:按按结果分类和位置分类。

按结果分类,即根据子查询得到的数据进行分类(理论上,任何一个查询结果都可以理解为一个二维表),分别为:

  • 标量子查询:子查询得到的结果是一行一列,出现的位置在where之后;
  • 列子查询:子查询得到的结果是一列多行,出现的位置在where之后;
  • 行子查询:子查询得到的结果是多行一列(多行多列),出现的位置在where之后;
  • 表子查询:子查询得到的结果是多行多列,出现的位置在from之后。

按位置分类,即根据子查询(select语句)在外部查询(select语句)中出现的位置进行分类,分别为:

  • from子查询:子查询出现在from之后;
  • where子查询:子查询出现在where条件之中;
  • exists子查询:子查询出现在exists里面。

标量子查询

需求:现知道班级名称为PM3.1,想要获取该班的全部学生。

思路

  • 先确定数据源,学生表。
    • select * from student where c_id = ?;
  • 然后获取班级 ID,可以通过(班级表)班级名称来确定。
    • select id from class where grade = "PM3.1";

执行如下 SQL 语句,进行测试:

-- 标量子查询
select * from student where c_id = (select id from class where grade = "PM3.1");

biaol

列子查询

需求:查询所有在读班级(学生表中存在的班级)的学生。

思路

  • 先确定数据源,学生表。
    • select * from student where c_id in ?;
  • 然后确定全部有效的班级 ID。
    • select id from class;

执行如下 SQL 语句,进行测试:

-- 列子查询
select * from student where c_id in (select id from class);

column

如上图所示,我们完成了列子查询。在列子查询的结果为一行多列时,我们需要使用in作为条件进行匹配;此外,在 MySQL 中还有三个类似的条件,分别为:allsomeany

  • any等价于in,表示其中一个;
  • any等价于smoe,而anysome用于否定时却有些区别;
  • all表示等于全部。

值得注意的是,在我们使用上面三个关键字中任何一个的时候,都需要搭配=使用,例如:

-- 列子查询
select * from student where c_id = any (select id from class);

select * from student where c_id = some (select id from class);

select * from student where c_id = all (select id from class);

ass

如上图所示,为anysomeall的肯定用法,下面我们来测试其否定用法:

-- 列子查询
select * from student where c_id != any (select id from class);

select * from student where c_id != some (select id from class);

select * from student where c_id != all (select id from class);

fouze

观察上图,我们会发现anysomeall在用于否定时,其会将null值排除掉。实际上,在真正的开发中,这三个关键字并不常用。


查询class

class

查询student

studnet


温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

5
0
查看评论

史上最简单的 MyBatis 教程

1 前言  MyBatis 源于 Apache 的一个开源项目 iBatis,而 iBatis 一词则来源于“internet”和“abatis”的组合,2010年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为MyBatis ,2013...
  • qq_35246620
  • qq_35246620
  • 2017-02-01 00:49
  • 6624

史上最简单的SpringCloud教程 | 第一篇: 服务的注册与发现(Eureka)

一、spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring cloud是基于spri...
  • fend0875
  • fend0875
  • 2017-04-21 08:39
  • 1578

史上最简单的SpringCloud教程

转载请标明出处:  http://blog.csdn.net/forezp/article/details/70148833  本文出自方志朋的博客 错过了这一篇,你可能再也学不会 Spring Cloud 了!Spring Boot做为下一代 web 框架,Spr...
  • zhongzh86
  • zhongzh86
  • 2017-11-22 14:15
  • 50

微服务:史上最简单的 SpringCloud 教程 | 终章

http://blog.csdn.net/forezp/article/details/70148833  本文出自方志朋的博客 案例全部采用Spring Boot 1.5.x ,Spring Cloud版本为Dalston.RELEASE  码农下载:https://gi...
  • superdangbo
  • superdangbo
  • 2017-11-01 17:20
  • 288

史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring cloud是基于springboot的。本文主要介绍了服务的注册与发现。
  • forezp
  • forezp
  • 2017-04-08 18:16
  • 310973

史上最直白的logistic regression教程 之 五

史上最直白的logistic regression教程整理稿,将4篇博文整理成一个完整的pdf文档,且修改成学术语境。 链接在这里: http://download.csdn.net/detail/u011539200/9290695 0积分下载,求rp,^_^
  • u011539200
  • u011539200
  • 2015-11-22 15:57
  • 660

史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)

这篇文章主要讲述通过feign去消费服务。Feign是一个声明式的web服务客户端,它使得写web服务变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,包括Feign 注解和JAX-RS注解。Feign同时支持可插拔的编码器和解码器。
  • forezp
  • forezp
  • 2017-04-09 11:53
  • 189167

log4j 史上最简单的配置

log4j.properties 文件内容:具体需求课根据自己的意愿选择不同的权限# Log4j properties log4j.rootLogger=INFO, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j....
  • forever_insist
  • forever_insist
  • 2017-11-20 11:26
  • 106

史上最直白的logistic regression教程 之 三

在线性拟合的基础上,我们实现logistic regression了。如前所述,样本集是 {x1,y1},{x2,y2},...,{xn,yn}[1]\{x_1,y_1\}, \{x_2, y_2\}, ..., \{x_n, y_n\}[1] 其中,xi=[1,xi,1,xi,2,xi,3,....
  • u011539200
  • u011539200
  • 2015-11-19 16:09
  • 1362

史上最简单的 MySQL 教程(二十一)「数据的高级操作 之 蠕虫复制」

数据的高级操作蠕虫复制蠕虫复制:从已有的数据表中获取数据,然后将数据进行新增操作,数据成倍(以指数形式)的增加。根据已有表创建新表,即复制表结构,其基本语法为: create table + 表名 + like + [数据库名.]表名; 执行如上 SQL 语句,进行测试:-- 根据已有表,创建新表,...
  • qq_35246620
  • qq_35246620
  • 2017-06-03 21:14
  • 2615
    个人资料
    • 访问:962941次
    • 积分:12930
    • 等级:
    • 排名:第1267名
    • 原创:258篇
    • 转载:86篇
    • 译文:11篇
    • 评论:954条
    博主的 GitHub 账号
    GitHub : Charies Gavin

        鉴于 CSDN 糟糕的用户体验,博主会将一些优质的文章迁移到 Charies Gavin's Blog  欢迎大家在 GitHub 上 Follow 博主,以及 Fork、Star、Watch 博主的项目。


      青春不老 奋斗不止


      好学若饥虚心若愚
    博客专栏