15个常用的SQL Server高级语法

来源:互联网 发布:大数据时代的政治机遇 编辑:程序博客网 时间:2024/06/07 01:06
  1. case …. end (具体的值)
    case 后面有值,相当于C#中的switch case
    注意: case 后必须有条件,并且when 后面必须是值不能为条件
    select name ,
    case level
    when 1 then ‘骨灰’
    when 2 then ‘大虾’
    when 3 then ‘菜鸟’
    end as ‘头衔’
    from [user]

    1. case …end (范围)
      case 后面无值,相当于C#中的if … else if …else ……
      注意:case 后不跟条件
      select PP.Name,
      case
      WHEN PP.ReorderPoint BETWEEN 200 AND 400 THEN ‘First’
      WHEN PP.ReorderPoint BETWEEN 400 AND 600 THEN ‘Second’
      WHEN PP.ReorderPoint BETWEEN 600 AND 800 THEN ‘three’
      ELSE ‘NONE’
      END
      from Production.Product PP

select PP.Name,
case
WHEN PP.ReorderPoint >600 THEN ‘First’
WHEN PP.ReorderPoint >=400 THEN ‘Second’
WHEN PP.ReorderPoint >=200 THEN ‘three’
ELSE ‘NONE’
END
from Production.Product PP

SELECT PP.Name ,
case
when PP.SafetyStockLevel >600 AND PP.ReorderPoint>600 THEN ‘Good’
else ‘Poor’
end
FROM Production.Product PP

3.if … else
IF(条件表达式)
BEGIN —- 相当于C#里的{
语句1
…….
END —-相当于C#里的}
ELSE
BEGIN —- 相当于C#里的{
语句1
…….
END —-相当于C#里的}

DECLARE @avg int
SELECT @avg =AVG(PP.ReorderPoint) FROM Production.Product PP
SELECT ‘pingju’ + CONVERT(varchar,@avg)
if @avg>600
begin
select ‘Before’
select top 3 PP.Name
from Production.Product PP
ORDER BY PP.ReorderPoint
end
else
begin
select ‘LastThree’
select top 3 PP.Name
from Production.Product PP
ORDER BY PP.ReorderPoint
end
4. while 循环
WHILE(条件表达式)
BEGIN —相当于C#里的{
语句
BREAK
END —相当于C#里的}

–SELECT * FROM Production.Product PP
DECLARE @conut int ,@failconut int,@i int=0
select @conut= COUNT(*) from Production.Product PP
SELECT @failconut = COUNT(*) FROM Production.Product PP WHERE PP.ReorderPoint<700
WHILE (@failconut>@conut/2)
BEGIN
UPDATE Production.Product SET ReorderPoint=ReorderPoint+1
SELECT @failconut=COUNT(*) FROM Production.Product where ReorderPoint <700
SET @i=@i+1
END

SELECT @i
UPDATE Production.Product SET ReorderPoint=700 WHERE ReorderPoint>700

5.索引
使用索引能提高查询的效率,但是索引也是占据空间的,而且添加,更新删除数据的时候也需要同步更新索引,因此会降低Insert ,Update,Delete的速度,只在经常检索的字段上(where )创建索引。
1)聚集索引 :索引目录中的和目录中对应的数据都是有顺序的。
2)非聚集索引:索引目录有顺序但存储的数据是没有顺序的。

CREATE NONCLUSTERED INDEX [ IX_Student_sNo] ON student
( [sNo] ASC)

6.子查询
将一个查询语句作为一个结果集供其它SQL语句使用,就像使用普通的表一样,被当作结果集的查询语句被称为子查询。所有可以使用表的地方几乎都可以使用子查询来代替。
–SELECT * FROM (SELECT * FROM Production.Product WHERE ReorderPoint<400 ) AS PP
–WHERE PP.MakeFlag= 0

SELECT — 横向输出
( SELECT MAX(ReorderPoint) FROM Production.Product ) AS PPMAX,
( SELECT MIN(ReorderPoint) FROM Production.Product ) AS PPMIN,
( SELECT SUM(ReorderPoint) FROM Production.Product ) AS PPSUM,
( SELECT AVG(ReorderPoint) FROM Production.Product ) AS PPAVG

— 纵向输出
SELECT ‘PPMAX’ AS ‘描述’ , CONVERT(numeric(10,2),MAX(ReorderPoint)) as ‘数据’ FROM Production.Product
union all
SELECT ‘PPMIN’ ,MIN(ProductID) FROM Production.ProductReview
union all
SELECT ‘PPSUM’ ,SUM(ReorderPoint) FROM Production.Product
union all
SELECT ‘PPAVG’ ,AVG(ReorderPoint) FROM Production.Product

–转换为两位小数 CONVERT(numeric(10,2),MAX(ReorderPoint))
–只有返回且仅返回一行,一列数据的子查询才能当成单值子查询
7.分页
—-分页1
–select top 3 * from mypt.dbo.SowWean SW
–where SW.SowID NOT IN (SELECT SowID FROM mypt.dbo.SowInfo ) – 4 表示页数

SELECT *, ROW_NUMBER() over(order by SI.StateStartDate DESC ) FROM SowInfo SI – over(order by …)获取行号

—-分页2
select * from (
select * ,ROW_NUMBER() over ( order by SI.SowID) as num from mypt.dbo.SowInfo SI
) as t
where num Between (Y-1)*T+1 AND Y *T
order by SowID desc

—-分页3
select * from
(select ROW_NUMBER() over (order by SI.SowID asc ) as num ,* from mypt.dbo.SowInfo SI) as T
where T.num between 1 and 20
8.连接
select CI.CoteName from SowInfo SI
left join CoteInfo CI on SI.CoteCode = CI.CoteCode
–内连接 inner join …on..。
–查询满足on 后面条件的数据
–外连接
–左连接 left join ….on….
–先查出左表中的所有数据
–再使用on 后面的条件对数据过滤
–右连接
–右连接 right join …on…
–先查出左表中的所有数据
–再使用on 后面的条件对数据过滤
–全连接
–full join …on….
–(*)交叉连接
–cross join 没有 on
–第一个表的每一行和后面表的每一行进行连接没有条件。是其它连接的基础

9.视图
–CREATE VIEW My_View
–as (SELECT * FROM SowInfo)
–drop view My_View

10.局部变量
————————局部变量———————–
–声明变量:使用declare 关键字,并且变量名已@开头,@直接连接变量名称,中间没有空格。
–必须明确变量的类型,同时还可以声明多个不同类型的变量。
–declare @name nvarchar(30),@age int
declare @BeginDate datetime,@EndDate datetime ,@FarmName nvarchar(100)

–变量赋值
set @BeginDate =DATEADD(MONTH,-1,GETDATE())
set @EndDate =GETDATE()
set @FarmName=’YDZYZC’
—输出变量的值
select @BeginDate ,@EndDate, @FarmName
—使用select可以同时为多个变量赋值
select @BeginDate=DATEADD(DAY,-23,GETDATE()) ,@EndDate=GETDATE(), @FarmName=’YDZYZC’

—在查询语句中为变量赋值
declare @num int=100 –为变量赋初值
–查询语句中赋值且变量作为条件使用
select @num= COUNT(sv.SowID) from sowgestation sv where checkdate>=@BeginDate and checkdate<=@EndDate and checkresult=803 and cotecode like (@FarmName+’%’)
–输出变量值
select @num
print @num – 输出到消息框中

11.全局变量

SELECT * FROM Student
select @@error

全局变量@@error 判断程序的执行是否出错

12.事务
事务 :同生共死
指访问并可能更新的数据库中各种数据项的一饿程序执行单元-也就是有一个多个sql 语句组成,必须作为一个整体执行
这些sql 语句作为一个整体一起向系统提交,要么执行要么都不执行

语法步骤:
开始事务: BEGIN TRANSACTION
事务提交: COMMIT TRANSACTION
事务滚回 : ROLLBACK TRANSACTION

13.存储过程

存储过程就像数据库中运行方法(函数)
和C# 里的方法一样,由存储过程/存储过程参数组成/可以有返回结果
前面学的if else /while/declare/insert/select 等,都可以在存储过程中使用
优点:执行速度快-在数据库中保存的存储过程语句都是编译过的
允许模块化程序设计-类似方法的复用
提高系统安全性-防止SQL注入
减少网络流通量 - 只要传输存储过程的名称
系统存储过程
由系统定义,存放在master数据库中
名称以“sp_”开头或“xp_”开头

创建存储过程:

定义存储过程的语法create PROC[EDURE] 存储过程名@参数1   数据类型=默认值  OUTPUT@参数n   数据类型= 默认值 OUTPUTASSQL语句参数说明:参数可选参数分为输入参数,输出参数输入参数允许有默认值EXEC 过程名 [参数]-------------------例--------------------------if exists(select * from sys.objects where name="This_Proc")drop  proc This_Procgocreate proc This_Proc@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 intexec usp_GroupMainlist1 1,100,@page outputselect @page
  1. 常用函数

1)ISNULL(expression,value) 如果expression 不为null 返回expression表达式的值,否则返回value 的值
2)聚合函数
avg() —–平均值 统计时注意null 不会被统计,需要加上isnull (列名,0)
sum() —– 求和
count() —– 求行数
min() ——求最小值
max() ——求最大值

3)字符串操作函数

LEN() --计算字符串的长度LOWER ()  -- 转小写POWER()  --- 大写LTRIM()  ---字符串左侧的空格去掉RTRIM()  --- 字符串右侧的空格去掉LTRIM(RTRIM("      AA     "))LEFT() RIGHT()   ----截取字符串SUBSTRING(string,start_position,length) ---参数string 为主字符串,start_position 为子字符串在主字符串中的起始位置(从1 开始),length 为子字符串的最大长度。SELECT SUBSTRING('ABCDEFG',2,3)REPLACE(string,oldstr,newstr)Convert(decimal(18,2),num)

4)日期相关函数

GETDATE()  ----取得当前日期时间DATEADD(datepart,number,date)   ---计算增加以后的日期DATEDIFF(datepart,number,date)  -----获取日期的某一部分DATEPART(datepart,date)  ----返回一个日期的特定部分  整数DATENAME(datepart,date)  ----返回日期中指定部分  字符串YEAR()MONTH()DAY()
  1. sql 语句执行顺序
5>... SELECT 5-1>[column] ,  5-2>distinct, 5-3>top 1>... FROM 表2>... WHERE   条件3>... Group by 列4>... Having  筛选条件5>... Order by 列