热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【SqlServer】SqlServer编程语言T-SQL的简介及基本用法

一.T-SQL概述SQLServer用于操作数据库的编程语言为Transaction-SQL,简称T-SQL。T-SQL与PLSQL不同,并没有固定的程序结构。T-SQL包括以下4个部分:
一.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自上次启动后的时间状态

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 qq
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(匹配)
按位运算符:&(位与)、|(位或)、^(按位异或)
一元运算符:+(正)、-(负)、~(按位取反)
赋值运算符:=(等于)

原文链接: T-SQL 简介及基本语法

推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
author-avatar
冷嘲热讽714
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有