三种常见的子查询

一、什么是子查询?

  (1)子查询(Subquery)是指出现在其他SQL语句内的SELECT子句

    例如:SELECT * FROM t1 WHERE col1=(SELECT col2 FROM

    t2);其中SELECT * FROM t1,称为Outer Query/Outer

    Statement ,SELECT col2 FROM t2,称之为SubQuery

  (2)子查询指嵌套在查询内部,且必须始终出现在圆括号内。

  (3)子查询可以包含多个关键字或条件,比如DISTINCT、GROUP BY、ORDER BY、LIMIT以及相关的函数等。

  (4)子查询的外层查询可以是SELECT,INSERT,UPDATE,SET或DO.

  (5)子查询的返回值:可以返回标量、一行、一列或子查询

二、使用比较运算符的子查询

常见的比较运算符

  =、 >、 <、 >=、 <= 、 <>、 !=、 <=>

语法结构

  operand comparison_operator subquery

2.1  比如我现在要查看一下这个表中所有商品的平均价格,操作命令及结果如下:

select avg(goods_price)  from  tdb_goods;

  这个AVG()它实际上是一个聚合函数,只有一个返回值,作用是求平均值。从结果来看,我们发现有很多的小数。

select  round(avg(goods_price))   from   tdb_goods;

  那么我们可不可以做四舍五入呢?当然可以,这里就要用到另外一个函数round(),操作命令及结果如下:

select  round(avg(goods_price),2)  from   tdb_goods;

  那么下面我们来查看一下,这个表里所有大于这个平均值的记录,比如我们查找其中的几个字段,操作命令及结果如下:

select  goods_id,goods_name,goods_price   from   tdb_goods   where   goods_price     >=     5636.36;

  

  我们发现这个平均值的结果是我们上一条查询的结果,那么我们能不能把两条语句合并到一起呢,当然是可以的,那么这里边就涉及到子查询,那么修改后的命令及结果如下:

select  goods_id,goods_name,goods_price   from  tdb_goods  where  goods_price   >=    select   round(avg(goods_price),2)    from    tdb_goods);

  这就是我们使用>=这个比较运算符所引起的子查询。

2.2   下面我们再来举个例子,比如说,我现在要查找一下超级本类型的商品的价格,操作命令及结果如下:

select    goods_price   from  tdb_goods   where   goods_cate=‘超极本‘;

  我们发现有3个价格,那么现在我想查找哪些商品的价格大于这些超级本,我该怎么写呢?我们先这样写,操作命令及结果如下:

  我们发现系统提示我们错误,子查询返回不止一行。

  为什么会有这个错误呢?因为我们知道我们的子查询一共返回了3个结果,我们没有指定是大于这3个结果中的哪一个,那么这就要涉及到另外几个关键字。他们分别是ANY、SOM、ALL,也就是说如果你的子查询在返回多个结果的时候,可以使用ANY、SOME或ALL来做修饰。其中ANY和SOME 是等价的,就是说只要符合其中一个就行,而ALL是要符合全部。使用这三个关键字是有一些原则的,如下图:

  下面我们来做个演示,我们把刚才的语句做个简单的修改,我们就在>后面加个any,操作命令及结果如下:

select  goods_id,goods_name,goods_price   from  tdb_goods  where  goods_price   > ANY (select  goods_price  from  tdb_goods   where  goods_cate = ‘超极本‘);

  从结果我们可以发现都是返回大于4299的结果,所以大于ANY就是大于任何一个都行,只要比最小一个大就行。如果说大于ALL,那就是要大于所有子查询结果的最大值,下面我们就来改成ALL试一下,操作命令及结果如下:

select  goods_id,goods_name,goods_price   from  tdb_goods  where  goods_price   >  ALL (select  goods_price  from  tdb_goods   where  goods_cate = ‘超极本‘);

三、使用[NOT] IN 的子查询

语法结构

  operand comparison_operator [NOT] IN (subquery)

=ANY 运算符与IN等效

!=ALL或<>ALL运算与NOT IN 等效

  我们只需要改一下关键字就行了。

四、使用[NOT] EXISTS的子查询

  如果子查询返回任意行,EXISTS将返回TRUE;否则为FALSE。这种方法相对用的比较少,大家了解一下即可。

时间: 2024-10-08 14:09:25

三种常见的子查询的相关文章

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

继续做以下的前期准备工作: 新建一个测试数据库TestDB: ? 1 create database TestDB; 创建测试表table1和table2: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE table1 (   customer_id VARCHAR(10) NOT NULL,   city VARCHAR(10) NOT NULL,   PRIMARY KEY(customer_id) )ENGINE=INNODB DEFAULT CH

MYSQL优化派生表(子查询)在From语句中的

Mysql 在5.6.3中,优化器更有效率地处理派生表(在from语句中的子查询): 优化器推迟物化子查询在from语句中的子查询,知道子查询的内容在查询正真执行需要时,才开始物化.这一举措提高了性能: 1:之前版本(5.6.3),from语句中的子查询在explain select 查看执行计划语句执行时就会物化.它导致了部分查询执行,但explain语句的目的是获取执行计划信息,而不是执行查询 该版本物化不会在explain中发生,所以explain执行计划结果的得到更快: 2:因为上面提及

mysql优化---in型子查询,exists子查询,from 型子查询

in型子查询引出的陷阱:(扫更少的行,不要临时表,不要文件排序就快) 题: 在ecshop商城表中,查询6号栏目的商品, (注,6号是一个大栏目) 最直观的: mysql> select goods_id,cat_id,goods_name from goods where cat_id in (select cat_id from category where parent_id=6); 误区: 给我们的感觉是, 先查到内层的6号栏目的子栏目,如7,8,9,11 然后外层, cat_id in

单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询

今日内容 表查询 单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询 单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) u

子查询

子查询返回单行多列: ANY三种用法: ALL两种用法:

SQL Server子查询填充DataSet时报500内部错误的解决办法

运行环境为Visual Studio 2010,数据库为SQL Server 2008. 执行下面SQL语句 SELECT SubsiteId, SubsiteTitle, count(CollectionID) CollectionNumber,count(LName) PlantNumber FROM (SELECT DISTINCT SubsiteId, SubsiteTitle, CollectionID, LName, CName FROM Cumplag_Garden_Plants

Mysql数据库理论基础之五--SELECT单多表查询、子查询、别名

一.简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1.是一种数据库管理系统 2.是一种关联数据库管理系统 3.是一种开放源码软件,且有大量可用的共享MySQL软件 4.MySQL数据库服务器具有快速.可靠和易于使用的特点 5.MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中 InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建.这样,表的大小就能超过单独文件的最大容量.表空间可包括原始磁盘分区,从而使得很大的表成为可能

前端学数据库之子查询

查询数据库,当查询条件比较复杂时,常常需要用到子查询.子查询(Subquery)是指出现在其他SQL语句内的SELECT子句.本文将详细介绍子查询 定义 子查询(Subquery)是指出现在其他SQL语句内的SELECT子句 SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中,SELECT * FROM t1,称为外层查询(Outer Query/Outer Statement),SELECT col2 FROM t2,称为子查询(Su

ThinkPHP3.2 SQL alias 子查询

SELECT info_key, info_value, info_status, edit_time FROM (SELECT * FROM `detail` WHERE login = '[email protected]' ORDER BY edit_time DESC  ) AS aaa GROUP BY info_key 希望通过Thinkphp实现基于alias的子查询,终于参考下面这个文章实现了. http://www.thinkphp.cn/update/122.html 如下是