子查询

子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,为了让读者更加清楚子查询的概念。

子查询返回结果
子查询可以返回的数据类型一共分为四种:

    1. 单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;
    2. 单行多列:返回一行数据中多个列的内容;
    3. 多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围;
    4. 多行多列:查询返回的结果是一张临时表;

WHERE子句中使用子查询

在WHERE子句之中处理单行单列子查询、多行单列子查询、单行多列子查询。

单行单列子查询

 示例一、查询公司之中工资最低的雇员的完整信息
--查询公司之中工资最低的雇员的完整信息
SELECT *
FROM emp e
WHERE e.sal=(
SELECT MIN(sal)
FROM emp);

示例二、查询出基本工资比ALLEN低的全部雇员信息

-- 查询出基本工资比ALLEN低的全部雇员信息
SELECT *
FROM emp e
WHERE e.sal<(
SELECT sal
FROM emp
WHERE ename='ALLEN'
);

示例三、查询基本工资高于公司平均薪金的全部雇员信息

--查询基本工资高于公司平均薪金的全部雇员信息
SELECT *
FROM emp e
WHERE e.sal>(
SELECT AVG(sal)
FROM emp);

单行多列子查询。

示例四、查找出与ALLEN从事同一工作,并且基本工资高于雇员编号为7521的全部雇员信息,

--查找出与ALLEN从事同一工作,并且基本工资高于雇员编号为7521的全部雇员信息,
SELECT *
FROM emp e
WHERE e.job=(
SELECT job
FROM emp
WHERE ename='ALLEN')
AND e.sal>(
SELECT sal
FROM emp
WHERE empno=7521);

示例五、查询与SCOTT从事同一工作且工资相同的雇员信息

SELECT *
FROM emp e
WHERE (e.job,e.sal) = (
SELECT job,sal
FROM emp
WHERE ename='SCOTT')
AND ename<>'SCOTT';

示例六、查询与雇员7566从事同一工作且领导相同的全部雇员信息

  --查询与雇员7566从事同一工作且领导相同的全部雇员信息
SELECT *
FROM emp e
WHERE (e.job,e.mgr) =(
SELECT job,mgr
FROM emp
WHERE empno=7566
);

示例七、查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)

--查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)
SELECT *
FROM emp e
WHERE (e.job,to_char(e.hiredate,'yyyy'))=(
SELECT job,to_char(hiredate,'YYYY')
FROM emp
WHERE ename='ALLEN'
);

多行单列子查询

主要使用三种操作符:IN、ANY、ALL
 IN操作

示例八、查询出与每个部门中最低工资相同的全部雇员信息

--查询出与每个部门中最低工资相同的全部雇员信息
SELECT *
FROM emp e
WHERE e.sal IN(
SELECT MIN(sal)
FROM emp
GROUP BY deptno
);

示例九、查询出不与每个部门中最低工资相同的全部雇员信息

--查询出不与每个部门中最低工资相同的全部雇员信息
SELECT *
FROM emp e
WHERE e.sal NOT IN(
SELECT MIN(sal)
FROM emp
GROUP BY deptno
);

ANY在使用中有如下三种使用形式:
=ANY:表示与子查询中的每个元素进行比较,功能与IN类似(然而<>ANY不等价于NOT IN)
>ANY:比子查询中返回结果的最小的要大(还包含了>=ANY)
<ANY:比子查询中返回结果的最大的要小(还包含了<=ANY)

示例十、查询出每个部门经理的工资

--查询出每个部门经理的工资

SELECT  *
FROM emp
WHERE sal = ANY (
SELECT MIN (sal)
FROM emp
WHERE job='MANAGER'
GROUP BY deptno
);

示例十一、查询出每个部门大于经理的工资

--查询出每个部门大于经理的工资
SELECT *
FROM emp
WHERE sal > ANY (
SELECT MIN (sal)
FROM emp
WHERE job='MANAGER'
GROUP BY deptno
);

示例十二、查询出每个部门小于经理的工资

--查询出每个部门小于经理的工资
SELECT *
FROM emp
WHERE sal < ANY (
SELECT MIN (sal)
FROM emp
WHERE job='MANAGER'
GROUP BY deptno
);

ALL操作符有以下三种用法:
<>ALL:等价于NOT IN(但是=ALL并不等价于IN)
>ALL:比子查询中最大的值还要大(还包含了>=ALL)
<ALL:比子查询中最小的值还要小(还包含了<=ALL)

示例十三、查询出每个部门不等于经理的工资

--查询出每个部门不等于经理的工资
SELECT *
FROM emp
WHERE sal <> ALL (
SELECT MIN (sal)
FROM emp
WHERE job='MANAGER'
GROUP BY deptno
);

示例十四、

SELECT  *
FROM emp
WHERE sal < ALL (
SELECT MIN (sal)
FROM emp
WHERE job='MANAGER'
GROUP BY deptno
);

示例十五、

SELECT  *
FROM emp
WHERE sal >ALL (
SELECT MIN (sal)
FROM emp
WHERE job='MANAGER'
GROUP BY deptno
);
空数据判断
在SQL之中提供了一个exists结构用于判断子查询是否有数据返回。如果子查询中有数据返回,则exists结构返回true,反之返回false。

示例十五、验证exists结构

--验证exists结构
SELECT * FROM emp
WHERE EXISTS( --返回空值,没有内容输出
SELECT * FROM emp WHERE empno=9999); --没有这个编号的员工

示例十六、

 SELECT * FROM emp
WHERE EXISTS(SELECT * FROM emp);--有内容将返回数据

示例十七、

  SELECT * FROM emp
WHERE NOT EXISTS(SELECT * FROM emp);--有数据,但取返,没有内容输出

子查询一(WHERE中的子查询)的更多相关文章

  1. 子查询。ANY三种用法。ALL两种用法。HAVING中使用子查询。SELECT中使用子查询。

    子查询存在的意义是解决多表查询带来的性能问题. 子查询返回单行多列: ANY三种用法: ALL两种用法: HAVING中的子查询返回单行单列: SELECT中使用子查询:(了解就好,避免使用这种方法! ...

  2. 使用resultMap实现ibatis复合数据结构查询(1.多重属性查询;2.属性中含有列表查询)

    以订单为例(订单详情包括了订单的基本信息,配送物流信息,商品信息),直接上代码: 1.多重属性查询 java实体 public class OrderDetail { @XmlElement(requ ...

  3. 在MySQL中使用子查询

    子查询作为数据源 子查询生成的结果集包含行.列数据,因而非常适合将它与表一起包含在from子句的子查询里.例: SELECT d.dept_id, d.name, e_cnt.how_many num ...

  4. 详细讲述MySQL中的子查询操作 (来自脚本之家)

    继续做以下的前期准备工作: 新建一个测试数据库TestDB: ? 1 create database TestDB; 创建测试表table1和table2: ? 1 2 3 4 5 6 7 8 9 1 ...

  5. 在update语句中使用子查询

    在update 中的 where 子句中使用子查询: UPDATE mg_page_log as a  SET  page_num=1 WHERE id in( SELECT id  from mg_ ...

  6. Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)

    为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...

  7. 浅谈T-SQL中的子查询

    引言 这篇文章我们来简单的谈一下子查询的相关知识.子查询可以分为独立子查询和相关子查询.独立子查询不依赖于它所属的外部查询,而相关子查询则依赖于它所属的外部查询.子查询返回的值可以是标量(单值).多值 ...

  8. 在 SQL Server 数据库的 WHERE 语句中使用子查询

    这是关于子查询语句的一系列文章中的第三篇.在这篇文章中我们将讨论WHERE语句中的子查询语句.其他的文章讨论了其他语句中的子查询语句. 本次课程中的所有例子都是基于Microsoft SQL Serv ...

  9. SQL-在Update中进行子查询和左联查询

    以下总结源自后边的三个参考思索和测试而来: 我们有一张行政区划表,为了查询速度的优化,我们需要在这张表中,将每个乡镇的记录中写入其所属的省.市.县, 表如下: 当然,我们可以使用游标或在存储过程中使用 ...

随机推荐

  1. 如何使用 sqlite3 访问 Android 手机的数据库

    如何设置Android手机的sqlite3命令环境 http://www.cnblogs.com/linjiqin/archive/2011/11/28/2266619.html SQLite3 为a ...

  2. 记录一次软件Bug发生的过程

    结束一周的紧张工作,难得的休息时光,坐在电脑前浏览博客.听听歌.看看大片,这也算是一种享受. 因为年度的开发任务已经开始了,所以最近会特别忙,新人的成长又没有想象中的好,经常在他们身上看到自己去年的影 ...

  3. 老生常谈ajax

    一,js中的ajax ajax(Asynchronous Javascript And XML)即为异步的JavaScript和XML,顾名思义,这个技术是和我们当前页面刷新无关的,因为它是异步的,在 ...

  4. 用最简单的例子理解单例模式(Singleton Pattern)

    当从应用程序全局的角度来看,如果只允许类的一个实例产生,就可以考虑单例模式. □ 即时加载的单例模式 把类的实例赋值给类的一个静态字段. class Program { static void Mai ...

  5. 【docker-compose】使用docker-compose部署运行spring boot+mysql 【处理容器的时区问题】【详解】【福利:使用docker-compose构建 wordpress+mysql】

    ==================================================================================================== ...

  6. [翻译] FTCoreText

    FTCoreText An open source Objective-C interface component that makes use of the CoreText framework t ...

  7. Mac 在启动eclipse时 Failed to load JavaHL Library解决方法

    在Mac 10.9.1系统里, 在Eclipse中安装svn的插件,出现如下提示 方法一: 1.根据提示进入链接 http://subclipse.tigris.org/wiki/JavaHL 2. ...

  8. 《JavaScript启示录》

    <JavaScript启示录> 基本信息 作者: (美)Cody Lindley 译者: 徐涛 出版社:人民邮电出版社 ISBN:9787115334947 上架时间:2014-2-21 ...

  9. With Visual Studio, Open Same File In Two Windows, Updates Reflected in Both

    I’ve always been frustrated in Visual Studio (all versions I can remember including latest vs2012) w ...

  10. ubuntu上minigui调试环境的建立

    minigui一共有两个版本:商业版()和GPL版(),问了一下飞漫软件,使用商业版前期的费用是9万,有技术支持,包括5000个licenses的费用,后期10K的量的话,每个licenses要6块, ...