SQL中的全局变量和局部变量.
- 格式:doc
- 大小:37.50 KB
- 文档页数:8
SQL脚本-变量--转说明:现在市⾯上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作⽤于begin...end块中,⽽普通的变量定义和使⽤都说的⽐较少,针对此类问题只能在官⽅⽂档中才能找到讲解。
前⾔MySQL存储过程中,定义变量有两种⽅式:1、使⽤set或select直接赋值,变量名以@开头例如:set @var=1;可以在⼀个会话的任何地⽅声明,作⽤域是整个会话,称为⽤户变量。
2、以declare关键字声明的变量,只能在存储过程中使⽤,称为存储过程变量,例如:declare var1 int default 0;主要⽤在存储过程中,或者是给存储传参数中。
两者的区别是:在调⽤存储过程时,以declare声明的变量都会被初始化为null。
⽽会话变量(即@开头的变量)则不会被再初始化,在⼀个会话内,只须初始化⼀次,之后在会话内都是对上⼀次计算的结果,就相当于在是这个会话内的全局变量。
主体内容局部变量⽤户变量会话变量全局变量会话变量和全局变量叫系统变量。
⼀、局部变量,只在当前begin/end代码块中有效局部变量⼀般⽤在sql语句块中,⽐如存储过程的begin/end。
其作⽤域仅限于该语句块,在该语句块执⾏完毕后,局部变量就消失了。
declare语句专门⽤于定义局部变量,可以使⽤default来说明默认值。
set语句是设置不同类型的变量,包括会话变量和全局变量。
局部变量定义语法形式declare var_name [, var_name]... data_type [ DEFAULT value ];例如在begin/end语句块中添加如下⼀段语句,接受函数传进来的a/b变量然后相加,通过set语句赋值给c变量。
set语句语法形式set var_name=expr [, var_name=expr]...; set语句既可以⽤于局部变量的赋值,也可以⽤于⽤户变量的申明并赋值。
declare c int default 0;set c=a+b;select c as C;或者⽤select …. into…形式赋值select into 语句句式:select col_name[,...] into var_name[,...] table_expr [where...];例⼦:declare v_employee_name varchar(100);declare v_employee_salary decimal(8,4);select employee_name, employee_salaryinto v_employee_name, v_employee_salaryfrom employeeswhere employee_id=1;⼆、⽤户变量,在客户端链接到数据库实例整个过程中⽤户变量都是有效的。
《SQL Server 2008数据库案例教程》练习题及模拟试卷答案第1章一、判断题1. 数据库技术是是计算机数据处理与信息管理系统的核心。
(√)2. 数据是用于描述现实世界中具体事物或抽象概念,可存储的数字符号。
(×)3. 数据库是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合。
(√)4. 数据库管理系统是一个按数据结构来存储和管理数据的服务器管理系统。
(×)5. 关系数据库,是建立在关系模型基础上的数据库。
(√)二、单选题1. 数据(Data)是一些可存储并具有明确意义的(A)A. 符号B.图形C.文字D.数字2. 人工阶段计算机用于数值计算,没有操作系统及管理数据的软件。
这一阶段的年代是(C)A. 19世纪80年代B. 20世纪20年代C.20世纪50年代D. 20世纪80年代3. 在网页中常用的图像格式是(D)A..bmp和.jpgB..gif和.bmpC. .png和.bmpD. .gif和.jpg4.数据库系统的重要特征是什么?(D)A. 数据的独立性和动态性 B.数据的静态性和独立性C.数据的动态性和共享性 D.数据的独立性和共享性三、多选题1.与数据库技术密切相关的基本概念有(ABCD)A. 数据B. 数据库C. 数据库管理系统D. 数据库系统2.数据库可分为哪几种类型?(ABC)A. 关系型数据库B. 网状数据库C. 层次数据库D.树形数据库3. DBMS提供数据操作语言DML,为用户提供了哪些操作?(ABCD)A.数据的追加B.数据的删除C.数据的更新D.数据的查询4.DBMS要分类组织、存储和管理各种数据,包括哪些内容?(ABC)A. 数据字典B. 用户数据C. 存取路径D.服务器5. 目前,DBMS常见品牌有哪些公司?(ABC)A.微软公司的SQL Server B.IBM公司的DB2 C.甲骨文公司的ORACLE D.索尼公司的MySQL四、填空题1.数据库(管理)技术经历了人工管理阶段和文件管理阶段。
(一)填空题1.数据管理经历了_______阶段、________阶段到________阶段的变迁。
(手工管理、文件管理、数据库管理)2.实体之间联系的基本类型有______、_______、_______。
(一对一、一对多、多对多)3.在E-R图中,用____表示实体,用______表示联系,用______表示属性。
(矩形框、菱形框、椭圆框)4.数据库的三层模式结构是________、_________、_______。
(外模式、逻辑模式、内模式)5.关系模型中一般讲数据完整性分为三类:_________、___________、__________。
(实体完整性、参照完整性、用户定义完整性)6.数据模型由三部分组成:数据结构、数据操作和____________。
(数据的约束条件或数据完整性规则)7.SQL语言是一种标准的数据库语言, 包括数据的查询、定义、操纵和______四部分功能。
(控制)8.视图是从其它________或视图导出的虚表。
(基本表)9.在关系模式R 中,若属性或属性组X 不是关系R 的关键字,但X 是其他关系模式的关键字,则称X 为关系R 的___________。
(外关键字)10.访问SQL server数据库对象时,需要经过身份验证和_________两个阶段,其中身份验证分为Windows验证模式和_______验证模式。
(权限验证、混合)11._______是存储在文件中的一系列SQL语句,即一系列按顺序提交的批处理。
(脚本)12.SQL语言中行注释的符号为_________;块注释的符号为_________。
(--、/**/)13.SQL server中的变量分为两种,全局变量和局部变量。
其中全局变量的名称以_______字符开始,有系统定义和维护。
局部变量以__________字符开始,由用户自己定义和赋值。
(@@、@)14.在SQL server中,其权限分为三类,即_________权限、_________权限和_________权限。
sql server变量参数摘要:1.SQL Server 变量参数简介2.局部变量与全局变量3.变量数据类型4.变量声明与赋值5.变量使用示例6.参数传递7.参数化查询8.总结正文:SQL Server 变量参数是SQL Server 中用于存储和操作数据的一种机制。
它们可以在存储过程、触发器、用户自定义函数以及普通的SQL 语句中使用。
变量参数的使用可以提高代码的可读性、可维护性和可重用性。
在SQL Server 中,变量参数分为局部变量和全局变量。
局部变量仅在存储过程、触发器或函数内部可见,而全局变量在整个数据库实例中可见。
局部变量在声明时不需要使用@符号,而全局变量需要。
局部变量的作用域仅限于其所在的存储过程、触发器或函数,而全局变量的作用域从其声明位置开始,直到整个脚本结束。
在SQL Server 中,变量参数的数据类型包括:bit、int、smallint、bigint、decimal、numeric、float、real、money、smallmoney、char、varchar、text、ntext、image、varbinary、xml 等。
根据实际需求选择合适的变量数据类型。
变量声明与赋值是变量参数的基本操作。
在SQL Server 中,可以使用CREATE PROCEDURE 或ALTER PROCEDURE 语句声明局部变量。
声明时需要指定变量的数据类型、名称和作用域。
赋值操作可以使用SET 或SELECT 语句完成。
在SQL Server 中,变量参数可以通过以下方式使用:- 在表达式中使用:例如SELECT @变量名。
- 在条件表达式中使用:例如IF @变量名= "值"。
- 在循环中使用:例如WHILE @变量名<> "值"。
- 在事务处理中使用:例如BEGIN TRANSACTION @变量名= "值"; COMMIT;参数传递是在SQL Server 中使用变量参数的重要功能。
SQL复习题(附部分答案)⼀、单选题1.根据关系数据基于的数据模型——关系模型的特征判断下列正确的⼀项:(___)A.只存在⼀对多的实体关系,以图形⽅式来表⽰。
B.以⼆维表格结构来保存数据,在关系表中不允许有重复⾏存在。
C.能体现⼀对多、多对多的关系,但不能体现⼀对⼀的关系。
D.关系模型数据库是数据库发展的最初阶段。
答案[B]2、在“连接”组中有两种连接认证⽅式,其中在(___)⽅式下,需要客户端应⽤程序连接时提供登录时需要的⽤户标识和密码。
A、Windows⾝份验证B、SQL Server ⾝份验证C、以超级⽤户⾝份登录时D、其他⽅式登录时答案[B]3、关系数据库中,主键是(___),当运⽤Transact-SQL语句创建主键时,可以是(__)。
⑴ A、为标识表中唯⼀的实体 B、创建唯⼀的索引,允许空值C、只允许以表中第⼀字段建⽴D、允许有多个主键的⑵ A、create table table1(column1 char(13) not null primary key,column2 int not on primary key;B、alter table table1 with nocheck addconstraint [PK_table1] primary key nonclustered ( column1) on primary;C、alter table table1 column1 primary key ;答案[ A C]4、视图是⼀种常⽤的数据对象,可以简化数据库操作,当使⽤多个数据表来建⽴视图时,不允许在该语句中包括(___)等关键字。
A、ORDER BY,COMPUTEB、ORDER BY,COMPUTE,COMPUTR BYC、ORDER BY,COMPUTE BY,GROUP BYD、GROUP BY,COMPUTE BY答案[B ]5、在Transact-SQL语法中,SELECT语句的完整语法较复杂,但⾄少包括的部分(_1_),使⽤关键字(_2_)可以把重复⾏屏蔽,将多个查询结果返回⼀个结果集合的运算符是(_3__),如果在SELECT语句中使⽤聚合函数时,可以在后⾯使⽤⑴ A、SELECT,INTO B、SELECT,FROMC、SELECT,GROUPD、仅SELECT⑵ A、DISTINCT B、UNION C、ALL D、TOP⑶ A、JOIN B、UNION C、INTO D、LIKE⑷ A、GROUP BY B、COMPUTE BY C、HAVING D、COMPUTE 答案[B A B A ]6、SQL Server 2008是⼀个()的数据库系统。
sqlserver中局部变量与全局变量的申明与赋值(转)局部变量⽤⼀个@标识,全局变量⽤两个@(常⽤的全局变量⼀般都是已经定义好的);申明局部变量语法:declare @变量名数据类型;例如:declare @num int;赋值:有两种⽅法式(@num为变量名,value为值)set @num=value; 或 select @num=value;如果想获取查询语句中的⼀个字段值可以⽤select给变量赋值,如下:select @num=字段名 from 表名 where ……中变量不⽤事前申明,在⽤的时候直接⽤“@变量名”使⽤就可以了。
第⼀种⽤法:set @num=1; 或set @num:=1; //这⾥要使⽤变量来保存数据,直接使⽤@num变量第⼆种⽤法:select @num:=1; 或 select @num:=字段名 from 表名 where ……注意上⾯两种赋值符号,使⽤set时可以⽤“=”或“:=”,但是使⽤select时必须⽤“:=赋值”在sql中,我们常常使⽤临时表来存储临时结果,对于结果是⼀个集合的情况,这种⽅法⾮常实⽤,但当结果仅仅是⼀个数据或者是⼏个数据时,还要去建⼀个表,显得就⽐较⿇烦,另外,当⼀个sql语句中的某些元素经常变化时,⽐如选择条件,(⾄少我想)应该使⽤局部变量。
当然ms sql server的全局变量也很有⽤。
> > > > 局部变量声明:declare @local_variable data_type@local_variable 是变量的名称。
变量名必须以 at 符 (@) 开头。
data_type 是任何由系统提供的或⽤户定义的数据类型。
变量不能是text、ntext 或 image 数据类型。
⽰例:use masterdeclare @sel_type char(2)declare @sel_cunt numeric(10)set @sel_type = 'u '/*user table*/set @sel_cunt = 10/*返回系统中⽤户表的数⽬*/select @sel_cunt = count(*)from sysobjectswhere type = @sel_typeselect @sel_cunt as 'user table ' 's count '如果要返回系统表的数⽬,可以⽤set @sel_type = 's '可能这个例⼦并不能说明使⽤变量的好处,我只是想说明使⽤⽅法。
SQL中的全局变量和局部变量在SQL中,我们常常使用临时表来存储临时结果,对于结果是一个集合的情况,这种方法非常实用,但当结果仅仅是一个数据或者是几个数据时,还要去建一个表,显得就比较麻烦,另外,当一个SQL语句中的某些元素经常变化时,比如选择条件,(至少我想)应该使用局部变量。
当然MS SQL Server的全局变量也很有用。
>>>>局部变量声明:DECLARE @local_variable data_type@local_variable 是变量的名称。
变量名必须以 at 符 (@) 开头。
data_type 是任何由系统提供的或用户定义的数据类型。
变量不能是 text、ntext 或 image 数据类型。
示例:use masterdeclare @SEL_TYPE char(2)declare @SEL_CUNT numeric(10)set @SEL_TYPE = 'U'/*user table*/set @SEL_CUNT = 10/*返回系统中用户表的数目*/select @SEL_CUNT = COUNT(*)from sysobjectswhere type = @SEL_TYPEselect @SEL_CUNT as 'User table ''s count'如果要返回系统表的数目,可以用set @SEL_TYPE = 'S'可能这个例子并不能说明使用变量的好处,我只是想说明使用方法。
当一组(几个甚至几十个)SQL语句都使用某个变量时,就能体会到他的好处了。
>>>>全局变量全局变量是系统预定义的,返回一些系统信息,全局变量以两个at(@)开头。
下面是我统计了一些较为常用的变量。
@@CONNECTIONS返回自上次启动以来连接或试图连接的次数。
@@CURSOR_ROWS返回连接上最后打开的游标中当前存在的合格行的数量(返回被打开的游标中还未被读取的有效数据行的行数)@@DATEFIRST返回每周第一天的数字@@ERROR返回最后执行的SQL 语句的错误代码。
@@FETCH_STATUS返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
@@IDENTITY返回最后插入的标识值@@LANGID返回当前所使用语言的本地语言标识符(ID)。
@@LANGUAGE返回当前使用的语言名。
@@LOCK_TIMEOUT返回当前会话的当前锁超时设置,单位为毫秒。
@@PROCID返回当前过程的存储过程标识符 (ID) 。
@@ROWCOUNT返回受上一语句影响的行数。
@@SERVERNAME返回运行的本地服务器名称。
@@SPID返回当前用户进程的服务器进程标识符 (ID)。
@@TRANCOUNT返回当前连接的活动事务数。
@@VERSION返回当前安装的日期、版本和处理器类型。
@@CPU_BUSY返回自SQL Server 最近一次启动以来CPU 的工作时间其单位为毫秒@@DATEFIRST返回使用SET DATEFIRST 命令而被赋值的DATAFIRST 参数值SET DATEFIRST,命令用来指定每周的第一天是星期几@@DBTS返回当前数据库的时间戳值必须保证数据库中时间戳的值是惟一的@@ERROR返回执行Transact-SQL 语句的错误代码@@FETCH_STATUS返回上一次FETCH 语句的状态值@@IDLE返回自SQL Server 最近一次启动以来CPU 处于空闭状态的时间长短单位为毫秒@@IO_BUSY返回自SQL Server 最近一次启动以来CPU 执行输入输出操作所花费的时间其单位为毫秒@@LANGID返回当前所使用的语言ID 值@@LANGUAGE返回当前使用的语言名称@@LOCK_TIMEOUT返回当前会话等待锁的时间长短其单位为毫秒@@MAX_CONNECTIONS返回允许连接到SQL Server 的最大连接数目@@MAX_PRECISION返回decimal 和numeric 数据类型的精确度@@NESTLEVEL返回当前执行的存储过程的嵌套级数初始值为0@@OPTIONS返回当前SET 选项的信息@@PACK_RECEIVED返回SQL Server 通过网络读取的输入包的数目@@PACK_SENT返回SQL Server 写给网络的输出包的数目@@PACKET_ERRORS返回网络包的错误数目@@PROCID返回当前存储过程的ID 值@@REMSERVER返回远程SQL Server 数据库服务器的名称@@SERVICENAME返回SQL Server 正运行于哪种服务状态之下如MSSQLServer MSDTC SQLServerAgent@@SPID返回当前用户处理的服务器处理ID 值@@TEXTSIZE返回SET 语句的TEXTSIZE 选项值SET 语句定义了SELECT 语句中text 或image数据类型的最大长度基本单位为字节@@TIMETICKS返回每一时钟的微秒数@@TOTAL_ERRORS返回磁盘读写错误数目@@TOTAL_READ返回磁盘读操作的数目@@TOTAL_WRITE返回磁盘写操作的数目@@TRANCOUNT返回当前连接中处于激活状态的事务数目常用函数----统计函数----AVG --求平均值COUNT --统计数目MAX --求最大值MIN --求最小值SUM --求和--AVGuse panguselect avg(e_wage) as dept_avgWagefrom employeegroup by dept_id--MAX--求工资最高的员工姓名use panguselect e_namefrom employeewhere e_wage =(select max(e_wage)from employee)--STDEV()--STDEV()函数返回表达式中所有数据的标准差--STDEVP()--STDEVP()函数返回总体标准差--VAR()--VAR()函数返回表达式中所有值的统计变异数--VARP()--VARP()函数返回总体变异数----算术函数----/***三角函数***/SIN(float_expressiοn) --返回以弧度表示的角的正弦COS(float_expressiοn) --返回以弧度表示的角的余弦TAN(float_expressiοn) --返回以弧度表示的角的正切COT(float_expressiοn) --返回以弧度表示的角的余切/***反三角函数***/ASIN(float_expressiοn) --返回正弦是FLOAT 值的以弧度表示的角ACOS(float_expressiοn) --返回余弦是FLOAT 值的以弧度表示的角ATAN(float_expressiοn) --返回正切是FLOAT 值的以弧度表示的角ATAN2(float_expressiοn1,float_expressiοn2)--返回正切是float_expressiοn1 /float_expres-sion2的以弧度表示的角DEGREES(numeric_expressiοn)--把弧度转换为角度返回与表达式相同的数据类型可为--INTEGER/MONEY/REAL/FLOAT 类型RADIANS(numeric_expressiοn) --把角度转换为弧度返回与表达式相同的数据类型可为--INTEGER/MONEY/REAL/FLOAT 类型EXP(float_expressiοn) --返回表达式的指数值LOG(float_expressiοn) --返回表达式的自然对数值LOG10(float_expressiοn)--返回表达式的以10 为底的对数值SQRT(float_expressiοn) --返回表达式的平方根/***取近似值函数***/CEILING(numeric_expressiοn) --返回>=表达式的最小整数返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT 类型FLOOR(numeric_expressiοn) --返回<=表达式的最小整数返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT 类型ROUND(numeric_expressiοn) --返回以integer_expressiοn 为精度的四舍五入值返回的数据--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型ABS(numeric_expressiοn) --返回表达式的绝对值返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT 类型SIGN(numeric_expressiοn) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型--与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型PI() --返回值为π 即3.1415926535897936RAND([integer_expressiοn]) --用任选的[integer_expressiοn]做种子值得出0-1 间的随机浮点数----字符串函数----ASCII() --函数返回字符表达式最左端字符的ASCII 码值CHAR() --函数用于将ASCII 码转换为字符--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值LOWER() --函数把字符串全部转换为小写UPPER() --函数把字符串全部转换为大写STR() --函数把数值型数据转换为字符型数据LTRIM() --函数把字符串头部的空格去掉RTRIM() --函数把字符串尾部的空格去掉LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置SOUNDEX() --函数返回一个四位字符码--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值DIFFERENCE() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异--0 两个SOUNDEX 函数返回值的第一个字符不同--1 两个SOUNDEX 函数返回值的第一个字符相同--2 两个SOUNDEX 函数返回值的第一二个字符相同--3 两个SOUNDEX 函数返回值的第一二三个字符相同--4 两个SOUNDEX 函数返回值完全相同QUOTENAME() --函数返回被特定字符括起来的字符串/*select quotename('abc', '{'} quotename('abc')运行结果如下----------------------------------{{abc} [abc]*/REPLICATE() --函数返回一个重复character_expressiοn 指定次数的字符串/*select replicate('abc', 3) replicate( 'abc', -2) replicate( 'abc', 0)运行结果如下----------- -----------abcabcabc NULL [空]*/REVERSE() --函数将指定的字符串的字符排列顺序颠倒REPLACE() --函数返回被替换了指定子串的字符串/*select replace('abc123g', '123', 'def')运行结果如下----------- -----------abcdefg*/SPACE() --函数返回一个有指定长度的空白字符串STUFF() --函数用另一子串替换字符串指定位置长度的子串----数据类型转换函数----CAST()函数语法如下CAST() (<expressiοn> AS <data_ type>[ length ])CONVERT()函数语法如下CONVERT() (<data_ type>[ length ], <expressiοn> [, style])select cast(100+99 as char) convert(varchar(12), getdate())运行结果如下------------------------------ ------------199 Jan 15 2000----日期函数----DAY() --函数返回date_expressiοn 中的日期值MONTH() --函数返回date_expressiοn 中的月份值YEAR() --函数返回date_expressiοn 中的年份值DATEADD(<datepart> ,<number> ,<date>)--函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期DATEDIFF(<datepart> ,<number> ,<date>)--函数返回两个指定日期在datepart 方面的不同之处DATENAME(<datepart> , <date>) --函数以字符串的形式返回日期的指定部分DATEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分GETDATE() --函数以DATETIME 的缺省格式返回系统当前的日期和时间----系统函数----APP_NAME() --函数返回当前执行的应用程序的名称COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值COL_LENGTH(<'table_name'>, <'column_name'>) --函数返回表中指定字段的长度值COL_NAME(<table_id>, <column_id>) --函数返回表中指定字段的名称即列名DATALENGTH() --函数返回数据表达式的数据的实际长度DB_ID(['database_name']) --函数返回数据库的编号DB_NAME(database_id) --函数返回数据库的名称HOST_ID() --函数返回服务器端计算机的名称HOST_NAME() --函数返回服务器端计算机的名称IDENTITY(<data_type>[, seed increment]) [AS column_name])--IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中/*select identity(int, 1, 1) as column_nameinto newtablefrom oldtable*/ISDATE() --函数判断所给定的表达式是否为合理日期ISNULL(<check_expressiοn>, <replacement_value>) --函数将表达式中的NULL 值用指定值替换ISNUMERIC() --函数判断所给定的表达式是否为合理的数值NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值NULLIF(<expressiοn1>, <expressiοn2>)--NULLIF 函数在expressiοn1 与expressiοn2 相等时返回NULL 值若不相等时则返回expressiοn1 的值。