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]
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 数据类型= 默认值 OUTPUT
AS
SQL语句
参数说明:
参数可选
参数分为输入参数,输出参数
输入参数允许有默认值
EXEC 过程名 [参数]
-------------------例--------------------------
if exists(select * from sys.objects where name="This_Proc")
drop proc This_Proc
go
create 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 int
exec usp_GroupMainlist1 1,100,@page output
select @page
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()
5>... SELECT 5-1>[column] , 5-2>distinct, 5-3>top
1>... FROM 表
2>... WHERE 条件
3>... Group by 列
4>... Having 筛选条件
5>... Order by 列