当前位置: 首页 > news >正文

SQL中的函数

目录

前言

一、系统内置函数

1、数学函数

2、日期和时间函数

3、聚合函数

4、字符串函数

二、自定义函数

1、标量函数的创建与调用

2、内嵌表值函数的创建与调用

3、多语句表值函数的创建与调用


前言

        函数是由一个或多个 T-SQL 语句组成的子程序,可用于封装代码以便重复使用。

一、系统内置函数

        T-SQL提供的内置函数,按照返回值是否具有确定性可分为确定性函数和非确定性函数两大类。

  • 确定性函数:每次使用特定的输入值调用该函数时,返回的结果都相同。
  • 非确定性函数:每次使用特定的输入值调用时,返回的结果都不同。

        函数 DATEADD为确定性函数,因为对于任何给定参数,返回的结果总是相同。函数 GETDATE为非确定性函数,因为每次执行这个函数,返回的结果都不同。

1、数学函数

常用数学函数
函数名称函数功能函数名称函数功能
ABS求绝对值POWER求 x的 y 次方
COS余弦函数RAND求随机数
COT余切函数ROUND四舍五入
EXP计算 e的 x次幂SIN正弦函数
FLOOR求仅次于最小值的值SQUARE开方
LOG求自然对数SQRT求平方根
PI常量,圆周率TAN正切函数

2、日期和时间函数

  • GETDATE():返回系统当前的日期和时间。
  • DATEADD(datepart, integer_expression, date_expression):返回指定日期 date_expression(日期表达式)加上指定的额外日期间隔 integer_expression(整形表达式)产生的新日期。
  • DATEDIFF(datepart, date_expression1, date_expression2):返回两个指定日期在 datepart 方面的不同之处,即 date_expression2 超过 date_expression1 的差值,结果值是一个带有正负号的整数值。
  • DATENAME(datepart, date_expression):以字符串的形式返回日期的指定部分,此部分由 datepart 来指定。
  • DATEPART(datepart, date_expression):以整数值的形式返回日期表达式的指定部分。此部分由 datepart 来指定。
  • day(date_expression):返回日期表达式中的日。
  • month(date_expression):返回日期表达式中的月。
  • year(date_expression):返回日期表达式中的年。

        DATEPART() 函数 和 DATENAME 函数极其相似,只不过前者返回的是时间的名称,后者返回的是具体的时间数值。

3、聚合函数

常用聚合函数
函数名描述
sum(列名)返回一个数字列的总和。
avg(列名)对一个数据列计算平均值。
min(列名)返回一个数字、字符串或日期列的最小值。
max(列名)返回一个数字、字符串或日期列的最大值。
count(列名)返回一个列的数据项数,条数。
count(*)返回找到的函数

4、字符串函数

  • ASCII(char_expression):返回表达式最左边一个字符的 ASCII码。
  • CHAR(integer_expression):返回整数所代表的 ASCII码值所对应的字符。
  • LOWER(char_expression):将大写字符转为小写字符。
  • UPPER(char_expression):将小写字符转为大写字符。
  • LTRIM(char_expression):删除字符串开始部分的空格。
  • RTRIM(char_expression):删除字符串结尾部分的空格。
  • RIGHT(char_expression, integer_expression):返回 char_expression 字符串中 integer_expression 个字符以后的部分字符串,integer_expression为负数时,返回 NULL。
  • SPACE(integer_expression):返回由 integer_expression 个空格组成的字符串,integer_expression为负数时,返回 NULL。
  • STR(float_expression [ , length [ , decimal ] ]):将一个数值类型数据转为字符串,length 为字符串长度,decimal 为小数点的位数。
  • STUFF(char_expression1, start, length, char_expression2):从 char_expression1 字符串的 start个字符位置删除 length个字符,然后把 char_expression2 字符串插入到 char_expression1 的 start 处。
  • SUBSTRING(expression, start, length):从 expression 的第 start 个字符处返回 length 个字符。
  • REVERSE(char_expression):返回 char_expression 的逆序。
  • CHARINDEX( ' pattern ', char_expression ):返回指定 pattern字符串在表达式中的起始位置。

二、自定义函数

        在 SQL SERVER 中,根据函数返回值类型,将不同自定义函数分为 标量函数、内嵌表值函数 和多语句表值函数。

  • 标量函数:返回一个确定类型的变量值,其返回值类型除了 TEXT、NTEXT、IMAGE、CURSOR、TIMESTAMP 和 TABLE 类型外的其它数据类型。函数体语句定义在 BEGIN ··· END 语句内。
  • 内嵌表值函数:返回值为一个表。内嵌表值函数没有由 BEGIN ··· END 语句括起来的函数体。返回的表由一个位于 RETURN 子句中的 SELECT 命令段从数据库中筛选出来。内嵌表值函数功能相当于一个参数化的试图。
  • 多语句表值函数:可以看作是 内嵌表值函数和内嵌表值函数的结合体。它返回的是一个表,但它和标量函数一样有一个用  BEGIN ··· END 括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。因此,它可以进行多次查询,对数据进行多次筛选与合并,弥补了内嵌表值函数的不足。

1、标量函数的创建与调用

--  创建标量函数的语法格式

CREATE  FUNCTIOIN  [ owner_name. ]   function_name    /*  函数名部分  */

        ( [ { @parameter_name   [ AS ]   parameter_data_type

                [ = DEFAULT ] }   [ , ... n ]  ] )                                 /*  形参定义部分  */

RETURNS   return_data_type                                               /*  返回参数的类型  */

[ AS ]

BEGIN

        function_body                                                                 /*  函数体部分  */

                RETURN  expression                                              /*  返回语句  */

END

 

--  owner_name:指定自定义函数的所有者。

--  function_name:指定自定义函数的名称。

--  @parameter_name:定义一个或多个参数,一个函数最多可以定义1024个参数,参数的作用范围是整个函数。

--  parameter_data_type 和 return_data_type 指定参数的数据类型和 返回值类外的其它数据类型。

--  function_body:是函数体部分,决定了函数的返回值。

--  expression:指定自定义函数返回的标量值表达式。

--  当函数参数由默认值时,调用该函数时必须指定默认 DEFAULT 关键字才能获取默认值。

--  示例:求 sc表中某门课程的平均成绩。

create   function   average  (@cn  char(20))   returns   float

as

begin

        declare   @aver   float

        select  @aver = (select  avg(score)   from  sc  where   sno = @cn)

        return   @aver

end

--  调用标量函数的语法格式

owner_name.function_name  (parameter_expression   1 ··· parameter_expression   n)

 

--  含义为: 所有者. 函数名(实参1, 实参2, ... , 实参n)。

当调用自定义的标量函数时,必须提供至少由两部分组成的名称(所有者. 函数名)。可以在 SELECT 语句中调用,实参可为已赋值的局部变量或表达式;也可以使用 EXECUTE 语句调用,方法与调用存储过程相同。

--  示例:求 C001号课的平均成绩。

declare   @course   char(6)

set   @course = 'C001'

select   dbo.average(@course)   as   'C001号课的平均成绩'

2、内嵌表值函数的创建与调用

--  创建内嵌表值函数的语法格式

CREATE  FUNCTIOIN  [ owner_name. ]   function_name    /*  函数名部分  */

        ( [ { @parameter_name   [ AS ]   parameter_data_type

                [ = DEFAULT ] }   [ , ... n ]  ] )                                 /*  形参定义部分  */

RETURNS   table                                                                  /*  返回参数的类型  */

[ AS ]

RETURN   [ ( SELECT   statement ) ]                         /*  通过 SELECT 语句返回内嵌表  */

 

--  table:指定返回值为一个表。

--  SELECT   statement:指单个 SELECT语句,确定返回的表的数据。

--  示例:查看某个专业所有学生的学号、姓名、所选课程的课程号和成绩。

create   function   st_func(@major   nvarchar(20))   returns   table

as   return

        (select   student.sno, student.sname, sc.cno, sc.score  from  student, sc

                where  specialty = @major   and   student.sno  = sc.sno)

        因为内嵌套表值函数的返回值为 table 类型,所以在调用这类函数时,只能通过 SELECT语句。

--  示例:查看计算机专业所有学生的学号、姓名、所选的课程号和成绩。

select  *  from  st_func('计算机')

3、多语句表值函数的创建与调用

        内嵌表值函数 和多语句表值函数的返回值都是表,其不同之处在于,内嵌表值函数没有函数体,返回的表是单个 SELECT语句的结果集;而多语句表值函数在 BEGIN ··· END 块中定义的函数主体包含 T-SQL 语句,这些语句可生成行,并将行插入至表中,最后返回表。

--  多语句表值函数的创建语法格式

CREATE  FUNCTIOIN  [ owner_name. ]   function_name    /*  函数名部分  */

        ( [ { @parameter_name   [ AS ]   parameter_data_type

                [ = DEFAULT ] }   [ , ... n ]  ] )                                 /*  定义函数参数部分  */

RETURNS   @return_variable  table  <table_definition>      /*  定义作为返回值的表  */

[ AS ]

BEGIN

        function_body                                                                 /*  函数体部分  */

                RETURN      

END

 

--  @return_variable:是一个 TABLE 类型的变量,用于存储和累积返回的表中的数据行。其余参数与标量函数相同。

--  示例:创建多语句表值函数,通过学号作为实参调用该函数,可显示该学生的姓名,以及各门功课的成绩和学分。

create   function   st_score  (@no  char(20))   returns   @score   table

(

s_no  char(20),

s_name   nvarchar(20),

c_name   nvarchar(20),

c_score   tinyint,

c_credit   tinyint

)

as   

begin

        insert   into   @score

        select  s.sno, s.sname, c.cname, sc.score, c.credit

        from   student  s,  course   c,  sc   sc  

        where   s.sno = sc.sno  and  sc.cno = c.cno  and  s.sno = @co

        return

end

        多语句表值函数的调用方法与内嵌表值函数的调用方法相同,只能通过 SELECT 语句调用。

--  示例:查询201602001号学生的姓名以及各门功课的成绩和学分。

select  *  from  st_score('201602001')

若有不足之处,欢迎大佬斧正。

相关文章:

SQL中的函数

目录 前言 一、系统内置函数 1、数学函数 2、日期和时间函数 3、聚合函数 4、字符串函数 二、自定义函数 1、标量函数的创建与调用 2、内嵌表值函数的创建与调用 3、多语句表值函数的创建与调用 前言 函数是由一个或多个 T-SQL 语句组成的子程序&#xff0c;可用于封…...

VSCode | 修改编辑器注释的颜色

1 打开VsCode的设置进入settings.json 2 添加如下代码 "editor.tokenColorCustomizations": {"comments": "#17e917"},3 保存即可生效...

媒体邀约专访与群访的区别?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约中的专访与群访在多个方面存在显著差异&#xff0c;以下是对这两种采访方式的详细比较&#xff1a; 一、定义与形式 专访&#xff1a; 定义&#xff1a;专访是指由媒体记者对单…...

Pycharm2024最新版community社区版下载安装配置,快速上手

第一步&#xff1a;下载 方法1&#xff1a;官网链接 https://www.jetbrains.com/pycharm/download/?sectionwindows .方法2&#xff1a;百度网盘 链接&#xff1a;https://pan.baidu.com/s/1ic2N5hUQ2m1Kmyr5nK9Jxw?pwd76dt 提取码&#xff1a;76dt --来自百度网盘超级…...

服务器选择租用还是托管?托管和租用哪个比较划算

在构建或扩展IT基础设施时&#xff0c;服务器作为关键组件&#xff0c;其选择方式——租用或托管&#xff0c;直接关系到企业的运营成本、灵活性、安全性及长期发展战略。本文将从技术、经济、安全等多个维度&#xff0c;深入解析这两种方案的优缺点&#xff0c;并探讨在何种情…...

智能制造·数字化工厂建设规划方案(65P)

获取完整PPT见下图 更多有关华为研发管理/IPD、MBSE、PLM、ERP、MES、数据治理、数字样机等方面免费解决方案、资料获取&#xff0c;请见下图...

ACM中国图灵大会专题 | 图灵奖得主Manuel Blum教授与仓颉团队交流 | 华为论坛:面向全场景应用编程语言精彩回顾

ACM 中国图灵大会&#xff08;ACM Turing Award Celebration Conference TURC 2024&#xff09;于2024年7月5日至7日在长沙举行。本届大会由ACM主办&#xff0c;in cooperation with CCF&#xff0c;互联网之父Vinton Cerf、中国计算机学会前理事长梅宏院士和廖湘科院士担任学术…...

k8s 公共服务

修改named.conf。修改第13行和第21行 下面是 named.rfc1912 修改位置&#xff0c;在最后 所以用cp -p 复制文件&#xff0c;保留权限 nslookup 回车&#xff0c;server是看哪个dns 在起作用 dns服务器要配置给所有公共服务节点和 k8s 节点 就在网络文件加个DNS2就行了&…...

【数据分析详细教学】全球气温变迁:一个多世纪的数据分析

全球气温变迁&#xff1a;一个多世纪的数据分析 1. 数据集选择与获取 数据可以从NASA的GISTEMP数据集获取&#xff0c;通常提供的格式有TXT和CSV。我们假设数据是以CSV格式提供。 2. 数据预处理 使用Python的pandas库读取数据并进行预处理。 import pandas as pd# 加载数…...

AV1技术学习:Reference Frame System

一、Reference Frames AV1 Codec 允许在其解码的帧缓冲区中最多允许保存 8 帧。对于一个编码帧&#xff0c;可以从解码的帧缓冲区中选择任意 7 个帧作为它的参考帧。编码端可以通过比特流显式地传输参考帧索引&#xff0c;范围从 1到 7。原则上&#xff0c;参考帧索引 1-4 为当…...

数学建模(7)——Logistic模型

一、马尔萨斯人口模型 import numpy as np import matplotlib.pyplot as plt# 初始人口 N0 100 # 人口增长率 r 0.02 # 时间段&#xff08;年&#xff09; t np.linspace(0, 200, 200)# 马尔萨斯人口模型 N N0 * np.exp(r * t)# 绘图 plt.plot(t, N, labelPopulation) plt.…...

“微软蓝屏”事件,给IT行业带来的宝贵经验和教训

“微软蓝屏”事件是指2024年7月19日发生的一次全球性技术故障&#xff0c;主要涉及微软视窗&#xff08;Windows&#xff09;操作系统及其相关应用和服务。 以下是对该事件的详细解析&#xff1a; 一、事件概述 发生时间&#xff1a;2024年7月19日事件影响&#xff1a;全球多个…...

QT总结——图标显示坑

最近写代码遇到一个神仙大坑&#xff0c;我都怀疑我软件是不是坏了&#xff0c;这里记录一下。 写qt工程的时候我们一般会设置图标&#xff0c;这个图标是窗体的图标同时也是任务栏的图标&#xff0c;但是我发现生成的exe没有图标&#xff0c;这个时候就想着给他加一个图标&…...

SQL 注入漏洞详解 - Union 注入

1)漏洞简介 SQL 注入简介 SQL 注入 即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,…...

Qt创建自定义组件并且promote to之后导致编译错误(CMake)

创建自定组件并且加入到全局(勾选"Global include"选项)后&#xff0c;重新编译&#xff0c;元对象编译器生成的ui_xxxx.h文件中会新加入自定义组件的头文件&#xff1a; 如图所示&#xff0c;编译器提示找不到自定义组件的头文件&#xff1a; Solution: 在CMakeL…...

告别写作瓶颈,4款AI协作工具助你迸发灵感

想要一个可以理解你思路&#xff0c;捕捉你灵感&#xff0c;并且帮你将这些内容转化为高质量文本的工具吗&#xff1f;现下大火的ai智能写作就能做到。 1 宙.语AI 传送门&#xff1a;https://ailjyk.com/pc 这个工具也是一种在线的AI工具。他可以写的文章种类非常多&#…...

java30-Shiro

概述 解决认证和授权 基本使用 package com.xpc.simple;import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.realm.SimpleAccountRealm; import o…...

【linux驱动开发】卸载驱动时报错:Trying to free already-free IRQ 0

【linux驱动开发】free_irq时报错:Trying to free already-free IRQ 0 卸载驱动时报错Trying to free already-free IRQ 0 第一次加载卸载驱动没有任何问题。第二次加载驱动&#xff0c;按键中断触发失效&#xff0c;卸载驱动时报错:Trying to free already-free IRQ 0 看了…...

SpringBoot如何解决yml明文密码问题

​ 博客主页: 南来_北往 &#x1f525;系列专栏&#xff1a;Spring Boot实战 前言 在现代的软件开发中&#xff0c;安全性是一个重要的考量因素。对于使用SpringBoot框架开发的应用程序而言&#xff0c;敏感信息如数据库密码、API密钥等通常存储在YAML配置文件中&#xf…...

SDL常用结构体和函数接口

1. 结构体 SDL_Window&#xff1a;SDL库中用于表示应用程序窗口的结构体。它封装了一个操作系统窗口的所有属性和功能&#xff0c;是创建图形用户界面的基础。通过创建一个SDL_Window&#xff0c;开发者可以定义窗口的初始大小、位置、是否全屏、是否具有边框等属性&#xff0…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...