sql常用查询语句

2024-10-23

sql常用查询语句(共14篇)

1.sql常用查询语句 篇一

SQL常用基础语句

1、SQL SELECT 语句

语法:SELECT列名称FROM表名称

2、SQL SELECT DISTINCT 语句

语法:SELECTDISTINCT列名称FROM表名称

3、SQL WHERE 语句

语法:SELECT列名称FROM表名称WHERE列运算符值

操作符描述

=等于

不等于

>大于

<小于>

>=大于等于

<=小于等于

BETWEEN在某个范围内

LIKE搜索某种模式

注释:在某些版本的 SQL 中,操作符 可以写为 !=,

SQL 使用单引号来环绕文本值。若果是数值,不能使用引号。

4、SQL AND & OR 运算符

AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤,

使用运括号组成复杂的表达式。

5、SQL ORDER BY 子句

根据指定的列对结果集进行排序,默认安生许对记录进行排序,可以使用 DESC 关键字进行降序排列。

如果第一列有相同的值或者有些值为空时,以第二列升序进行排列。

6、SQL INSERT INTO 语句

语法:INSERTINTO表名称VALUES(值1,值2,....)

指定插入数据的列:INSERTINTOTABLE_NAME (列1,列2,...)VALUES (值1,值2,....)

7、SQL UPDATE 语句

语法:UPDATE表名称SET列名称=新值WHERE列名称=某值

8、SQL DELETE 语句

语法:DELETEFROM表名称WHERE列名称=值

删除所有行操作,意味着表的结构、属性和索引都是完整的,单数据是空的。

DELETE*FROMtables_name

2.sql常用查询语句 篇二

1.select语句由多个子句构成, 其基本表达式如下:select[all∣distinct]*或者column as alias[, column2] from table[, table2]

[where“conditions1”]

[group by“column-list1”]

[order by“column-list”[asc∣desc]]

在查询语句中, 被[]括起来的是可选项。最基本的结构是select-from-where语句。如果没有查询条件的话, where语句也是可以没有的。其中select子句是数据查询的核心语句, 通过select子句, 可以指定所要查询的字段。

2.as子句设置字段别名

select customerID, companyTITLE as公司名称from客户表

3.from子句用以指出查询目标所涉及的所有表。可以指定当前的数据库, 也可以指定一个外部数据库或一个数据源。From子句由关键字from后跟一组用逗号分开的表名组成, 每个表名都表示一个包括该查询要检索数据的表。这些表称为此SQL语句的表源, 因为查询结果都源于它们。在FROM子句中最多可指定256表或视图, 它们之间用逗号分隔。

4.where子句指出查询目标必须满足的条件, 系统根据条件进行选择运算, 输出符合条件的记录集合。Where子句设置查询条件, 过滤掉不需要的数据行。例如下面语句可查询价格高于1000的记录。Select product, perprice from产品表 where perprice>1000。

5.order by子句对记录排序。Order by是可选的子句, order by子句将查询结果按一列或多列中的数据排序。可以通过指定ASC或DESC按照升序或降充排列查询的结果。

6.group by子句进行分组查询

group by子句将所有的行在一起, 它包含了指定列的数列以及允许合计函数来计算一个或者多个列。

7.like和in子句进行通配查询

in运算符指定某几个项, 用以查询符合这几个项的所有记录, 如同“=”与“or”的组合。Like匹配符, 通配字符有以下几种:百分号%可匹配任意类型和长度的字符, 如果是中文, 应使用两个百分号。下划线:匹配单个任意字符。方括号[]指定一个字符、字符串或范围, 要求所匹配的对象为它们中的任一个。

8.sql函数进行统计查询

sql提供了事个作用在列值集合上的内置函数:count (计算元素的个数) 、max (找出某一列元素的最大值) 、min (找出某一列元素的最小值) 、sum (对某一列的数值进行求和) 、avg (对某一列的数值进行求平均数) , 除count外, 这些集合函数都必须作用在由简单值组成的集合上, 也就是, 数字集合或字符串集合。

还有一些命令, 由于篇幅限制, 不再一一列举, 请各位读者可以逐一尝试;一些基本的sql命令可以帮助我们在日常的生活工作中解决一些实际性的问题。

摘要:本文对日常工作中要经常用到SQL语句进行分析, 希望能与感兴趣的朋友一起探讨, 共同挖掘新的功能, 借此提高工作效率, 方便日常工作。

3.SQL语句优化方法分析与探讨 篇三

关键词:数据库;优化;SQL

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)15-30611-03

Analysis and Discussion of SQL Statement Optimization

LIU Ming-hua1,2, ZHOU Li1

(1. Glorious Sun School of Business and Management, Donghua University, Shanghai 200051, China;2. Information Center, Fujian Polytechnic of Information Technology, Fuzhou 350003, China)

Abstract:In database application systems, performance becomes one of their main problems needed to be resolved with the increase of data in it. For the demands that the customer wants the database are more and more effective, and this makes us optimize the design of the database. SQL optimization is a very important aspect in system optimization. This paper states some methods of SQL optimization from the application.

Key words:database;optimization;SQL

1 引言

在应用系统开发过程中,由于数据库数据的逐渐增加,系统的响应速度就成为系统设计中越来越需要解决的问题。数据库管理系统设计优化一个很重要的方面就是SQL语句的优化。对于数据库应用程序来说,重点在于SQL的执行效率,本文从SQL语言的定位、分析、调整、优化和技巧五个方面分别讨论SQL语句优化的一些具体方法。

2 SQL语句优化方法

2.1 SQL编码的定位

首先是查找大量使用内存及磁盘I/O的语句,并对其进行准确定位。例如:

selectdisk_reads,sql_text

fromv$sqlarea

where disk_reads>20000

order bydisk_reads desc;

Disk_read SQL_TEXT

12,987select order#,columns,types from orders

Where substr(ordered,1,2)=:1

11,231select custid,city from customers

Where city=CHICAGO

然后查找逻辑读最多的查询语句还有查找锁死其他用户操作的用户。例如:

Select a.serial#, a, sid, s.username, b.id1, c.sql_text

Form v$session a,v$lock b,v$ sqltext c

Where b.id1 in

(select distinct e.id1

From v$session d,v$lock e

Where d.lockwait=e.kaddr)

and a. Sid=b.sid

and c.hash_value=a.sql_hash_value

And b.request=0;

2.2 SQL编码分析

SQL语句的分析过程(无论是否使用优化器,分析过程都相同),包括以下几方面:

–检查语法

–搜索共享池

–搜索数据字典

–计算搜索路径

为提高SQL的共享性,建议使用统一的SQL编程标准如下:

–Put all verbs in one case

–Begin all SQL verbs on a new line

–Right or left align verbs with the initial verb

–Bind variables will ensure all SQL is equal so statements is not reparsed

2.3 SQL编码调整

使用下列信息确定访问路径:

–SQL语句

–在引用表上的索引

–执行计划

–当前优化模式

–提示变量

–表统计(如果是基于成本的优化,可知道选择何种优化)

2.4 SQL编码的具体优化

2.4.1 优化器

以Oracle为例,Oracle的优化器有三种:

–基于规则的优化(RULE)

–基于成本的优化(COST)

–基于选择性的优化(CHOOSE)

以下分别提出三种优化的方法。首先讨论基于规则的优化(rules),Oracle分析器从右到左处理,最后一个表最先被处理。最后一个表应该是包含父键或连接判定到其它表,SQL每一条件都被分级。如此类推,如果优化器有多个索引可选,唯一索引总排在非唯一索引的前面。若两个索引一样,如果是不同表上的两个索引,表的顺序将用于决定使用那个索引;如果两个索引在同一表上,首先引用的索引将被使用。除索引以外,WHERE子句中比较常量和变量比字段之间的比较优先。

然后是基于成本的优化(COST),基于成本的优化器没有固定的费用评估规则,评估是灵活的并基于分析统计的结果变化,逻辑读取的评估标准。用最少的资源实现最大吞吐量(ALL_ROWS)。用最少的资源实现首行最佳响应时间(FIRST_ROWS)。100%地选择唯一索引;计算非唯一索引的选择性;用列的最大最小值处理评估范围;Hint可被用于影响优化器。另外可以通过加入hint来强制改变优化策略。

FULL——强制进行全表扫描

SELECT /*+ FULL(table_name)*/ column1,column2…

INDEX——强制使用指定的索引

SELECT /*+ INDEX(table_name index_name1, index_name2…)*/

ORDERED——强制指定查询时的驱动表

SELECT /*+ ORDERED*/ column1,column2…FROM table1, table2

ALL_ROWS——基于成本的优化,最大的提高数据的吞吐性

SELECT /*+ ALL_ROWS */ (ALL_ROWS hint通常会禁用索引)

最后说明基于选择性的优化(CHOOSE)。From子句的内表外表次序:在表的连接中一个表作为外表,也称驱动表,另一个表作为内表。首先检查外表的每一行是否满足查询条件,对于满足条件的那些外表记录,扫描每一个内表记录并且与它在连接列上进行匹配。优化器选择外表的根据是:满足条件的返回数据行数少;或定位数据行时需要读操作的次数多(不能有效利用索引);如果有三个或以上的表进行关联查询,中间的表应该作为外表,与之相反的表作为内表。以下是确定表连接次序的实例(基于Sybase):

select TableA.colx, TableB.coly from TableA, TableB where TableA.col1 = TableB.col1 and TableB.col2=anything and TableA.col2 = something

假设A,B表都是有10条记录满足条件

表A:1,000,000条记录,每个数据页上10行记录,(共100,000页),没有索引。(定位数据行时需要读操作的次数多-应选作外表)

表B:100,000条记录,每个数据页上10行记录,(共10,000页),在连接列上有聚簇索引,索引树为3层。

通过以下的计算说明应该选表A为外表。如果表A是外表:对它的存取是通过全表扫描,当找到第一个满足条件的记录,在表B上用聚簇索引查找B表中col1列与从A表检索出的值匹配的数据行,做完后继续扫描A表,重复上面的过程,直到A表全部扫描完毕。假设A表有10条满足条件的记录,则该次查询所需的读数据页的次数如下:

- 读取的页数

- A表扫描100,000

- 0次B表索引扫描10*3=30

- 合计100,030

如果表B是外表:对它的存取是通过聚簇索引,当找到第一个满足条件的记录,在表A上用全表扫描A表中col1列与从B表检索出的值匹配的数据行,做完后继续扫描B表,重复上面的过程,直到B表全部扫描完毕。假设B表有10条满足条件的记录,则该次查询所需的读数据页的次数如下:

- 读取的页数

- B表扫描 3

- 10次 A表全表扫描10*100,000=1,000,000

- 合计1,000,003

WHERE子句后面参数的写法:

有索引且能用上索引的表达式,其格式有:

<column><operator><expression>

<expression><operator><column>

<column> is null(对Oracle不适合)

不等操作符!>和!=是特殊情况,这时查询优化器不能使用索引来定位搜索。

下面的例子是可优化的:

au_lname = "Bennett"

price >= $12.00

price >= $12.00*3

advance >10000 and advance < 20000

下面的例子则不是:salary=commission /*两边都是列名*/

substring(lname,1,3) ="Ben" /*列名边不允许函数*/

advance * 2 = 5000 /*列名边不允许表达式*/

advance =$10000 or price = $12.00 /*含有or谓词*/

2.4.2 可以转化为优化的查询条件书写

(1)between谓词可以转化为>=and<=子句,比如:

price between 10 and 20可以转化为 price>= 10 and <=20

(2)like子句中匹配值的第一个字符是常量,也可以进行转换,例如:

like "sm%"可以转换成 >="sm" and <"sn"

表titles和表titleauthor是一对多关系,title_id在表titles中是唯一的。

1.select au_lname,title from titles t,titleauthor ta,authors a where t.title_id =ta.tatle_id and a.au_id=ta.au_id and t.title_id ="T81002"title_id在表titles中是唯一的。

2.select au_lname,title from titles t,titleauthor ta,authors a where t.title_id =ta.tatle_id and a.au_id=ta.au_idand ta.title_id="T81002"这是最差的,因为title_id在表titleauthor中非唯一。

3.select au_lname,title from titles t,titleauthor ta,authors a where t.title_id =ta.tatle_id and a.au_id=ta.au_id and t.title_id="T81002"and ta.title_id= "T81002"这是最优的。

查询1就可能比查询2执行的好,因为title_id是唯一的,筛选的效果会好些,第3个查询提供了两个表的搜索变量,给优化器更多的选择来调整连接操作表的顺序。

2.4.3 连接顺序(只适用于基于规划的优化器)

Oracel采用自下而上的顺序解析WHERE子句,可以过滤掉最大数量记录的条件写在WHERE子句的末尾。

SELECT ***

FROM EMP E

WHERE 30 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO)

AND SAL > 30000

AND JOB= 'MANAGER'

2.4.4 查询条件书写的注意事项

编写SQL语句时关于查询条件书写应注意在搜索子句的列名边要避免函数、算术操作符和其它的表达式避免不兼容的数据类型使用复合索引的第一个列名给优化器提供尽可能多的查询条件-可以用上索引的检索条件。

2.5 编码的技巧

2.5.1 or与in子句的优化

查询优化器对and和or子句的查询采用不同的处理方式,包含or或in子句查询的优化依赖于在这些子句中使用的表上的索引和这些子句是否返回重复的结果。or子句通常采用下面的形式:

where column1 = or column1=

where column1 = or column2=

如果or子句中使用的列上有任一个列没有索引或使用索引的开销超过了全表扫描的开销,则执行全表扫描。

OR策略:使用or子句的查询相当于多个查询的union,一些记录可能满足多个条件,但只应当返回一次。OR策略将使用每一列的索引把满足每个or子句的记录行merge 到一起,然后再去掉重复数据行。如果or子句不会返回重复记录,优化器就会使用多个匹配索引查询,每个or子句单独考虑,可以使用不同的索引。如or子句返回重复记录,则采用比较费时的or策略。先把满足每一个or子句的记录行的ID号存储到数据库tempdb中的工作表中,然后进行排序并删除重复的ID号,再利用行ID从基表中检索出不 重复的数据行。or策略在被访问的数据页上维护一共享锁所以会影响并发性。在使用隔离级别3或holdlock子句的情况下,要避免or查询。当在索引列上进行条件判断时,用>=替代>例如下面的查询,在int_col上建有索引:

select * from table where int_col > 3

该查询使用索引找到第一个int_col=3的值,然后向前扫描。如果表中有许多行中int_col的值是3,则该查询不得不扫描许多页后找到第一个int_col大于3的数据行。

若把查询写成下面的形式,则会更有效:

select * from table where int_col >= 4 exist和 not exist 在子查询,exists和in要比not exists和not in执行得快,因为对于exists和in,优化器只要找到一条记录就可以返回TRUE,而对于not exists和not in则必须检查所有的值。

2.6 SQL编码的开发调优

SQL编码的开发调优一般应该考虑以下一些原则:

1、在搜索子句的列名边要避免函数、算术操作符和其它的表达式,除非建立基于函数的索引;

2、使用复合索引的第一个列名;

3、SELECT子句中避免使用'*';

4、用TRUNCATE替代DELETE;

5、尽量多使用COMMIT;

6、避免在索引列上使用IS NULL和IS NOT NULL(Oracle);

7、用UNION-ALL 替换UNION(如果有可能的话);

8、使用较大的BUFFER(比如10MB, 10,240,000)可以提高EXPORT和IMPORT的速度;

9、在物理存储上分离表和索引;

10、当连接的两个或多个数据表的数据量都过大时,考虑将数据表进行整合到一张表中;

11、对于批处理的操作,使用指定的大的回滚段;

12、当使用存储过程处理数据量比较大表时,可考虑使用中间表或临时工作表;

13、当没有可用的索引时,则只能创建工作表对结果数据排序;

14、将纵向表拆成横向表处理,比如费用字段拆成市话、长话、IP费用等;

15、将层次结构复杂(如雪花形结构)的维表如咨询树类型,或将信息比较多的维表比如客户信息表,直接取出维度信息放进事实表中,并对该表建立索引,增加查询的速度。

2.7 SQL编码的应用调优

SQL编码的应用调优应该注意以下几点:

1、对于频繁进行更新和插入的表,比如状态监控表和日志表使用行级锁;

2、对于频繁进行更新和插入的大数据量表,比如日志表,要考虑所建索引的数量,避免建过多的索引(会降低插入和更新操作的执行效率,并且占用大量的存储空间,可能比原表还大);

3、对于字段较多并且包含memo,text,image等记录长度大的数据表,在查询时要考虑执行效率,比如对于批量工单查询,只需返回有限的几个字段(减少I/O和执行时间),对于工单的精确查询返回全部字段的值;

4、在应用中对业务的处理引入事务机制和异常处理机制,保证业务处理的完整性;

5、考虑主外键约束的使用(灵活与严整),使用触发器或事务处理的方式来保证参照完整性;

6、对于数据量不大的表,可以将数据一次取到内存中,然后再进行计算和查找,比如树形结构的展现。

3 总结

SQL的性能优化是一个复杂的过程,涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。不同的数据库都有各自不同的功能和特色,在实际应用环境中,应该根据实际情况选择较合理的数据库系统设计和优化策略,这样才能充分利用数据库管理系统提供的高性能服务使应用系统能充分发挥其高效的功能。

参考文献:

[1] 袁鹏飞. SQL Server7.0 数据库系统管理与应用开发[M]. 北京:人民邮电出版社,1999.

[2] Patrick O Neil, Elizabeth Oneil. DATABASE: Principles, Programming and Performance[M]. Beijing: Higher Education Press, Morgan Kaufmann Publishers, 2001.

[3] 微软公司. Microsoft SQL Server 7.0系统管理[M].北京:北京希望电子出版社,1999.

[4] SQL Server数据库性能优化技术[M]. 中国IT认证实验室(China IT Lab).

[5] 吕映芝, 张素芝, 蒋维杜. 编译原理[M]. 北京:高等教育出版社,2000.12.

4.sql常用查询语句 篇四

W_KMR01_11 ---- KMM13BR COPYWRITE BY LD /09/07 15:30

SELECT DISTINCT SUBSTRING( KMM102.KMM102_BGT_TYPE,1,4 ) AS BGT_TYPE,

( CASE SUBSTRING( KMM102.KMM102_BGT_TYPE,3,2 ) WHEN “09” THEN “1” WHEN “10” THEN “2”

WHEN “11” THEN “3” ELSE “9” END ) AS BGT_CLASS,

SUBSTRING( KMM102.KMM102_BGT_TYPE,1,2 ) AS BGT_TEAM,

( ISNULL( (SELECT SUBSTRING(KMC101.KMC101_NAME,CHARINDEX(“-”,KMC101.KMC101_NAME)+1,12) FROM KMC101

WHERE ( KMC101.KMC101_TYPE = “BUDGETCODE” )

AND ( KMC101.KMC101_CODE = SUBSTRING( KMM102.KMM102_BGT_TYPE,1,4 ) + “00” ) ),“” ) ) AS BGT_NAME,

SUM( ISNULL( KMM101.KMM101_BGT_JAN,0 ) ) AS BGT_AMT01,

SUM( ISNULL( KMM101.KMM101_BGT_FEB,0 ) ) AS BGT_AMT02,

SUM( ISNULL( KMM101.KMM101_BGT_MAR,0 ) ) AS BGT_AMT03,

SUM( ISNULL( KMM101.KMM101_BGT_APR,0 ) ) AS BGT_AMT04,

SUM( ISNULL( KMM101.KMM101_BGT_MAY,0 ) ) AS BGT_AMT05,

SUM( ISNULL( KMM101.KMM101_BGT_JUN,0 ) ) AS BGT_AMT06,

SUM( ISNULL( KMM101.KMM101_BGT_JUL,0 ) ) AS BGT_AMT07,

SUM( ISNULL( KMM101.KMM101_BGT_AUG,0 ) ) AS BGT_AMT08,

SUM( ISNULL( KMM101.KMM101_BGT_SEP,0 ) ) AS BGT_AMT09,

SUM( ISNULL( KMM101.KMM101_BGT_OCT,0 ) ) AS BGT_AMT10,

SUM( ISNULL( KMM101.KMM101_BGT_NOV,0 ) ) AS BGT_AMT11,

SUM( ISNULL( KMM101.KMM101_BGT_DEC,0 ) ) AS BGT_AMT12,

( SUM( ISNULL( KMM101.KMM101_BGT_JAN,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_FEB,0 ) ) +

SUM( ISNULL( KMM101.KMM101_BGT_MAR,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_APR,0 ) ) +

SUM( ISNULL( KMM101.KMM101_BGT_MAY,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_JUN,0 ) ) +

SUM( ISNULL( KMM101.KMM101_BGT_JUL,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_AUG,0 ) ) +

SUM( ISNULL( KMM101.KMM101_BGT_SEP,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_OCT,0 ) ) +

SUM( ISNULL( KMM101.KMM101_BGT_NOV,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_DEC,0 ) ) ) AS AMT01,

( “XXXXXXXX” ) AS AMT02,

SUM( ISNULL( ( CASE WHEN ( CONVERT(CHAR(8),KMM102.KMM102_CHK_DATE,112) < “YYYYMMDD” )

THEN KMM102.KMM102_CHK_AMT ELSE 0 END ),0 ) ) AS AMT09,

SUM( ISNULL( ( CASE WHEN ( ( CONVERT(CHAR(8),KMM102.KMM102_OVER_DATE,112) < “YYYYMMDD” )

AND KMM102.KMM102_OVER_STATUS “00” )

THEN KMM102.KMM102_OVER_AMT

WHEN ( ( CONVERT(CHAR(8),KMM102.KMM102_OVER_DATE,112) < “YYYYMMDD” )

AND KMM102.KMM102_OVER_STATUS = “00” )

THEN KMM102.KMM102_OVER_AMT ELSE 0 END ),0 ) ) AS AMT07,

SUM( ISNULL( ( SELECT CASE WHEN ( ( CONVERT(CHAR(8),KMM103.KMM103_PAY_DATE,112) < “YYYYMMDD” )

AND KMM103.KMM103_PAY_STATUS “2” )

THEN KMM103.KMM103_PAY_AMT ELSE 0 END

FROM KMM103

WHERE ( KMM103.KMM103_YY = KMM102.KMM102_YY )

AND ( KMM103.KMM103_BGT_KIND = KMM102.KMM102_BGT_KIND )

AND ( KMM103.KMM103_CASE_NO = KMM102.KMM102_CASE_NO ) ),0 ) ) AS AMT03,

SUM( ISNULL( ( SELECT CASE WHEN ( ( CONVERT(CHAR(8),KMM103.KMM103_PAY_DATE,112) < “YYYYMMDD” )

AND KMM103.KMM103_PAY_STATUS “1” )

THEN KMM103.KMM103_PAY_AMT ELSE 0 END

FROM KMM103

WHERE ( KMM103.KMM103_YY = KMM102.KMM102_YY )

AND ( KMM103.KMM103_BGT_KIND = KMM102.KMM102_BGT_KIND )

AND ( KMM103.KMM103_CASE_NO = KMM102.KMM102_CASE_NO ) ),0 ) ) AS AMT04

FROM KMM102,

KMM101

WHERE ( KMM102.KMM102_YY = “YYY” ) AND

( KMM102.KMM102_BGT_KIND = “1” ) AND

( KMM101.KMM101_YY =* KMM102.KMM102_YY ) AND

( KMM101.KMM101_BGT_KIND =* KMM102.KMM102_BGT_KIND ) AND

( KMM101.KMM101_BGT_TYPE =* KMM102.KMM102_BGT_TYPE )

GROUP BY SUBSTRING( KMM102.KMM102_BGT_TYPE,1,4 ),

SUBSTRING( KMM102.KMM102_BGT_TYPE,3,2 ),

SUBSTRING( KMM102.KMM102_BGT_TYPE,1,2 )

ORDER BY BGT_CLASS ASC,

BGT_TYPE DESC

5.实验六SQL语句 篇五

一、实验目的(1)进一步掌握查询的概念和方法。

(2)熟练掌握单表查询的select语句。

(3)熟练掌握聚合函数的使用。

(4)熟练掌握连接查询方法

(5)熟练掌握嵌套查询方法

(6)掌握创建和管理视图的方法。

二、实验内容

1、查询时改变列标题的显示:

检索全体学生的学号、姓名、籍贯信息,并分别加上“学号”、“姓名”、“籍贯”的别名信息。SQL语句:

2、条件查询

(1)查询选修了课程号为“002”,且成绩大于80的学生的学号。

SQL语句:

(2)某些学生选修某门课程后没有参加考试,所以有选课记录,但没有考试成绩,查询缺少成绩的学生的学号和相应的课程号。

SQL语句:

3、基于IN子句的数据查询

从课程表中查询出“高数”、“C语言程序设计”的所有信息。

SQL语句:

4、基于Like子句的查询

从学生表中分别检索出姓张的所有同学的资料;检索名字的第二个字是“红”或“虹”的所有同学的资料。

SQL语句:

5、查询经过计算的值。

查询全体学生的姓名及其出生年份,需为计算值取别名“出生年份”。

SQL语句:

6、使用ORDER BY语句对查询的结果进行排序

显示所有学生的基本信息,并按学生的年龄的降序排列。

SQL语句:

7、使用Group子句进行查询

汇总总分大于是150分的学生的学号及总成绩。

8、使用聚合函数

计算“002”号课程的学生平均成绩、最高分、最低分。

SQL语句:

9、查询与“张虹”在同一个班级的学生学号、姓名、所属系。

(嵌套查询)SQL语句:

连接查询T-SQL语句:

10、创建一个名为stuview的视图,能检索出每位选课学生的学号、姓名、课程名、总成绩。SQL语句为:

11、创建一个名为stuview1的视图,从数据库XSGL的student表中查询出性别为“男”的所有学生的资料。并在创建视图时使用with check option。(注:该子句用于强制视图上执行的所有修改语句必须符合由Select语句where中的条件。)

SQL语句为:

13、管理视图中的数据

1)从视图stuview1查询出籍贯为“内蒙”的学生资料。

SQL语句:

思考:是否student表中所有籍贯为内蒙的同学都被查询出来了?

2)向视图stuview1中插入一行数据。学号:1006,姓名:赵青,籍贯:内蒙,性别:男,年龄:22。

SQL语句:

原student表中的内容有何变化?

思考:如向视图stuview1中插入一行数据。学号:1007,姓名:赵静,籍贯:内蒙,性别:女,年龄:22。

会出现什么样的结果?

原student表中的内容有何变化?

3)修改视图stuview1中的数据。

将stuview1中、姓名为“赵青”同学的年龄改为20岁。

SQL语句:

原student表中的内容有何变化?

4)从视图中stuview1将籍贯为内蒙、姓名为“赵青”同学删除。

6.标准SQL语句注意事项 篇六

(暂适用于sqlserver,sybase,db2的odbc的接口)

1. INSERT 语句

写法为 :INSERT INTO 表名(字段,….)VALUES(值,….)

2. DELETE 语句

写法为:DELETE FROM 表名 WHERE ….如果删除数据为0行,则某些数据库sqlca.sqlcode的返回值为-1,需要在DELTETE 以前加以SELECT语句判断是否有真正的删除行。

3. UPDATE 语句

写法为:UPDATE 表名 se t 字段 = 值 WHERE ……

不支持写法为:UPDATE 表名 se t 字段 = 值 FROM 表名WHERE ……

如果更新数据为0行,则某些数据库sqlca.sqlcode的返回值为-1,需要在UPDATE 以前加以SELECT语句判断是否有真正的更新行。

4. 存取字符串时,应该用单引号,不能用双引号

5. 存取时间的标准字符串写法为“{ts’ yyyy-mm-dd hh:mm:ss’}”

6. 外连接的写法为:{oj master_table left outer join primary_table on(连接条件)}

例如:SELECT MS_YJ01.YJXH,MS_YJ01.TJHM,MS_BRDA.MZHM FROM {oj MS_YJ01 LEFT OUTER JOIN MS_BRDA ON(MS_YJ01.ID = MS_BRDA.ID)};

但某些数据库还不支持多重连接的标准写法,示例如下:

SELECT MS_YJ01.YJXH,MS_YJ01.TJHM,MS_BRDA.MZHM ,GY_KSDM.KSMC FROM {oj MS_YJ01 LEFT OUTER JOIN MS_BRDA ON(MS_YJ01.ID = MS_BRDA.ID)LEFT OUTER JOIN GY_KSDM(MS_YJ01.SJKS = GY_KSDM.KSDM)};

7. 在游标中不能使用sql语句

8. 在一个事务中不能有 CREATE TABLE,CREATE INDEX,DROP TABLE 语句

9.在保存实数时,应该用decimal{n} 类型(明确指出小数的位数),不能用double 或 real

10.某些数据库在sql语句中对大小写敏感。

11.某些数据库在sql语句中两个字符串不能相加

12.数值列中最好有默认值,如有null 值,则会sum统计出错

7.sql常用查询语句 篇七

1 SQL语句处理流程

1.1 打开游标

从上图可以看出处理SQL语句的第一步就是要打开一个游标, 事实上, 一个完整的SQL处理过程就是一个游标的生命周期。

1.2 共享SQL

O r a c l e内存中有一个区叫S H A-RED_POOL, 这个区的主要作用就是将SQL语句存放在这个区内, 当客户发出一个新的SQL语句, 数据库引擎首先会到这个区查找是否有相同的SQL, 如果有, 则避免了解析、分析索引、制定执行计划等一系列的动作。如果没有则需要进行hard parse。

1.3 绑定变量

如果在SQL中指定了绑定变量, 需要在这个阶段给SQL附上绑定变量的值。

1.4 并行处理

如果SQL需要进行并行处理, 在这一阶段需要把整个SQL分割成多个并行的部分。

1.5 执行查询

Oracle按照执行计划指定的方式执行SQL, 执行UPDATE和DELETE语句时, 必须将行锁定, 以免其他用户修改。Oracle先从数据库缓冲区中寻找是否存在所要的数据块, 如果存在, 就直接读或修改, 否则从物理文件中读到数据库缓冲区中。

1.6 返回结果

对SELECT语句需要返回结果的语句, 首先看是否需要排序, 需要, 则排序后返回给用户, 然后根据内存的大小不同, 可以一次取出一行数据, 也可以一次取一组数据。这时, 可能要用到数据结构中的外部排序, 并归排序等算法, 所以如内存允许的话, 会在很大程度上提高性能。

2 影响SQL性能的原因

影响SQL性能的因素很多, 如初始化参数设置不合理、导入了不准确的系统及模式统计数据从而影响优化程序 (CBO) 的正确判断等, 这些往往和DBA密切相关。纯粹从SQL语句出发, 笔者认为影响SQL性能不外乎以下四个重要原因。

(1) 在大记录集上进行高成本操作, 如使用了引起排序的谓词等。

(2) 过多的I/O操作 (含物理I/O与逻辑I/O) , 最典型的就是未建立恰当的索引, 导致对查询表进行全表扫描。

(3) 处理了太多的无用记录, 如在多表连接时过滤条件位置不当导致中间结果集包含了太多的无用记录。

(4) 未充分利用数据库提供的功能, 如查询的并行化处理等。

3 SQL优化解决方案

通常, 一个关系数据库服务器上的SQL进程要使用该服务器60%~90%的资源。一般来说, 数据库应用上60%的性能问题是因为运行着效率很低的SQL语句, 而其中30%SQL语句的性能是可以被显著改进提升的。

3.1 避免使用<>和!=

<>和!=都是不等于的意思, 但在SQL开发过程中尽量不要使用, 因为这个关键字会造成索引失效, 降低查询效率。下面是使用表client_info (客户信息表) 进行测试的情况, 其中在cl_no (客户编号) 列上建立了索引。

3.2 避免隐式转换

隐式转换是最容易被开发人员忽视的一点, 因为它并不影响查询结果, 但它却影响了查询效率, 在查询过程中, 由于数据类型的不符合, 造成隐式的调用to_char或to_number函数。下面采用USER_INFO (用户信息表) 来测试这一过程, 如表1所示。

◆查询用户名称为101的客户信息, 下面是没有隐式转换的查询:

从测试结果很容易看出:第二个查询中索引失效了, 这是因为ORACLE数据库在解析过程中后台进行了隐式转换user_name=to_char (101) 造成的。

3.3 选择最有效率的表名顺序

ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名, 因此FROM子句中写在最后的表 (基础表) 将被最先处理, 在FROM子句中包含多个表的情况下, 必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时, 会运用排序及合并的方式连接首先, 扫描第一张表 (FROM子句中最后的那个表) 并对记录进行排序, 然后扫描第二张表 (FROM子句中最后第二个表) , 最后将所有从第二张表中检索出的记录与第一个表中合适记录进行合并。下面是对这一理论的验证, 其中用户信息表user_info有999条数据, 合同信息表cont_info有32000条数据。

这一结果表明, 合理的表的连接顺序对数据库性能的提高是很有帮助的。

4 结语

8.sql常用查询语句 篇八

关键词:关系数据库三级模式结构;关系代数;关系演算;SQL

中图分类号:TP311文献标识码:A 文章编号:1009-3044(2007)15-30606-03

Simply Talking about the Three Theoretics Foundation of the SQL Query Function

FU Si-ping

(Quanzhou Economic & Trade Polytechnic,Quanzhou 362000,China)

Abstract:The text uses the Data Base Management System-Visual FoxPro 6.0 as a flat-top building, expands on the Structured Query Language how to explain the three layer structure of relation DB through the select example and how to reflect the thought ofrelation algebra and relation mathematical calculation.

Key words:the three layer structure of relation DB ;relation algebra;relationmathematical calculation;SQL

1 引言

现代生活中,数据库管理系统(DBMS)被广泛应用于各个领域,人们利用它来存储数据,并方便地从中查询所需的数据。DBMS利用SQL来实现其查询功能,为了更好地体现查询机制,文章先介绍与查询功能密切相关的三个理论基础——关系数据库三级模式结构、关系代数、关系演算,然后用实例来阐述查询功能如何反映这三个理论基础。

2 关系数据库三级模式结构

关系模型遵循数据库的三级体系结构,即关系模式、关系子模式和存储模式。SQL语言支持关系数据库三级模式结构,但是术语与传统关系模型术语不同。在SQL中,关系模式称为“基本表”,关系子模式称为“视图”,存储模式称为“存储文件”。三者关系如下图所示。

图1关系数据库三级模式结构

存储文件是指数据表存储在硬盘上的结构,与外部存储器上的一个物理文件对应。

基本表是用户看到和使用的数据的描述,是用户与数据库的接口,它由存储文件通过映射关系得到。一个基本表可以跨越一个或多个存储文件,一个存储文件也可以存放一个或多个数据表。基本表是本身独立存在的表,视图是从基本表或其他视图中导出的表,它本身不独立存储在数据库中,也就是说数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。

SQL用户可以是应用程序,也可以是终端用户。用户可以用SQL语言对视图和基本表进行查询。在用户眼中,视图和基本表都是关系,而存储文件对用户是透明的。

3 关系代数

关系数据库的查询语言分为两大类:关系代数语言和关系演算语言。

关系代数语言的查询操作是以集合操作为基础的运算。最基本的五种操作为并、差、笛卡儿积、投影和选择。

并:设有R和S具有相同结构的关系模式,R和S的并是由属于R或属于S的元组组成的集合,记为R U S。

差:关系R和S具有相同的关系模式,R和S的差是由属于R但不属于S的元组组成的集合,记为R-S。

笛卡儿积:设关系R和S的元组数分别为r和s。定义R和S的笛卡儿积是一个(r+s)元的元组集合,每个元组的前r个分量来自R的一个元组,后s个分量来自S的一个元组,记为R X S。

投影:该操作对关系进行垂直分割,得到关系的某一列(字段),记为Πi1,i2,…ik(R)。

选择:该操作对关系进行水平分割,得到关系的某一行(元组),记为σF(R)。

4 关系演算

关系演算语言的查询操作是以数理逻辑为中心的谓词演算为基础的运算。

谓词(predicate)指明一个条件,通过对它的求解可得出下列之一的值:“真”、“假”、“未知”。常见的谓词有比较谓词:>,≥,<,≤,=,≠;包含谓词:IN;存在谓词:EXISTS。关系演算有元组关系演算与域关系演算两类,前者以元组为变量,后者以域为变量。

4.1 元组关系演算

在元组关系演算中,元组关系演算表达式(简称为元组表达式)用表达式{t│Q(t)}来表示,其中t是元组变量,它表示一个定长的元组,Q(t)是公式,公式是由原子公式组成的。原子公式有下列三种形式:

R(s),其中R是关系名,s是元组变量。它表示这样的一个命题:“s是关系R的一个元组”。

s[i]θu[j],其中s和u都是元组变量,θ是算术比较运算符。该原子公式表示这样的命题:“元组s的第i个分量与元组u的第j个分量之间满足θ关系”。例如,s[1]

s[i]θa或aθs[i],这里a是一个常量。前一个原子公式表示这样的命题:“元组s的第i个分量与常量a之间满足θ关系”。

在一个公式中,如果一个元组变量的前面没有存在量词Э或全称量词▽等符号,那么称之为自由元组变量,否则称之为约束元组变量。元组表达式的一般形式{t│Q(t)}中,t是Q中唯一的自由元组变量。

关系代数的五种基本操作均可用元组表达式来表示。其表示如下:

1)并:R∪S={t│R(t)∨S(t)}

2)差:R-S={t│R(t)∧┓S(t)}

3)投影:Πi1,i2,…ik(R)={t(k)│(Эu)(R(u)∧t[1]=u[i1]∧t[2]=u[i2]∧…t[k]=u[ik])}

4) 选择:σF(R)={t∣R(t)∧F’}

5) 笛卡儿积:R×S={t— ($u) ($v) (R(u) ∧ S(v) ∧t[1]=u[1] ∧ t[2]=u[2] ∧ t[3]=u[3] ∧ t[4]=v[1] ∧ t[5]=v[2] ∧ t[6]=v[3] )}

4.2 域关系演算

用表达式{x1,x2,…xk|φ(x1,x2,…xk)}来表示,其中x1,x2,…xk是域变量,是由关系、域变量、常量及运算符组成的式子。

{x1,x2,…xk|φ(x1,x2,…xk)}表示所有使φ(x1,x2,…xk)为“真”的那些x1,x2,…xk组成的元组的集合。每一个关系代数表达式有一个等价的域演算表达式,反之亦然。

域关系演算和元组关系演算是类似的,不同之处是用域变量代替元组变量的每一个分量。与元组变量不同的是,域变量的变化范围是某个值域而不是一个关系。可以像元组演算一样定义域演算的原子公式。域演算的原子公式有以下两种形式:

·R(x1…xk),R是k元关系,每个xi是常量或域变量。

·xθy,其中x,y是常量或域变量,但至少有一个是域变量,θ是算术比较运算符。

域关系演算的公式中也可使用∨、∧、┓等逻辑运算符,还可用(Эx)和(▽x)形成新的公式,但变量x是域变量,不是元组变量。

5 Visual FoxPro的SQL数据查询功能

SQL用来与数据库管理系统通信,集数据定义、数据操纵、数据管理的功能于一体,是一个通用的、功能极强的关系数据库语言,已被众多的数据库管理系统所采用,既可以用于远程的基于服务器的数据,如ORACLE、SQL Server,又可以用于本地数据库,如Visual FoxPro、PowerBulider和ACCESS以及符合ODBC的数据库。SQL功能包括数据查询、数据操纵、数据定义和数据控制4个方面。

本文利用Visual FoxPro的SQL查询功能来阐述观点,分为三步。

第一步:建立需要的数据表。

利用Visual FoxPro6.0定义一个教学数据库,包括五个基本表S1(计算机1班学生表)、S2(计算机2班学生表)、SC2(计算机2班选课情况表)、CO(课程) 、TY2(计算机2班团员表)。表结构如下:

S1(SN,SNAME,AGE,SEX)

S2(SN,SNAME,AGE,SEX)

SC2(SN,CN,GRADE)

CO(CN,CNAME,TEACHER)

TY2(SN,SNAME,AGE,SEX)

其中SN代表学生学号,SNAME代表学生姓名,AGE代表学生年龄,SEX代表学生性别,CN代表课程号,GRADE代表成绩,CNAME代表课程名,TEACHER代表任课教师。

图2教学数据库

表1计算机1班学生表

表2计算机2班学生表

表3计算机2班选课情况表

表4课程表

表5计算机2班团员表

第二步:反映三级模式结构。

所看到的S1、S2、SC2、CO、TY2五个数据库表属于三级模式结构中的第二层,具体五个表如何存放在存储设备上(即第一层),对我们而言是透明的。那么,第一层和第二层之间如何转换呢?是通过映射关系得到的。

数据查询是在相互关联的表中查询所需要的数据,本质是对第二层执行SELECT命令。第一层对SELECT命令来讲,也是透明的。通过查询看到的结果属于三级模式结构中的第三层,是建立在第二层之上的一种满足用户需求的“映射假相”。

第三步:体现关系代数和关系演算的思想。

Visual FoxPro中在对关系数据库中的数据表进行查询时,找到用户感兴趣的数据,就需要对关系进行一定的关系运算。关系运算的基本运算有两大类:一类是传统的集合运算(并、差等),另一类是专门的关系运算(选择、投影、联接),沿用了关系代数和关系演算的概念。

在第二步了解了三级模式结构的互相参照关系之后,来了解SELECT命令结构,结构如下:

SELECT子句:说明需要查询的数据项目—必需;

FROM子句:数据项目的来源(表或视图)—必需;

WHERE子句:查询的条件或多表联接条件,运算符:比较、LIKE、IN、BETWEEN… AND…、OR、NOT、AND;

下面通过查询实例,说明关系代数、关系演算的五种基本操作和关系演算的谓词运算如何体现在SQL的查询功能中,及其它们的对照写法。

功能一、并

例如:要查看计算机班的所有学生记录,需要合并S1和S2两个学生表的内容。

关系代数写法:S1∪S2

关系演算写法:{t│S1(t)∨S2(t)}

SQL写法:SELECT * FROM S1 UNION SELECT * FROM S2

通过两个SELECT语句,找出两个表的内容。把一个SELECT语句的结果看作一个集合,结果为两个集合,利用UNION实现两个结果合的合并操作。

表6 S1并S2结果表

功能二、差

VFP中,标准 SQL没有直接提供集合的差运算,但可以用其他方法实现。

例如:查询计算机2班学生表中不是团员的记录。可以通过对计算机2班学生表S2和团员表TY2做差集操作(即所有学生扣掉团员学生)。

关系代数写法:S2-TY2

关系演算写法:{t│S2(t)∧┓TY2(t)}

SQL写法:SELECT * FROM S2 WHERE SN NOT IN (SELECT SN FROM TY2)

先用内层查询查找团员表TY2的学号SN,传给外层查询作为外层条件语句的一个限制值,学生表S2中的SN不在团员表TY2中的记录为最终的结果,实现了差操作。

表7 S2差TY2结果表

功能三、笛卡儿积

例如:对S2和CO两个表做笛卡儿积。

关系代数写法:S2 X CO

关系演算写法:{t— ($u) ($v) (S2 (u) ∧CO (v) ∧t[1]=u[1] ∧ t[2]=u[2] ∧ t[3]=u[3] ∧t[4]= u [4] ∧ t[5]=v[1] ∧ t[6]=v[2] ∧ t[7]=v[3] )}

SQL写法:SELECT SN,SNAME,AGE,SEX,CN,CNAME,TEACHER FROM S2,CO

结果学生表S每条记录和课程表CO的每条记录搭配一次,通过SELECT语句指定两个表的字段在无限制条件的情况下选择到一个新的关系中,实现了笛卡儿积。

表8 S2和CO笛卡儿积结果表

功能四、投影

例如:查找S2表中学生的姓名和年龄。

关系代数写法:Π姓名,年龄(S2)

关系演算写法:{t(2) │(ЭU)S2(U) ∧t[1]=U[2] ∧t(2)=U(3)}

SQL写法:SELECT SNAME,AGE FROM S2

结果显示了学生表S的姓名SANME和年龄AGE两个字段,对关系进行了垂直分解,实现投影操作。

表9 S2投影

功能五、选择

例如:查找S2表中性别为男的学生资料。

关系代数写法:σ性别=“男”(S2)

关系演算写法:{ t|S2(t) ∧t[4]=”男”}

SQL写法:SELECT*FROMS2WHERE SEX=”男”

结果显示出性别SEX为男的记录,得到筛选的结果,对关系进行了水平分解,实现选择操作。

表10 S2选择

功能六、谓词

SQL中,谓词用在嵌套查询语句中,谓词有IN、NOT IN、EXISTS和NOT EXISTS。

例如:通过计算机2班学生表S2和计算机2班团员表TY2,查询计算机2班不是团员的记录。可以用谓词来实现。

谓词检查子查询中是否有结果返回,在团员表TY2中不存在的元组,而在学生表S2中存在的,即为满足条件的结果。

关系演算写法:{ t1t2t3t4∣S2(t1t2t3t4) ∧┓TY2(t1t2t3t4)}

SQL写法:SELECT * FROM S WHERE NOT EXISTS;

(SELECT * FROM TY WHERE S.SN=TY.SN)

表11 谓词操作

6 结束语

SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。但当我们了解SQL怎么做的一些原理,有助于在实现不同层次的查询功能时,思路更清晰,效率更高。

文章阐述了SQL查询功能的三个相关理论知识,以及SQL查询功能如何体现这些理论点。SQL功能强大,还有很多知识需要大家共同探讨。

参考文献:

[1]王利.全国计算机等级考试二级教程—Visual FoxPro程序设计.北京:高等教育出版社,2004.

[2]王春森.系统设计师(高级程序员)教程.北京:清华大学出版社,2002.249-277.

[3]史嘉权.数据库系统基础教程.北京:清华大学出版社,2000.121-145.

[4]萨师煊,王珊.数据库系统概论.北京:高等教育出版社,2000.

[5]耿素云.离散数学(第2版).北京:清华大学出版社.

9.sql常用查询语句 篇九

SQL Server修改标识列方法 如自增列的批量

SQL Server 2005 还原数据库错误解决方法

sql中返回参数的值

SQL Server 日期相关资料详细介绍

SQL Server SQL Agent服务使用教程小结

SQL Server误区30日谈 第2天 DBCC CHECKD

SQL Server利用bcp命令把SQL语句结果生成

SQl 语句(常见)

设置密码保护的SqlServer数据库备份文件与

还原sql server数据库的处理方法

热 点 排 行

SQL Server 2008图文安装教程

SQL Server 2012 安装图解教程(附

sqlserver中distinct的用法(不重

SQL Server导入、导出、备份数据

SQL语句去掉重复记录,获取重复记

SQL Server数据库入门学习总结

SQL Server错误代码大全及解释(

sql convert函数使用小结

sql 时间函数 整理的比较全了

10.sql常用查询语句 篇十

在Oracle10g中用spreport.sql生成statspack文件时,其中的SQL语句只显示了5行,往往显示不完整,有时又需要完整的SQL来进一步分析SQL的性能问题.对具体的SQL的语句进行调优,

查看Oracle10g中的/oracle/oms/102_64/rdbms/admin/spreport.sql语句,该脚本原来是调用了sprepins脚本,而在sprepins脚本中又调用了sprepcon.sql脚本,

在sprepcon.sql脚本中的define num_rows_per_hash=4;//表示每个SQL最多显示4行,如果有些SQL比较长,可以设置成num_rows_per_hash=100;//短的sql,就显示全部的sql。如果长的sql,最多可以显示100行。

11.sql常用查询语句 篇十一

Oracle数据库是甲骨文公司的一款关系数据库管理系统,目前仍在数据库市场上占有主要份额。它一般应用于商业,政府部门,它的功能很强大,能够处理大批量的数据,在网络方面也用的非常多?由于查询操作在SQL语句中代价最大,因此,优质的查询语句可以使应用系统的性能得到大大提高。在进行可能的性能改进的检查时,首先应该检查最有可能导致性能变差的方面,包括编写拙劣的应用SQL语句、大小不合适的SGA内存结构。效率差的SQL语句执行计划。过度的文件I/O。访问数据库资源的紊乱等。因此,数据库系统的性能受到SQL语句的执行效率的影响,通过对有问题的SQL语句进行调整,可以使数据库系统的性能得到显著改善,有助于提高数据库内存区的命中率。减少I/O访问和对网络带宽的占用,探讨基于Oracle数据库的SQL语句优化具有非常重要的意义。

2 SQL语句优化技术

所谓SQL语句优化技术,就是将性能低下的SQL语句转换成目的相同的性能优异的SQL语句。优化SQL语句的传统方法是通过手工重写来对SQL语句进行优化。DBA或资深程序员通过对SQL语句执行计划的分析,依靠自己的实际工作经验,尝试对SQL语句进行重写,然后对结果和性能进行比较,从而试图找到性能较佳的SQL语句。这种传统上的作法无法找出SQL语句的所有可能写法,并且依赖于人的经验,非常耗费时间。

3 SQL语句优化

3.1 Oracle数据库对表的访问

Oracle数据库采用两种访问表中记录的方式:

(1)全表扫描

全表扫描就是对表中每条记录进行顺序的访问。Oracle采用一次读入多个数据块(database block)的方式对全表扫描进行优化。

(2)通过ROWID访问表

为了提高访问表的效率,强烈采用基于ROWID的访问方式情况。ROWID包含了表中记录的物理位置信息。Oracle数据和存放数据的物理位置之间的联系,采用索引进行实现。通常情况下,索引提供了快速访问ROWID的方法,因此那些基于索引列的查询,能够得到性能上的提高。

3.2 SQL语句编写需要满足的规则

根据上面两种Oracle访问表的方式,进行SQL语句的编写时,需要满足以下规则:

(1)尽量使用索引。

(2)选择联合查询的联合次序。在SQL语句的编写中,应该注意首先需要选择要查询的主表,因为主表要扫描整个表数据,所以主表应该数据量最小。

(3)IN或者NOT IN语句在子查询中慎重使用,可以使用(NOT)EXISTS。

(4)慎重使用视图的联合查询,尤其慎重使用比较复杂的视图之间的联合查询。一般来说,将对视图的查询分解为对数据表的直接查询能够取得更好的效果。

(5)可以在参数文件中进行SHARED_POOL_RE-SERVED_SIZE参数的设置,这个参数保留了一个连续的内存空间在SGA共享池中,对于存放大的SQL程序包非常有帮助。

(6)对于某些经常使用的存储过程,可以通过Oracle公司提供的DBMS_SHARED_POOL程序固定在SQL区中而不被换出内存,对于提高最终用户的响应时间是非常有利的。

3.3 实例

(1)通过使用索引进行SQL语句优化

例如,比较下面两条SQL语句:

语句A:SELECT deptno,deptname FROM dept WHERE deptno NOT IN(SELECT deptno FROM student);

语句B:SELECT deptno,deptname FROM dept WHERE NOTEXISTS(SELECT*FROM student WHERE dept.deptno=student.deptno);

通过执行发现,这两条查询语句实现的结果相同,但是在执行语句A时,Oracle会扫描整个student表,而建立在student表上的deptno索引没有使用到,当执行语句B时,由于在子查询中使用了联合查询,Oracle只扫描了student表中的部分数据,并利用了deptno列的索引,因此,语句B的效率比语句A的效率高。

(2)选择最有效率的表名顺序

Oracle的解析器按照从右到左的顺序对FROM子句中的表名进行处理,FROM子句中写在最后的表将最先被处理,当FROM子句中包含多个表时,必须选择记录条数最少的表作为基础表。如果有3个以上的表进行连接查询,那么,就需要选择交叉表作为基础表,交叉表就是被其他表所引用的那个表?

例如:

student表描述了location表和category表的交集?

相对于下列SQL语句更有效率:

4 结语

通过进行SQL语句优化,提高了Oracle数据库系统的性能,明显降低了其系统响应时间,提高了程序运行速度,使系统的顺利运行得到良好的保障。高效SQL语句的编写,决定了Oracle数据库运行性能的高低,因此,在实际的性能管理工作中,应加强Oracle数据库的SQL语句优化。

摘要:简要介绍SQL语句优化技术,并结合具体的事例,探讨了基于Oracle数据库的SQL语句优化。

关键词:Oracle数据库,SQL语句,优化

参考文献

[1]李学强,罗省贤.基于ORACLE系统的数据库性能优化设计[J].通信与广播电视,2006,(04).

[2]巢子杰.Oracle数据库优化探究[J].软件导刊,2010,(02).

[3]聂洪.ORACLE数据库性能的调整[J].梅山科技,2006,(S1).

[4]江骏.Oracle中SQL优化原理分析[J].计算机教育,2009,(10).

[5]邢春晖,郑智星.ORACLE数据库的管理[J].黑龙江科技信息,2010,(08).

[6]韩云波,宋莉.Oracle性能调整技术研究[J].电脑知识与技术,2010,(07).

[7]闫河.运用C#处理Oracle数据库图片[J].电脑编程技巧与维护,2010,(02).

[8]胡朝明,唐华旺.利用Oracle构建图书馆数字资源仓储系统[J].浙江理工大学学报,2010,(01).

[9]白晨星.Oracle商务智能在现代企业信息中的应用[J].中国商贸,2010,(02).

12.sql常用查询语句 篇十二

加一个栏位删去一个栏位改变栏位名称改变栏位的资料种类

以上列出的改变并不是所有可能的改变。ALTER TABLE也可以被用来作其他的改变,例如改变主键定义。

ALTER TABLE的语法如下:

ALTER TABLE “table_name”

[改变方式];

[改变方式] 的详细写法会依我们想要达到的目标而有所不同。再以上列出的改变中,[改变方式] 如下:

加一个栏位: ADD “栏位 1” “栏位 1 资料种类”删去一个栏位: DROP “栏位 1”改变栏位名称: CHANGE “原本栏位名” “新栏位名” “新栏位名资料种类”改变栏位的资料种类: MODIFY “栏位 1” “新资料种类”

以下我们用在CREATE TABLE一页建出的Customer表格来当作例子:

Customer 表格

栏位名称资料种类First_Namechar(50)Last_Namechar(50)Addresschar(50)Citychar(50)Countrychar(25)Birth_Datedatetime

第一,我们要加入一个叫做 “Gender” 的栏位。这可以用以下的指令达成:

ALTER TABLE Customer ADD Gender char(1);

这个指令执行后的表格架构是:

Customer 表格

栏位名称资料种类First_Namechar(50)Last_Namechar(50)Addresschar(50)Citychar(50)Countrychar(25)Birth_DatedatetimeGenderchar(1)

接下来,我们要把 “Address” 栏位改名为 “Addr”,

这可以用以下的指令达成:

ALTER TABLE Customer CHANGE Address Addr char(50);

这个指令执行后的表格架构是:

Customer 表格

栏位名称资料种类First_Namechar(50)Last_Namechar(50)Addrchar(50)Citychar(50)Countrychar(25)Birth_DatedatetimeGenderchar(1)

再来,我们要将 “Addr” 栏位的资料种类改为 char(30)。这可以用以下的指令达成:

ALTER TABLE Customer MODIFY Addr char(30);

这个指令执行后的表格架构是:

Customer 表格

栏位名称资料种类First_Namechar(50)Last_Namechar(50)Addrchar(30)Citychar(50)Countrychar(25)Birth_DatedatetimeGenderchar(1)

最后,我们要删除 “Gender” 栏位。这可以用以下的指令达成:

ALTER TABLE Customer DROP Gender;

这个指令执行后的表格架构是:

Customer 表格

栏位名称资料种类First_Namechar(50)Last_Namechar(50)Addrchar(30)Citychar(50)Countrychar(25)Birth_Datedatetime

13.sql常用查询语句 篇十三

在一个结果组中搜索

子选择的理念很简单:一个选择查询安置在另一个查询内部,创建一个在单一声明搜索中不可用的资源。子选择允许查询的合并,结果组比较的责任落到了数据库中而不是应用软件代码中。

使用这个功能的一个途径是对两个表格中的可比数据专栏中的值进行定位。例如,我的一个数据库有两个表格,Album和Lyric。我可以很容易地通过下面的子查询声明来找到每一个Metallica的歌曲中包含“justice”的歌名:

SELECTsong_nameFROMAlbum

WHEREband_name=‘Metallica’

ANDsong_nameIN

(SELECTsong_nameFROMLyric

WHEREsong_lyricLIKE‘%justice%’);

这个例子是很简单的,我从Album表格中选择了所有Metallica的歌曲,接着,我在lyric表格中选择所有包含“justice”的歌曲,最后,我使用IN关键字来从Lyric表格结果组中显示的Album表格中返回歌曲名称。

我使用Lyric表格结果组来给Album表格中的结果做限定。WHERE子句中的子选择部分是完全自包含的,因此我不需要使用例如Album.song_name和Lyric.song_name等完整的专栏名称。我没有从最终结果组的Lyric表格中返回任何值,如果我需要歌曲的Lyric,我会使用一个JOIN声明。

使用NOTIN排除结果

你可以使用NOTIN关键字来获得明确地不被包含在另一个结果组中的结果。例如,我想要通过下面的代码来返回Metallica在“AndJusticeforAll”专辑中不包含单词“justice”的歌曲:

SELECTsong_nameFROMAlbum

WHEREalbum_name=‘AndJusticeforAll’

ANDband_name=‘Metallica’

ANDsong_nameNOTIN

(SELECTsong_nameFROMLyric

WHEREsong_lyricLIKE‘%justice%’);

在前面的SQL代码中,我选择了Metallica的“AndJusticeforAll,”专辑中的所有歌曲,接着是带有歌词中带有“justice”所有歌曲,最后从在Lyric结果组中没有出现的Album结果组返回了所有歌曲。较之于返回两个查询并使用代码来比较数组,你通过一个单独的声明就可以得到确切的结果。

使用EXISTS来相关结果

有时你可以通过多种途径来访问相同的数据,而且你需要对你的结果进行匹配(或相关)来得到值的交叉区。例如,我可以通过搜索Album表格来得到Metallica的歌曲列表,可是,我也可以从我的Cover表格中得到由Damage,Inc表演的Metallica的歌曲的列表,我可以在两个表格中直接比较查询结果来对值作相关。

SELECTAlbum.song_nameFROMAlbum

WHEREAlbum.band_name=‘Metallica’

ANDEXISTS

(SELECTCover.song_nameFROMCover

WHERECover.band_name=‘Damage,Inc.’

ANDCover.song_name=Album.song_name);

在SQL代码中,我使用完整的专栏名称,这是因为我直接对两个表格作比较,而不仅仅是将结果组作为一个被动资源来使用,

我并不从Cover表格中返回结果。一些数据库支持NOTEXISTS关键字来确保你并没有匹配。

使用合计函数来比较

除了使用子选择在相关的表格中检查数据,你还可以在一个WHERE子选择中使用合计函数来确定主结果组。例如,我想要核实每一个Metallica歌曲在Album表格中的条目。而且,我还想返回缺少歌曲的专辑的名称。很方便地,AlbumInfo表格包含的一个专栏(album_tracks)给出了应该有多少首歌曲方面的信息。

SELECTAlbumInfo.album_nameFROMAlbumInfo

WHEREAlbumInfo.band_name=‘Metallica’

ANDalbum_tracks

(SELECTCOUNT(*)FROMAlbum

WHEREAlbum.album_name=AlbumInfo.album_name);

现在我已经成功地返回了所有Metallica的专辑中,应有的曲目数量与Album表格中实际的歌曲条目数量不符的专辑名称。

返回子选择结果

如果我还是关心每一张专辑的曲目数量并需要得到一个比较报告怎么办?你可以将一个子选择的结果作为最终结果组的一部分来返回。这个功能经常被合计函数所使用。通常地,对其他表格的访问可以作为你的查询的一部分。下一个例子将返回每一张Metallica的专辑,应该包括的曲目数量和在Album表格中包括的条目数量:

SELECTAlbumInfo.album_name,album_tracks,

(SELECTCOUNT(*)FROMAlbum

WHEREAlbum.album_name=AlbumInfo.album_name)

FROMAlbumInfo

WHEREAlbumInfo.band_name=‘Metallica’;

另一个强有力的例子涉及了在AlbumInfo表格中将album_tracks值改变为在Album表格中实际的条目数量:

UPDATEAlbumInfoSETalbum_tracks=

SELECTCOUNT(*)FROMAlbum

WHEREAlbumInfo.album_name=Album.album_name)

WHEREAlbumInfo.band_name=‘Metallica’;

在上两个例子中的子选择声明被看作一个自包含单位来执行。

子选择比较关键字(ALL,SOME,ANY)

除了使用标准查询功能,还有三个关键字可以使你将一个表达式值和一个单栏子选择声明结果组作比较,这些关键字返回TRUE或FALSE的Boolean值。ALL关键字要求子选择中所有值都遵守比较运算符。SOME和ANY关键字则要求至少一对。这里是ALL关键字的一个简单实例。

SELECT*FROMAlbumSales

WHEREalbum_gross>

ALL(SELECTalbum_costsFROMAlbumProduction);

上面的例子将从AlbumSales表格返回在AlbumProduction表格里面付出总额大于成本而生产最昂贵的专辑的所有记录。如果用ANY替代ALL,声明将返回所有付出总额大于最低专辑成本的专辑记录。声明=ANY与IN关键字意义是相同的。声明ALL与NOTIN关键字是对等的。关键字ANY和SOME也是等同的。数据库生产商中对这些关键字的支持情况是不同的,因此在出现问题时要相信查阅生产商方面的资料。

谁对标准化数据结构有疑问?

14.sql常用查询语句 篇十四

近几年,信息泄漏事件频繁发生,用户对数据库的安全性越来越关注。由于数据库本身的复杂性,数据库的管理运行、日常维护和数据安全保护只能由专业的数据库管理员进行。但是,很多使用数据库的人并不熟悉数据库,甚至完全不了解数据库。SQL分析技术能够帮助用户快速抽取SQL语句中的字段、表、视图及对它们的操作,快速识别SQL语句的风险。同时基于SQL分析技术能够将SQL语句翻译成自然语言,使之更容易被理解,有助于实现安全控制。

早期的SQL解析使用Lex,Yacc的比较多。虽然Oracle已经将ANTLR应用在SQL Developer的IDE中,但是SQL Developer并非开源使用。因此使用ANTLR进行SQL解析的研究目前还很少,进行SQL翻译的工作还未见报道。在使用ANTLR解析SQL并且将结果进行进一步分析是一个新的尝试。本文针对数据库安全,基于LL文法,采用ANTLR工具,实现了SQL的词法和语法解析器,并进一步实现了SQL语句到自然语言的翻译。最后,将SQL解析和翻译功能应用在数据库防火墙和安全审计系统中,对于提高数据库的安全防护能力具有很大的实际意义。

1 SQL解析器

1.1 SQL词法解析器实现

SQL语言的词法主要分为标识符、数字、注释与提示、字符串、时间、区间和变量。基于ANTLR实现SQL词法解析首先要定义词法的fragment。所谓的fragment是词的一部分,而不会出现在词法解析的结果中。以数字和时间为例分析。

(1)数字Number。在SQL语言中表示数值类型。数值类型包含整数部分、小数部分、符号部分、指数部分和类型部分,其中指数部分是一个大写字母“E”或者一个小写字母“e”加一个带有符号的整数,如果不带符号默认为“+”。数值类型中,整数部分和小数部分必须包含其中之一,其他部分都是可选的,只包含小数部分时允许“.”出现在数值的最前面,例如“.5”表示“0.5”。数字的DFA表示如图1所示。

(2)时间Datetime。时间格式比较固定,必须由关键字DATE开头,后面是一个表示时间的字符串,如果不是表示时间的字符串,SQL语句认为是错误的语句。另外,时间戳也被认为是一种时间格式,必须是由关键字TIMESTAMP开头,时间戳格式包含AT TIME ZONE可选结构,表示时区。时间的DFA表示如图2所示。

根据这七种类型的自动机表示将其转换成对应的EBNF表示。使用“*”、“+”替换DFA中的循环结构,“*”表示可以跳过的循环结构,“+”表示不可跳过的循环结构。使用“|”表示DFA中的选择结构,在每个分支之间使用“|”表示选择。使用“?”表示DFA中可跳过的结构,将“?”放在可选结构的后面。在每个单元上使用“()”将不可拆分的部分包含在内,就可以使用简单的EBNF语句描述复杂的DFA。另外,对于SQL的保留字要做单独的识别。例如:select要定义成SELECT:S E L E C T;这样select无论是“Select”还是“se LECT”都能识别出来。针对不同的SQL语句它的保留字也是不一样的,需要单独定义语法文件。SQL语言中是不区分大写字母和小写字母的,在ANTLR中单独的字母应该被当作碎片来定义,不能出现在最终的解析结果中,使用“fragment”修饰。字母包含键盘上所有能够输入的符号以及键盘上不能直接输入的UNICODE字符。SQL语言中使用的数字是阿拉伯数字0~9,单独的数字也要使用“fragment”修饰。

1.2 SQL语法解析器实现

语法解析器实现过程中需要将所有的语言模式转化为EBNF描述的规则语句。SQL语言的范式使用的是EBNF描述,要将其转换成EBNF描述的规则。EBNF范式的好坏虽然不会影响到解析的效率,解析效率只与被解析的字符串的长度有关系,但是会影响到解析器生成的效率。坏的EBNF规则会导致生成的过程中出现大量的递归调用和栈操作,生成的时间和内存会成指数级增长。所以EBNF的规则还是有很多细节需要注意。规则的深度不能太深,并且需要或关系的规则尽量将K值控制到最低,因为规则生成的复杂度是(K*N)M。其中,K是向后查看的token数;N是或关系连接的多个规则;M是规则嵌套的层数。由于一个子规则经常被多个规则引用,所以子规则会影响所有引用它的规则的生成效率。降低子规则的层数和减小K值是有效的提高生成效率的方法。N值一般难以降低,除非规则本身就有冗余,但是这种情况比较少见。

使用ANTLR将语法文件编译成解析器,实现过程类似于词法分析。输入由String变成tokens,ANTLR自身的语法不变。使用全部的语法生成语法解析器,在生成过程中系统采用LL(K)分析方法。ANTLR支持预测功能,可以在特定的地方使用预测。设置回溯位置,对输入的tokens进行预测,降低解析时间和消耗的资源。解析的结果可以得到每一个token的属性、内容和值。再对生成的一维AST树做递归下降,将AST树的二维层次结构补全,得到具有层次和附属关系的二维语法树。AST树上的节点对于解析来说并不都是必须的,在生成过程中将不需要的节点删除,留下必须的结果,精简AST树对于快速提取重要信息有很大的帮助。在AST树生成的过程中直接嵌入SQL语句检查代码,同时可以在解析过程中直接根据token的类型判断输入词的意义,从而将SQL中最重要的表、视图、字段直接提取出来,同时判断出SQL的类型和操作对象的类型。更进一步,将SQL中存在的安全隐患的类似缓冲区溢出和SQL注入攻击的风险直接检测出来。

2 SQL翻译

2.1 SQL语句AST的构建

ANTLR语法解析的输出结果就是抽象语法树。将语法解析的结果设置为AST,ANTLR每一个规则解析之后就能生成AST结构。默认情况下生成一维语法树,所有的结果在同一个层次上。如果需要自定义抽象语法树的返回结果,需要在语法解析过程中加入AST构建规则。ANTLR的抽象语法树构建语法非常简单,标准语法只有三种:

(1)“^”,前面的符号作为父节点;

(2)“!”,前面的节点不出现在语法树上;

(3)“⁃>^(……)”,“⁃>”左侧是语法解析语句,右侧是抽象语法树生成语句,括号内是一棵子树,第一个符号是树的根,其他元素是第一个元素的子节点。例如:(A+B)⁃>^(+A B)。

由于SQL语言是结构化的查询语句,在构建抽象语法树上有先天的优势。构建语法树时只需要考虑SQL中查询的主体,忽略不需要的部分,其中最重要的就是表、字段、视图和在表、字段、视图上的操作。查询语句是SQL语句中最复杂的语句,可以使用嵌套和递归的方式,语法结构十分灵活。由于其他语言相比于查询语言简单很多。本节用查询语句举例说明SQL语句抽象语法树生成过程。

查询语句可以包含for update语句,但不是必须包含,for update和查询是平行关系,一个查询只能在最后包含一个for update语句,这里只需要将最后的“;”裁剪掉:

select Statment:subquery(for_update_clause)?(′;′!)?;

子查询可以有嵌套,也可以和其他子查询做交、并、异或操作,最终结果做一次排序:

查询块是最终的查询,包含查询的各个功能模块,模块在结构上是平行的:

2.2 AST转换成自然语言

SQL语句的语言结构更接近英文的语言结构,与中文的语言结构差别较大,简单的对关键字替换不考虑语义是不能达到翻译效果的,只会让结果更加匪夷所思,举例说明:

直接替换翻译结果为:

使用树解析器将抽象语法树转换成自然语言。由于抽象语法树采用递归的方式表示语法结构,在解析的过程中也使用递归的方式,并将语法习惯调整为汉语语言的语法习惯。在转换的过程中补充虚词和连接词,增加语言的连贯性。最后对翻译结果进行格式化,增加缩进便于阅读。考虑汉语的阅读习惯,可以将较长的句子翻译成子句的形式,最后,根据数据库建模表和数据库方法表,可以将翻译结果中的方法名、字段名、表名等翻译成中文,翻译时只要判断出被翻译内容的类型,然后查找相应的数据表,就能将剩下的英文部分翻译成中文,生成最终结果为:

模块1:

查询获取用户方法(user)的执行结果的返回数据

模块2:

从用户表(user)中查询姓名字段(name)的返回数据

条件1:

标识字段(id)等于条件判断方法(if)[转换成ascii编码方法(ascii)[子串方法(substr)[{模块1},1,1]的返回结果]]的返回结果等于1,1,0]的返回结果

条件2:

字串‘admin’在[{模块2}]里

模块3:

从日志表(logs)中查询满足{条件1}条件的日期字段(date)和用户字段(user)和动作字段(action)和姓名字段(name)的返回数据

模块4:

逻辑表[{模块3}]

模块5:

查询方法用户方法(user)执行结果的返回数据

模块6:

连接字符串方法(concat)[{模块5},′⁃⁃′,方法数据(data⁃base)的执行结果]的执行结果

主查询:

从{模块4}中查询满足{条件2}条件的{模块6}和姓名字段(name)的返回数据。

翻译过程中需要调整语序,语序的调整主要使用栈实现,将需要调整语序的句子放入栈中,返回时再从栈中取出。树解析器翻译的过程如下:

(1)当前指针在根节点,获取节点,判断节点类型,类型不一样,Tree Walker进入不同的解析模块,这里以SELECT语句为例;

(2)获取一个子节点,判断节点的类型;

(3)如果是SELECT语句,那么就调用se⁃lect_tree_walker,然后调整语序,执行stack.push操作,将结果先缓存。如果是FROM语句,调用from_tree_walker的结果放入output流中。如果是WHERE语句,调用where_tree_walker,调用stack.pop将SELECT语句出栈,和WHERE语句合并格式,结果放入到output流中;

(4)tree_waker是一个递归的过程,在解析过程中,将查询的条件和子模块生成独立的翻译模块;

(5)tree_waker在执行的过程中遇到需要查询建模表和函数表的情况,将查询的结果输出;

(6)重复步骤(2)~步骤(5)过程,直到input流为空。

Tree Walker对部分叶节点的翻译规则如表1所示。

3 系统实现与效果分析

本系统目前已在数据库审计和防火墙产品有所应用,数据库审计与防火墙引擎设置界面如图3所示。要对数据库进行审计或者建立防火墙,先要添加数据库引擎。审计数据获取方式有很多种,在设置界面进行设置。

规则设置界面部分截图如图4所示。规则可以设置表、字段、SQL类型等,SQL解析中能够获取的所有信息都可以在规则界面上设置。通过对SQL语句进行解析获取语句的类型,然后对不同类型的SQL语句设置不同的规则。

告警设置界面如图5所示。规则匹配上之后设置相应的告警级别,就会产生相应的告警信息。

检索界面如图6所示。可以对审计日志进行检索,获取数据库用户的操作行为。

告警界面如图7所示。SQL语句触发告警规则就会产生告警,在告警界面上可以查看告警细节。

图7中select 1 from db_queue_tables where 1=2,其中条件1=2是常量比较,判定SQL语句可能是SQL注入语句,产生高风险告警。然后通过SQL翻译将SQL语句翻译成对应的中文,select 1 from db_queue_tables where 1=2的翻译结果为“从表dba_queue_tabkes中查询满足条件1=2的值1的返回结果”。

最新流量界面如图8所示。在最新流量界面可以实时显示最新的SQL操作,随时监控SQL操作动态。基于SQL解析和翻译的数据库审计和防火墙产品可以在审计模式对操作进行溯源,起到对不法分子进行震慑的作用。防火墙模式可以通过阻断方式对风险进行控制,从而提升数据库系统的安全性。

4 结论

本文通过分析标准SQL语言的词法规则和语法规则,并基于ANTLR设计并实现了SQL词法解析器和语法解析器;使用SQL词法解析器和语法解析器实现了SQL语句辅助分析功能,实现了SQL语句的词法分析和语法树生成;通过解析语法树提取SQL信息并将SQL语句翻译成自然语言;并将SQL解析和翻译的功能应用在数据库综合审计系统中。SQL解析和翻译模块已经被应用在商业数据库防火墙和安全审计系统中,并且被部署到多个数据中心。系统可以监控数据库的所有活动,阻断危险操作和攻击,从而达到增强数据库安全的目的,为保障数据库及信息系统的安全逐步发挥作用。

本文设计了一种基于反激式直流变换器的动力电池均衡电路,给出了系统建模方法,并在PSIM环境下完了系统仿真电路,针对8种典型非均衡状态进行了全面的仿真实验,最后通过实验证明了系统建模的有效性。由于建模过程忽略了变换器磁阻、磁滞、磁饱和现象,同时简化了电路寄生参数,需要进一步完善。

摘要:信息泄漏事件不断发生使得数据库安全的重要性不断提高。基于SQL解析能够实现SQL到自然语言的翻译,帮助非专业人员分析数据库的访问活动和识别风险。通过SQL词法和语法的EBNF描述构造了可以用于LL的规则输入,使用ANTLR工具生成了SQL词法和语法解析器。进一步,SQL词法和语法解析器实现了SQL语句到抽象语法树的转换。并通过解析抽象语法树,将SQL语句翻译成自然语言。最后,将SQL解析和翻译功能应用在数据库防火墙和安全审计系统中。

关键词:SQL解析,LL解析器,ANTLR,抽象语法树,SQL翻译,数据库安全

参考文献

[1]张博,类艳春,廉小伟.数据库安全漏洞浅析[J].保密科学技术,2012(3):23-25.

[2]刘三献.基于ANTLR的Gaussian词法分析器和语法分析器的分析与设计[D].兰州:兰州大学,2009.

[3]闫红岩.SQL语句分析及数据库安全研究[J].贵阳:贵州大学,2006.

[4]侯智斌,孙彦飞,吕曹芳.基于入侵容忍技术的数据库安全策略研究[J].现代电子技术,2011,34(7):78-80.

[5]PARR T,FISHER K.LL(*):the foundation of the ANTLR parser generator[C]//Proceedings of 32nd ACM SIGPLAN Conference on Programming Language Design and Implementation.[S.l.]:ACM,2011:425-436.

[6]SALOMAA K,YU S.NFA to DFA transformation for finite languages over arbitrary alphabets[C]//Proceedings of 1996 First International Workshop on Implementing Automata.London:Springer,1996:149-158.

[7]LOUDEN K C.Compiler construction:principles and practice[M].New York:Cengage Learning,2000:21-148.

上一篇:测绘档案管理保密制度下一篇:治安巡防大队教育培训计划