Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

通常为以下格式中一种:

  • WHERE expression \ [NOT] IN (subquery)

  • WHERE expression comparison_operator \ [ANY | ALL] (subquery)

  • WHERE \ [NOT] EXISTS (subquery)

注意以下几点

...

内部查询的执行独立于外部查询,内部查询仅执行一次,执行完毕后将结果作为外部查询的条件使用。(先执行内部查询,再执行外部查询)

示例

示例均按照MYSQL语法

标量子查询

mysql> select num,name
  -> from employee
  -> where d_id=(
  ->   select d_id
  ->   from department
  ->   where d_name='科技部');
mysql> SELECT  playerno,town,sex
  -> FROM PLAYERS
  -> WHERE (town,sex) = ((SELECT town FROM PLAYERS WHERE playerno=7),
  ->                     (SELECT sex FROM PLAYERS WHERE playerno=44));

行子查询

mysql> select * from employee
  -> where d_id in
  ->   (select d_id from department);

列子查询

mysql> select * from employee
  -> where d_id !=any
  ->   (select d_id from department);
mysql> select * from employee
  -> where d_id >=all
  ->   (select d_id from department);

表子查询

select column1 + (select max(column2) from table2) 
from table1;


select column1, column2 
from table1 
where column1 > (select max(select column1 from table2);


行子查询

select column1, column2 
from table1 
where (column1, column2) = (select avg(column1),avg(column2) from table2);

列子查询

select column1, column2 
from table1 
where column1 in (select column1 from table2);


表子查询

select t.a + t.b 
from (select column1 as a, column2 as b from table1) tmysql> select *
  -> from COMMITTEE_MEMBERS
  -> where (begin_date,end_date) in
  -> (
  ->   select begin_date,end_date
  ->   from COMMITTEE_MEMBERS
  ->   where position='Secretary'
  -> );

相关子查询

定义

在子查询中使用到了外部查询的表中的任何列。先执行外部查询,然后执行子查询。

...

接下来,InfluxDB执行主要查询并计算这些差的平均值。请注意,主查询指定difference作为MEAN()函数中的字段键。

Druid

Druid官方文档链接

Druid SQL支持如下结构的SELECT查询,可以看出Druid支持FROM型表子查询

...

x IN (subquery) 如果子查询返回x,则为True。这将转换为联接;有关详细信息,请参阅 查询转换
x NOT IN (subquery) 如果子查询没有返回x,则为True。这将转换为联接;有关详细信息,请参阅 查询转换

TDEngine

TDEngine官方文档链接

从 2.2.0.0 版本开始,TDengine 的查询引擎开始支持在 FROM 子句中使用非关联子查询(“非关联”的意思是,子查询不会用到父查询中的参数)。也即在普通 SELECT 语句的 tb_name_list 位置,用一个独立的 SELECT 语句来代替(这一 SELECT 语句被包含在英文圆括号内),于是完整的嵌套查询 SQL 语句形如:

...

  1. 目前仅支持一层嵌套,也即不能在子查询中再嵌入子查询。

  2. 内层查询的返回结果将作为“虚拟表”供外层查询使用,此虚拟表可以使用 AS 语法做重命名,以便于外层查询中方便引用。

  3. 目前不能在“连续查询”功能中使用子查询。

  4. 在内层和外层查询中,都支持普通的表间/超级表间 JOIN。内层查询的计算结果也可以再参与数据子表的 JOIN 操作。

  5. 目前内层查询、外层查询均不支持 UNION 操作。

  6. 内层查询支持的功能特性与非嵌套的查询语句能力是一致的。

    • 内层查询的 ORDER BY 子句一般没有意义,建议避免这样的写法以免无谓的资源消耗。

  7. 与非嵌套的查询语句相比,外层查询所能支持的功能特性存在如下限制:

    • 计算函数部分:

      1. 如果内层查询的结果数据未提供时间戳,那么计算过程依赖时间戳的函数在外层会无法正常工作。例如:TOP, BOTTOM, FIRST, LAST, DIFF。

      2. 计算过程需要两遍扫描的函数,在外层查询中无法正常工作。例如:此类函数包括:STDDEV, PERCENTILE。

    • 外层查询中不支持 IN 算子,但在内层中可以使用。

    • 外层查询不支持 GROUP BY。

TimeScaleDB

TimeScaleDB官方文档链接

With TimescaleDB, there's no need to learn a custom query language. TimescaleDB supports full SQL. This means you can put your SQL knowledge to good use and use the rich ecosystem of PostgreSQL tools you know and live.

TimeScaleDB支持PostgreSQL所有子查询语法

Cassandra

Cassandra官方文档链接

谷歌上搜索显示不支持子查询,官网文档(4.0版本)对查询的定义也显示不支持子查询。

select_statement::= SELECT [ JSON | DISTINCT ] ( select_clause | '*' )
FROM `table_name`
[ WHERE `where_clause` ]
[ GROUP BY `group_by_clause` ]
[ ORDER BY `ordering_clause` ]
[ PER PARTITION LIMIT (`integer` | `bind_marker`) ]
[ LIMIT (`integer` | `bind_marker`) ]
[ ALLOW FILTERING ]
select_clause::= `selector` [ AS `identifier` ] ( ',' `selector` [ AS `identifier` ] )
selector::== `column_name`
| `term`
| CAST '(' `selector` AS `cql_type` ')'
| `function_name` '(' [ `selector` ( ',' `selector` )_ ] ')'
| COUNT '(' '_' ')'
where_clause::= `relation` ( AND `relation` )*
relation::= column_name operator term
'(' column_name ( ',' column_name )* ')' operator tuple_literal
TOKEN '(' column_name# ( ',' column_name )* ')' operator term
operator::= '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | CONTAINS | CONTAINS KEY
group_by_clause::= column_name ( ',' column_name )*
ordering_clause::= column_name [ ASC | DESC ] ( ',' column_name [ ASC | DESC ] )*

Doris

Doris官方文档链接

不相关子查询

支持谓词 IN和 EXISTS

SELECT x FROM t1 WHERE x [NOT] IN (SELECT y FROM t2);
SELECT x FROM t1 WHERE EXISTS (SELECT y FROM t2 WHERE y = 1);

...