15 个常用的 SQL Server 高级语法

SQL server 常用命令总结 SQL常用命令 阅读详情
AI摘要

本文详细介绍 SQL Server 中常用的语法,包括 case...end 的使用、条件判断与循环语句、索引、子查询、分页、连接、视图、变量、事务、存储过程等,并附带实际案例。

转自:http://www.codeceo.com/article/15-sql-server-grammer.html

自从用了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,
    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、局部变量

---------------------------------局部变量--------------------------
--声明变量:使用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+@@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 列

sql server 常用运维SQL sql server 常用运维sql 阅读详情

相关推荐

量化交易新手必看:如何用vnpy+Tushare轻松获取A股历史数据(附完整代码)

本文为量化交易新手提供了使用vnpy和Tushare构建A股历史数据获取系统的完整指南。通过详细的代码示例,手把手教你搭建环境、封装数据获取引擎,并实现日线等数据的格式转换与本地存储,为策略回测与分析奠定坚实的数据基础。

weixin_29098117的博客 378

SQL Server 常用高级语法笔记

自从用了EF后很少写sql和存储过程了,今天需要写个比较复杂的报告,翻出了之前的笔记做参考,感觉这个笔记还是很有用的,因此发出来和园友分享。 1、case...end (具体的值)case后面有值,相当于c#中的switch case注意:case后必须有条件,并且when后面必须是值不能为条件。 -----------------case--end---语法结构-----------...

weixin_33853827的博客 456

【脑电分析系列】第15篇:脑电功能连接性与脑网络分析(二):Granger因果性、图论指标与复杂网络构建

摘要: 本文深入探讨了脑电(EEG)分析中的高阶连接性方法——有效连接(Effective Connectivity),重点介绍了Granger因果性(Granger Causality, GC)的原理与应用。GC通过统计预测揭示脑区间信息流动方向,超越了传统功能连接的同步性分析。文章还结合图论指标(如度、路径长度、聚类系数和模块化)量化脑网络的拓扑结构,并通过Python代码(MNE和NetworkX库)演示了从EEG数据构建、分析复杂脑网络的完整流程。该研究为理解大脑动态互动、认知任务信息流及神经系统疾

qq_32516809的博客 1563

SQL server高级语法

1. 公共表达式CTE 公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE。递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。 如下面的例子,可以递归把组织名放到一起。 其实CTE的作用就相当于子查询 2.窗口函数、分区函数 窗口函数和聚集函数一样都是对定义的行集(组)进行聚集,但是不像聚集一样只返...

weixin_30374009的博客 472

VisionPro 9.0 QuickBuild里用C#脚本调用Halcon 23.11模型,保姆级图文配置流程

本文详细介绍了如何在VisionPro 9.0 QuickBuild环境中使用C#脚本调用Halcon 23.11深度学习模型,提供从环境配置到模型集成的保姆级图文教程。重点解决图像格式转换、许可证配置等工业视觉检测中的常见问题,帮助开发者快速实现高效、稳定的视觉检测流水线部署。

weixin_27027459的博客 435

AHB2eflash 控制器设计笔记

① SRAM② DRAM③ SSD④ SATA⑤ U 盘⑥ 移动硬盘⑦ 机械磁盘eflash。

weixin_46220498的博客 3078

(珍藏)高级:SQL Server 常用高级语法笔记

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

weixin_43964192的博客 1453

四、Burpsuite工具之proxy模块详解-intercept功能

过了一个年,感觉好久都没有更新了,今天就从burpsuite的更新开始吧。前面已经说过了burpsuite的安装和proxy代理的配置,今天说一下proxy模块中非常有用的intercept功能。intercept是拦截的意思,在这里相当于拦截请求,可以实时的对请求进行拦截,然后请求参数的篡改,再把请求放通,从而达到实时修改请求的功能intercept的总体界面如下图所示其中下图红框中是可以修改请求目标的相关信息。

SmileAssassn的博客 1663

SQL教程——分支结构

本教程中所使用的数据库的建表语句都在“SQL教程——索引”这篇文章中,点击链接直达:索引&建表语句 摘要:本文主要介绍SQL语法的流程控制结构 目录 流程控制结构 分支结构 1.if函数 2.case结构 3.if结构 流程控制结构 顺序结构:程序从上往下依次执行 分支结构:程序从两条或多条路径中选择一条去执行 循环结构:程序在满足一定条件的基础上,重复执行一段代码 分支结构 1.if函数 功能:实现简单的双分支 语法: if (表...

待到春花烂漫时 1万+

华为od 面试八股文_C++_01_含答案

华为od 面试八股文_C++_01_含答案

MISAYAONE的博客 5593

YOLOv11安卓端部署终极指南:从训练到NCNN移植,30分钟搞定手机实时检测!

本文详细介绍了YOLOv11模型在安卓设备上的NCNN部署全流程。主要内容包括:1) 环境配置要求(Python3.8+、PyTorch、NCNN框架等);2) COCO2017数据集准备与配置;3) 模型训练建议(使用RTX3090,50-100个epoch);4) 模型导出转换步骤(ONNX格式转换、NCNN优化);5) 安卓端实现的关键优化(快速sigmoid实现、纯C++NMS等)。项目在安卓CPU模式下可实现20FPS的稳定检测,并提供了激活函数选择、模型量化等性能调优建议。通过参考多个开源项目,

FJN110的博客 1726

sql循环查询语句_SQL查询语句-简单查询

一、SQL基本查询语句1、从表中查询2列select 姓名,性别 from student;2、查询出全部列select * from student;3、为列赋予别名select 姓名 as s_name,性别 as '人类性别' from student;4、删除重复数据①删除某列重复数据select distinct 姓名 from student;②删除两列的重复数据select dist...

weixin_31480911的博客 1万+

Windows 下 Claude Code Desktop 安装与使用全记录:从零到一的保姆级图文教程

本文主要介绍了Windows 下 Claude Code 安装全记录:从零到一的保姆级图文教程,希望能对学习使用 Claude Code 的同学们有所帮助。 文章目录 1. 背景 2. 安装Claude Code Desktop 3. 配置第三方API 4. 日常使用

weixin_43178406的博客 8万+

15个常用的SQL Server高级语法

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]

鹤仁的专栏 1496

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

SQL Server全方位指南:从入门到高级详解

本文为您提供了关于SQL Server的全面教程,覆盖了入门、进阶和高级三大部分。首先,我们介绍了SQL Server的基础知识,包括数据库创建、表操作、数据查询、更新等基本SQL语法。接着,深入探讨了事务处理、索引优化、联合查询、视图、存储过程及触发器等进阶技术。最后,文章详细讲解了查询优化、分区表、高可用性、灾难恢复、透明数据加密以及大数据支持等高级特性。无论您是初学者还是高级用户,都能通过本文获得深入的SQL Server知识与实践技巧。

qq_43535970的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SQL Server SQL语法详解与实战应用:从基础到场景实现

DDL 用于定义和管理数据库对象,如表、视图、索引等。常见的 DDL 语句包括CREATEALTERDROP等。本文详细介绍了 SQL Server 的 SQL 语法,包括 DDL、DML、DCL、TCL 等基本操作,并结合丰富的代码示例展示了如何使用这些语法进行数据库操作。最后,我们设计了一个完整的“员工管理系统”应用场景,展示了如何将 SQL Server 的各项功能综合应用于实际项目中。通过本文的学习,读者可以掌握 SQL Server 的核心 SQL 语法,并具备开发简单数据库应用的能力。

qq_53152589的博客 819

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Sql server基本语法练习

Sql server基本语法Sql server基本语法 Sql server基本语法 此处源于一个基本的SQL Server试题,基本上涵盖了SQL Server的全部基本语法,粘贴在此处,权当分享 SQL server基本语法 –1、 创建TestDB数据库 create database TestDB; –2、 查看TestDB数据库是否存在 IF EXISTS (SELECT 1 F...

lamch67的博客 704

SQL Server基本语法

SQL Server基本语法

u010117029的博客 898

【SQL Server 2008数据库基础篇】常用关键字、数据类型和常用语法

SQL Server 2008 常用关键字、数据类型和常用语法 常用关键字: SQL server 2008一共大约有180多个关键字。简要分为主要关键字、辅助关键字和函数类关键字。本文就常用的这三类关键字进行语法说明和用例。 说明:1、比较好的习惯是,数据库名以D_开头,表名用T_开头,字段名以F_开头,这样可以防止和关键字重名。 2、如果确实用到了系统关键字,就要在关键上加[...

weixin_30547797的博客 1611

SQL Server 常用函数

本文介绍了SQL中常用的各类函数及其应用实例,涵盖了字符串处理、数值计算、日期与时间、逻辑与条件、聚合与窗口、系统与元数据以及JSON处理等多个方面。字符串处理函数如CONCAT、SUBSTRING、CHARINDEX和REPLACE用于拼接、截取、查找和替换字符串;数值计算函数如ROUND、ABS和RAND用于四舍五入、取绝对值和生成随机数;日期与时间函数如GETDATE、DATEDIFF和DATEADD用于获取当前日期、计算日期差值和日期加减;逻辑与条件函数如CASE、COALESCE和IIF用于条件分

沐白的博客 1346

SQL server高级应用

  SQL server高级应用一. 建库,建表,加约束.1.1建库use mastergoif exists (select * from sysdatabases where name=’MyDatabase’)—判断master数据库sysdatagbases表中是否存在将要创建的数据库名drop database MyDatabase—如果sysdatabase

lyh8749的专栏 987

SQL Server日期查询常用语句

SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)))) when 28 then '平年' else '闰年' end。when 28 then '平年' else '闰年' end。或者使用计算本月的最后一天的脚本,然后用DAY函数区最后一天。set @m=2 --月份。

csdn_wzq的博客 1684

SQL常用函数详解:MySQL、PostgreSQL、Oracle、SQL Server对比指南

在数据库开发中,熟练掌握SQL函数是提高查询效率和数据处理能力的关键。本文将详细介绍SQL中最常用的函数,并对比不同数据库系统(MySQL、PostgreSQL、Oracle、SQL Server)中的使用方法和差异。

Q10235129566的博客 1913
上一篇: 10个对开发者非常有用的设计原则
下一篇: SOAP消息机制简介
UU_Yang
博客等级 码龄23年 926粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值