SQL语句在审计中地简单应用.docx
《SQL语句在审计中地简单应用.docx》由会员分享,可在线阅读,更多相关《SQL语句在审计中地简单应用.docx(11页珍藏版)》请在冰豆网上搜索。
SQL语句在审计中地简单应用
SQL语句在审计的简单应用
SELECT语句是SQL语言中使用频率最高的语句,完全可以说SELECT语句是SQL的灵魂。
SELECT语句的作用就是让数据库服务器根据用户的要求搜索出所需要的信息资料,并按规定的格式进行整理,再返回给用户。
一、SELECT语句的基本组件和描述:
SELECT
指明要检索的数据的列。
FROM
指明从哪(几)个表中检索行。
WHERE
指明返回数据必须满足的标准(条件)。
GROUP
BY
对于集合查询,指明返回的列数据通过这些列来形成组(分组查询)。
HAVING
对于集合查询,指明返回的集合值必须满足的标准。
ORDER
BY
指明返回的排序顺序(排序查询)。
例如:
⑴简单查询数据库表hzbb中的以下几列,并将查询结果的每一行都返回在选定列中显示,可用以下SQL语句表示:
SELECTid,lname,fname,state,zip,contract
FROM
hzbb
(前面的列名即字段名如用*表示所有列)
即为:
SELECT
*
FROM
hzbb
⑵添加WHERE条件子句,以缩小检索范围。
如只返回显示state列中含有‘CA’字符,并且同时满足contract列中值为0的报有记录(行)。
可用以下SQL语句表示:
SELECTid,lname,fname,state,zip,contract
FROM
hzbb
WHEREstate=‘CA’AND
contract=0
(逻辑操作符AND表示与的意思,而OR表示或的意思,如使用AND则返回的行必须满足AND两边的条件,OR操作符则要求OR两边至少满足一个条件)
虽然SELECT语句的完整语法较复杂,但是其主要的子句可归纳如下:
SELECT
select_list
[INTO新表名]
FROM表一,[表二]……
[WHERE条件表达式]
[GROUPBY分组列]
[HAVING指定组或聚合应满足的搜索条件]
[ORDERBY指定要排序的列[ASC(升序)|DESC(降序)]]
二、审计实务中的SQL例句说明
1、在SELECT语句中,“*”表示表中所有的列。
如:
select
*
from
凭证库 该语句表示选择凭证库(表)中所有列的记录。
2、使用TOP关键字用于指定只返回前面一定数量的数据。
当查询到的数据非常多(如有100万行),但又没有必要对所有数据进行浏览时,使用TOP关键字可以大大减少查询的时间。
如:
SELECT
TOP
20
FROM
HZK表示从数据库HZK中返回前面20行的数据。
SELECT
TOP20
PERCENT
FROMHZK表示从数据库表HZK中搜索返回前20%的数据。
3、使用DISTINCT关键字。
使用DISTINCT关键字可从返回的结果数据集合中删除重复的行,使返回的结果更加简洁。
如:
select
distinct科目编码from
凭证库,该语句表示从凭证库中选择科目编码以及使用distinct关键字后去掉那些重复的科目编码,使每个科目编码都是唯一。
注意:
在使用DISTINCT关键字后,如果表中存在多个NULL的数据,服务器将会把这些数据视为相等。
4、灵活运用SQL语句使用计算列。
在进行审计数据分析和查询时经常需要对查询的数据进行再计算,这里审计人员可充分运用SELECT语句的功能来直接使用计算列对审计数据进行运算,而计算列并不存在于表格所存储的数据中,它是通过对某些列的数据进行计算而得出的结果列。
例如:
将每吨水泥的销售价格降低20%:
SELECT
ID,TYPE,销售价格,销售价格-销售价格*20%
FROM
SJKB
由于计算列没有列名,所以返回的结果看不到它的字段名字。
在计算列上,允许使用+、-、*、/、%和逻辑运算符。
5、操作查询的列名。
SELECT语句可以根据实际的需要对查询数据的列标题进行修改,或者为设立没有标题的列增加临时的标题。
对列名进行操作的方法有三种:
一是在列表达式后面直接给出列名。
SELECTtitle_id‘商品代号’,price‘原价’,price–price*0.3‘现价’FROM
title
二是使用SQL支持的“=”符号来连接列表达式。
SELECT‘商品代号’=title_id,‘原价’=price,‘现价’=price–price*0.3from
title
三是在指定列标题时,使用AS关键字来连接列表达式和指定的列名。
SELECTtitle_id
AS‘图书代号’,price
AS‘原价’,price–price*0.3
AS‘现价’FROM
title
以上三种语句返回结果相同。
注意:
在对列名进行操作时,有以下几个问题值得注意:
当使用中文列名时,可以不写引号,但决不能使用全角引号,否则查询结果出错;当使用的英文列名超过两个单词时,必须使用引号将列名括起来;可以联合使用本节介绍的3种方法,返回结果相同。
另外,审计人员还可通过应用函数方式直接对表列进行操作。
如语句:
Selectsum(jfje),sum(dfje)
from
pzk
该语句是将pzk(凭证库)中所有凭证的借方发生额求和和贷方发生额求和,借以查看pzk表中借贷发生额是否平衡。
6、使用WHERE条件子句。
使用WHERE子句的目的是从表的数据集中筛选出符合审计人员设定条件的行。
使用WHERE子句可以限制查询的范围,提高查询效率。
使用时注意WHERE子句必须紧跟FROM子句之后。
WHERE子句中的条件表达式包括算术表达式和逻辑表达式。
算术表达式:
=(等于);<(小于);>(大于);<>(不等于);!
>(不大于);
!
<(不小于);
>=(大于等于);
<=(小于等于);!
=(不等于)。
例1:
查询数据库表title中,返回商品的价格打了9折后仍大于150元的商品代码、商品种类及商品的原价。
Select
title_id
As
商品代码,type
As
商品种类,price
As
商品原价
from
title
Where
price
-price*0.1>150
例2:
通过对摘要字段内容的选择筛选出其中与招待费有关的所有凭证。
Select科目编码,科目名称,摘要,凭证日期,借方金额,贷方金额from凭证库where摘要like
'%招待费%'
例3:
在凭证库中统计7到12月份现金的借贷发生总额。
Selectsum(借方金额)as
现金借方发生总额,sum(贷方金额)as
现金贷方发生总额
from
凭证库
where科目编码like'101%'and
凭证日期between#2004-07-01#
and
#2004-12-31#
例4:
从凭证库表中筛选出“贷:
现金”,且摘要中不含“工资”或“奖金”或“稿费”或“补”或“津贴”或“劳保”或“福利”或“出差”或“差旅费”字段,且现金贷方发生额大于结算起点(5000元)的所有记录。
审计人员可通过此语句为审查除发工资、奖金或借差旅费等情况之外,现金使用是否超范围、超限额。
本例是以5000元作为界点,具体使用时也可视其需要做具体修改。
如果现在科目不为101,可能对编码也要做修改。
select*from凭证库where科目编码like'101%'and贷方金额>5000
and摘要notlike'%工资%'and摘要notlike'%奖金%'and摘要notlike'%稿费%'and摘要notlike'%补%'and摘要notlike'%津贴%'and摘要notlike'%劳保%'and摘要notlike'%福利%'and摘要notlike'%出差%'and摘要notlike'%差旅费%'
7、使用BETWHEEN关键字。
使用BETWHEEN关键字可以方便地限制查询数据的范围(即包含在两个边界内的值),NOT
BETWHEEN(不包含在两个边界内的值)。
使用BETWHEEN表达式进行查询的效果可以使用>=和<=的逻辑表达式来代替;使用NOT
BETWHEEN进行查询的效果可以使用>和<的逻辑表达式来代替。
如:
Select
商品代码,商品种类,商品价格
from
titles
Where
商品价格
BETWHEEN
$10
AND
$15
也可用:
select
商品代码,商品种类,商品价格
from
titles
where
商品价格
>=$10
AND
商品价格
<=$15
如果要查商品价格大于15元和小于10元的商品的代码、种类和价格,可用以下查询:
select
商品代码,商品种类,商品价格
from
titles
where
商品价格<$15
or
商品价格>$20
也可用:
where
NOT
BETWHEEN
15
AND
20
注意:
在使用BETWHEEN限制查询数据范围时,同时包括了边界值,而使用NOTBETWHEEN进行查询时没有包括边界值。
8、使用IN关键字。
同BETWHEEN关键字一样,IN关键字的引入也是为方便地限制检索数据的范围,灵活使用IN关键字,可以用简洁的语句实现较复杂的查询。
如:
select
pz_id,
pz_date,
pz_fname,pz_zy
from
hzk
where
state=‘招待费’
or
state=’餐费’
or
state=’酒水费’
如用IN关键字可替代以上语句:
select
pz_id,
pz_date,
pz_fname,pz_zy
from
hzk
where
state
IN(‘招待费’,
‘餐费’
‘酒水费’)
如果要查询不在列表中的值,可使用NOT
IN,方法同上。
9、使用LIKE子语句进行模糊查询。
审计人员往往在实际应用中不一定总是能够就很快地给出精确的查询条件,因此经常需要根据一些并不确定的线索来排查被审数据,LIKE子句就是用来进行模糊查询的语句,
在LIKE子句使用中,通常与通配符配合使用。
SQL提供了四种通配符供用户实现复杂的查询条件:
%
(百分号):
表示从0到n个任意字符。
_
(下划线):
表示单个任意字符。
[]
(封闭方括号):
表示方括号内列出的任意一个字符。
[∧]
:
表示任意一个没有在方括号内列出的字符。
如:
where
科目名称
like
‘%费’
就是查询条件以“费”结尾的科目字段。
下列将查询出所有满足tel_id的前面两个字母为“72”、第4个字母为“—”的人员姓名和电话号码:
Select
tel_lanme,
tel_fname,
phone,
tle_id
from
TELWhere
tel_id
like
‘72_—%’
使用方括号可以将字符查询的范围进一步缩小。
注意:
在LIKE子句的查询条件中,包含在‘ ’中的所有字符都将被考虑进去,包括空格在内,所以要注意在‘’中末尾含有空格而影响查询结果。
必须注意的是所有通配符都只有在LIKE子句中才有意义,否则,通配符会被当作普通字符处理。
也就是说通配符只有跟随LIKE后才有效。
10、使用ORDER
BY
给数据排序
Select语句获得的数据一般是没有按规律进行排序的,GROUP主要是对表中的信息细化分组,对属于同组信息进行统计,一般与函数一起使用。
语法为:
Order
by
{
order
by
expression
[ASC︱DESC]}
[,.....n]
]
Order
by
expression:
定义用于排序的列。
可以使用多列进行排序,各列在order
by
子句中的顺序决定了排序过程中的优先级。
[ASC]
表示升序,[DESC]表示降序。
默认情况下,order
by子句按升序进行排列。
即默认使用[ASC]关键字,如果特别要求按降序进行排序,必须使用[DESC]关键字。
如果在某一列中使用了计算列,如对某一列使用了函数或者是表达式,而又希望针对该列的值进行排序,那么必须在order
by子句中再包含该函数或表达式,或使用为该计算列临时分配的列名。
GROUP主要是对表中的信息分组,在分组的基础上,对表的信息按组进行统计,一般和函数一起使用。
例1:
对凭证库中其他应收款(113)科目中各末级科目按科目编码进行分组统计,并将借方金额和贷方金额分别进行求和显示。
select科目编码,sum(借方金额),sum(贷方金额)from凭证库where科目编码like'113%'
groupby科目编码
例2:
在凭证库中统计其他应受款(113)中二级科目(二级科目长度为5)的年借方发生总额和贷方发生总额。
在本例中,可通过调整长度来控制所求的科目级别,如果是3就是求其他应受款所有借贷方总额,如果是7就是所有的三级科目借贷方总额。
当然其具体数值大小根据实际编码长度为准。
selectleft(科目编码,5),sum(借方金额),sum(贷方金额)from凭证库where科目编码like'113%'
groupbyleft(科目编码,5)
例3:
上例是对年度求借贷发生总额,本语句是求出其他应受款(113)中二级科目的每个月的借贷发生总额。
同样改变数字大小可以改变所求的科目级别。
selectleft(科目编码,5)as二级科目编码,month(凭证日期)as月份,sum(借方金额)as月借方总额,sum(贷方金额)as月贷方总额from凭证库where科目编码like'113%'
groupbyleft(科目编码,6),month(凭证日期)
本组例句是以其他应受款(113)科目为例,具体运用时也可根据需要对其他科目进行统计和分析借贷发生年度总额或月度总额,以达到通过查询显示的结果与报表或总账进行实质性校核,最终达到审计的目的。