SQL中row_number()、rank()、dense_rank()后括号的作用是什么?
SQL中row_number()、rank()、dense_rank()后括号的用途
这三个都是SQL里的无参数窗口函数,它们后面的括号主要有两个关键作用:
- 标识函数调用,区分普通标识符:SQL语法规定,函数必须通过
()来声明是调用行为,哪怕不需要传入参数也不能省略括号。如果去掉括号写成row_number,数据库会把它当成一个列名或变量来查找,找不到就会抛出语法错误。 - 保持语法一致性,预留扩展空间:和其他需要参数的窗口函数(比如
sum(col)、avg(col))的语法结构统一,让SQL语句的写法更规整。同时,括号的存在也为后续SQL方言的功能扩展预留了语法空间,哪怕当前主流数据库里这三个函数不需要参数,也能保证语法的兼容性。
举个实际的例子,正确的用法是:
SELECT student_name, exam_score, row_number() OVER(ORDER BY exam_score DESC) AS row_num, rank() OVER(ORDER BY exam_score DESC) AS ranking, dense_rank() OVER(ORDER BY exam_score DESC) AS dense_ranking FROM exam_results;
如果把函数后的括号去掉,比如写成row_number OVER(...),数据库会直接报错,因为无法识别这是一个窗口函数调用。
注意:别把这个括号和后面OVER()里的括号搞混——OVER()里的内容是用来定义窗口范围(比如分区、排序规则)的,而函数名后的括号是属于函数本身的语法要求。
内容的提问来源于stack exchange,提问作者Ayyappa Maruthi Alapati
相关产品推荐
相关产品推荐

