首页 > 数据库 >48. SQL--子查询(嵌套查询)

48. SQL--子查询(嵌套查询)

时间:2022-09-05 16:44:26浏览次数:60  
标签:name 48 -- 查询 column 子句 where select

1. 前言

子查询也称“内部查询”或者“嵌套查询”,是指将一个 select 查询(子查询)的结果作为另一个 sql 语句(主查询)的数据来源或者判断条件。

子查询可以嵌入 select、insert、update 和 delete 语句中,也可以和 =、<、>、in、between、exists 等运算符一起使用。

子查询常用在 where 子句和 from 子句后边:

  • 当用于 where 子句时,根据不同的运算符,子查询可以返回单行单列、多行单列、单行多列数据。子查询就是要返回能够作为 where 子句查询条件的值。
  • 当用于 from 子句时,一般返回多行多列数据,相当于返回一张临时表,这样才符合 from 后面是表的规则。这种做法能够实现多表联合查询。

注意,mysql 数据库从 4.1 版本才开始支持子查询,早期版本是不支持的。

2. 语法

用于 where 子句的子查询的基本语法如下:

select column_name [, column_name ]
from   table1 [, table2 ]
where  column_name operator
    (select column_name [, column_name ]
    from table1 [, table2 ]
    [where])

子查询需要放在括号( )内。operator 表示用于 where 子句的运算符。

用于 from 子句的子查询的基本语法如下:

select column_name [, column_name ]
from (select column_name [, column_name ]
      from table1 [, table2 ]
      [where]) as temp_table_name
where  condition

用于 form 的子查询返回的结果相当于一张临时表,所以需要使用 AS 关键字为该临时表起一个名字。

3. 示例

有包含如下记录的 CUSTOMERS 表:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  35 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

1) WHERE 子句中的子查询返回单行单列数据,也即子查询的结果只有一个值,一般是满足 WHERE 查询条件中的比较运算符,比如 >、<、>=、<=、=、!= 等。请看下面的代码:

select *
   from customers
   where salary > (select salary
         from customers
         where name='komal');

该语句用来查询比 Komal 薪水高的客户,执行结果为:

+----+----------+-----+---------+--------+
| id | name     | age | address | salary |
+----+----------+-----+---------+--------+
|  4 | Chaitali |  25 | Mumbai  |   6500 |
|  5 | Hardik   |  27 | Bhopal  |   8500 |
|  7 | Muffy    |  24 | Indore  |  10000 |
+----+----------+-----+---------+--------+

您也可以使用逻辑运算符(AND、OR 等)构造稍微复杂一些的查询条件,只要最终的 WHERE 子句符合语法就行。请看下面的代码:

select *
   from customers
   where salary > (select salary
         from customers
         where name='komal')
   and salary < 10000;

该语句用来查询薪水比 Komal 高,但是低于 10000 的客户,执行结果为:

+----+----------+-----+---------+--------+
| id | name     | age | address | salary |
+----+----------+-----+---------+--------+
|  4 | Chaitali |  25 | Mumbai  |   6500 |
|  5 | Hardik   |  27 | Bhopal  |   8500 |
+----+----------+-----+---------+--------+

2) where 子句中的子查询返回单列多行数据,一般和 in、not int、any 关键字使用,也就是对集合范围的操作。

下面的代码将子查询和 in 关键字一起使用:

sql> select *
   from customers
   where id in (select id
         from customers
         where salary > 4500)
   and age >= 25;

该语句用来返回薪水大于 4500、年龄不低于 25 岁的客户,执行结果:

+----+----------+-----+---------+----------+
| id | name     | age | address | salary   |
+----+----------+-----+---------+----------+
|  4 | chaitali |  25 | mumbai  |  6500.00 |
|  5 | hardik   |  27 | bhopal  |  8500.00 |
+----+----------+-----+---------+----------+

 

标签:name,48,--,查询,column,子句,where,select
From: https://www.cnblogs.com/jiajunling/p/16658704.html

相关文章

  • 十问 RocketMQ:十年再出发,到底有何不同?
    背景作为一种实时数据的处理平台,消息系统的发展跟业务架构的变迁一直息息相关,那么我们可以透过业务架构的变化来看消息系统的发展历程和未来趋势。经过十多年的发展,Rocket......
  • iOS上架app store下载步骤
    1、安装iOS上架辅助软件Appuploader2、申请iOS发布证书(p12)3、申请iOS发布描述文件(mobileprovision)4、打包ipa5、上传ipa到iTunesConnect6、TestFlight方......
  • MyBatis 六--动态条件查询
    查询多条件——动态查询SQL语句随着用户输入或者外部条件的变化而变化,我们成为动态SQL修改SQL语句即可,有两种方法:首先利用if标签来进行判断,wh......
  • APIRouter of FASTAPI
    ROUTEROFAPPhttps://fastapi.tiangolo.com/tutorial/first-steps/如果应用比较简单,可以把所有的路径定义在app上。如果应用非常庞大,有很多的逻辑,按照业务分为产生数十......
  • npm publish更新包版本
    版本管理npm的发包需要遵循语义化版本,一个版本号包含三个部分: MAJOR.MINOR.PATCH ,MAJOR表示主版本号,当你做了不兼容的API修改;MINOR表示次版本号,当你做了向下兼容的......
  • Session认证机制与JWT认证机制
    一、什么是身份认证?身份认证(Authentication)又称“身份验证”、“鉴权”,是指通过一定的手段,完成对用户身份的确认。日常生活中的身份认证随处可见,例如:高铁的验票乘车,手......
  • 【设计模式】Java设计模式 - 建造者模式
    【设计模式】Java设计模式-建造者模式......
  • C#实现HTTP访问类HttpHelper
    在项目开发过程中,我们经常会访问第三方接口,如我们需要接入的第三方接口是WebAPI,这时候我们就需要使用HttpHelper调用远程接口了。示例中的HttpHelper类使用Log4Net记录了......
  • 通过Quartz 进行定时任务
    小记一下通过Quartz 进行轮询数据库从而进行自动打印的需求。一:首先通过NuGet引用Quartz,Quartz依赖Common.Logging和Common.Logging.Log4Net1211,所以同时需要引用这两个D......
  • 网络层协议与应用
    1 网络层的功能1、定义了基于IP协议的逻辑地址2、连接不同的媒介类型3、选择数据通过网络的最佳路径2 IP数据包IP数据报文由首部(称为报头)和数据两部分组成。首部的......