sql server T-SQL 基础

SQL语言按照用途可以分为如下3类:

①DDL(Data Definition Language)  数据定义语言:

定义修改和删除数据库、表、索引和视图等

②DML(Data Manipulation Language)  数据处理语言:

对数据进行查询(SELECT)、插入(INSERT)、删除(DELETE)、更新(UPDATE)等

③DCL(Data Control Language)  数据控制语言:

对数据库对象的权限管理和事务管理

一、T-SQL语法基础

1.标识符

在SQL Server中,标识符就是指用来定义服务器、数据库、数据库对象和变量等的名称。

①.常规标识符

常规标识符是指符合标识符的格式规则不需要使用分隔符进行分隔的标识符。

标识符的格式规则,如:

Select * from book where bname=“C程序”

中的book和bname。

命名规则:

1)第一个字符:字母、_、@和#

2)后续字符可以是字母、数字、@、$、#或_

3)标识符不可以是保留字

4)不允许嵌入空格或其他特殊字符

5)字符数在1-128之间。

特殊意义的标识符:

1)以@开始的标识符表示局部变量

2)以@@开始的标识符表示全局变量

3)以#开始的标识符表示临时表或过程

4)以##开始的标识符表示全局临时对象

②. 分隔标识符

分隔标识符在下列情况下使用:

当在对象名称或对象名称的组成部分中使用保留字时

当使用未被列为合法标识符的字符时

T-SQL使用的两种分隔符:

1)双引号(”)。(当QUOTED_IDENTIFIER设为ON时有效)

例如:   SELECT * FROM " My Table "

2)方括号([ ])。

例如:   SELECT * FROM [My Table]

分隔标识符的格式规则

2.常量

常量是指在程序运行过程中值始终不变的值。

3.变量

在SQL Server中,变量分为局部变量和全局变量

1)局部变量

前面有一个@字符,由用户定义和使用。

2)全局变量

名称前面有两个@字符,由系统定义和维护。

1) 局部变量

局部变量由用户定义,仅在声明它的批处理、存储过程或者触发器中有效。

局部变量的定义:

DECLARE { @local_variable data_type }[,...n]

注:变量不能是text、ntext或image数据类型

例: DECLARE @grade int,@sex char(2)

给变量赋值,可用set或select语句,如:

Set @local_variable=expression

Select {@local_variable=expression} [,…n]

例如:

1  DECLARE  @grade int,@sex char(2)
2 set @grade=60
3 select @sex=‘女‘
4 select @grade, @sex

2)全局变量

全局变量记录了SQL Server的各种状态信息,它们不能被显示地赋值或声明,而且不能被用户定义。

4.运算符

运算符是一种符号,用来指定要在一个或多个表达式中执行的操作。

SQL Server提供的运算符:算术运算符,赋值运算符,按位运算符,比较运算符,逻辑运算符,字符串运算符,一元运算符

赋值运算符:   =

算术运算符:  +    -    *    /    %

字符串连接运算符: +

比较运算符:  >   <   =   >=   <=   !=   <>   !<   !>

逻辑运算符: NOT     AND      OR      BETWEEN    EXISTS   IN        LIKE      SOME     ANY     ALL

一元运算符:+ 正      -负      ~位反

按位运算符:  & 按位与    |按位或    ^按位异或

运算符优先级:

+(正)、-(负)、~(按位NOT)

*、/、%

+(加)、+(连接)、-(减)

=、>、<、>=、<=、<>、!=、!>、!<

^(按位异或)、&(按位与)、|(按位或)

NOT

AND

ALL、ANY、BETWEEN、IN、LIKE、OR、

=(赋值)

5.流程控制语句

控制流语句是用来控制程序执行流程的语句,使用控制流语句可以在程序中组织语句的执行流程,提高编程语言的处理能力。

T-SQL提供控制流关键字,用于控制语句、语句块和存储过程的执行流。


控制流语句


说明


BEGIN…END


定义语句块


IF…ELSE


条件处理语句,如果条件成立,执行IF语句;

否则执行ELSE语句


CASE


分支语句


WHILE


循环语句


GOTO


无条件跳转语句


RETURN


无条件退出语句


WAITFOR


延迟语句


BREAK


跳出循环语句


CONTINUE


重新开始循环语句

① BEGIN…END语句

BEGIN…END语句用于将多个Transact-SQL语句组合为一个逻辑块。

语法格式为:

BEGIN

{

sql语句|语句块

}

END

下面几种情况经常要用到BEGIN和END语句:

WHILE循环需要包含语句块。

CASE语句的分支包含语句块。

IF或ELSE子句需要包含语句块。

② IF…ELSE语句

使用IF…ELSE语句,可以有条件地执行语句。其语法格式如下:

IF Boolean_expression

{sql语句|语句块}

[ELSE

{sql语句|语句块}]

③CASE语句

使用CASE语句可以进行多个分支的选择。CASE具有两种格式:

简单CASE格式:将某个表达式与一组表达式进行比较以确定结果。

搜索CASE格式:计算一组布尔表达式以确定结果。

注: CASE语句只能用于SQL语句的一部分,不能独立成句。

1)简单CASE格式

其语法格式如下:

CASE input_expression

WHEN when_expression THEN result_expression

[…n]

[ELSE else_result_expression]

END

注: input_expression和每个when_expression的数据类型必须相同或隐形转换。

如果未找到匹配值,也没有else子句,则返回null。

2)搜索CASE格式

其语法格式如下:

CASE

WHEN Boolean_expression THEN result_expression

[…n]

[ELSE else_result_expression]

END

注:如果Boolean_expression表达式的值为true,则返回then后的表达式,然后跳出case语句。

④ WHILE语句

WHILE语句可以重复执行若干SQL语句。

其语法格式如下:

WHILE Boolean_expression

{sql语句|语句块}

[BREAK]

{sql语句|语句块}

[CONTINUE]

⑤GOTO语句

GOTO语句可以实现无条件的跳转。其语法格式为:

GOTO lable

⑥ RETURN语句

使用RETURN语句,可以从查询或过程中无条件退出。可在任何时候用于从过程、批处理或语句块中退出,而不执行位于RETURN之后的语句。

语法格式为:

RETURN  [integer_expression]

其中:integer_expression为一个整数值,是return语句要返回的值。

⑦ WAITFOR语句

使用WAITFOR语句,可以在指定的时间或者过了一定时间后,执行语句块、存储过程或者事务。

其语法格式为:

WAITFOR {DELAY ‘time‘ | TIME ‘time‘}

⑧try…catch语句

实现错误处理功能。

其语法格式为:

Begin try

{sql_statement|sql_block}

End try

Begin catch

{sql_statement|sql_block}

End catch

6.注释

SQL Server的两种注释字符:

①  --(双连字符)

这些注释字符可与要执行的代码处在同一行,也可另起一行。从双连字符开始到行尾均为注释。

②  /*…*/(正斜杠-星号对)

从开始注释对(/*)到结束注释对(*/)之间的全部内容均视为注释部分。可对多行注释。

7.游标的使用

游标包括以下两个部分:

①游标结果集

 定义该游标的SELECT语句返回的行的集合。

②游标位置

 指向这个集合中某一行的指针。

游标的典型使用过程 :

1) 声明游标

声明游标使用DECLARE CURSOR语句,格式如下:

DECLARE cursor_name [ SCROLL ] CURSOR

FOR select_statement

[ FOR { READ ONLY | UPDATE [ OF column_name [ , …n ] ] } ]

其中:

cursor_name:所定义游标名称。

SCROLL:指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果未指定 SCROLL,默认 NEXT。

lselect_statement:是定义游标结果集的标准 SELECT 语句。

UPDATE [OF column_name [,...n]]:定义游标内可更新的列。如果指定 OF column_name [,...n] 参数,则只允许修改所列出的列。如果在 UPDATE 中未指定列的列表,则可以更新所有列。

2) 打开游标

打开游标使用OPEN语句,其语法格式如下:

OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }

其中:

GLOBAL:指定 cursor_name 为全局游标。

cursor_name:已声明的游标的名称。如果全局游标和局部游标都使用 cursor_name 作为其名称,那么如果指定了 GLOBAL,cursor_name 指的是全局游标,否则 cursor_name 指的是局部游标。

cursor_variable_name:游标变量的名称,该名称引用一个游标。

3)从打开的游标中提取行

格式:

FETCH [ [ NEXT | PRIOR | FIRST | LAST

| ABSOLUTE { n | @nvar }

| RELATIVE { n | @nvar }

]

FROM

]

{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }

[ INTO @variable_name [ , …n ] ]

其中:

NEXT:返回紧跟当前行之后的结果行。

PRIOR:返回紧临当前行前面的结果行。

FIRST:返回游标中的第一行并将其作为当前行。

LAST:返回游标中的最后一行并将其作为当前行。

ABSOLUTE {n | @nvar}:如果 n 或 @nvar 为正数,返回从游标头开始的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数,返回游标尾之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0,则没有行返回。

RELATIVE {n | @nvar}:如果 n 或 @nvar 为正数,返回当前行之后的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数,返回当前行之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0,返回当前行。

GLOBAL:指定 cursor_name 指的是全局游标。

cursor_name:要从中进行提取的开放游标的名称。

@cursor_variable_name:游标变量名,引用要进行提取操作的打开的游标。

INTO @variable_name[,...n]:允许将提取操作的列数据放到局部变量中。

@@FETCH_STATUS()函数

 该函数报告上一个FETCH语句的状态,其取值和含义如表所示。


取值


含义


0


FETCH语句成功


-1


FETCH语句失败或此行不在结果集中


-2


被提取的行不存在

@@ROWCOUNT 全局变量

用来提供游标活动信息,它返回受上一语句影响的行数。

4)关闭游标

关闭游标使用CLOSE语句,其语法格式如下:

CLOSE { { [ GLOBAL ] cursor_name } | cursor_variable_name }

5) 释放游标

释放游标将释放所有分配给此游标的资源。格式为:

DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }

时间: 2024-10-16 20:10:44

sql server T-SQL 基础的相关文章

SQL Server 2008从基础开始学习历程(1)------创建表与查询

[by:yy] 无论我们学什么呢,都要讲究一个Why,一个How.那么我们为什么要学SQL呢?无非就那么几点. 1.为了适应其他技术,和其他技术配对而学. 我个人的理解呢,只要在IT行业,无论你学什么,或者做什么工作.都离不开数据库.而学习数据库呢,又太文字化了,看的心里就烦.我是很抵触文字的.看着一大排一大排的字,就怕.可能是大天朝的教育所致.已经怕了学生生涯了. 2.为了适应社会而学. 随便找个招聘信息,都会有标注需要会SQL语言啊.了解MySql呀.会搞Oracle呀.所以呢,为了能在找工

SQL SERVER 查看SQL语句IO,时间,索引消耗

1.查看SQL语句IO消耗 set statistics io on     select * from dbo.jx_order where order_time>'2011-04-12 12:49:57.580' set statistics io off 2.查看SQL语句时间消耗 set statistics time on      select * from dbo.jx_order where order_time>'2011-04-12 12:49:57.580' set st

连接SQL Server执行SQL语句

public static DataTable GetData() { string Connect = ConfigurationManager.AppSettings["ConnectionString"].ToString(); SqlConnection sc = new SqlConnection(Connect); sc.Open(); SqlCommand cm = new SqlCommand("select * from Department");

SQL Server 2008&mdash;&mdash;SQL命令INSERT

T-SQL的INSERT命令的语法: INSERT [INTO]     {table_name|view_name}     [{(column_name,column_name,-)}]     {VALUES (expression,expression,-)} 方括号内是可选的. 列名的列表必须用圆括号包围住,逗号分隔. 关键字VALUES是必须的,数据值用圆括号包围,逗号分隔. 最好是尽量避免在名称中包含空格: 如果表或视图的名称与保留字相同或包含空格,则必须用方括号或双引号将名称包围

(转)[SQL Server] 动态sql给变量赋值(或返回值给变量)

本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) declare @i_counts int, @i_times int; set @str_sql = 'select @tmp_counts = counts, @tmp_times=times ' + ' from ' +@str_dbname+ '.dbo.t_msisdn with(nolock) '

SQL Server 2008 /SQL Server 2008 R2 配置数据库邮件

原文:SQL Server 2008 /SQL Server 2008 R2 配置数据库邮件 从2005开始,就引入了"数据库邮件"功能.并且取代SQLMail.原有SQLMail可以继续使用. SQLMail要求有应用程序编程接口(Extended Messaging Application Programming Interface,MAPI),安装新的Office时可能导致SQLMail失败. 数据库邮件更加安全.可靠,并且不需要MAPI.具有群集感知能力.可以自动重传发送失败的

[Oracle][ODBC SQL Server Driver][SQL Server]对象名 &#39;RECOVER.HS_TRANSACTION_LOG&#39; 无效(转)

原帖由 qingyun 于 2010-6-21 15:44 发表 在写pl/sql的时候,有个很重要的注意点:比如:begin  update  某个sqlserver的表@dblink名字 .....;  update 某个oracle的表...;end; 这段pl/sql执行会报错:错误信息是:-----------------------------------------------------------------执行失败:ORA-02054: 事务处理 2.12.27634 有问题

SQLSERVER 免费对比数据库结构和数据的工具支持:SQL Server 2012, SQL Server 2008 and SQL Server 2005

New xSQL Schema Compare - version 5 Compare the schemas of two SQL Server databases, review differences, generate synchronization script and execute it - xSQL Schema Compare makes database change management easy. xSQL Schema Compare supports SQL Serv

SQL SERVER 插件SQL Prompt

打开SQL,提示“SQL Prompt has been disabled due to an error with the registration of a required DLL - TextMgrP.dll. To resolve the error, repair SQL Server Management Studio or Visual Studio from the Windows Control Panel.” 解决办法: 重新注册TextMgrP.dll 此动态库 开始->

Sql Server中sql语句自动换行

怎么让sql server中的sql语句自动换行呢? 如下图: 工具--选项--所有语言 Sql Server中sql语句自动换行