基本语句
功能描述
基本的查询语句,返回查询结果。
语法格式
1 2 3 4 5 6 7 |
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]; |
关键字
参数 |
描述 |
---|---|
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防御规则配置方法。
示例
将表student中,name为Mike的数据记录查询出来,并根据字段score升序排序。
1 2 3 |
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 );
- 方案1:用NOT EXISTS替代NOT IN