自从用了EF后很少写sql和存储过程了,今天需要写个比较复杂的报告,翻出了之前的笔记做参考,感觉这个笔记还是很有用的,因此发出来和园友分享。

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,casewhen english between 80 and 90  then '优'when english between 60 and 79  then '良'else '差'endfrom Score
------------------case---end--------------------------------
select studentId,casewhen english >=80  then '优'when english >=60  then '良'else '差'endfrom Score
-----------------------------------------------------
select *,casewhen english>=60 and math >=60 then '及格'else '不及格'end
from Score 

3、if...eles

IF(条件表达式)BEGIN --相当于C#里的{    语句1……END --相当于C#里的}
ELSEBEGIN语句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 descendelsebeginselect '后三名'select top 3 * from Score order by english  end

4、while循环

WHILE(条件表达式)BEGIN --相当于C#里的{    语句……BREAKEND --相当于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)beginupdate Score set english=english+1select @failcount=COUNT(*) from Score where english<100set @i=@i+1end
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 studentwhere [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

--分页3select * 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,casewhen 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、局部变量

---------------------------------局部变量--------------------------
--声明变量:使用declare关键字,并且变量名已@开头,@直接连接变量名,中间没有空格。必须指明变量的类型,同时还可以声明多个不同类型的变量。
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+@@errorif (@sumError=0)
commit tran --提交成功,提交事务
else
rollback tran --提交失败,回滚事务

13、存储过程

存储过程---就像数据库中运行方法(函数)
和C#里的方法一样,由存储过程名/存储过程参数组成/可以有返回结果。
前面学的if else/while/变量/insert/select 等,都可以在存储过程中使用
优点:

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

系统存储过程
由系统定义,存放在master数据库中
名称以“sp_”开头或”xp_”开头

创建存储过程:

定义存储过程的语法CREATE  PROC[EDURE]  存储过程名 @参数1  数据类型 = 默认值 OUTPUT,@参数n  数据类型 = 默认值 OUTPUTASSQL语句
参数说明:
参数可选
参数分为输入参数、输出参数
输入参数允许有默认值
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 twhere num between(@pageSize*(@pageIndex-1)+1) and @pageSize*@pageIndexorder 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>top1>…From 表2>…Where 条件3>…Group by 列4>…Having 筛选条件6>…Order by 列

---------------------以下是根据园友建议后续补充的,部分为项目中的实际代码(没时间写整理直接贴源码)---------------------------

 16、分组查询group by...having

对group by分组后的数据进行过滤在分组查询中,查询的列名必须出现在group by后或者在聚合函数中

--查询平均工资大于两千块钱的部门select department_id,avg(wages)from employeewhere department_id  is not nullgroup by department_idhaving avg(wages)>2000

17、临时表[转]

方法一:
     create table #临时表名(字段1 约束条件,
                      字段2 约束条件,
                  .....)
        create table ##临时表名(字段1 约束条件,
                          字段2 约束条件,
                      .....)
        方法二:
     select * into #临时表名 from 你的表;
       select * into ##临时表名 from 你的表;
注:以上的#代表局部临时表,##代表全局临时表

drop table #Tmp   --删除临时表#Tmp
create table #Tmp --创建临时表#Tmp
(ID   int IDENTITY (1,1)     not null, --创建列ID,并且每次新增一条记录就会加1WokNo                varchar(50),   primary key (ID)      --定义ID为临时表#Tmp的主键
);
Select * from #Tmp    --查询临时表的数据
truncate table #Tmp --清空临时表的所有数据和约束

详细说明:http://www.cnblogs.com/Hdsome/archive/2008/12/10/1351504.html

18、表值函数

Create FUNCTION [dbo].[GetUPR]
(@upr varchar(2)  --传入函数中的参数
)
RETURNS @tab TABLE
(UPR varchar(2) --返回表的字段,这里只有一个字段
)
AS
BEGINif(@upr='0')begininsert @tabselect 'U'union select 'P'union select 'R'endelsebegininsert @tab select @uprendRETURN ;
END

19、标量值函数

-- =============================================
-- 根据订单号获取销售员1的邮箱
-- =============================================
Create FUNCTION [dbo].[GetSalManAEmailByOrderNo]
(@orderNo varchar(16)
)
RETURNS varchar(128)
AS
BEGINdeclare @salManAEmail varchar(128)select @salManAEmail=EMailA from UserDB.dbo.EmployeeInfo where EmployeeID in(select EmployeeInfoID from SalesManInfo where SalesManCode in(  select SalesManA from OrderInfo where SalesOrder=@orderNo))RETURN ( @salManAEmail)END

20、触发器[转]

CREATE TRIGGER trigger_name
ON {table_name | view_name}
{FOR | After | Instead of } [ insert, update,delete ]
AS           sql_statement 

详细说明:http://www.cnblogs.com/yank/p/4193820.html

转载于:https://www.cnblogs.com/rdst/p/4727063.html

SQL Server 常用高级语法笔记相关推荐

  1. SQL Server常用的系统存储过程应用实例(转)

    摘要:Sql Server自带的系统存储过程有许多,但大部分我们是不常用的.我在实践中根据自己的体会,总结整理了一些比较常用的,加上一些实例介绍给大家.本期介绍: l         sp_attac ...

  2. SQL server常用查询

    SQL server常用操作 查询:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,v ...

  3. oracle sql常用的函数,界别Oracle和SQL Server常用函数

    区分Oracle和SQL Server常用函数 一.数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) ...

  4. SQL Server 常用更新语句,用B表数据作为条件或数据源更新A表数据

    SQL Server 常用更新语句,用B表数据作为条件或数据源更新A表数据 示例:用B表姓名覆盖A表姓名 假设: A表数据 Id,Name 1,张三 B表数据 Id,Name 1,李四 用下面这个语句 ...

  5. SQL Server T-SQL高级查询

    高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student; --all 查询所有 select all sex from s ...

  6. 数据库SQL SERVER常用命令说明

    转载自https://blog.csdn.net/xf_yan/article/details/80464835: 一.基础 1.说明:创建数据库 CREATE DATABASE database-n ...

  7. SQL Server常用的系统存储过程应用实例

    摘要:Sql Server自带的系统存储过程有许多,但大部分我们是不常用的.我在实践中根据自己的体会,总结整理了一些比较常用的,加上一些实例介绍给大家.本期介绍: l         sp_attac ...

  8. Sql Server常用时间段查询汇总

    前言 本文对应Sql Server 中常用的时间查询的进行一些汇总,例如查询当天的.本周的.本月的.本季度的,某个时间段内的时间. 实例 实例(我的)表名:mytable 字段名:mydate (一) ...

  9. Solr常用查询语法笔记

    1.常用查询 q - 查询字符串,这个是必须的.如果查询所有*:* ,根据指定字段查询(Name:张三 AND Address:北京) fq - (filter query)过虑查询,作用:在q查询符 ...

  10. SQL Server 常用日期函数的运用

    1.对SQL Server 日期函数的应用,本文主要的内容是如何获取下面的相关日期 本周星期一 本月第一天 本季度第一天 本年第一天 本周第一天 本月最后一天 本季度最后一天 本年最后一天 本周最后一 ...

最新文章

  1. ollvm 编译器优化的bug
  2. 中考考试的指令广播_明天FM105.2《朝朝早精神好》推出2017广州中考日特别报道...
  3. linux shell sed中使用变量
  4. git 无法拉取项目,本地ping不通github的解决办法(详解)
  5. 字节Java高级岗:javaio流面试题
  6. wince6.0远程控制工具_【创新创效】门架业务主动监测工具和远程控制电源开关...
  7. PigPen:用Clojure写MapReduce Introducing PigPen: Map-Reduce for Clojure
  8. 图像局部显著性—点特征(FREAK)
  9. 一文看懂计算机神经网络与梯度下降
  10. Asp.net 中 Eval 调用后台函数的写法
  11. python中什么是主要数据类型_python中基本数据类型是什么
  12. springboot在启动jar由于配置hibernate的映射文件上classpath导致的!BOOT-INF/classes/!路径出现!号问题解决方法
  13. 【转】和菜鸟一起学linux之DBUS基础学习记录
  14. 清空上传控件HtmlInputFile的方法
  15. 背景渐变/字体颜色渐变(可应用于银行卡背景框)
  16. java医院门诊管理系统
  17. Android Studio制作一个简单的计算器APP
  18. php模仿一个开票系统,一个模仿oso的php论坛程序(之一)
  19. 查看core dumped的详细错误原因
  20. 互联网快讯:菜鸟加码全球物流网络布局;猿辅导、掌门教育聚焦素质教育

热门文章

  1. go对get、post请求封装
  2. Mysql关键字 (MySQL 5.1参考手册)
  3. java queue的实例化_如何在java中实例化Queue对象?
  4. CONTEXT_CREATION_ERROR: Renderer: Error creating Canvas3D graphics context/Not a GL2 implementation
  5. Execution failed for task :Test:lintVitalRelease/Lint found fatal errors while assembling a release
  6. JDK的问题:用C启动虚拟机跟java运行结果有差异
  7. ADB Interface显示黄色惊叹号怎么办?
  8. H264编码质量屏幕截图
  9. C#中获得窗体的句柄
  10. std::map,不同的插入方式,会导致崩溃