一.T-SQL概述
SQL Server用于操作数据库的编程语言为Transaction-SQL,简称T-SQL。T-SQL与PL/SQL不同,并没有固定的程序结构。
T-SQL包括以下4个部分:
DDL:定义和管理数据库及其对象,例如create、alter和drop等。
DML:实现对数据库表各对象的操作,例如insert、update等。
DCL:数据控制语言,实现对数据库进行安全管理和权限管理等控制,例如grant、revoke、deny等。
附加的语言元素。T-SQL的附加语言元素,包括变量、运算符、函数、注释和流程控制语句等。
在T-SQL中,命令和语句的书写是不区分大小写的。
二.T-SQL编程基础
1、标识符
①T-SQL规则标识符
- 由字母、数字、下划线、@、#、$符号组成,其中字母可以是a-z或A-Z,也可以是来自其他语言的字母字符。
- 首字符不能为数字和$。
- 标识符不允许是T-SQL保留字。
- 标识符内不允许有空格和特殊字符
- 长度小于128
②界定标识符
对于不符合标识符规则的标识符,则要使用界定符方括号([])或双引号(“”)将标识符括起来。如标识符[My Table]、“select”内分别使用了空格和保留字select。
2、数据类型
在SQL Server中提供了多种系统数据类型。除了系统数据类型外,还可以自定义数据类型。
①系统数据类型
(1)精确数字数据类型
- int
存储整型数值,存储数值范围为-231~231-1。 - bigint
bigint比int能存储更大的数值,存储数值范围为-263~263-1。 - smallint
数据类型的范围数值比int更小,在-215~215-1之间。定义这种数据类型的时候一定要小心,要确定存储的数据不会超过smallint所能存储的数值范围。 - tinyint
数据类型的范围数值比smallint更小,存储从 0 到 255 的整型数据。 - decimal/numeric
decimal[(p,s)]和numeric[(p,s)]这两种数据类型用于存储相同精度和范围的数据(小数点的左、右两边存储的数值位数相同),所能存储的数值范围为-1038+1~1038-1。
p表示指定小数点左边和右边可以存储的十进制数字的最大个数,s指定小数位数。[(p,s)]的范围为1≤p≤38,0≤s≤p。若省略s,则默认为0;若未附带p及s,则numeric表示numeric(18),只能表示整数
(2)近似数字数据类型
- float
存储小数点不固定的数值,存储的数值范围。为-1.79E+308~1.79E+308。 - real
与float非常相似,存储数值范围为-3.40E+38~3.40E+38。
(3)货币数据类型
- money
- smallmoney
(4)字符数据类型
- char
长度固定,最多可以定义8000个字符。如果定义一个列为char(n),则将存储n个字符。当输入少于定义的字符数时,剩余的长度将被在右边的空格填满。 - nchar
与char类型相似,但最多可以定义4000个字符,使用Unicode编码。 - varchar
与char一样,用于存储字母数字数据,最多可定义8000个字符。二者不同之处在于varchar的每一行可以有不同的字符数,最大字符数未定义的最大长度。例如列定义为varchar(50),则该列数据最多可以有50个字符长。然而,如果列中只存储了3个字符长的字符串,则只会使用3个字符的存储空间。如果定义列时没有指定大小,即varchar(),则其长度默认为1。
特别,varchar(max)可以定义超过8000个字符的字符串数据类型,最多1073741824个字符。【注意不是varchar(n)】 - nvarchar
定义方式与varchar相似,除了nvarchar使用Unicode格式存储字符。
(3)日期和时间数据类型
- date
仅用来存储日期,其范围从0001年1月1日到9999年12月31日。date数据类型的格式是YYYY-MM-DD。 - time
只存储基于24小时制的时间,其格式为hh:mm:ss[.nnnnnnn]。与date数据类型类似,为了给要存储在列中的数据提供准确的数据类型,能存储精确度达100纳秒的数据。 - datetime
用于存储从1753年1月1日到9999年12月31日之间的任何日期和时间。datetime不仅存储日期,而且会在日期的旁边存储时间。如果只像定义为datetime的列存入日期,则会在存储的日期中加入默认的时间12:00:00。 - datetime2
与datetime类似,datetime2用于存储日期和时间。不同之处是,datatime2的数据类型秒的小数部分的精度更高。此外,该数据类型能存储从0001年1月1日到9999年12月31日的日期。其格式为YYYY-MM-DD hh:mm:ss[.nnnnnnn]。 - smalldatetime
与datetime十分相似,除了smalldatetime可存储的数值范围是从1900年1月1日到2079年6月6日。该数值范围的结束日期不是月末。
(4)二进制数据类型
- binary
存储固定大小的二进制个十数据,最多可存储8000字节。
这种数据类型主要用于存储作为标记或标记组合的数据。例如存储关于客户的标记。需要了解客户是否处于活动状态(值为1)、最近一个月有无消费记录(值为2)、最后一个月的消费额是否超过1000元(值为4)或者是否按时销账(值为8)。这将向数据库中加入4个数据列。然而,若使用binary值,如果客户有一个值为1101的二进制值,那么该客户拥有的值为1+4+8,这表明客户是活动的。最后一个月的消费额超过1000元并按时销账。 - varbinary
与binary十分相似,但是varbinary每一行的物理列大小随存储的值而不同。varbinary(max)能存储长度超过8000个字符的数据,最多可存储2GB,可用于存储类似图像这样的数据。
(5)专用数据类型
- bit
该数据类型存储的值为0或1.通常用于判定真假值。 - uniqueidentifier
用于存储16位全局唯一标识符(UUID)。 - XML
②程序中的数据类型
(1)cursor
数据能够以驻留内存的状态进行存储。游标,与表类似,有数据行和列,但它们的相似之处仅限于此。不同之处如:游标没有索引。通过使用游标来建立数据集,以便一次处理一行数据。
(2)table
table数据类型与游标和表有几分相似之处。该数据类型用于存储行和列的数据,但不能在数据上建索引。此时,系统可以“一次处理一个数据集”的数据,就想处理一个标准的表那样。
(3)sql_varint
可以根据存储的数据改变数据类型,即用来存储一些不同类型的数据类型。不过强烈不推荐使用这种数据类型。
3、表达式
表达式常指由常量、变量、函数等通过运算符按一定的规则连接起来的有意义的式子。
1.变量
T-SQL的变量分为局部变量和全局变量。
(1)局部变量
局部变量由用户定义,一般出现在批处理、存储过程和触发器中,其作用范围仅在程序内部。
局部变量必须先声明,后使用。T-SQL还为局部变量提供了赋值语句。
①declare变量声明语句,其语法格式为:
declare @变量1 [as] datatype,@变量2 [as] datatype...
- 局部变量名称必须以@开始开头
- as可以省略
- 赋初值NULL
局部变量的赋值有三种方式:
①在变量定义的时候对其赋值:
declare @变量1 [as] datatype = value,@变量2 [as] datatype = value...
②select赋值语句,其语法格式为:
select @变量1 = 表达式1,@变量2 = 表达式2...
- 用select命令可以一次给多个变量赋值
- 表达式可以为普通的value,也可以为查询结果
- 当表达式为表的列名时,形式与普通查询中使用列别名的用法类似。可以使用子查询从表中一次返回多个值。如果查询的结果为多行,则只会把最后一行的相应列值赋给变量,这与PL/SQL的处理方式不同,在PL/SQL中,不允许把多行查询结果赋值给变量
③set赋值语句,其语法格式为:
set @变量 = 表达式
- 基本用法和select一样,区别在于一条set赋值语句只能给一个变量赋值,而一条select语句可以给多个变量赋值
【示例】
declare @sumsal as numeric(10,2),@dno as tinyint
select @dno = deptno,@sumsal = sum(sal)
from emp
where deptno = 10
group by deptno
print cast(@dno as varchar)+':'+cast(@sumsal as varchar)
(2)全局变量
全局变量由SQL Server系统定义,通常用来跟踪服务器范围和特定会话期间的信息,不能被用户显式地定义和赋值。可以通过访问全局变量来了解系统目前的一些状态信息。
全局变量名以@@开头。下面给出一些常用的全局变量。
全局变量 | 说明 |
---|---|
@@error | 上一条SQL语句报告的错误号 |
@@nestlevel | 当前存储过程或触发器的嵌套级别 |
@@rowcount | 上一条SQL语句处理的行数 |
@@servername | 本地服务器名称 |
@@identity | 最后插入的标识值 |
@@spid | 当前用户进程的会话id |
@@fetch_status | 上一条游标fetch语句的状态 |
@@cpu_busy | SQL Server自上次启动后的时间状态 |
@@trancount | 当前的用户连接的当前活动事务数 |
2.逻辑处理
(1)if ... else ...
格式:
if 表达式
begin
条件成立处理语句
end
else
begin
条件不成立处理语句
end
例如:
declare @i int
set @i = 1
if @i > 0
begin
select CONVERT(varchar(10),@i)+'大于0' AS 提示信息
end
else
begin
select CONVERT(varchar(10),@i)+'小于0' AS 提示信息
end
3.函数
函数是用来完成某种特定功能,并返回处理结果的一组T-SQL语句,处理结果成为“返回值”,处理过程成为“函数体”。
函数又分为系统内置函数和用户自动以函数。SQL Server提供了大量系统内置函数,主要可以分为以下几类:数学函数、字符串函数、日期函数、convert函数、聚合函数。
(1)数学函数
T-SQL中提供的常用的数学函数如下:
- abs():返回绝对值
- round(数值表达式,长度,[,类型]):舍入到指定长度或精度。类型为0,表示舍入,类型为非0,表示截断
- power(m,n):返回m的n次幂
- trunc():将数字截断到指定的位数
- %:求余数,SQL Server没有mod(m,n),而用m%n代替
(2)字符串函数
- ltrim(str,substr)/rtrim(str,substr):str表示要操作的字符串,substr表示要裁剪的子串,若裁剪空格,则可以省略
- substring(str,position,length):求子字符串
- replace(str,search_str,rep_str):替换一个字符串中的子串。search_str表示要搜索的子字符串,rep_str表示要替换的目标字符串
- left(str,n):返回字符串从左边开始的指定个数的字符
- len():求字符串长度
(3)日期和时间函数
首先列出日期时间函数中的重要参数。
日期时间元素 | 缩写 | 含义 |
---|---|---|
year | yy,yyyy | 年 |
month | m,mm | 月 |
day | d,dd | 日 |
dayofyear | dy | 年的天数 |
week | wk | 星期数 |
weekday | dw | 星期几 |
hour | hh | 时 |
minute | mi | 分 |
quarter | 刻 | |
second | ss | 秒 |
millisecond | ms | 毫秒 |
T-SQL中提供下列日期函数:
- getdate():返回当前的日期和时间
- year(日期):返回指定日期的“年”部分的整数
- month(日期):返回指定日期的“月”部分的整数
- day(日期):返回指定日期的“日”部分的整数
- datepart(日期元素,日期):返回日期元素指定的日期部分的整数
- datename(日期元素,日期):以字符串的形式返回日期元素指定时间的日期名称
- datediff(日期元素,日期1,日期2):返回两个日期间的差值并将其转换为指定日期元素的形式
- dateadd(日期元素,数值,日期) :按照“日期元素”给定的日期单位,返回“日期”加上“数值”的新日期
涉及日期时间常量时,SQL Server建议使用与dateformat及语言环境设置无关的字符串格式,通常这样的字符串常量符合下面两种形式:
- 日期之间不使用分隔符,格式为yyyymmdd[ hh:mi:[:ss][,mmm]],如'20070703','20070703 17:53:00.997'。
- ISO 8601标准形式,格式为yyyy-mm-ddThh:mi:ss[.mmm],日期各个部分之间使用“-”分隔符,日期和时间部分用T分隔,并且时间部分不能省略,如'2007-07-03T17:53:10'。
(4)数据类型转换函数
转换的方式有隐式转换和显式转换两种。
隐式转换是SQL Server自动地将数据从一种数据类型转换为另一种数据类型,用户不可见。
显式转换使用convert函数,该函数可以将一种数据类型的表达式强制转换为另一种数据类型的表达式。两种数据类型必须能够进行转换,例如,char值可以转换为binary,但不能转换为image。该函数的主要作用是把数值型或日期型数据转换为字符串,而只包含数字的字符串转换为数值型数据一般隐式转换。
格式:convert(数据类型(长度),表达式[,n])
函数的第4个参数n是可选的,用于日期时间型数据类型和字符数据类型转换。参数取值如下表所示。
不带世纪数位 | 带世纪数位 | 格式 |
---|---|---|
1 | 101 | mm/dd/yyyy |
2 | 102 | yy.mm.dd |
3 | 103 | dd/mm/yyyy |
4 | 104 | dd.mm.yy |
5 | 105 | dd-mm-yy |
8 | 108 | hh:mi:ss |
20或120 | yyyy-mm-dd hh:mi::ss(24h) |
【示例】
select ename+''''+'s sal is'+convert(char(7),sal) as 'EMPLOYEE'S SAL' from emp;
select cid as '客户ID',cname as '客户名称'
convert(char(10),cRegisterationDate,102) as '注册日期'
from customer;
最终显示的日期格式就会如2006.12.02
3.运算符
算术运算符:+、-、*、/、%(求余)
字符串运算符:+(连接)
比较运算符:=、>、>=、<、<=、<>(不等于)、!>(不大于)、!<(不小于)
逻辑运算符:NOT、AND、OR、ALL(所有)、ANY(或SOME,任意一个)、BETWEEN...AND、EXISTS(存在)、IN(在范围内)、LIKE(匹配)
按位运算符:&(位与)、|(位或)、^(按位异或)
一元运算符:+(正)、-(负)、~(按位取反)
赋值运算符:=(等于)
【SqlServer】T-SQL的简介及基本用法的更多相关文章
-
SQLServer中sql for xml path 的用法
我们通常需要获取一个多行的某个字段拼出的字符串,我们可以使用for xml path进行处理:下面将介绍for xml path的具体用法: 创建测试表&插入测试数据 在数据库中新增测试表 C ...
-
sql事务(Transaction)用法介绍及回滚实例
sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...
-
SQLServer&#160;常见SQL笔试题之语句操作题详解
SqlServer 常见SQL笔试题之语句操作题详解 by:授客 QQ:1033553122 测试数据库 CREATE DATABASE handWriting ON PRIMARY ( name = ...
-
sql语句中charindex的用法 可用于截取字符串
使用CHARINDEX和PATINDEX函数来搜索文字列和字符串.这两个函数是如何运转的,解释他们的区别.同时提供一些例子,通过这些例子,你可以可以考虑使用这两个函数来解决很多不同的字符搜索的问题. ...
-
SQL SERVER 中 GO 的用法2
具体不废话了,请看下文详解. 1 2 3 4 5 6 7 8 9 10 use db_CSharp go select *, 备注=case when Grade>=90 then '成绩 ...
-
SQL中EXISTS和IN用法
SQL中EXISTS的用法 指定一个子查询,检测行的存在. 语法:EXISTS subquery 参数:subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INT ...
-
SQL SERVER 中PatIndex的用法个人理解
一般用法:PatIndex('%AAA%',‘BBBBBBBB’) 上句的意思是查找AAA在BBBBBBBB中的位置,从1开始计算,如果没有的话则返回0 其中%AAA%的用法和 SQL语句中like的 ...
-
Oracle数据库之PL/SQL程序设计简介
PL/SQL程序设计简介 一.什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写. ORACLE的SQL ...
-
SQL语句一些特殊的用法
SQL语句一些特殊的用法 一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份s ...
随机推荐
-
EF里的继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子
本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discr ...
-
Linux学习笔记之——安装虚拟机后,如何启用网卡
版本:CentOS-6.5-i386-minimal 虚拟机:vmware 11.1.2 安装完之后是看不到网卡信息的,如下: 我们编辑网卡etho的配置信息: 将 ...
-
js 阻止浏览器默认行为
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
-
新提交审核app保留检查更新入口将被拒绝(读取App Store 版本号的)
3月起要求关闭所有App内的检查更新功能,苹果App Store将向用户自动提示更新,新版本提交审核版本如果保留检查更新入口,审核时,将被拒绝. 以上拒绝的方案: 读取App Store的版本号. 替 ...
-
拓扑排序 codevs 4040 cojs 438
codevs 4040 EZ系列之奖金 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 由于无敌的WRN在2015年世界英 ...
-
HDU1028 Ignatius and the Princess III 【母函数模板题】
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
-
perl 5.22手动安装Mysql DBI和DBD
mysql 手动安装DBI 和DBD: DBI版本: [root@dr-mysql01 DBD-mysql-4.033]# perl -MDBI -le 'print $DBI::VERSION;' ...
-
flink-conf.yaml
Flink 配置文件 对于管理员来说,差不多经常调整的就只有 conf 下的flink-conf.yaml : 经过初步的调整,大约有以下模块的参数(未优化) Licensed to the Apac ...
-
php- post表单 input name属性的问题
<input type='text' style='width: 99px' name='deptNo'></td> name为字符串的时候传递的是单个字符串 <inp ...
-
javascript some()函数用法详解
参数说明callback: 要对每个数组元素执行的回调函数.thisObject : 在执行回调函数时定义的this对象. 功能说明对数组中的每个元素都执行一次指定的函数(callback),直到此函 ...