重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一、概念
创新互联公司,专注为中小企业提供官网建设、营销型网站制作、响应式网站开发、展示型成都做网站、网站设计等服务,帮助中小企业通过网站体现价值、有效益。帮助企业快速建站、解决网站建设与网站营销推广问题。
SQL (Structured Query Language) 数据库,指关系型数据库。主要代表:SQL Server,Oracle,MySQL(开源),PostgreSQL(开源)。
NoSQL(Not Only SQL)泛指非关系型数据库。主要代表:MongoDB,Redis,CouchDB。
二、区别
1、存储方式
SQL数据存在特定结构的表中;而NoSQL则更加灵活和可扩展,存储方式可以省是JSON文档、哈希表或者其他方式。SQL通常以数据库表形式存储数据。举个栗子,存个学生借书数据:
而NoSQL存储方式比较灵活,比如使用类JSON文件存储上表中熊大的借阅数据:
2、表/数据集合的数据的关系
在SQL中,必须定义好表和字段结构后才能添加数据,例如定义表的主键(primary key),索引(index),触发器(trigger),存储过程(stored procedure)等。表结构可以在被定义之后更新,但是如果有比较大的结构变更的话就会变得比较复杂。在NoSQL中,数据可以在任何时候任何地方添加,不需要先定义表。例如下面这段代码会自动创建一个新的"借阅表"数据集合:
NoSQL也可以在数据集中建立索引。以MongoDB为例,会自动在数据集合创建后创建唯一值_id字段,这样的话就可以在数据集创建后增加索引。
从这点来看,NoSQL可能更加适合初始化数据还不明确或者未定的项目中。
3、外部数据存储
SQL中如何需要增加外部关联数据的话,规范化做法是在原表中增加一个外键,关联外部数据表。例如需要在借阅表中增加审核人信息,先建立一个审核人表:
再在原来的借阅人表中增加审核人外键:
这样如果我们需要更新审核人个人信息的时候只需要更新审核人表而不需要对借阅人表做更新。而在NoSQL中除了这种规范化的外部数据表做法以外,我们还能用如下的非规范化方式把外部数据直接放到原数据集中,以提高查询效率。缺点也比较明显,更新审核人数据的时候将会比较麻烦。
4、SQL中的JOIN查询
SQL中可以使用JOIN表链接方式将多个关系数据表中的数据用一条简单的查询语句查询出来。NoSQL暂未提供类似JOIN的查询方式对多个数据集中的数据做查询。所以大部分NoSQL使用非规范化的数据存储方式存储数据。
5、数据耦合性
SQL中不允许删除已经被使用的外部数据,例如审核人表中的"熊三"已经被分配给了借阅人熊大,那么在审核人表中将不允许删除熊三这条数据,以保证数据完整性。而NoSQL中则没有这种强耦合的概念,可以随时删除任何数据。
6、事务
SQL中如果多张表数据需要同批次被更新,即如果其中一张表更新失败的话其他表也不能更新成功。这种场景可以通过事务来控制,可以在所有命令完成后再统一提交事务。而NoSQL中没有事务这个概念,每一个数据集的操作都是原子级的。
7、增删改查语法
8、查询性能
在相同水平的系统设计的前提下,因为NoSQL中省略了JOIN查询的消耗,故理论上性能上是优于SQL的。
方法1:
第一步:
backup
log
database_name
with
no_log
或者
backup
log
database_name
with
truncate_only
--no_log和truncate_only是在这里是同义的,随便执行哪一句都可以
第二步:
1.收缩特定数据库的所有数据和日志文件,执行
dbcc
shrinkdatabase
(database_name,[,target_percent])--database_name是要收缩的数据库名称;target_percent是数据库收缩后的数据库文件中所要的剩余可用空间百分比
2.收缩一次一个特定数据库中的数据或日志文件,执行
dbcc
shrinkfile(file_id,[,target_size])
--file_id是要收缩的文件的标识
(id)
号,若要获得文件
id,请使用
file_id
函数或在当前数据库中搜索
sysfiles;target_size是用兆字节表示的所要的文件大小(用整数表示)。如果没有指定,dbcc
shrinkfile
将文件大小减少到默认文件大小
两个dbcc都可以带上参数notruncate或truncateonly,具体意思看帮助。
方法2(这个方法在sqlserver2000的环境下做一般能成功,在sqlserver7及以下版本就不一定了):
第一步:
先备份整个数据库以备不测
第二步:
备份结束后,在query
analyzer中执行如下的语句:
exec
sp_detach_db
yourdbname,true
--卸除这个db在mssql中的注册信息
第三步:
到日志的物理文件所在的目录中去删除该日志文件或者将该日志文件移出该目录
第四步:
在query
analyzer中执行如下的语句:
exec
sp_attach_single_file_db
yourdbname,'d:\mssql7\data\yourdbname_data.mdf'
--以单文件的方式注册该db,如果成功则mssql将自动为这个db生成一个500k的日志文件。
以上方法在清除log日志中均有效。
但,能否让sql
server
不产生log日志呢?以上方法好像均无效。
我这儿正好有个case:
我客户的sql
server每天都会产生4,500m的log日志,每天都清除一下,非常不便。有没有办法实现不产生log日志呢?
我分析了一下客户产生log日志的原因,并且做了相应测试。
客户是每天将数据库清空,从总系统中将数据导入到sql
server里。我感决sqlserver在插入时产生log不大,在delete整个库时产生log极大。
比如:
select
*
into
test_2
from
b_bgxx
共45000条记录,产生十几m
log,如果
delete
from
test_2
产生80多m
log
,这明显存在问题。
虽然可以换成:
truncate
table
test_2
但我还是希望能找到不产生log的方法。就如oracle不产生归档一样。
-- 修改存储过程PZ_JF_TimePeriodCardTimes
ALTER PROCEDURE [dbo].[PZ_JF_TimePeriodCardTimes]
@StaffID int, -- 员工ID
@BeginDate datetime, -- 开始日期
@EndDate datetime, -- 结束日期
@TimeBegin nvarchar(5), -- 时间段开始
@TimeEnd nvarchar(5), -- 时间段结束
@CardTimes int, -- 时间区间内的刷卡次数
@UserNo nvarchar(100)
AS
BEGIN
-- 如果StaffID为0则将之设为null,StaffID应该是输入参数
if @StaffID=0 begin set @StaffID=null end
-- 自定义变量@UserID,初始值为0
Declare @UserID int=0
-- 将变量@UserID设为满足条件且EnableYN='Y'的那个userid的值
select @UserID=userid from Ghrs_User where
UserNo=@UserNo
and EnableYN='Y'
-- 自定义变量@TempAdd ,初始值为0
Declare @TempAdd int=0
-- 如果结束时间小于开始时间设置 @TempAdd 的值为1
if @TimeEnd@TimeBegin begin set @TempAdd=1 end
select StaffNo,StaffName,convert(nvarchar(10),b.CDate ,121)from Ghra_Staff,Ghrb_Calendar b
where b.CDate between @BeginDate and @EndDate --条件1:Ghrb_Calendar中的CDate的值在开始时间和结束时间之内
and Ghra_Staff.StaffID=ISNULL( @StaffID,Ghra_Staff.staffID) --条件2:如果@StaffID是null此过滤条件无效,@StaffID不是null,
and dbo.FUserStaffPriv(@UserID,staffid)='Y' -- 条件3:FUserStaffPriv(@UserID,staffid)的结果是'Y'
and (select COUNT(1)from Ghrb_CardRecord
where StaffID = Ghra_Staff.StaffID
and EnableYN='Y'
and CardTime between convert(nvarchar(10),b.CDate ,121)+' '+ @TimeBegin
and convert(nvarchar(10),Dateadd(Day,@TempAdd,b.CDate) ,121)+' '+ @TimeEnd
)= @CardTimes --条件4:StaffID一致、EnableYN为'Y',CardTime在开始时间和结束时间之间
END
1、 创建语法
create proc | procedure pro_name
[{@参数数据类型} [=默认值] [output],
{@参数数据类型} [=默认值] [output],
....
]
as
SQL_statements
2、 创建不带参数存储过程
--创建存储过程
if (exists (select * from sys.objects where name = 'proc_get_student'))
drop proc proc_get_student
go
create proc proc_get_student
as
select * from student;
--调用、执行存储过程
exec proc_get_student;
3、 修改存储过程
--修改存储过程
alter proc proc_get_student
as
select * from student;
4、 带参存储过程
--带参存储过程
if (object_id('proc_find_stu', 'P') is not null)
drop proc proc_find_stu
go
create proc proc_find_stu(@startId int, @endId int)
as
select * from student where id between @startId and @endId
go
exec proc_find_stu 2, 4;
5、 带通配符参数存储过程
--带通配符参数存储过程
if (object_id('proc_findStudentByName', 'P') is not null)
drop proc proc_findStudentByName
go
create proc proc_findStudentByName(@name varchar(20) = '%j%', @nextName varchar(20) = '%')
as
select * from student where name like @name and name like @nextName;
go
exec proc_findStudentByName;exec proc_findStudentByName '%o%', 't%';
扩展资料:
SQL存储过程优点:
1、重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
2、减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
3、安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
参考资料来源:百度百科—存储过程
sql
server存储过程
输出结果集
还是比较简单的.
直接在
存储过程里面执行
sql
语句就可以了。
例如:
--
测试返回结果集的存储过程
create
procedure
testproc
as
begin
select
'hello
1'
as
a,
'world
1'
as
b
union
all
select
'hello
2'
as
a,
'world
2'
as
b;
end
go
剩下的,
就是你用
别的开发语言,
例如
c#
什么的
,
调用这个存储过程,
获取结果集了。