MS-SQL
变量
一个@为局部变量,两个@@为全局变量
@@error 最后一句SQL语句的错误编号 错误码
@@identity最后一次插入的标示值符
insert into biao(lie) output inserted.id values(zhi)
select @@identity
@@language
@@version
@@transcount当前事务数
@@severname本地服务器名字
@@rowcount受上句SQL语句影响的行数
@@max_connections可以创建同时连接的最大数目
先定义,后使用。ADO.Net中给变量起别名加@ 任何一个名字会被认为是一个列或者存储过程
定义:declare @变量 类型 declare @name nvarchar(4)
赋值:set @变量 =值
select @变量=值, @变量=值
比如
declare @name='张三'
declare @sid =1
select @name= stuName from student where stu_id=@sid 将张三换成查出的name值。
流程控制
在sql执行特定的脚本。循环判断,if else
if(条件表达式) --没有{},用begin end代替。
begin语句end
else
begin语句end
例如
DECLARE @num int
SET @num =2;
IF(@num=2)
begin
select '是二'
end
else
begin
select '不是二'
end
while(条件表达式) begin 语句 continue break end
1-100和
--定义两个变量,总和与指针赋初值0 和1
DECLARE @sum int
declare @index int
select @sum=0,@index=1
while(@index!>100)
begin
set @sum=@index+ @sum
set @index=@index+1
end
SELECT @sum
1-100的素数
只能被1和本身整除的数字 2 3 5 7 11 13 17
class Program
{
static void Main(string[] args)
{
for (int i = 2; i <100; i++)
{
int j; for ( j = 2; j < i; j++)
{
if (i%j == 0)
{
break;
}
}
if (j == i)
{
Console.Write( i+",");
}
}
Console.ReadKey();
}
}
SQL:列出实现1-100所有的质数
CREATE table zhishu(
zs int
)
SELECT * from zhishu DECLARE @i int
DECLARE @j int
SET @i = 2
WHILE(@i<100)
begin
set @j =2
while(@j<@i)
BEGIN
IF(@i%@j=0)
begin
break
end
set @j=@j+1
end
IF(@i=@j)
BEGIN
insert INTO zhishu(zs)VALUES(@i)
end
set @i=@i+1
end
和
求:1-100所有偶数的和
DECLARE @su int
declare @inde int
select @su=0,@inde=1
while(@inde!>100)
begin
IF(@inde%2=0)
BEGIN
set @su=@inde+ @su
end
set @inde=@inde+1
end
SELECT @su
case函数
放在select之后,对字段处理显示数据变化。给一般用户看这些数据,需要改值,比如 f代表女,m代表男。
2种:
简单case函数,相当c#switch case。
case 字段
when 值1 then 显示1
when 值2 then 显示2
else 显示
end
select id ,name,
case sex when 'f' then '女' when ‘m’ then ‘男’ else ‘不知’ end as[性别],--需要为此列取个别名,上个sex字段名不能用了。
from biao
搜索case函数相当c#if else if
case
when 字段表达式 then 显示1
when sex=‘f’ then 显示2
else 显示
end
SELECT name,
CASE WHEN (age>=20 and age<=30 and cashM>=2000 and cashM<=10000) then ''
WHEN (age>=30 and age<=80 and cashM>=3000 and cashM<=10000) then ''
END AS "年龄工资"
from cash
case when then end对一列数据进行操作。as七个列名
trancate 删除
公共表表达式 修改视图
表联合
:union列数目没变化,可以将结果集合并,没有改变结果的结构。多个select。行数增加而已。
表连接
数据源的操作,from后面的事情
改变列的数目,3列和9列的表合并成12列的表称为连接
交叉连接:cross两个表的笛卡尔积。生成辅助表,用于数据优化,需要1234纯数字连续据表
USE lianxi; --删除表格
drop table dbo.num15;
DROP table num25;
CREATE table t_stu( stuid int ,stuName nvarchar(4) )
CREATE table t_score( scoreid int ,scoreName nvarchar(4) )
INSERT into t_stu VALUES(1,'张三'),(2,'李四');
INSERT into t_stu VALUES(3,'王五'),(4,'李六');
INSERT into t_score VALUES(1,'第一次'),(2,'第二次') --删除前几行数据
DELETE top (4) from t_stu;
SELECT *FROM t_stu;
SELECT* FROM t_score;
交叉连接最为基本。
SELECT * FROM t_stu as t1 CROSS JOIN t_score as t2;
内连接:on条件,就是主外键相同时,找到对应的信息。此种方法有交叉连接的基础再on主外键,记住。
SELECT * FROM t_stu as t1 INNER JOIN t_score as t2 on t1.stuid=t2.scoreid;
外连接:outer join一般省略,用左连接和右连接 全连接
SELECT * FROM t_stu as t1 LEFT join t_score as t2 on t1.stuid=t2.scoreid;
SELECT * FROM t_stu as t1 RIGHT join t_score as t2 on t1.stuid=t2.scoreid;
SELECT * FROM t_stu as t1 full join t_score as t2 on t1.stuid=t2.scoreid;
表表达式
派生表(临时表),公共表表达式(临时),视图(持久存在)可能浪费资源哦
3种,派生表(临时表)将查询的数据作为from后的数据源,和子查询有点类似。但是子查询是一个或多个值,用in,而派生表是一张表。
查询是必须用括号括起来。不能是游标,必须是结果集。所以不能只含有order by。可以top oderby
比如有张学生表和课程表,要求查询15年山东的学生,同时显示课程。
就会 select *
from student as t1 inner jion course as t2 on t1.id=t2.stu_courid
where datediff(year,studate,getdate())=0 and stuaddr like'%山东%'
我们可以先把学生表和课程表连接,求出学生课程表。
作为派生表数据源,select * from (派生表)as 表别名 where datediff(year,studate,getdate())=0 and stuaddr like'%山东%'
公共表表达式
CTE(Common Table Expression)。
http://www.cnblogs.com/CareySon/archive/2011/12/12/2284740.html
http://www.cnblogs.com/aierong/archive/2008/07/31/1257250.html
视图
为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的.但是,视图是作为系统对象存在数据库中,那对于结果集仅仅需要在存储过程或是用户自定义函数中使用一次的时候,使用视图就显得有些奢侈。
事务
和values()()表值函数类似,原子性的操作,作为一个整体(由多个sql语句组成)执行。每句sql语句就是一个事务。防止一些更改,删除,插入等动作造成错误。
开启事务:begin transaction
控制事务是否整体执行。commit rollback commit rollback和begin之间的所有代码为整体。
事务提交:commit transaction 让这个事务起效,就是执行事务
事务回滚:rollback transaction 不让这个事务起效。
表值函数的原子性执行
事务的原子性执行。
CREATE table biao(
[id] int
)
begin transaction
declare @myerror int;
set @myerror=0;--一定赋初值,否则为null +-*/都为null
insert into biao(id) values('奥奥')
set @myerror=@myerror+@@error;
insert into biao(id) values(2)
set @myerror=@myerror+@@error;
if(@myerror>0)
begin
rollback
end
else
begin
commit
end
SELECT *FROM biao
此时的第一句insert语句就报出错误,第二句就没有检测。
虽然有一行收到影响,但是select的时候,还是没有执行,被回滚了。但是消息中是报出错误信息
两次的结果相同,都没有执行,区别在错误信息的爆出。
事务的细节:只有commit后才会对数据库的数据造成影响,但是错误还是照常编译报错
对待这些错误信息,会返回到c#中作为异常来出现。需要在数据库本身先判断有异常否,再执行,不要讲这个异常返回到c#程序中。
所以在数据库中的事务中用到异常代码块来判断,有异常回滚,正常commit
异常代码块
所以出现错误就rollback回滚,不出现错误就执行commit。就需要数据库中的异常代码块begin try ***end try begin catch**end catch
所以,事务和begin try end try begin catch end catch 来结合保证原子性操作和对异常信息的处理。
储存过程
存在数据库当中已经编译好的sql语句,提高信息安全性(防止sql注入),减少网络流量
sql是一个脚本语言,先编译后执行。
c#中sql语句需要在dbms中先编译后执行。效率低。而且存在传输问题。
将一个sql语句变成储存过程 -- 视图 内联表值函数 公用表表达式 都需要as来个sql语句引导
create procedure usp_ming alter 修改表结构 视图
as sql语句
as begin 多条sql语句 end go
用的时候直接[exec] usp_ming
事务和存储过程结合。
存储过程可以包含事务,事务包含异常代码块。
上面都是用户定义的存储过程up_。当然有系统存储过程sp_,xp_
系统存储过程sp_** 查阅sql联机丛书
sp_renamedb更改数据库的名字
sp_database
sp_helpdb
http://www.cnblogs.com/hantianwei/archive/2012/07/23/2605274.html 系统存储过程 大全
有参存储过程:
sp_renamedb [ @dbname = ] 'old_name' , [ @newname = ] 'new_name' --有参存储过程
create procedure up_ming
@变量 类型
as
begin
sql语句
end
分页的存储过程
因为这条语句比较长。最好传输少。用预编译的存储过程效率更高。
1,要生成连续的编号。row_number() over order by(字段) as ming
分页:每页显示几行,现在看第几页 每页5行,看第3页
sql2000,
-CREATE table biao(
[id] int
)
insert into biao(id) values
(2),(3),(4),(5),(6),(7),(8),(9),(10),
(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),
(21),(22),(23),(24),(25),(26),(27)
--每页5行,看第3页 每页m行(固定),第n页
select top 5 *
from biao
where [id] not in
(SELECT top ((3-1)*5) id FROM biao) --子查询
--n-1*m
结果
同样我们可以对连续的id用between and
select * from biao
where [id] between (5*(3-1)+1) AND (5*3)
记过和上面一样。
但是对一些没有连续id的数据,我们怎么办,我们需要添加一个连续的列。用到的函数row_number() over (order by 字段):根据一个表的字段的顺序来添加一列
create table luanbiao(
num int
)
insert into luanbiao VALUES(100),(1002),(1300),(1500),(10),(180),(1400),
(1080),(170),(108),(192),(210),(5100),(6100),(18700),(17500),(187700),
(19700),(1087780),(10270),(10370),(1037530),(10373370),(1373700) select * from luanbiao
select *from
(select row_number() OVER (ORDER by num)as xuhao, * from luanbiao)as table_zi --列名起名字,表也要起名字。 row_number() over(order by 字段)
where table_zi.xuhao between ((3-1)*5+1)and 3*5
--((n-1)*m+1)and n*m
结果是这样。记住哦 n第几页 m每页m条PageSize
如果没有给加序列号的表起别名,是要出错的。因为 where的字段。 2个select。
1 not in 2 row_number() over order by(zi) as lieming 3 里面select 的表起个as biaoming 4 2个select 5最好携程存储过程。6 where between
7 做尾页 下一页需要总页数。ceiling(7/3.0)记得有个数必须是浮点数。 @Count= count(*)from biao @PageCount=@Count*1.0/@PageSize
7行 每页3行 3页 7/3=2 6行 每页3行 2页
CREATE proc usp_fenye
@PageIndex int, --逗号
@PageSize int,
@PageCount int output
as
DECLARE @Count int;
SELECT @Count=count(*)FROM Photos;
SELECT @PageCount=ceiling(@Count*1.0/@PageSize); SELECT *FROM
(SELECT row_number() OVER (order BY Photos.P_Id) as xuhao,* FROM Photos)as biao
WHERE xuhao BETWEEN (@PageIndex-1)*@PageSize+1AND @PageIndex*@PageSize; declare @N INT
EXEC usp_fenye 2,3,@N output
print @N
分页数据端全部
USE [boyadata]
GO
/****** Object: StoredProcedure [dbo].[usp_productInfo_Pager] Script Date: 05/18/2016 13:09:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[usp_productInfo_Pager]
@PageIndex int,
@PageSize int,
@PageCount int output
as
DECLARE @Count int;
SELECT @Count=count(1)FROM productInfo;
SELECT @PageCount=ceiling(@Count*1.0/@PageSize); SELECT id, title, detail, picurl,insertTime FROM
(SELECT row_number() OVER (order BY productInfo.id) as xuhao,id, title, detail, picurl,insertTime FROM productInfo)as biao
WHERE xuhao BETWEEN (@PageIndex-1)*@PageSize+1AND @PageIndex*@PageSize
order by insertTime desc;
MS-SQL的更多相关文章
- MS SQL巡检系列——检查外键字段是否缺少索引
前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方 ...
- MS SQL巡检系列——检查重复索引
前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方 ...
- [MS SQL Server]SQL Server如何开启远程访问
在日常工作中,经常需要连接到远程的MS SQL Server数据库中.当然也经常会出现下面的连接错误. 解决方法: 1. 设置数据库允许远程连接,数据库实例名-->右键--->属性---C ...
- Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码)
Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码) http://blog.csdn.net/helonsy/article/details/7207497 ...
- MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建
前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...
- MS SQL Server 数据库分离-SQL语句
前言 今天在在清理数据库,是MS SQL Server,其中用到分离数据库文件.在这过程中,出现了一个小小的问题:误将数据库日志文件删除了,然后数据就打不开了,除了脱机,其他操作都报错. 数据库分离 ...
- MS SQL验证字符串是否包含有大小写字母
昨晚有实现一个小功能,就是在MS SQL Server中,检查字符串是否包含有大小写字母.通常应用在字符串的复杂度. ) = N'SDFfgGRYJhhTYUJ' IF LOWER(@s) COLLA ...
- MS SQL 字符拆分存处理
MS SQL Server没有split()函数,但是我们可以写一个Table-valued Functions定义函数[dbo].[udf_SplitStringToTable] : CREATE ...
- 在易语言中调用MS SQL SERVER数据库存储过程方法总结
Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...
- 作业配置规范文档[MS SQL]
作业配置规范文档(MS SQL) 文档类型 MS SQL数据库作业配置规范文档 创建日期 2015-07-30 版本变化 V3.0 修改记录 修改人 修改日期 版本 修改描述 潇湘隐者 2015-08 ...
随机推荐
- POJ1631 LIS模板
题目:http://poj.org/problem?id=1631 两种nlogn的方法. 1.树状数组优化暴力.有种扫描线的感觉,以时间保证位置,把值作为数组脚标. 2.记录长为...的上升子序列末 ...
- vqmod for opencart插件制作进阶与技巧
FROM: http://www.sdtclass.com/4799.html 15年的时候,我写过一篇文章<略谈 vqmod for opencart 插件制作过程>,也不知道被哪些人抄 ...
- [C++ Primer] : 第13章: 拷贝控制
拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符 ...
- keepalived配置主从备份
keepalived配置主从备份 keepalived是一个用于做双机热备(HA)的软件,常和haproxy联合起来做热备+负载均衡,达到高可用. 运行原理 keepalived通过选举(看服务器 ...
- spring eureka required a bean of type 'com.netflix.discovery.DiscoveryClient' that could not be found.
spring在集成第三方过程很容易出现类名相同,且基本作用相同的类.这样给初学者带来一定的困惑. 导致用错类而出现以下问题. required a bean of type 'com.netflix. ...
- 术语-软件-软件开发:SDK(软件开发工具包)
ylbtech-术语-软件-软件开发:SDK(软件开发工具包) 软件开发工具包(缩写:SDK.外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包.软件框架 ...
- 杂项:IIS
ylbtech-杂项:IIS IIS是Internet Information Services的缩写,意为互联网信息服务,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务 ...
- table边框
border-collapse 语法 border-collapse:separate | collapse | inherit 默认值:separate 取值 separate: 默认值.边框会被分 ...
- Java 默认事务级别read committed对binlog_format的需求
转载: java.sql.SQLException: Cannot execute statement: impossible to write to binary log since BINLOG_ ...
- MySQL 安装方法
所有平台的Mysql下载地址为: MySQL 下载. 挑选你需要的 MySQL Community Server 版本及对应的平台. Linux/UNIX上安装Mysql Linux平台上推荐使用RP ...