所谓子查询,就是指在一个查询之中嵌套了其他的若干查询,通过子查询可以实现多表查询,该查询语句中可能包含IN,ANY,ALL和EXISTS等关键字,除此之外还可以包含比较运算符,子查询经常出现在WHERE和FROM字句中。

WHERE字句中的子查询:该位置处的子查询一般返回单行单列,多行单列,单行多列数据记录。

FROM字句中的子查询:该位置处的子查询一般返回多行多列数据记录,可以当作一张临时表。

1. 返回结果为单行单列和单行多列子查询

当子查询的返回结果为单行单列数据记录时,该子查询语句一般在主查询语句的WHERE子句里,通常会包含比较运算符(">","<","=","!="等)。

1.1 返回结果为单行单列子查询

SELECT * FROM e_employee WHERE sal >(SELECT sal FROM t_employee WHERE ename='SMITH')

1.2 返回结果为单行多列子查询

SELECT ename,sal,job FROM e_employee WHERE (sal,job) = (SELECT sal,job FROM t_employee WHERE ename='SMITH')

2. 返回结果为多行单列子查询

当子查询的返回结果为多行单列数据记录时,该子查询语句一般在主查询语句的WHERE子句里,通常会包含IN,ANY,ALL,EXISTS等关键字。

2.1 带有关键字IN的子查询

当主查询语句的条件是子查询的查询结果时,就可以通过关键字IN来进行判断,相反如果想实现主查询的条件不是子查询的查询结果时,就可以通过关键字NOT IN来进行判断。

SELECT * FROM t_employee WHERE deptno IN (SELECT deptno FROM t_dept)

2.2 带有关键字ANY的子查询

SELECT ename,sal FROM t_employee WHERE sal >ANY (SELECT sal FROM t_employee WHERE job='MANAGER')

关键字ANY用来表示主查询的条件为满足子查询返回查询结果中任意一条数据记录,该关键字有三种匹配方式,分别如下:

=ANY:其功能与关键字IN一样。

>ANY(>=ANY):比子查询中返回数据记录中最小的还要大于(大于等于)数据记录。

<ANY(<=ANY):比子查询中返回数据记录中最大的还要小于(小于等于)数据记录。

2.3 带有关键字ALL的子查询

SELECT ename,sal FROM t_employee WHERE sal >ALL (SELECT sal FROM t_employee WHERE job='MANAGER')

关键字ALL用来表示主查询的条件为满足子查询返回查询结果中所有数据记录,该关键字有以下两种匹配方式。

>ALL(>=ALL):比子查询中返回数据记录中最大的还要大于(大于等于)数据记录。

<ALL(<=ALL):比子查询中返回数据记录中最小的还要小于(小于等于)数据记录。

2.4 带有关键字EXISTS的子查询

关键字EXISTS是一个布尔类型,当返回结果集时为TRUE,不能返回结果集时为FALSE。查询时EXISTS对外表采用遍历方式逐条查询,每次查询都会比较EXISTS的条件语句,当EXISTS里的条件语句返回记录行时则条件为真,此时返回当前遍历到的记录;反之,如果EXISTS里的条件语句不能返回记录行,则丢弃当前遍历到的记录。

SELECT * FROM t_dept c WHERE NOT EXISTS (SELECT * FROM e_employee WHERE deptno=c.deptno);

3. 返回结果为多行多列子查询

当子查询的返回结果为多行多列数据记录时,该子查询语句一般会在主查询语句的FROM子句里,被当作一张临时表的方式来处理。

mysql之子查询的更多相关文章

  1. mysql in 子查询 效率慢 优化(转)

    mysql in 子查询 效率慢 优化(转) 现在的CMS系统.博客系统.BBS等都喜欢使用标签tag作交叉链接,因此我也尝鲜用了下.但用了后发现我想查询某个tag的文章列表时速度很慢,达到5秒之久! ...

  2. MySQL 行子查询(转)

    MySQL 行子查询 行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集. 一个行子查询的例子如下: SELECT * FROM table1 WH ...

  3. MySQL FROM 子查询

    FROM 子句中的子查询 MySQL FROM 子查询是指 FROM 的子句作为子查询语句,主查询再到子查询结果中获取需要的数据.FROM 子查询语法如下: SELECT ... FROM (subq ...

  4. MySQL 表子查询

    MySQL 表子查询 表子查询是指子查询返回的结果集是 N 行 N 列的一个表数据. MySQL 表子查询实例 下面是用于例子的两张原始数据表: article 表: aid title conten ...

  5. MySQL 行子查询

    MySQL 行子查询 行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集. 一个行子查询的例子如下: SELECT * FROM table1 WH ...

  6. Mysql in子查询中加limit报错

    Mysql in子查询中加limit报错 select id from aa where id in ( select id from bb limit 10 ); 改写成 SELECT id FRO ...

  7. MySQL(五) —— 子查询

    子查询(SubQuery)是指出现在其他SQL语句内的SELECT语句. 如: SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中 SELE ...

  8. MySql优化子查询

    用子查询语句来影响子查询中产生结果rows的数量和顺序. For example: SELECT * FROM t1 WHERE t1.column1 IN (SELECT column1 FROM ...

  9. Mysql的子查询相关知识,少但是精

    Mysql子查询 概念分析: 根据相关性分: (1)不相关子查询:一条Sql语句中含有多条SELECT语句,先执行子查询,再执行外查询,子查询可对立运行 关键字:(1)先子查询,再外查询 (2)可以对 ...

  10. 聊聊MySQL的子查询

    1. 背景 在之前介绍MySQL执行计划的博文中已经谈及了一些关于子查询相关的执行计划与优化.本文将重点介绍MySQL中与子查询相关的内容,设计子查询优化策略,包含半连接子查询的优化与非半连接子查询的 ...

随机推荐

  1. Es6懒加载

    const Login = resolve => require(['@/components/Login'], resolve) 注(当路由被访问的时候才加载这个组件)

  2. zookeeper分布式算法和部署

    算法摘要 安装 配置 监控 创建节点 二阶段提交(Two-Phase Commit) 投票和执行 协调者向参与者发送事务内容,询问是否可以提交,各参与者节点执行事务并向协调者反馈 如果所有参与者反馈y ...

  3. Xamarin 2017.9.13发布更新

     Xamarin 2017.9.13发布更新 Visual Studio 2017更新到15.3.4.其中,Xamarin.Visual更新到4.6.3.4;Xamarin.iOS更新到10.12.3 ...

  4. 路由跟踪工具0trace

    路由跟踪工具0trace   0trace是Kali Linuz自带的一个Shell脚本工具.该工具基于已建立的TCP连接,进行路由探测,实现侦查和防火墙穿透功能.使用时候,用户首先使用Telnet之 ...

  5. nyoj 211&&poj 3660

    Cow Contest 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, ...

  6. 克鲁斯卡尔(并查集)hdu 1233

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  7. nyoj 18 The Triangle

    The Triangle 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure ...

  8. 【BZOJ 2916】 2916: [Poi1997]Monochromatic Triangles (容斥)

    2916: [Poi1997]Monochromatic Triangles Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 310  Solved: 1 ...

  9. 一个安卓应用 多少个 dalvik 虚拟机

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 一个

  10. hdu 3681 压缩dp+搜索

    题意:一个机器人想越狱,他只能带一定电量的电池,'S'表示道路可行,'G'表示充电器, 只可充电一次,但是可以经过很多次.'F'表示起点,'Y'表示要破坏的机关,也是只能破坏一次,但是可以经过无数次. ...