# SELECT
#### 功能描述
从HStore opt表读取数据。
![](https://support.huaweicloud.com/devg-dws/public_sys-resources/note_3.0-zh-cn.png)
- 如需使用实时数仓能力，请在DWS控制台创建集群时，选择**存算一体1:4云盘规格** ，了解更多参见[存算一体规格](https://support.huaweicloud.com/productdesc-dws/dws_01_00018.html)。
- 创建DWS集群选择**1:8云盘规格** 为标准数仓，**1:4云盘规格**为实时数仓，以下内容描述的"实时数仓"、"标准数仓"即通过以上规格区分。
 
#### 注意事项
- 列存表与HStore opt表都暂不支持SELECT FOR UPDATE语法。
- 对HStore opt表执行SELECT查询时，会扫描列存主表CU上的数据、delta表上的I记录中的数据、内存中每行数据更新信息，并将三种信息合并后返回。
- 在通过主键索引或唯一索引查询数据的场景中： 对于传统列存表，唯一索引会同时存储行存Delta表上的数据位置信息（blocknum，offset）与列存主表的数据位置信息（cuid，offset），数据MERGE到主表后又会插入新的索引元组，索引会持续膨胀。
  对于HStore opt表，由于实现了全局CUID的统一分配，索引元组中始终只存储（cuid，offset）， 数据MERGE后不会产生新的索引元组。
  
 
#### 语法格式
```
[ 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并向表中插入数据：
```
CREATE TABLE reason_select
(
  r_reason_sk integer,
  r_reason_id integer,
  r_reason_desc character(100)
)WITH(ORIENTATION = COLUMN, ENABLE_HSTORE_OPT=ON);
INSERT INTO reason_select values(3, 1,'reason 1'),(10, 2,'reason 2'),(4, 3,'reason 3'),(10, 4,'reason 4');
```
执行GROUP BY分组操作：
```
SELECT COUNT(*), r_reason_sk FROM reason_select GROUP BY r_reason_sk;
```
执行HAVING过滤操作：
```
SELECT COUNT(*) c,r_reason_sk FROM reason_select GROUP BY r_reason_sk HAVING c > 1;
```
执行ORDER BY操作：
```
SELECT * FROM reason_select ORDER BY r_reason_sk;
```
