第一篇:审计模式下常用的SQL查询语句示例
审计模式下常用的SQL查询语句示例
随着信息技术的不断发展,被审计对象的财务和业务系统也大多使用了专用软件进行计算机管理,如果暂不考虑计算机软硬件本身的系统审计,那么我们所面对的审计也就分为了以财务账套为基础的账套式审计模式和直接对数据本身(包括财务数据和业务数据)审计的数据式审计模式。但不论是何种审计模式,最根本的还是要使用计算机语句对具体问题进行查询分析,即通过数据库的SQL查询语句对数据库中的数据表进行查询分析。
虽然SQL语句的功能很多,且不同数据库环境下的具体使用也会因为所遵循的官方标准不同而略有差别,但多数情况下的使用是相通的。同时因为审计工作的特点,所使用的SQL语句也多是对数据的查询,一般并不会包括对原始数据的增加、删除、修改等操作,所以在计算机审计中重点需要掌握的内容就是灵活利用SQL语句的查询功能。实际审计工作当中,在数据审计模式下我们所常用的是如下所示的语句,也是从实际审计工作中收集出具有代表性的语句,并且所有语句都基于Access数据库,在AO现场审计实施系统中可正常使用。
一、对单个表的条件查询,用where指定查询条件,也有不使用where的情况,多用于对原始表的统计、分类等
该类情况下SQL语句的语法是“select * from 表名 where 条件”。可以指定单个条件或多个条件,并可配合其他函数或关键字使用,常用到的类型有如下几类。
(一)对单个条件的简单查询:
select * from 存款表 where 金额>=100000;该情况的使用较为简单,适用于任何单条件查询。
(二)对多个条件的查询,各条件间可能是and或or的关系:
select * from 存款表 where金额>=100000 and 存款时间 >= #2006-1-1#;
该情况常用于对多个条件的查询,根据关键字and或or来决定是同时满足所有条件还是仅满足某些条件。
(三)对多个条件的查询,得到符合条件的某字段的合计值:
select sum(金额)from 存款表 where金额>=100000 and 存款时间 >= #2006-1-1# and 存款时间<= #2006-12-31# order by 金额 desc, 存款时间 asc;
该情况一般用于统计某种条件下的合计值,常用于对某种情况下的总金额情况进行了解。
(四)用集函数按条件查询:
select count(*)from 凭证表 where 金额>=100000;select max(发生金额)from 存款表;select avg(发生金额)from 存款表;
该情况类似于上面求和函数的使用,可根据具体需求进行应用。
(五)对关键字的内容进行查询:
select * from 凭证表 where 摘要 like „%招待费%‟;该情况较为常用,查询包含某些关键字的所有记录,也可结合关键字and或or等查询多个条件。
(六)查询内容是否包含在给定的范围内:
select * from 科目代码表 where 科目代码 in(„101‟,‟102‟);该情况用于所关心的字段包含内容类别较少的情况,常用在已基本确定查询范围之后。当所关心内容类别较多时可使用下面将提到的两张表的嵌套查询。
(七)对某个字段进行分组,查询各字段属性分别对应的发生次数,并按发生次数进行排序:
select 款项代码, count(款项代码)as 次数from大额现金支取表 group by 款项代码 order by count(款项代码)desc;该情况常用于对某个所关心字段的分类统计,得出每个类别所发生的次数,并可按发生次数进行排序。
(八)按某个字段的长度进行分类并进行排序:
select len(科目代码)as 发生次数from 科目代码表 group by len(科目代码)order by len(科目代码)desc;
该情况用于了解某字段的长度分组情况,可对所取得的原始数据进行验证,以证实原始数据的规范性或找出不规范情况的问题所在。
(九)分组查询,group与having联用:
select 客户号,count(*)as 发生次数
from 存款表
where 发生金额>=100000 group by 客户号 having count(*)>1;
该类语句常用于要列出所关心某字段的某一个或几个条件限制下发生次数超出某范围的情况。如查询发生多次(即同一关键字发生的记录数大于1)大额存取的客户号及其存取次数,查询结果按客户号分组。
以上各类对单个表的查询结果并未直接存储成新表,不利于对查询结果的进一步分析利用,我们可以使用“select * into 新表名 from 表名 where 条件”这种语句格式把查询结果保存成新表,如
select * into 大额存款发生情况表 from 存款表 where 金额>=100000;
二、对多个表的条件查询,一般需根据各表的相应关键字进行连接
这种情况下必须对各表的对应关键字进行关联,一般情况下是对两张表的关联查询,当有更多张表要操作时可以每次对两张表操作后再和剩余的表关联操作,也可以扩展SQL语句同时对两个以上的表操作,以下只列出对两张表操作的情况。
(一)两张结构相同的表合并并生成新表,使用关键字union进行联合查询:
select * into 中间表 from
(select * from 原始表1 union select * from 原始表2);该情况常用于对多个原始表的整理以生成中间表,便于后续的查询工作。如合并采集到的原始数据,将原本分月存储的数据表全并成分年度存储的数据表。
(二)两张表的连接,生成新的中间表:
select a.*,b.客户名称into 含客户名称的现金支取表 from现金支取表 as a, 客户基本信息表 as b where a.款项代码=b.款项代码;使用该类语句的前提是两张表存在相关联的关键字,常用于一张表根据两表的连接关键字引入另一张表的某些字段,为后续的查询准备好中间表。其中使用别名可以简化SQL语句的输入。如财务数据中采集到的凭证表是两张表时,可连接两表引入摘要字段等。
(三)两张表的关联查询,可加入多个条件:
select a.*,b.科目代码 from 对公活期存款明细表 as a, 活期存款账户动态表 as b where a.款项代码=b.款项代码 and 科目代码 like ‟201%‟;
该情况可看作对两张表连接的扩展,即根据where所限定的条件来对两张表关联查询。
(四)两张表的嵌套查询,两层查询间要使用关键字in:
select * into频繁发生大额现金支取
from大额现金支取
where 交易金额>=100000 and 款项代码 in(select 款项代码
from款项代码发生次数_大额现金支取
where 次数 >= 10)
order by 款项代码,交易金额,记账日期;
这种情况也可理解为简单查询,不同的是其中where所指定的某个条件是由另一张表的又一个查询所指定的,与单表查询的语句
select * from 科目代码表 where 科目代码 in(„101‟,‟102‟);进行对比后发现,可将两张表的嵌套查询看作如上语句的扩展。如利用大额现金支取表和大额现金支取的款项代码发生次数表查询交易金额大且发生次数多的情况。再比如利用贷款表和股东表查询贷款表中含股东贷款的情况。
(五)多表的连接操作
多表连接可分为内连接、外连接、自身连接、交叉连接。其中内连接又分为等值连接、不等连接和自然连接,外连接又分为左连接、右连接和全连接。实际审计工作当中所用到的多是内连接与外连接,较少用到自身连接与交叉连接。多表的连接使用需根据具体情况而定,下面列出部分示例。
1.内连接的等值连接:
select * from 存款表 as a inner join 客户信息表 as b on a.款项代码=b.款项代码;
以上语句用于列出存款表和客户信息表中款项代码相同的记录。
2.外连接的左连接。
select * from 存款表 as a left join 客户信息表 as b on a.款项代码=b.款项代码;左连接的特点是显示全部左边表中的所有项目,即使其中有些项中的数据未填写完全。右连接与此类似,其特点是显示全部右边表中的所有项目,甚至是左边表中没有和它匹配的记录。
以上列出的是数据审计模式下根据实际工作总结出的常用SQL语句,虽然所列内容并不全面,更不可能完全体现SQL查询的全面功能与精妙所在,但只要能够很好地分析出审计需求,把用自然语言表达的审计思路转化为计算机的SQL查询语句,并结合以上的常用语句适当组合运用,一定能使数据审计模式下的工作达到事半功倍的效果,更好地推动计算机审计的快速发展。
第二篇:SQL查询语句
SQL查询语句
第一次:查询(显示)、条件、排序、空记录
第二次:通配符、生成表、文件(记事本)、数组、临时表,数学函数、分组、嵌套查询
第三次:插入记录、删除记录、更新记录 第四次:超连接、新建(打开)数据库、表的建立、表的删除、第五次 表结构的修改,添加记录 显示同张芳同一天出生的学生的信息 格式:
1、查询(显示)记录
显示所有男学生的学号,姓名,性别 区分:字段、条件、表名
Select 字段名列表(*)from 表名; where 条件表达式;
into table(dbf)文件名;
into cursor 临时表名;
into array 数组名;
to file 文件名;
order by 字段名列表(asc desc);
group by 字段名 having 条件;
显示所有大于平均分的学生的学号、姓名 显示同E4挣同样工资的职工信息
Select * from 职工 where 工资=(select 工资 from 职工 where 职工号=”E4”)职工(仓库号C(10),职工号 C(10),工资 N(10,2))
显示所有工资大于1500的员工的仓库号、职工号及所在的城市
2、插入记录
Insert into 表名(字段名列表)values(记录值)
3、删除记录
Delete from 表名 where 条件
4、更新记录
Update 表名 set 字段名=记录值; Where 条件
5、表的删除
drop table 表名
6、表的建立
create table 表名(字段名 数据类型(宽度))
7、表结构的修改select * from 职工where 职工号!=“E4” AND 工资=(select 工资 from 职工 where 职工号=“E4”)
alter table 表名
1)增加字段
alter table student add 身份证号 c(10)
2)删除字段
alter table student drop colum 身份证号
3)修改字段名
alter table student rename colum 出生日期 to 出生年月
4)增加字段有效性规则
alter table student alter 成绩 set check 成绩>=0 and 成绩<=100;
error “成绩输入错误,成绩应该在0-100之间”
5)删除字段有效性规则
alter table student alter 成绩 drop check 注意:
以上题目中用到的 SQL语句粘贴到计事本文件XY.TXT中(每行一条语句)。对两个表操作的方法:
1)同时打开两个表
select 仓库.仓库号,城市,职工号,工资 from 仓库,职工;
where 职工.仓库号=仓库.仓库号 and 工资=1250
2)超连接(内连接、左连接、右连接、全连
接)
内连接:只显示符合条件的记录
左连接:显示符合条件的记录及第一个表中不符合条件的记录
右连接:显示符合条件的记录及第二个表中不符合条件的记录
全连接:显示符合条件的记录及第一、二个表中不符合条件的记录
成绩表(score)
学号姓名课程名成绩 2001张三计算机10 2003张四英语20 2001张三语言30 2005张三数据40 2003张四计算机50
Select sum(成绩)from score group by 学号
Select sum(成绩)from score group by 课程名
select 字段名列表(*)from 表名;where 条件;
order by 字段名列表 asc|desc;
into table(dbf)表名;
into array 数组名;
to file 文件名;
into cursor 临时表名
题目练习
实现以下功能:在考生文件夹下,打开“陶的数据库”的数据库,并利用SQL语句在该数据库中新建一个表:gongzi(职工号 c(4),实发工资 n(7,0)),将zhigong表中基本工资大于1330(含1330)的记录存储在gongzi表中,其中实发工资为:基本工资+加班费(白天20,晚上30),最后将所有的SQL语句保存到考生目录下的sqlanswer.txt文件中(自行建立,一行一条语句)
open database 陶的数据库
create table gongzi(职工号 c(4),基本工资 n(7,2))
select 职工号,基本工资+白班*20+晚班*30 from zhigong;where 基本工资>1350 into array xy
insert into gongzi from array xy
第三篇:Sql语句查询
sql语句多表连接查询
在程序开发过程中,不仅可以对单一数据表进行查询,还可以进行多表查询,用户通过多表查询从多个表中提取出需要的数据。
多表查询可以分为内连接查询、外连接查询以及联合查询。
1.内连接查询
连接查询是指通过各个表之间共同列的关联性查询数据。连接查询分为内连接查询和外连接查询。内连接是将两个相互交叉的数据集合中重叠部分的数据行连接起来,返回表示两个数据集合之间匹配连接关系的数据行。
可以在FORM子句中使用INNER JOIN„ON„建立内连接,也可以在WHERE子句中指定连接条件建立内连接,例如:
select a.UserName,b.BookName,b.Datetm from UserInfo as a inner join SellSheet as b on a.UserID= b.UserID
也可以用下面的语句实现。
select a.UserName,b.BookName,b.Datetm from UserInfo as a,SellSheet as b where a.UserID=b.UserID
2.外连接查询
外连接是对内连接的扩充,除了将两个数据集合中重叠部分以内的数据行连接起来之外,还可以根据要求返回左侧或右侧数据集合中非匹配的数据,即左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。
l左外连接LEFT OUTER JOIN
左外连接LEFT OUTER JOIN逻辑运算符除了返回两个数据表中满足连接条件的行,它还返回任何在后一个数据表中没有匹配行的前一个数据表中的行。非匹配行的部分字段列作为空值返回。
l右外连接RIGHT OUTER JOIN
右外连接RIGHT OUTER JOIN是左外连接的反向连接。它除了返回两个数据表中满足连接条件的行,还返回任何在前一个数据表中没有匹配行的后一个数据表中的行。非匹配行的部分字段列作为空值返回。
3.使用UNION进行联合查询
使用UNION运算符可以进行联合查询。UNION运算符连接多个SELECT语句,将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中所有查询的全部行。使用UNION运算符遵循的规则如下:
(1)在使用UNION运算符组合的语句中,所有选择列表的表达式数目必须相同(列名、算术表达式、聚集函数等)。
(2)在使用UNION组合的结果集中的相应列必须具有相同数据类型,或者两种数据类型之间必须存在可能的隐性数据转换,或者提供了显式转换。例如,在datetime数据类型的列和binary数据类型的列之间不能使用UNION运算符,除非提供了显式转换,而在money数据类型的列和int数据类型的列之间可以使用UNION运算符,因为它们可以进行隐性转换。
(3)结果集中列的名字或者别名是由第一个SELECT语句的选择列表决定的。
注意:对数据表进行联合查询时,结果集中行的最大数量是各表行数之“和”,而对数据表进行连接查询时,结果集中行的最大数量是各表行数之“积”。
第四篇:SQL语句(百度查询)
创建数据库
创建之前判断该数据库是否存在
if exists(select * from sysdatabases where name='databaseName')
drop database databaseName
go
Create DATABASE database-name 删除数据库
drop database dbname 备份sql server
---创建备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
---开始备份
BACKUP DATABASE pubs TO testBack 创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:go
use 原数据库名
go
select * into 目的数据库名.dbo.目的表名 from 原表名(使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only 创建序列
create sequence SIMON_SEQUENCE
minvalue 1--最小值
maxvalue ***999999999999--最大值
start with 1--开始值
increment by 1--每次加几
cache 20;删除新表
drop table tabname 增加一个列
Alter table tabname add colname coltype 删除一个列
Alter table tabname drop column colname 添加主键
Alter table tabname add primary key(col)
说明:删除主键:Alter table tabname drop primary key(col)创建索引
create [unique] index idxname on tabname(col…。)删除索引:drop index idxname on tabname
注:索引是不可更改的,想更改必须删除重新建。创建视图
create view viewname as select statement
删除视图:drop view viewname 简单基本的sql语句
(1)数据记录筛选:
sql=“select * from 数据表 where 字段名=字段值 order by 字段名 [desc]”
sql=“select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]”
sql=“select top 10 * from 数据表 where 字段名 order by 字段名 [desc]”
sql=“select * from 数据表 where 字段名 in('值1','值2','值3')”
sql=“select * from 数据表 where 字段名 between 值1 and 值2”
(2)更新数据记录:
sql=“update 数据表 set 字段名=字段值 where 条件表达式”
sql=“update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式”
(3)删除数据记录:
sql=“delete from 数据表 where 条件表达式”
sql=“delete from 数据表”(将数据表所有记录删除)
(4)添加数据记录:
sql=“insert into 数据表(字段1,字段2,字段3 …)values(值1,值2,值3 …)”
sql=“insert into 目标数据表 select * from 源数据表”(把源数据表的记录添加到目标数据表)
(5)数据记录统计函数:
AVG(字段名)得出一个表格栏平均值
COUNT(*;字段名)对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名)取得一个表格栏最大的值
MIN(字段名)取得一个表格栏最小的值
SUM(字段名)把数据栏的值相加
引用以上函数的方法:
sql=“select sum(字段名)as 别名 from 数据表 where 条件表达式”
set rs=conn.excute(sql)
用 rs(“别名”)获取统计的值,其它函数运用同上。
查询去除重复值:select distinct * from table1
(5)数据表的建立和删除:
CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度)……)
几个高级查询运算词
A:UNION 运算符 UNION 运算符通过组合其他两个结果表(例如TABLE1 和TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随UNION 一起使用时(即UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自TABLE1 就是来自TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在TABLE1 中但不在TABLE2 中的行并消除所有重复行而派生出一个结果表。当ALL 随EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。
C:INTERSECT 运算符
INTERSECT 运算符通过只包括TABLE1 和TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当ALL 随INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。使用外连接
A、left outer join:
左外连接(左连接):结果集既包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。编辑本段判断对象是否存在 判断数据库是否存在
if exists(select* from sysdatabases wherename= '数据库名')
dropdatabase[数据库名] 判断表是否存在
if not exists(select * from sysobjects where [name] = '表名' and xtype='U')
begin
--这里创建表
end 判断存储过程是否存在
if exists(select* from sysobjects whereid = object_id(N'[存储过程名]')and OBJECTPROPERTY(id, N'IsProcedure')= 1)
dropprocedure[存储过程名] 判断临时表是否存在
if object_id('tempdb..#临时表名')isnot null
droptable#临时表名 判断视图是否存在
--SQL Server 2000
IF EXISTS(SELECT* FROM sysviews WHEREobject_id = '[dbo].[视图名]'
--SQL Server 2005 IF EXISTS(SELECT* FROM sys.views WHEREobject_id = '[dbo].[视图名]' 判断函数是否存在
if exists(select* from dbo.sysobjects whereid = object_id(N'[dbo].[函数名]')and xtype in(N'FN', N'IF', N'TF'))
dropfunction[dbo].[函数名] 获取创建信息
SELECT[name],[id],crdate FROM sysobjects where xtype='U'
/*
xtype 的表示参数类型,通常包括如下这些 C = CHECK约束 D = 默认值或DEFAULT约束 F = FOREIGNKEY约束 L = 日志 FN = 标量函数 IF = 内嵌表函数 P = 存储过程 PK = PRIMARYKEY约束(类型是K)RF = 复制筛选存储过程 S = 系统表 TF = 表函数 TR = 触发器U = 用户表 UQ = UNIQUE约束(类型是K)V = 视图 X = 扩展存储过程 */ 判断列是否存在
if exists(select* from syscolumns whereid=object_id('表名')and name='列名')
altertable表名dropcolumn列名 判断列是否自增列
if columnproperty(object_id('table'),'col','IsIdentity')=1
print '自增列'
else
print '不是自增列'
SELECT* FROM sys.columns WHEREobject_id=OBJECT_ID('表名')
AND is_identity=1 判断表中是否存在索引
if exists(select* from sysindexes whereid=object_id('表名')and name='索引名')
print '存在'
else
print '不存在 查看数据库中对象
SELECT* FROM sysobjects WHEREname='对象名'
select * from table(所要查询的表名)where coloum(条件)编辑本段提升 复制表
(只复制结构,源表名:a 新表名:b)(Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a 拷贝表
(拷贝数据,源表名:a 目标表名:b)(Access可用)
insert into b(x, y, z)select d,e,f from a;跨数据库之间表的拷贝
(具体数据使用绝对路径)(Access可用)insert into b(x, y, z)select d,e,f from a in ‘具体数据库’ where 条件
例子:。.from b in '“&Server.MapPath(”.“&”data.mdb“ &”' where..子查询
(表名1:a 表名2:b)
select a,b,c from a where a IN(select d from b 或者: select a,b,c from a where a IN(1,2,3)显示文章最后时间
select a.title,a.username,b.adddate from table a,(select max(adddate)adddate from table where table.title=a.title)b 外连接查询
(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 在线视图查询
(表名1:a
select * from(Select a,b,c FROM a)T where t.a > 1;between的用法
between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2 in 的使用方法
select * from table1 where a [not] in(‘值1’,’值2’,’值4’,’值6’)
删除主表没有的信息
两张关联表delete from table1 where not exists(select * from table2 where table1.field1=table2.field1 四表联查问题
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where.....日程安排提前五分钟
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 一条sql 搞定数据库页
select top 10 b.* from(select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)a,表名 b where b.主键字段= a.主键字段 order by a.排序字段
前10条记录
select top 10 * from table1 where 范围 选择排名
选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等。)
select a,b,c from tablename ta where a=(select max(a)from tablename tb where tb.b=ta.b)
包括所有在TableA 中但不在TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA except(select a from tableB)except(select a from tableC)随机取出10条数据
select top 10 * from tablename order by newid()随机选择记录
select newid()删除重复记录
Delete from tablename where id not in(select max(id)from tablename group by col1,col2,...)列出数据库里的表名
select name from sysobjects where type='U' 列出表里的所有的
select name from syscolumns where id=object_id('TableName')列示排列
列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end)FROM tablename group by type
显示结果:
type vender pcs
电脑A 1
电脑A 1
光盘B 2
光盘A 2
手机B 3
手机C 3 初始化表table1
TRUNCATE TABLE table1 选择从10到15的记录
select top 5 * from(select top 5 * from(select top 15 * from table order by id asc)table_别名 order by id desc)table_2 order by id
数据类型转换
declare @numid int
declare @id varchar(50)
set @numid=2005
set @id=convert(varchar,@numid)
通过上述语句完成数据类型Int转换成varchar,其他转换类似,可参看convert函数
编辑本段技巧 1=1,1=2的使用 在SQL语句组合时用的较多
‚where 1=1‛是表示选择全部 ‚where 1=2‛全部不选,如:
if @strWhere!='
begin
set @strSQL = 'select count(*)as Total from [' + @tblName + '] where ' + @strWhere
end
else
begin
set @strSQL = 'select count(*)as Total from [' + @tblName + ']'
end
我们可以直接写成
set @strSQL = 'select count(*)as Total from [' + @tblName + '] where 1=1 and '+ @strWhere 收缩数据库
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE 压缩数据库
dbcc shrinkdatabase(dbname)
转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname'
go 检查备份集
RESTORE VERIFYONLY from disk='E:dvbbs.bak' 修复数据库
Alter DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss)WITH TABLOCK
GO
Alter DATABASE [dvbbs] SET MULTI_USER
GO 日志清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,@MaxMinutes INT,@NewSize INT
USE tablename--要操作的数据库名
Select @LogicalFileName = 'tablename_log',--日志文件名
@MaxMinutes = 10,--Limit on time allowed to wrap log.@NewSize = 1--你想设定的日志文件的大小(M)
--Setup / initialize
DECLARE @OriginalSize int
Select @OriginalSize = size
FROM sysfiles
Where name = @LogicalFileName
Select 'Original Size of ' + db_name()+ ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize)+ ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024))+ 'MB'
FROM sysfiles
Where name = @LogicalFileName
Create TABLE DummyTrans
(DummyColumn char(8000)not null)
DECLARE @Counter INT,@StartTime DATETIME,@TruncLog VARCHAR(255)
Select @StartTime = GETDATE(),@TruncLog = 'BACKUP LOG ' + db_name()+ ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE(@LogicalFileName, @NewSize)
EXEC(@TruncLog)
--Wrap the log if necessary.WHILE @MaxMinutes > DATEDIFF(mi, @StartTime, GETDATE())--time has not expired
AND @OriginalSize =(Select size FROM sysfiles Where name = @LogicalFileName)
AND(@OriginalSize * 8 /1024)> @NewSize
BEGIN--Outer loop.Select @Counter = 0
WHILE((@Counter < @OriginalSize / 16)AND(@Counter < 50000))
BEGIN--update
Insert DummyTrans VALUES('Fill Log')
Delete DummyTrans
Select @Counter = @Counter + 1
END
EXEC(@TruncLog)
END
Select 'Final Size of ' + db_name()+ ' LOG is ' +
CONVERT(VARCHAR(30),size)+ ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024))+ 'MB'
FROM sysfiles
Where name = @LogicalFileName
Drop TABLE DummyTrans
SET NOCOUNT OFF 更改某个表 exec sp_changeobjectowner 'tablename','dbo' 存储更改全部表
Create PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),@NewOwner as NVARCHAR(128)
AS
DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)
DECLARE curObject CURSOR FOR
select 'Name' = name,'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + '.' + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
end
--select @name,@NewOwner,@OldOwner
FETCH NEXT FROM curObject INTO @Name, @Owner
END
close curObject
deallocate curObject
GO SERVER中循环写入数据
declare @i int
set @i=1
while @i<30
begin
insert into test(userid)values(@i)
set @i=@i+1
end 在SQL Server中有5种约束:
主键约束(primary key constraint)唯一性约束(unique constraint)检查约束(check constraint)缺省约束(default constraint)
外部键约束(foreign key constraint)SQL SERVER中,(1)对于基本表的约束分为列约束和表约束
约束是限制用户输入到表中的数据的值的范围,一般分为列级约束与表级约束。
列级约束有六种:主键Primary key、外键foreign key、唯一 unique、检查 checck、默认default、非空/空值 not null/ null
表级约束有四种:主键、外键、唯
一、检查
列约束是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名;
表约束与列定义相互独立,不包括在列定义中,通常用于对多个列一起进行约束,与列定义用’,’分隔,定义表约束时必须指出要约束的那些列的名称。完整性约束的基本语法格式为:
[ CONSTRAINT <约束名> ] <约束类型> 约束名:约束不指定名称时,系统会给定一个名称。(2)列级约束与表级约束的区别
如果完整性约束涉及到该表的多个属性列,必须定义在表级上,否则既可以定义在列级也可以定义在表级。简而言之:
列级约束:列级约束是行定义的一部分,只能应用于一列上。
表级约束:表级约束是独立于列的定义,可以应用在一个表中的多列上。(3)列级约束与表级约束在SQL中的用法(即如何在SQL中定义约束)在创建表时定义约束:
CREATE TABLE table_name
({
|column_name AS computed_column_expression-------计算列定义
|
}[,….n])一个约束定义为列级约束还是表级约束???
根据实际需要和设计者思路确定。如primary key,当只涉及到一列时,定义为列级约束;当涉及到多列时,则定义为表级约束。
Prinmary key定义为列级约束时,相应SQL语句: Stu_id上建立的主键pk_1为列级约束 CREATE TABLE student(Stu_id int constraint pk_1 primary key,Stu_name varchar(8), ….)当定义为表级约束时,相应SQL语句: CREATE TABLE student(Stu_id int NOT NULL, Stu_id上建立的主键pk_1为的表级约束 Stu_name varchar(8), Constraint pk_1 primary key(Stu_id),….)各约束具体说明: 主键约束
PRIMARY KEY约束 PRIMARY KEY约束用于定义基本表的主键,起唯一标识作用,其值不能为NULL,也不能重复,以此来保证实体的完整性。PRIMARY KEY与UNIQUE约束类似,通过建立唯一索引来保证基本表在主键列取值的唯一性,但它们之间存在着很大的区别:
①在一个基本表中只能定义一个PRIMARY KEY约束,但可定义多个UNIQUE约束; ②对于指定为PRIMARY KEY的一个列或多个列的组合,其中任何一个列都不能出现空值,而对于UNIQUE所约束的唯一键,则允许为空。
注意:不能为同一个列或一组列既定义UNIQUE约束,又定义PRIMARY KEY约束。PRIMARY KEY既可用于列约束,也可用于表约束。PRIMARY KEY用于定义列约束时,其语法格式如下:
CONSTRAINT <约束名> PRIMARY KEY PRIMARY KEY用于定义表约束时,即将某些列的组合定义为主键,其语法格式如下:
[CONSTRAINT <约束名>]S PRIMARY KEY(<列名>[{<列名>}])2.唯一性(UNIQUE)约束
UNIQUE约束用于指明基本表在某一列或多个列的组合上的取值必须唯一。
定义了UNIQUE约束的那些列称为唯一键,系统自动为唯一键建立唯一索引,从而保证了唯一键的唯一性。
唯一键允许为空,但系统为保证其唯一性,最多只可以出现一个NULL值。UNIQUE既可用于列约束,也可用于表约束。UNIQUE用于定义列约束时,其语法格式如下:
[CONSTRAINT <约束名>] UNIQUE 唯一性约束用于指定一个或者多个列的组合的值具有唯一性,以防止在列中输入重复的值。当使用唯一性约束时,需要考虑以下几个因素: ①使用唯一性约束的字段允许为空值。②一个表中可以允许有多个唯一性约束。③可以把唯一性约束定义在多个字段上。
④唯一性约束用于强制在指定字段上创建一个唯一性索引。⑤缺省情况下,创建的索引类型为非聚簇索引。
unique约束是用来确保不受主键约束列上的数据的唯一性.unique与primary key的区别在于:(1)unique约束主要用于非主键的一列或多列上要求数据唯一.(2)unique约束允许该列上存在NULL值,而主键决不允许出现.(3)可以在一个表创建多个unique约束,而在一个表上只能够设置一个主键 3.检查约束
CHECK约束用来检查字段值所允许的范围,如,一个字段只能输入整数,而且限定在0-100的整数,以此来保证域的完整性。
CHECK既可用于列约束,也可用于表约束,其语法格式为:
[CONSTRAINT <约束名>] CHECK(<条件>)一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中字段有关。一个表中可以定义多个检查约束。
每个CREATE TABLE语句中每个字段只能定义一个检查约束。
当执行INSERT语句或者UPDATE语句时,检查约束将验证数据。检查约束中不能包含子查询。4.缺省约束
使用缺省约束时,应该注意以下几点: 每个字段只能定义一个缺省约束。
如果定义的缺省值长于其对应字段的允许长度,那么输入到表中的缺省值将被截断。不能加入到带有IDENTITY属性或者数据类型为timestamp的字段上。如果字段定义为用户定义的数据类型,而且有一个缺省绑定到这个数据类型上,则不允许该字段有缺省约束。5.外部键约束
外部键约束用于强制参照完整性,提供单个字段或者多个字段的参照完整性。FOREIGN KEY约束指定某一个列或一组列作为外部键,其中,包含外部键的表称为从表(参照表),包含外部键所引用的主键或唯一键的表称主表(被参照表)。
系统保证从表在外部键上的取值要么是主表中某一个主键值或唯一键值,要么取空值。以此保证两个表之间的连接,确保了实体的参照完整性。FOREIGN KEY既可用于列约束,也可用于表约束,其语法格式为:
CONSTRAINT <约束名>] FOREIGN KEY
REFERENCES <主表名>(<列名>[{<列名>}])当使用外部键约束时,应该考虑以下几个因素: ①外部键约束提供了字段参照完整性。
②外部键从句中的字段数目和每个字段指定的数据类型必须和REFERENCES从句中的字段相匹配。
③外部键约束不能自动创建索引,需要用户手动创建。
④用户想要修改外部键约束的数据,必须有对外部键约束所参考表的SELECT权限或者REFERENCES权限。
⑤参考同一表中的字段时,必须只使用REFERENCES子句,不能使用外部键子句。⑥一个表中最多可以有31个外部键约束。⑦在临时表中,不能使用外部键约束。⑧主键和外部键的数据类型必须严格匹配。6.NULL 约束
(1)NULL/NOT NULL 是否允许该字段的值为NULL。NULL值不是0也不是空白,更不是填入字符串‚NULL‛,而是表示‚不知道‛、‚不确定‛或‚没有数据‛的意思。
当某一字段的值一定要输入才有意义的时候,则可以设置为NOT NULL。如主键列就不允许出现空值,否则就失去了唯一标识一条记录的作用 只能用于定义列约束,其语法格式如下:
[constraint <约束名> ][null|not null]
第五篇:SQL结构化查询语句
SQL结构化查询语句
一、数据定义功能
创建表:Createtable 表名(字段名……)修改表:Altertable表名
删除表:Droptable表名
二、数据操纵功能
数据插入:Insertinto 表名values(…,…,)数据更新:Update表名Set表达式 Where 条件 数据删除:DeleteFrom 表名Where 条件
三、查询功能
SELECT*FROM表名
WHERE条件
ORDERBY 字段排序
GROUPBY 字段分组
函数:SUM()AVG()COUNT()MAX()MIN()去向:
INTOTABLE表
INTOCURSOR临时表
INTOARRAY数组