单行和多行子查询

本文介绍SQL子查询的基础用法,包括IN、ANY、ALL关键字的应用,并通过实例展示如何使用这些关键字来筛选数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子查询可以返回的行数和列数具有约束。如果您使用 INANY ALL,则子查询可以返回多个行,但只返回一个列。如果您使用其它运算符,则子查询必须返回单个值。
示例数据库中的两个表与财务结果有关。fin_code 表是一个较小的表,保存财务数据及其含义的不同代码:
若要列出 fin_data 表中的收入项,请键入以下语句:
SELECT *
FROM fin_data
WHERE fin_data.code IN
    (   SELECT fin_code.code
        FROM fin_code
        WHERE type = 'revenue' )
year
quarter
code
amount
1999
Q1
r1
1023
1999
Q2
r1
2033
1999
Q3
r1
2998
1999
Q4
r1
3014
2000
Q1
r1
3114
本示例使用限定符清楚地标识每个引用中的 code 列所属的表。在这个特殊示例中,限定符可能已被省略。
另外两个关键字(ANY ALL)可以用作运算符的限定符以允许它们处理多个行。
以下查询与上面的成功查询相同:
SELECT *
FROM fin_data
WHERE fin_data.code = ANY
   (   SELECT fin_code.code
       FROM fin_code
       WHERE type = 'revenue' )
=ANY 条件与 IN 条件相同,但 ANY 还可以和不等式(如<>)一起使用,从而更灵活地使用子查询。
ALL 关键字与单词 ANY 相似。例如,以下查询列出非收入财务数据:
SELECT *
FROM fin_data
WHERE fin_data.code <> ALL
   (   SELECT fin_code.code
       FROM fin_code
       WHERE type = 'revenue' )
这与下面使用 NOT IN 的命令等同:
SELECT *
FROM fin_data
WHERE fin_data.code NOT IN
   (   SELECT fin_code.code
       FROM fin_code
       WHERE type = 'revenue' )
通常,子查询结果集限制为单个列。以下示例没有意义,这是因为 Adaptive Server Anywhere 不知道将 fin_code 中的哪个列与 fin_data.code 列比较。
-- this query is incorrect
SELECT *
FROM fin_data
WHERE fin_data.code IN
   (   SELECT fin_code.code, fin_code.type
       FROM fin_code
       WHERE type = 'revenue' )
使用 IN 条件的子查询可以返回一组行,而使用比较运算符的子查询则只能返回一行。例如,由于子查询返回两行,所以以下命令导致一个错误:
-- this query is incorrect
SELECT *
FROM fin_data
WHERE fin_data.code =
   (   SELECT fin_code.code
       FROM fin_code
       WHERE type = 'revenue' )
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值