
# 基本语句
#### 功能描述
基本的查询语句，返回查询结果。
#### 语法格式
```
SELECT [ALL | DISTINCT] attr_expr_list FROM table_reference
  [WHERE where_condition]
  [GROUP BY col_name_list]
  [ORDER BY col_name_list][ASC | DESC]
  [CLUSTER BY col_name_list | DISTRIBUTE BY col_name_list]
  [SORT BY col_name_list]]
  [LIMIT number];
```
#### 关键字
表1SELECT关键字说明 
| **参数**          | **描述**                                                                                                                                                                           |
|:---|:---|
| ALL             | ALL关键字用于返回数据库所有匹配的行，包括重复的行。ALL关键字的后面只能跟\*，否则执行语句会出错。 ALL是SQL语句的默认行为，通常不会被明确写出，如果不指定ALL或DISTINCT，查询结果将包含所有的行，即使是重复的行数据也将被返回。 |
| DISTINCT        | 在SELECT语句中使用DISTINCT关键字时，系统会在查询结果中去除重复的数据，确保结果的唯一性。                                                                                                                              |
| WHERE           | 指定查询的过滤条件，支持算术运算符、关系运算符和逻辑运算符。                                                                                                                                                   |
| where_condition | 过滤条件。                                                                                                                                                                            |
| GROUP BY        | 指定分组的字段，支持单字段及多字段分组。                                                                                                                                                             |
| col_name_list   | 字段列表。                                                                                                                                                                            |
| ORDER BY        | 对查询结果进行排序。                                                                                                                                                                       |
| ASC/DESC        | ASC为升序，DESC为降序，默认为ASC。                                                                                                                                                           |
| CLUSTER BY      | 为分桶且排序，按照分桶字段先进行分桶，再在每个桶中依据该字段进行排序，即当DISTRIBUTE BY的字段与SORT BY的字段相同且排序为降序时，两者的作用与CLUSTER BY等效。                                                                                    |
| DISTRIBUTE BY   | 指定分桶字段，不进行排序。                                                                                                                                                                    |
| SORT BY         | 将会在桶内进行排序。                                                                                                                                                                       |
| LIMIT           | 对查询结果进行限制，number参数仅支持INT类型。                                                                                                                                                      |
   
#### 注意事项
- 所查询的表必须是已经存在的表，否则提示查询错误。
- 在DLI管理控制台提交SQL语句读取binary类型的数据进行展示时，会对binary数据进行Base64转换。
- 在where子句中使用not in时，必须保证子查询结果集不包含任何null值。一旦存在null，整个查询结果将为空集。解决方案请参考[常见问题：not in子查询中有null值，查询结果为空怎么办？]
  使用DLI提供的SQL防御规则功能可以配置Not in\<Subquery\>的拦截规则，在作业运行时及时提醒您修改Not in\<Subquery\>语句。了解[SQL防御规则配置方法](https://support.huaweicloud.com/usermanual-dli/dli_01_0612.html)。
  
 
#### 示例
将表student中，name为Mike的数据记录查询出来，并根据字段score升序排序。
```
SELECT * FROM student
  WHERE name = 'Mike'
  ORDER BY score;
```
 #### 常见问题：not in子查询中有null值，查询结果为空怎么办？
- **问题概述：**SQL语法中只要not in子查询中有一个null值，整个查询结果就会是空集（无数据返回）。
- **示例：** 如下示例中期望的结果是3，但是反馈的是null。
  ```
  -- 表A
  id
  ---
  1
  2
  3
  -- 表B
  value
  -----
  1
  2
  ```
  执行以下SQL语句:
  ```
  SELECT * FROM A
  WHERE id NOT IN (SELECT value FROM B);
  ```
  
- **原因分析：**
  id NOT IN (1, 2, NULL)
  等价于
  id \<\> 1 AND id \<\> 2 AND id \<\> NULL
  id \<\> NULL 的结果是 UNKNOWN（SQL 的三值逻辑），整个表达式为 FALSE
  
- **解决方案** ：
  为了避免NULL导致空结果可以使用以下方案：
  - 方案1：用NOT EXISTS替代NOT IN
    ```
    SELECT * FROM A
    WHERE NOT EXISTS (
      SELECT 1 FROM B WHERE B.value = A.id
    );
    ```
    
  
  - 方案2：在子查询中过滤掉NULL
    ```
    SELECT * FROM A
    WHERE id NOT IN (
      SELECT value FROM B WHERE value IS NOT NULL
    );
    ```
    
   
 
