更新时间:2024-01-25 GMT+08:00

SELECT

功能描述

从HStore表读取数据。

注意事项

  • 列存表与HStore表都暂不支持SELECT FOR UPDATE语法。
  • 对HStore表执行SELECT查询时,会扫描列存主表CU上的数据、delta表上的I记录中的数据、内存中每行数据更新信息,并将三种信息合并后返回。
  • 在通过主键索引或唯一索引查询数据的场景中:

    对于传统列存表,唯一索引会同时存储行存Delta表上的数据位置信息(blocknum,offset)与列存主表的数据位置信息(cuid,offset),数据MERGE到主表后又会插入新的索引元组,索引会持续膨胀。

    对于HStore表,由于实现了全局CUID的统一分配,索引元组中始终只存储(cuid,offset), 数据MERGE后不会产生新的索引元组。

语法格式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[ WITH [ RECURSIVE ] with_query [, ...] ]
SELECT [/*+ plan_hint */] [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
{ * | {expression [ [ AS ] output_name ]} [, ...] }
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY grouping_element [, ...] ]
[ HAVING condition [, ...] ]
[ { UNION | INTERSECT | EXCEPT | MINUS } [ ALL | DISTINCT ] select ]
[ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ]
[ { [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] } | { LIMIT start, { count | ALL } } ]

参数说明

  • DISTINCT [ ON ( expression [, ...] ) ]

    从SELECT的结果集中删除所有重复的行,使结果集中的每行都是唯一的。

    ON ( expression [, ...] ) 只保留那些在给出的表达式上运算出相同结果的行集合中的第一行。

  • SELECT列表

    指定查询表中列名,可以是部分列或者是全部(使用通配符*表示)。

    通过使用子句AS output_name可以为输出字段取个别名,这个别名通常用于输出字段的显示。

  • FROM子句

    为SELECT声明一个或者多个源表。

    FROM子句涉及的元素如下所示。

  • WHERE子句

    WHERE子句构成一个行选择表达式,用来缩小SELECT查询的范围。condition是返回值为布尔型的任意表达式,任何不满足该条件的行都不会被检索。

    WHERE子句中可以通过指定"(+)"操作符的方法将表的连接关系转换为外连接。但是不建议用户使用这种用法,因为这并不是SQL的标准语法,在做平台迁移的时候可能面临语法兼容性的问题。同时,使用"(+)"有很多限制:

  • GROUP BY子句

    将查询结果按某一列或多列的值分组,值相等的为一组。

  • HAVING子句

    与GROUP BY子句配合用来选择特殊的组。HAVING子句将组的一些属性与一个常数值比较,只有满足HAVING子句中的逻辑表达式的组才会被提取出来。

  • ORDER BY子句

    对SELECT语句检索得到的数据进行升序或降序排序。对于ORDER BY表达式中包含多列的情况:

示例

创建表reason_select并向表中插入数据:
1
2
3
4
5
6
7
CREATE TABLE reason_select
(
  r_reason_sk integer,
  r_reason_id integer,
  r_reason_desc character(100)
)WITH(ORIENTATION = COLUMN, ENABLE_HSTORE=ON);
INSERT INTO reason_select values(3, 1,'reason 1'),(10, 2,'reason 2'),(4, 3,'reason 3'),(10, 4,'reason 4');
执行GROUP BY分组操作:
1
SELECT COUNT(*), r_reason_sk FROM reason_select GROUP BY r_reason_sk;
执行HAVING过滤操作:
1
SELECT COUNT(*) c,r_reason_sk FROM reason_select GROUP BY r_reason_sk HAVING c > 1;
执行ORDER BY操作:
1
SELECT * FROM reason_select ORDER BY r_reason_sk;