5.3 查询语法

SELECT语法定义:

[ WITH with_subquery_table_name AS ( query ) ]
SELECT
[DISTINCT] select_expr [, select_expr ...]
[FROM  table_reference [, ...] ]
[WHERE filter_condition]
[GROUP BY { expr [ASC | DESC] | ROLLUP ( expr_list ) | CUBE ( expr_list ) | GROUPING SETS ( expr_list )} , ...]
[HAVING having_condition]
[ORDER BY {col_name | expr }
[ASC | DESC], ...]
[{ UNION [ ALL ] | INTERSECT | EXCEPT } (SELECT select_expr..)]
[LIMIT {[offset,] row_count}]

1. WITH子句

WITH语句用于定义一个或者多个子查询,每个子查询定义一个临时表,类似于视图的定义; 在WITH中定义的临时表可以在当前查询的其他子句中引用;
所有的WITH语句定义的临时表,都可以通过SELECT子句中的子查询定义来完成类似的效果,但是对于这些子查询或者临时表被后面的字句多次引用时,WITH语句只需要计算一次临时表结果,然后多次复用,从而达到减少公共表达式计算的次数。

语法:

[ WITH with_subquery [, ...] ]

而 with_suquery的语法为:

with_subquery_table_name AS ( query )

参数:

  • with_subquery_table_name:当前查询中一个唯一的临时表名称
  • query:所有可以支持的SELECT查询

例如:

  • with t as (select x,y from A) select t.y from t order by t.x limit 10

2. SELECT列表

SELECT语句中的列投射的基本结构为:

SELECT [ ALL | DISTINCT ] * | expression [ AS column_alias ] [, ...]

参数:

  • ALL:当不需要定义DISTINCT时的一个可选冗余字段
  • DISTINCT:用于消除重复的行
  • * :返回所有的列
  • expression: 一个或者多个列引用,也可以带函数的列表达式
  • AS column_alias : 用于定义select列的别名,AS关键字可选。AS后面接的alias如果是一个带空格的字符串,可以使用"`"符号支持。
  • 当表的列名是关键字的时候,如date,需要给字段加上反引号才能解析

3. FROM子句

FROM子句的语法为:

FROM table_reference [, ...]

其中 table_reference的支持的格式如下:

with_subquery_table_name [ [ AS ] alias ]
table_name [ * ] [ [ AS ] alias ]
( subquery ) [ AS ] alias
table_reference join_type table_reference
[ ON join_condition ]

参数:

  • with_subquery_table_name : WITH语句定义的子查询名字
  • table_name : 表名或者视图名称
  • alias:表或者视图的别名
  • join_type:[INNER] JOIN, LEFT [OUTER] JOIN, RIGHT [OUTER] JOIN, CROSS JOIN
  • 支持的join_type:[INNER] JOIN, LEFT [OUTER] JOIN, RIGHT [OUTER] JOIN, CROSS JOIN, NATURAL JOIN

  • join_condition : 用于join的on条件,on后面的条件只能是等值关系,非等值关系允许定义在where子句里

4. WHERE子句

WHERE子句语法为:

[WHERE filter_condition]

其中filter_condition可以是用AND,OR等二元逻辑操作符连接的多个表达式,也可以是IN, NOT INEXIST, NOT EXIST构成的相关或非相关子查询(或Semi Join)。

5. GROUP BY子句

GROUP BY 用于做分组操作,语法为:

GROUP BY ([ROLLUP | CUBE] expression [, ...]) | expression [ASC | DESC]

GROUP BY 后的表达式必须是select list中的非聚合表达式。

备注:

  • 支持group by别名,例如:select x+1 as t from table group by t
  • 支持having 别名,例如:select x+1 as t from table having t > 10

  • GROUP BY col ASC | DESC相当于GROUP BY col ORDER BY col ASC | DESC。当GROUP BY ASC | DESCORDER BY连用时,以ORDER BY的序为准

  • SELECT句子中出现非聚合列时,如SELECT a, count(b) FROM ... GROUP BY b中的a,非聚合列将取组内(GROUP BY分组)的第一条记录

6. HAVING子句

Having子句用于做分组后面的过滤,语法为:

[ HAVING condition ]

备注:

  • HAVING 条件引用的表达式必须出现在group by的列中,或者引用聚合列表达式
  • HAVING 条件不支持select list中列的别名,必须要重写列表达式才可以

  • HAVING 条件不支持select list中列的下标引用

7. ORDER BY子句

ORDER BY字句用于做排序,语法为:

[ ORDER BY expression
[ ASC | DESC ]
[ LIMIT { count | ALL } ]

参数:

  • expression: 定义如何排序,可以是select list中的列或者别名,也可以是没有出现在select list中的列
  • ASC | DESC: 定义排序的方式,升序(ASC)或者 降序(DESC), NULL值默认排在前面
  • LIMIT number | ALL : 控制返回结果集的行数,number指定行数,ALL等同于返回所有行

备注:

  • 支持offset,如LIMIT n, m

8. UNION / INTERSECT / EXCEPT / MINUS子句

UNION / INTERSECT / EXCEPT / MINUS用于进行集合求并、交、差操作,语法为:

query
{ UNION [ ALL ] | INTERSECT | EXCEPT | MINUS }
query

参数:

  • query: 操作符前后的query输出的列数目和类型都必须完全一致
  • UNION [ALL]:集合求并操作,输出合并后的结果, ALL表示无需去重
  • INTERSECT: 集合求交操作,输出各个query的交集
  • EXCEPT:集合求差操作,返回query的差集结果
  • MINUS: 集合求差操作,同EXCEPT

集合操作的排序:

UNIONEXCEPT 操作符都是左结合(left-associative), 例如:

select * from t1
union
select * from t2
except
select * from t3
order by c1;

相当于先做完t1 union t2 except t3, 最后才是对前面的结果按照c1进行全局排序

Intersect操作符的优先级是高于 UNIONEXCEPT的, 例如

select * from t1
union
select * from t2
intersect
select * from t3
order by c1;

等同于:

select * from t1
union
(select * from t2
intersect
select * from t3)
order by c1;

备注:

  • 集合操作符前的query是不可以带order by语句的,如果要带,需要用括号括起来

results matching ""

    No results matching ""