SQL中on后面能跟组函数吗

SQL Server 2008为Transact-SQL语言提供了大量功能强大的系統数利用该数不需要写很多代码就能够完成很多任务。在SQL Server 2008中数主要用来获得有关信息,进行算术计算、统计分析、实现数据类型转换等操作本节将介绍常用的聚合、数学、字符串、日期和时间数,以及如何自定义数等

聚合数常用于GROUP BY子句,用于聚合分组的数据所有聚合数均为确定性数,也就是说只要使用一组特定输入值调用聚合数该数总是返回同类型的值。例如计算一组整数型数值的总和或者岼均值,结果将同样会返回整数型的数值

该数在和GROUP BY子句一起使用时显示出其强大功能,但聚合数的使用也不是只限于分组查询如果查詢语句中使用了聚合数,而没有用GROUP BY子句则聚合数是用于聚合整个结果集(匹配WHERE子句的所有行)。例如不使用GROUP BY子句,SELECT列表中AVG只能和SUM对应但不能对应特定列。

SQL Server 2008中提供了大量的聚合数表4-8中列出了一些常用聚合数。


返回组中各值的平均值如果为空将被忽略
用于生成哈希索引,返回按照表的某一行或一组表达式计算出来的校验和值
返回组中各值的校验和如果为空将被忽略
返回组中项值的数量,如果为空也將计数
返回组中项值的数量与COUNT数唯一的差别是他们的返回值。COUNT_BIG始终返回bigint数据类型值COUNT始终返回int数据类型值
当行由CUBE或ROLLUP运算符添加时,该数將导致附加列的输出值为1;当行不由CUBE或ROLLUP运算符添加时将导致附加列的输出值为0
返回组中值列表的最大值
返回组中值列表的最小值
返回指萣表达式中所有值的标准偏差
返回指定表达式中所有值的总体标准偏差
返回指定表达式中所有值的方差
返回指定表达式中所有值的总体方差

在SQL Server 2008提供的所有聚合数中,除了COUNT数以外聚合数都会忽略空值。

下面通过示例演示下聚合数的具体应用例如,下面的语句按【体育场管悝系统】数据库中【管理员信息】表的“管理员名称”进行分组并统计该管理员负责场馆的个数,并且统计该管理员负责的场馆的平均單价具体代码如下所示:

执行上述语句,可以查询出管理员姓名为“李玺”所负责的场馆个数及平均单价如图4-9所示。



数学数用于对数芓表达式进行数学运算并返回运算结果在SQL Server 2008中,数学数可以对系统提供的数字数据进行运算:

数据类型数据的内置运算的精度为六个小数位数SQL Server提供了20多个用于处理整数与浮点值的数学数。下面表4-9列出了部分常用的数学数


返回数值表达式的绝对值
返回指定表达式以e为底的指数
返回大于或等于数值表达式的最小整数
返回小于或等于数值表达式的最大整
返回数值表达式的自然对数
返回数值表达式以10为底的对
返囙对数值表达式进行幂运算的结果
返回舍入到指定长度或精度的数值表达式
返回数值表达式的正号(+)、负号(-)或零(0)
返回数值表达式的平方根

例洳,下面创建一个使用ROUND数的示例具体代码如图所示:

执行上述代码,结果如图5-6所示



字符串数用于计算、格式化和处理字符串参数,或將对象转换为字符串与数学数一样,SQL Server 2008为了方便用户进行字符型数据的各种操作和运算提供了功能全面的字符串数字符串数也是经常使鼡的一种数,常见的字符串数如表4-10所示


ASCII数,返回字符表达式中最左侧的字符的ASCII代码值
ASCII代码转换数返回指定ASCII代码的字符
左子串数,返回芓符串中从左边开始指定个数的字符
字符串数返回指定字符串表达式的字符(而不是字节)数,其中不包含尾随空格
小写字母数将大寫字符数据转换为小写字符数据后返回字符表达式
删除前导空格字符串,返回删除了前导空格之后的字符表达式
替换数用第三个表达式替换第一个字符串表达式中出现的所有第二个指定字符串表达式的匹配项
复制数,以指定的次数重复字符表达式
右子串数返回字符串中從右边开始指定个数的字符
删除尾随空格数,删除所有尾随空格后返回一个字符串
空格数返回由重复的空格组成的字符串
数字向字符转換数,返回由数字数据转换来的字符数据
子串数返回字符表达式、二进制表达式、文本表达式或图像表达式的一部分
大写数,返回小写芓符数据转换为大写的字符表达式

例如对于下面的查询演示了如何使用字符串数:

在上述语句中同时使用了RIGHT、ASCII、LEN、SPACE、LTRIM和SUBSTRING共6个字符串数,返回姓氏为“王”的所有客户信息其执行结果如图5-7所示。



SQL Server 2008提供了9个日期和时间处理数其中的一些数接受datepart变元,这个变元指定数处理日期与时间所使用的时间粒度表5-11列出了datepart变元的可能设置。



返回给指定日期加上一个时间间隔后的新datetime值
返回跨两个指定日期的日期边界数囷时间边界数。
返回表示指定日期的指定日期部分的字符串
返回表示指定日期的指定日期部分的整数。
返回一个整数表示指定日期的忝DATEPART部分。
返回表示当前的UTC时间(通用协调时间或格林尼治标准时间)的datetime值当前的UTC时间得自当前的本地时间和运行Microsoft SQL Server 2008实例的计算机操作系统Φ的时区设置。
返回表示指定日期的“月”部分的整数
返回表示指定日期的年份的整数。

上述日期数中DATENAME、GETDATE和GETUTCDATE具有不确定性。而DATEPART除了用莋DATEPART(dw,date)外都具有确定性其虽dw是weekday的日期部分,取决于设置每周的第一天的SET DATEFIRST所设置的值除此之外的上述日期数都具有确定性。

为了有助于读者哽好的掌握日期和时间数的用法下面举出DATEPART()和DATEDIFF()数的应用实例,具体代码及执行结果如图5-8所示



除了使用系统数外,用户还可以创建自定义數以实现更独特的功能。自定义数可以接受零个或多个输入参数其返回值可以是一个数值,也可以是一个表但是自定义数不支持输絀参数。在SQL Server 2008中使用CREATE FUNCTION语句来创建自定义数,根据数返回值形式的不同可以创建三类自定义数,分别是标量值自定义数、内联表值自定义數和多语句表值自定义数

标量值自定义数返回一个确定类型的标量值,其返回的值类型为除text、ntext、image、cursor、timestamp和table类型外的其他数据类型也就是說,标量值自定义数返回的是一个数值

标量值自定义数的语法结构如下所示:

语法中各参数含义如下:

l   WITH  该子句指出了创建数的选项。如果指定了ENCRYPTION参数则创建的数是被加密的,数定义的文本将以不可读的形式存储在syscomments表中任何人都不能查看该数的定义,包括数的创建者和系统管理员;

了解了语法格式及参数含义之后下面来创建一个标量值数,他使用一个整形参数指定订单号返回该订单的客户的姓名。

執行上述语句后在【教务管理系统】数据库中创建一个名称为GetName的标量值数在查询中调用该数,具体的代码及结果如图5-10所示


内联表值数鉯表的形式返回一个返回值,即他返回的是一个表内联表值自定义数没有由BEGIN…END语句块中包含的数体,而是直接使用RETURN子句其中包含的SELECT语呴将数据从数据库中筛选出来形成一个表。使用内联表值自定义数可以提供参数化的视图功能

内联表值自定义数的语法结构如下所示:

該语法结构中各参数的含义与标量值数语法机构中参数含义相似。

例如创建一个内联表值数来返回一个管理员负责的所有场馆信息代码洳下所示:

这里创建的数名称为GetPalaestra,他的字符串参数@Pid指定要查询的班级编号RETURNS TABLE指定这是一个内联表值数。创建完成后使用SELECT语句来查看管理員编号为102所负责的所有场馆信息,如图5-11所示


多语句表值自定义数可以看作标量型和内联表值型数的结合体。该类数的返回值是一个表泹他和标量值自定义数一样,有一个用BEGIN…END语句块中包含起来的数体返回值的表中的数据是由数体中的语句插入的。由此可见他可以进荇多次查询,对数据进行多次筛选与合并弥补了内联表值自定义数的不足。


【架构革新 高效可控】2020年6月4日~6日苐十一届中国数据库技术大会将在北京隆重召开

大会设置2大主会场,20+技术专场将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨为广大数据领域从业人士提供一场年度盛会和交流平台。

“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理

返回结果如下表,实际上就是分类汇总

示例3执行后会提示下错误,如下图这就是需要注意的一点,在select指定的字段要么就要包含在Group By语呴的后面作为分组的依据;要么就要被包含在聚合数中。

示例4中则可以指定“摘要”字段其原因在于“多列分组”中包含了“摘要字段”,其执行结果如下表

“多列分组”实际上就是就是按照多列(类别+摘要)合并后的值进行分组示例4中可以看到“a, a2001, 13”为“a, a2001, 11”和“a, a2001, 2”两條记录的合并。

在示例3中提到group by语句中select指定的字段必须是“分组依据字段”其他字段若想出现在select中则必须包含在聚合数中,常见的聚合数洳下表:

示例6:求各组记录数目

示例7:求各组记录数目

  • where 子句的作用是在对查询结果进行分组前将不符合where条件的行去掉,即在分组之前过濾数据where条件中不能包含聚组数,使用where条件过滤出特定的行
  • having 子句的作用是筛选满足条件的组,即在分组之后过滤数据条件中经常包含聚组数,使用having 条件过滤出特定的组也可以使用多个分组标准进行分组。

compute子句能够观察“查询结果”的数据细节或统计各列数据(如例10中max、min和avg)返回结果由select列表和compute统计结果组成。

示例11与示例10相比多了“order by 类别”和“... by 类别”示例10的执行结果实际是按照分组(a、b、c)进行了显礻,每组都是由改组数据列表和改组数统计结果组成另外:

我要回帖

更多关于 函数 的文章

 

随机推荐