云服务器内容精选

  • 多个子查询 with t1 as(select name,max(price) as maxprice from fruit group by name), t2 as(select name,avg(price) as avgprice from fruit group by name) select t1.*,t2.* from t1 join t2 on t1.name = t2.name;
  • Qualifying Column Names 当JOIN的两个relation有相同的列名时,列引用必须使用relation别名(如果relation有别名)或relation名称进行限定: SELECT nation.name, region.name FROM nation CROSS JOIN region; SELECT n.name, r.name FROM nation AS n CROSS JOIN region AS r; SELECT n.name, r.name FROM nation n CROSS JOIN region r;
  • SEMI JOIN、ANTI JOIN 当一张表在另一张表找到匹配的记录之后,半连接(semi-join)返回第一张表中的记录。与条件连接相反,即使在右节点中找到几条匹配的记录,左节点的表也只会返回一条记录。另外,右节点的表一条记录也不会返回。半连接通常使用IN或EXISTS作为连接条件。 而anti-join则与semi-join相反,即当在第二张表没有发现匹配记录时,才会返回第一张表里的记录;当使用not exists/not in的时候会用到。 其他支持的条件包括如下内容: where子句中的多个条件 别名关系 下标表达式 解引用表达式 强制转换表达式 特定函数调用 目前,只在如下情况下支持多个semi/anti join表达式:第一个表中的列在其直接后续的join表达式中被查询,且不与其他join表达式有关系。 示例如下:
  • OFFSET OFFSET的作用是丢弃结果集中的前若干行数据。 OFFSET count [ ROW | ROWS ] 如果有ORDER BY,则OFFSET将会作用于排序后的结果集,OFFSET丢弃前若干行数据后保留的数据集,仍然是排序的: SELECT name FROM fruit ORDER BY name OFFSET 3; name ------------ peach pear watermelon (3 rows) 否则,如果没有使用ORDER BY,被丢弃的行可能是任意的行。如果OFFSET指定的行数等于或超过了结果集的大小,则最终返回的结果为空。
  • 语法 [/*+ query_rewrite_hint*/] [ WITH [ RECURSIVE ] with_query [, ...] ] SELECT [ ALL | DISTINCT ] select_expression [, ...] [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ] [ HAVING condition] [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ] [ ORDER BY expression [ ASC | DESC ] [, ...] ] [ OFFSET count [ ROW | ROWS ] ] [ LIMIT { count | ALL } ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ] from_item 可以是以下形式: table_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ] from_item join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ] table_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ] MATCH_RECOGNIZE pattern_recognition_specification [ [ AS ] alias [ ( column_alias [, ...] ) ] ] join_type 可以是以下形式: [ INNER ] JOIN LEFT [ OUTER ] JOIN RIGHT [ OUTER ] JOIN FULL [ OUTER ] JOIN LEFT [SEMI] JOIN RIGHT [SEMI] JOIN LEFT [ANTI] JOIN RIGHT [ANTI] JOIN CROSS JOIN grouping_element 可以是以下形式: () expression GROUPING SETS ( ( column [, ...] ) [, ...] ) CUBE ( column [, ...] ) ROLLUP ( column [, ...] )
  • INTERSECT query INTERSECT [DISTINCT] query INTERSECT仅返回第一个和第二个查询的结果相交的行。以下是最简单的INTERSECT子句之一的示例。它选择值13和42,并将此结果集与选择值13的第二个查询合并。由于42仅在第一个查询的结果集中,因此不包含在最终结果中。 SELECT * FROM (VALUES 13,42) INTERSECT SELECT 13; _col0 ------- 13 (1 row)
  • EXCEPT query EXCEPT [DISTINCT] query EXCEPT返回在第一个查询结果而不在第二个查询结果中的行。 SELECT * FROM (VALUES 13, 42) EXCEPT SELECT 13; _col0 ------- 42 (1 row) Having子句目前不支持使用列的别名,例如: select count(userid) as num ,dept as aaa from salary group by dept having aaa='d1'; 报错如下: Query 20210630_085136_00024_wc8n9@default@HetuEngine failed: line 1:75: Column 'aaa' cannot be resolved
  • FETCH FIRST FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES FETCH FIRST支持FIRST或NEXT关键字以及ROW或ROWS关键字。这些关键字等效,不影响query执行。 如果FETCH FIRST未指定数量,默认为1: SELECT orderdate FROM orders FETCH FIRST ROW ONLY; orderdate -------------- 2020-11-11 SELECT * FROM new_orders FETCH FIRST 2 ROW ONLY; orderkey | orderstatus | totalprice | orderdate --------------|-------------|------------|-------------- 202011181113 | online | 9527.0 | 2020-11-11 202011181114 | online | 666.0 | 2020-11-11 (2 rows) 如果使用了OFFSET,则LIMIT或FETCH FIRST会在OFFSET之后应用于结果集: SELECT * FROM (VALUES 5, 2, 4, 1, 3) t(x) ORDER BY x OFFSET 2 FETCH FIRST ROW ONLY; x --- 3 (1 row) 对于FETCH FIRST子句,参数ONLY或WITH TIES控制结果集中包含哪些行。 如果指定了ONLY参数,则结果集将限制为包含参数数量的前若干行。 如果指定了WITH TIES参数,则要求必须带ORDER BY子句。其结果集中包含符合条件的前若干行基本结果集以及额外的行。这些额外的返回行与基本结果集中最后一行的ORDER BY的参数一样: CREATE TABLE nation (name varchar, regionkey integer); insert into nation values ('ETHIOPIA',0),('MOROCCO',0),('ETHIOPIA',2),('KENYA',2),('ALGERIA',0),('MOZAMBIQUE',0); --返回regionkey与第一条相同的所有记录。 SELECT name, regionkey FROM nation ORDER BY regionkey FETCH FIRST ROW WITH TIES; name | regionkey ------------|----------- ALGERIA | 0 ETHIOPIA | 0 MOZAMBIQUE | 0 MOROCCO | 0 (4 rows)
  • ORDER BY ORDER BY子句用于按一个或多个输出表达式对结果集排序。 ORDER BY expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] 每个expression可以由输出列组成,也可以是按位置选择输出列的序号。 ORDER BY子句在GROUP BY或HAVING子句之后,在OFFSET、LIMIT或FETCH FIRST子句之前进行计算。 按照SQL规范,ORDER BY子句只影响包含该子句的查询结果的行顺序。HetuEngine遵循该规范,并删除该子句的冗余用法,以避免对性能造成负面影响。 例如在执行INSERT语句时,ORDER BY子句不会对插入的数据产生影响,是个冗余的操作,会对整个INSERT语句的整体性能产生负面影响,因此HetuEngine会跳过ORDER BY操作。 ORDER BY只作用于SELECT子句: INSERT INTO some_table SELECT * FROM another_table ORDER BY field; ORDER BY冗余的例子是嵌套查询,不影响整个语句的结果: SELECT * FROM some_table JOIN (SELECT * FROM another_table ORDER BY field) u ON some_table.key = u.key;