1、case…end (详细的值)

case后面有值,相当于c#中的switch case

注意:case后必须有条件,而且when后面必须是值不能为条件。

-----------------case--end---语法结构---------------------

select name , --注意逗号
case level --case后跟条件
when 1 then '骨灰'
when 2 then '大虾'
when 3 then'菜鸟'
end as'头衔'
from [user]

2、case…end (范围)

case 后面无值。相当于c#中的if…else if…else….

注意:case后不根条件

------------------case---end--------------------------------
select studentId,
case
when english between 80 and 90 then '优'
when english between 60 and 79 then '良'
else '差'
end
from Score
------------------case---end--------------------------------
select studentId,
case
when english >=80 then '优'
when english >=60 then '良'
else '差'
end
from Score
-----------------------------------------------------
select *,
case
when english>=60 and math >=60 then '及格'
else '不及格'
end
from Score

3、if…eles

IF(条件表达式)
BEGIN --相当于C#里的{
语句1
……
END --相当于C#里的}
ELSE
BEGIN
语句1
……
END
--计算平均分数并输出,假设平均分数超过分输出成绩最高的三个学生的成绩。否则输出后三名的学生
declare @avg int --定义变量
select @avg= AVG(english) from Score --为变量赋值
select '平均成绩'+CONVERT(varchar,@avg) --打印变量的值
if @avg<60
begin
select '前三名'
select top 3 * from Score order by english desc
end
else
begin
select '后三名'
select top 3 * from Score order by english
end

4、while循环

WHILE(条件表达式)
BEGIN --相当于C#里的{
语句
……
BREAK
END --相当于C#里的} --假设不及格的人超过半数(考试题出难了),则给每一个人添加分
select * from Score
declare @conut int,@failcount int,@i int=0 --定义变量
select @conut =COUNT(*) from Score --统计总人数
select @failcount =COUNT(*) from Score where english<100 --统计未及格的人数
while (@failcount>@conut/2)
begin
update Score set english=english+1
select @failcount=COUNT(*) from Score where english<100
set @i=@i+1
end
select @i
update Score set english=100 where english >100

5、索引

使用索引能提高查询效率,可是索引也是占领空间的。并且加入、更新、删除数据的时候也须要同步更新索引,因此会减少Insert、Update、Delete的速度。仅仅在常常检索的字段上(Where)创建索引。

1)聚集索引:索引文件夹中的和文件夹中相应的数据都是有顺序的。

2)非聚集索引:索引文件夹有顺序但存储的数据是没有顺序的。

--创建非聚集索引
CREATE NONCLUSTERED INDEX [IX_Student_sNo] ON student
(
[sNo] ASC
)

6、子查询

将一个查询语句做为一个结果集供其它SQL语句使用,就像使用普通的表一样,被当作结果集的查询语句被称为子查询。全部能够使用表的地方差点儿都能够使用子查询来取代。

select * from (select * from student where sAge<30) as t  --被查询的子表必须有别名
where t.sSex ='男' --对子表中的列筛选

转换为两位小数:CONVERT(numeric(10,2), AVG(english))

仅仅有返回且仅返回一行、一列数据的子查询才干当成单值子查询。

select '平均成绩', (select AVG(english) from Score) --能够成功运行
select '姓名', (select sName from student) --错误。由于‘姓名’仅仅有一行。而子表中姓名有多行 select * from student where sClassId in(select cid from Class where cName IN('高一一班','高二一班')) --子查询有多值时使用in

7、分页

--分页1
select top 3 * from student
where [sId] not in (select top (3*(4-1)) [sid] from student)--4表示页数 select *, row_number() over(order by [sage] desc ) from student-- row_number() over (order by..)获取行号 --分页2
select * from
(select *, row_number() over(order by [sid] desc ) as num from student)as t
where num between (Y-1)*T+1 and Y*T
order by [sid] desc
--分页3
select * from
(select ROW_NUMBER() over( order by [UnitPrice] asc) as num,* from [Books] where [publisherid]=1 )as t
where t.num between 1 and 20 --要查询的開始条数和结束条数

8、连接

select sName,sAge,
case
when english <60 then '不及格'
when english IS null then '缺考'
else CONVERT(nvarchar, english)
end as'英语成绩'
from student as s
left join Score as c on s.sid =c.sid 内连接 inner join...on...
查询满足on后面条件的数据
外连接
左连接
left join...on...
先查出左表中的全部数据
再使用on后面的条件对数据过滤
右连接
right join...on...
先查出右表中的全部数据
再使用on后面的条件对数据过滤
全连接
full join ...on... (*)交叉连接
cross join 没有on
第一个表的每一行和后面表的每一行进行连接
没有条件。是其他连接的基础

9.视图

长处:

  • 筛选表中的行
  • 防止未经许可的用户訪问敏感数据
  • 减少数据库的复杂程度

创建视图

create view v_Demo
as
select ......

10、局部变量

---------------------------------局部变量--------------------------
--声明变量:使用declarekeyword,而且变量名已@开头,@直接连接变量名,中间没有空格。必须指明变量的类型。同一时候还能够声明多个不同类型的变量。 declare @name nvarchar(30) ,@age int --变量赋值:
--1、使用set 给变量赋值,仅仅能给一个变量赋值
set @age=18
set @name ='Tianjia' select @age,@name --输出变量的值 --2、使用select 能够同一时候为多个变量赋值
select @age=19,@name='Laoniu' --3、在查询语句中为变量赋值
declare @sum int =18 --为变量赋初值
select @sum= SUM(english) from Score --查询语句中赋值
select @sum --输出变量值 --4、变量作为条件使用 declare @sname nvarchar(10)='张三'
declare @sage int
select @sage=sage from student where sName=@sname
select @sage --5、使用print输出变量值。一次仅仅能输出一个变量的值,输出为文本形式
print @sage

11、全局变量

--------------------------全局变量(系统变量)----------------------------------
select * from student0
select @@error --最后一个T-SQL错误的错误号
select @@max_connections--获取创建的同一时候连接的最大数目
select @@identity --返回近期一次插入的编号

12、事务

事务:同生共死

指訪问并可能更新数据库中各种数据项的一个程序运行单元(unit)–也就是由多个sql语句组成。必须作为一个总体运行

这些sql语句作为一个总体一起向系统提交,要么都运行、要么都不运行

语法步骤:

  • 開始事务:BEGIN TRANSACTION
  • 事务提交:COMMIT TRANSACTION
  • 事务回滚:ROLLBACK TRANSACTION

推断某条语句运行是否出错:

全局变量@@ERROR;

@@ERROR仅仅能推断当前一条T-SQL语句运行是否有错,为了推断事务中全部T-SQL语句是否有错,我们须要对错误进行累计;

---------------------------模拟转账----------------------------
declare @sumError int=0 --声明变量 begin tran
update bank set balance=balance-1000 where cId='0001'
set @sumError=@sumError+@@error
update bank set balance=balance+1000 where cId='0002'
set @sumError=@sumError+@@error if (@sumError=0)
commit tran --提交成功,提交事务
else
rollback tran --提交失败,回滚事务

13、存储过程

存储过程—就像数据库中执行方法(函数)

和C#里的方法一样。由存储过程名/存储过程參数组成/能够有返回结果。

前面学的if else/while/变量/insert/select 等,都能够在存储过程中使用

长处:

  • 运行速度更快 – 在数据库中保存的存储过程语句都是编译过的
  • 同意模块化程序设计 – 类似方法的复用
  • 提高系统安全性 – 防止SQL注入
  • 降低网络流通量 – 仅仅要传输 存储过程的名称

系统存储过程

由系统定义,存放在master数据库中

名称以“sp_”开头或”xp_”开头

创建存储过程:

定义存储过程的语法
CREATE PROC[EDURE] 存储过程名
@參数1 数据类型 = 默认值 OUTPUT,
@參数n 数据类型 = 默认值 OUTPUT
AS
SQL语句
參数说明:
參数可选
參数分为输入參数、输出參数
输入參数同意有默认值
EXEC 过程名 [參数]
----------------------例--------------------------
if exists (select * from sys.objects where name='usp_GroupMainlist1')
drop proc usp_GroupMainlist1
go
create proc usp_GroupMainlist1
@pageIndex int, --页数
@pageSize int, --条数
@pageCount int output--输出共多少页
as
declare @count int --共多少条数据
select @count =count(*) from [mainlist] --获取此表的总条数
set @pageCount=ceiling(@count*1.0/@pageSize) select * from
(select *,row_number() over(order by [date of booking] desc) as 'num' from [mainlist]) as t
where num between(@pageSize*(@pageIndex-1)+1) and @pageSize*@pageIndex
order by [date of booking] desc
-------------------------------------------------------------------------------------------
--调用
declare @page int
exec usp_GroupMainlist1 1,100,@page output
select @page

14、经常使用函数

1)ISNULL(expression,value)     假设expression不为null返回expression表达式的值。否则返回value的值

2)聚合函数

avg()  -- 平均值 统计时注意null不会被统计,须要加上isnull(列名,0)
sum() -- 求和
count() -- 求行数
min() -- 求最小值
max() -- 求最大值

3)字符串操作函数

  LEN() --计算字符串长度
LOWER() --转小写
UPPER () --大写
LTRIM() --字符串左側的空格去掉
RTRIM () --字符串右側的空格去掉
LTRIM(RTRIM(' bb '))
LEFT()、RIGHT() -- 截取取字符串
SUBSTRING(string,start_position,length)
-- 參数string为主字符串,start_position为子字符串在主字符串中的起始位置(从1開始),length为子字符串的最大长度。 SELECT SUBSTRING('abcdef111',2,3)
REPLACE(string,oldstr,newstr) Convert(decimal(18,2),num)--保留两位小数

4)日期相关函数

GETDATE() --取得当前日期时间
DATEADD (datepart , number, date )--计算添加以后的日期。 參数date为待计算的日期;參数number为增量;參数datepart为计量单位,可选值见备注。DATEADD(DAY, 3,date)为计算日期date的3天后的日期,而DATEADD(MONTH ,-8,date)为计算日期date的8个月之前的日期
DATEDIFF ( datepart , startdate , enddate ) --计算两个日期之间的差额。 datepart 为计量单位,可取值參考DateAdd。 -- 获取日期的某一部分 :
DATEPART (datepart,date)--返回一个日期的特定部分 整数
DATENAME(datepart,date)--返回日期中指定部分 字符串
YEAR()
MONTH()
DAY()

15、sql语句运行顺序

  5>…Select 5-1>选择列,5-2>distinct,5-3>top
1>…From 表
2>…Where 条件
3>…Group by 列
4>…Having 筛选条件
6>…Order by 列

15 个经常使用的 SQL Server 高级语法的更多相关文章

  1. SQL server高级语法

    1. 公共表达式CTE 公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE.递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达 ...

  2. SQL server存储过程语法及实例(转)

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...

  3. Sql Server 基础语法

    来自:http://www.cnblogs.com/AaronYang/archive/2012/04/24/2468093.html Sql Server 基础语法 -- 查看数据表 select  ...

  4. SQL SERVER常用语法记录

    用于记录SQL SERVER常用语法,以及内置函数. 以下语句包含: WITH 临时表语法 ROW_NUMBER()内置函数,我一般主要是用来分页.针对于查出来的所有数据做一个数字排序 分页的BETW ...

  5. SQL Server高级性能调优策略

    论坛里经常有人问“我的数据库很慢,有什么办法提高速度呢?”.这是个古老的话题,又是常见的问题,也是DBA们最想解决的问题之一.我想就SQLServer调优大家一起论一论,如果可以的话尽量发表自己观点, ...

  6. SQL Server高级内容之子查询和表链接

    1.子查询概念 (1)就是在查询的where子句中的判断依据是另一个查询的结果,如此就构成了一个外部的查询和一个内部的查询,这个内部的查询就是自查询. (2)自查询的分类 1)独立子查询 ->独 ...

  7. SQL Server高级内容之case语法函数

    1.Case函数的用法  (1)使用类似:switch-case与if-else if. (2)语法: case [字段] when 表达式 then 显示数据 when 表达式 then 显示数据 ...

  8. SQL SERVER高级知识积累

    什么叫做高可用服务器? 高可用服务器简单来理解就是不宕机的服务器 什么叫走服务器的自动化灾备? 自动灾备的意思就是,让从服务器自动变成主服务器 sql server的聚合是什么? 事务会引起性能下降, ...

  9. SQL SERVER常用语法汇总

    阅读目录 一.SQL分类 二.基础语句 三.sql技巧 四.(MS SQL Server)SQL语句导入导出大全 回到目录 一.SQL分类 DDL—数据定义语言(CREATE,ALTER,DROP,D ...

随机推荐

  1. chrome打开网址但是没有地址栏

    chrome打开网址但是没有地址栏 C:\Users\Administrator>C:\Users\Administrator\AppData\Local\Google\Chrome\Appli ...

  2. myeclipse集成svn

    svn安装 这个我在博客中的代码管理里面有些,也是一直next.svn代码管理版本号管理器安装好之后. myeclipse的svn插件 方法一: 然后配置MyEclipse的SVN插件,将插件下载下来 ...

  3. 数据挖掘算法学习(一)K-Means算法

    博主近期实习開始接触数据挖掘,将学习笔记分享给大家.眼下用的软件是weka.下篇文章会着重解说. 转载请附上链接http://blog.csdn.net/iemyxie/article/details ...

  4. Line(扩展欧几里得)

    题意:本题给出一个直线,推断是否有整数点在这条直线上: 分析:本题最重要的是在给出的直线是不是平行于坐标轴,即A是不是为0或B是不是为0..此外.本题另一点就是C输入之后要取其相反数,才干进行扩展欧几 ...

  5. Xcode6 引入第三方静态库project的方法

    首先.介绍一下把在当前project中引入其它依赖project的方法: 第一:把其它项目project加入到现有project做法: 定义: FPro 现有project == 父project C ...

  6. display:block jquery.sort()

    对所有的块元素都没有意义,块元素的dispaly属性默认值为block,没必要再显式定义——除非你之前对块元素的display属性重新定义过.===========================多罗 ...

  7. Weex学习与实践(一):Weex,你需要知道的事

    Weex学习与实践(一):Weex,你需要知道的事 http://coderyi.com/posts/weex1/ 1.命令行工具:weex-toolkit  https://github.com/w ...

  8. block的一些注意事项

    1,定义block时是可以同时进行赋值的 2,block中是代码块,就是里面写的是语句,需要加分号 3,在block中,允许有多条语句 4,在带有参数的block中,声明部分参数名可以省略,但是建议写

  9. 在centos上面开机自启动某个程序

    Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置.可以通过 systemctl --version 命令来查看使用的版本 常用命令 # 立即启动一个服务 $ s ...

  10. ASP.NET中各种缓存技术的特点及使用场景

    对于一些不经常改变却经常被request的数据,我们喜欢将它们缓存在内存.这样用户请求时先到缓存中去取,如果缓存中没有,再去数据库拿,提高响应速度.缓存一般实现在BLL,这样可以与DAL分离,更换数据 ...