sql语言十篇

时间:2023-03-21 09:24:19

sql语言

sql语言篇1

关键词:SQL语言;数据库;教学方法

SQL(Structured Query Language)是关系数据库系统的国际标准查询语言,当前主流的数据库都提供对该语言的支持,它包括数据定义、数据控制、数据操作以及数据查询。SQI语言包含的内容非常丰富,其中查询是数据库最重要的操作,SQL语言的SELECT语句为查询提供了灵活而全面的支持。VFP数据库课程是安康学院文科专业学生开设的一门计算机公共课,SOL语言是该课程的一个重点和难点,采用什么样的教学方法,使学生在较短的时间内对SQL语言能够全面地了解和掌握,提高学生的数据库应用能力,是广大计算机教育工作者所共同关心的问题。

1SQL语言教学中存在的问题

1.1学生缺乏学习兴趣

SQL语言的教学内容一般都先讲解概念、语法,然后通过一个简单的实例进行验证,而真正能提高学生学习兴趣的实例很少,导致学生缺乏学习兴趣,影响课堂教学质量。

1.2不能写出完整的SQL命令

非计算机专业的学生从开始接触到计算机操作时,主要使用的是图形界面的操作方式,对于使用命令的操作方式非常生疏,学习起来非常困难。学生反映,能够分析出SQL命令的功能,但很难写出完整的SOL命令。

1.3不能用SOL语言实现分组统计功能

分组统计查询是SOL语言中的一个难点,分组查询通常和统计函数一起使用,学生反映不知道用哪些函数以及如何确定分组依据。

1.4多表查询以及嵌套查询掌握的较差

在教学过程中,学生反映,单表查询相对容易,多表查询涉及多个联接条件,嵌套查询涉及主查询和子查询以及关键字(in,any,all等)的选择,学生很难写出完整的命令。

2 SQL语言教学方法研究

2.1改变教学内容顺序,提高学生学习兴趣

通过实例讲解SOL语言的具体功能。

例1:查询本班学生的全部信息。

SQI命令:select*from学生表

通过该实例讲解sQL语言每一部分的语句功能,如select表示查询,星号(*)表示显示所有列,from短语后跟表名。可以让学生思考:查询课程的全部信息、查询班级的全部信息,这些命令如何写。接着可以引出条件查询(where子句)、分组查询(group by子句)、排序查询(order by子句)等。

实例的选择最好是学生熟悉的数据,如本班的学生、学生所学习的课程、学生的学习成绩等。为了进一步提高学生的学习兴趣,还可以举例说明日常生活中用到的数据库的例子,如火车订票系统、超市管理系统、银行管理系统等,让学生明白数据库和自己的生活息息相关,数据库是一门技能,要学好这门技能,必须学好SQL语言,使学生对SQL语言的学习产生兴趣,进而提高课堂教学效果。

2.2可视化的SQL语言对比教学方法

SQI培言主要是由命令及参数组成,掌握不好命令及参数的使用就不能正确执行查询,得到结果。针对学生不能写出完整的SQL命令的问题,可以采用可视化的SQI语言对比教学方法,通过实例说明该方法的具体使用过程。

教学管理数据库包含如下4张表:

学生表(学号、姓名、性别、专业编号、出生日期、奖学金、备注)

课程表(课程号、课程名、课时、学分、必修)

专业表(专业编号、专业名称)

成绩表(学号、课程号、成绩)

例2:查找平均分是前3名的女生的学号、姓名、专业名称、年龄和平均分。

(1)打开Microsoft Visual FoxPr06.0,选择新建查询。

(2)在查询设计器中添加查询需要的数据表:学生表、专业表和成绩表,并设置添加显示字段,函数的添加要在“函数和表达式”文本框处输入,然后点击添加,如图1所示。

(3)设置2张表的连接条件,学生表和专业表通过专业编号联接,学生表和成绩表通过学号联接。

(4)设置筛选条件为:学生表.性别=t.。

(5)设置排序依据,按平均分的降序排序。

(6)设置分组依据,按学号分组。

(7)设置杂项,无重复记录与命令关键字distinct对应,记录个数与top n关键字对应。

该查询命令比较复杂,涉及多表查询、分组统it.排序、条件查询等操作,学生很难写出完整的命令,通过查询设计器这种可视化的方式进行对比教学,学生操作的每一步都可以查看到对应的SQI培句,可以加强学生对SQI语句的掌握,整个操作过程很直观,学生很容易地掌握了SQL语言中各种参数的正确使用。

2.3 SOL分组查询

针对学生反映的分组查询问题,在教学过程中应注意以下几点:

(1)SQL统计函数。SQL统计函数包括:count,sum,avg,max,min这5个基本函数,要让学生明白每个函数的具体功能,在实践过程中,学生有时候把count函数和sum函数弄混,在教学过程中应该强调二者的区别,count用来计数,sum用来给数值数据求和。

(2)分析分组的依据。例如求男女生的平均年龄,应该按性别分组;求每个学生的平均成绩,应该按学号分组;求每门课程的平均成绩应该按课程号分组等。由浅入深,让学生掌握如何确定分组依据。

(3)通过实践加强学生对所学知识的理解和掌握。例3:统计男女生人数。

命令:select性别,count(*) as人数

from学生表

group by性别

让学生实践操作:统计男女生入学成绩的平均分,统计不同专业学生的平均年龄等操作。

2.4多表查询和嵌套查询

2.4.1多表查询

首先要分析的是查询中最少需要的数据表,而不是把所有表都写进查询,这样就会影响查询效率。其次,要分析多表查询中的连接条件,例如学生表和专业表通过专业编号连接,课程表和成绩表通过课程号连接等。最后,需要提醒学生多表中具有的相同字段在显示时必须写上表的别名或表名。

2.4.2嵌套查询

从简单的实例出发:例如查询所有选课的学生信息,应该就是查询那些学号在成绩表中的所有学生信息,查询命令为:

select*from学生表

where学号in(select学号from成绩表)

让学生思考:查询被学生选修的课程信息,应该如何写,使学生对所学知识融会贯通,提高学生的数据库应用能力。

sql语言篇2

【关键词】SQL语言;教学信息系统;选课数据维护

学分制作为我国高等院校近年已普遍实行的一种教学管理制度,教学信息系统是一套具有先进教学理念的,涉及到高校教务管理各个环节、面向学校各部门的多模块的综合教学信息管理系统。高校教学信息系统作为校园数字化建设的重要应用组成部分,是高校学分制管理的重要技术支持,结构化查询语言作为关系数据库的标准语言在教学系统的选课数据维护领域发挥着极其重要的作用。

一、教学信息系统支持学分制选课

完全学分制是一种以学分为计量单位衡量学生学业完成状况的教学管理制度。在导师的指导下,由学生自己选择专业的发展方向,自己安排每学年的学习计划,自己决定毕业时间,在许可的年限内,学生修满规定的学分即可毕业。完全学分制作为我国高等院校近年已普遍实行的一种教学管理制度,是以尊重学生的个体差异为基础的。学生可以在一定程度上自主构建和完善知识、能力结构,并能结合自身情况及时调整学习计划,有利于学生的全面发展。

我们知道学分制的施行需要有一个良好的基础,这个基础不仅包括学院的良好制度基础,更应包括我们教学信息系统的平台技术保证。高校教务系统是一套具有先进教学理念的,涉及到教务管理各个环节、面向学习各部门以及各层次用户的多模块的综合教学信息管理系统。经过几年的应用已经在学校的教务管理工作中发挥了不可替代的作用,现在已经成为学校的核心应用系统之一。特别是系统中的选课模块,是对学校学分制实施的有力支持和信息化保证。

二、结构化查询语言概述

结构化查询语言(Structured Query Language)简称SQL,是一种介于关系代数与关系演算之间的结构化查询语言,其功能并不仅仅是查询,而是一个通用的、功能极强的关系数据库语言和程序设计语言。

SQL语言是1974年由Boyce和Chamber-lin提出的。由于它功能丰富,语言简捷倍受用户及计算机工业界欢迎,被众多计算机公司和软件公司所采用。经各公司的不断修改、扩充和完善,最终发展成为关系数据库的标准语言。

1986年10月美国国家标准局(American National Standard Institute,简称ANSI)的数据库委员会X3H2批准了SQL作为关系数据库语言的美国标准。同年公布了SQL标准文本(简称SQL-86)。1987年国际标准化组织(简称ISO)也通过了这一标准。此后ANSI不断修改和完善SQL标准,并于1989年公布了SQL-89标准,1992年又公布了SQL-92标准。目前ISO也已经公布了最新的标准也就是SQL200n,有很多学者都在做这方面的研究。

SQL是高级的非过程化编程语言,是沟通数据库服务器和客户端的重要工具,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以,具有完全不同底层结构的不同数据库系统,可以使用相同的SQL语言作为数据输入与管理的接口。它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使它具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的功能只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。

SQL语言集数据查询(Data Query)、数据操纵(Data Manipulation)、数据定义(Data Definition)和数据控制(Data Control)功能于一体。也就是说,使用SQL语言可从数据库中取回数据,可在数据库中插入新的记录,可更新数据库中的数据,也可从数据库删除记录,还可创建新数据库并数据库中创建新表,创建存储过程,创建视图,并同时设置表、存储过程和视图的权限。具体说来SQL语言的主要特点包括:

(1)综合统一

(2)高度非过程化

(3)面向集合的操作方式

(4)以同一种语法结构提供两种使用方式

总结起来,SQL语言包括三种主要程序设计语言类别的语句:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL),它们是:

(1)数据定义语言(Data Definition Language(DDL),用来建立数据库、数据对象和定义其列。定义:definition/例如:CREATE、DROP、ALTER等语句。

(2)数据操作语言Data Manipulation Language(DML),用来插入、修改、删除、查询,可以修改数据库中的数据。操作:make/ 例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句、SELECT(查询)。

(3)数据控制语言Data Controlling Language(DCL),用来控制数据库组件的存取允许、存取权限等。控制:control/例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。

三、使用SQL语言解决工作中实际问题

通过几年的工作实践,我们逐渐意识到在选课模块的应用和维护工作中的一个重点内容就是如何维护好学生的选课数据,整体来说维护的工作分为三个部分,那就是选课前数据准备,选课中的流程和数据控制,以及选课后的数据维护工作。因此,在以上知识的基础上结合选课工作中遇到的实际情况,笔者总结了几条使用SQL语言解决选课数据维护的问题。

1.去掉预置选课数据操作步中的重复数据

由于选课数据来源于前期的数据准备的结果,因此这里面既包括已有的教学计划等基础数据,也包括在排课模块时操作得到的课程安排数据,部分系统操作人员在做排课的任务时发生了错误,导致了系统管理员在选课流程控制中的预置选课数据操作步时不能保存结果而不得不中断,经分析是教务信息人员在做排课任务数据时对同一个班级的同一门课程多做了一次课堂数据,从而导致在pk_kkbjb和xk_kkbjb这两张表中都出现了数据重复的现象。此时使用SQL语言针对相关数据表即可解决问题。

2.针对所有选课数据进行核对

前面提到,选课模块中的选课数据即是学生选修课程的数据表现,也是后续学生成绩数据的直接来源,所以在系统中要想进行后续的成绩录入工作就必须把选课数据准备好。通常我们会在选课工作全部完成后做一个选课数据的校验工作,以确保这部分数据的准确可靠。

总之,本文中总结出的这些SQL语句只是目前在工作中发现的一些比较成熟的能够解决学校教学系统中选课数据问题的语句,还有很多问题有待我们的发现和解决。

参考文献

sql语言篇3

GKD-BASE数据库是一个具有自主知识产权的数据库管理系统,具有兼容SQL89标准的SQL引擎,能够为用户提供一个统一、有效的数据库访问接口,实现对数据库的各种操作。但是SQL语言缺乏对算法的描述能力,难以胜任复杂的程序设计。为了融合SQL语言强大的集合数据处理能力和第三代语言(3GL)灵活的过程处理能力,主流数据库管理系统产品都已提供了对过程式SQL语言的支持,如Oracle的PL/SQL[1]。为了使GKD-BASE适应发展现状,满足管理人员和开发人员的需求,急需开发GKD-BASE自身的PL/SQL引擎。

本文在数据库管理系统GKD-BASE上设计并实现了兼容Oracle PL/SQL V2.3语言规范的PL/SOL引擎,扩展了GKD-BASE过程处理功能。

1 GKD-BASE PL/SQL引擎的体系结构

GKD-BASE PL/SQL引擎的基本功能是将用户用PL/SQL语言编写的程序通过词法分析程序、语法分析程序进行解析,生成中间代码并解释执行。如果在分析阶段或解释执行阶段发现错误,则向用户报告错误号及相应的错误信息,以便用户排错[2]。根据PL/SQL语言兼有过程式语句和SQL语句的特点,采取分治策略,把过程语句和SQL语句分开处理。PL/SQL引擎在对PL/SQL源程序编译执行时,首先进行预处理,把SQL语句和过程语句分开;然后对SQL语句和过程语句分别解析,生成语法树;最后通过执行模块对中间代码进行解释执行。

图1

    GKD-BASE PL/SQL引擎对源程序编译生成中间代码,不能直接在目标机器上执行,需要一个解释中间代码的环境,以提供对PL/SQL语言中的数据类型的支持,保证PL/SQL正确执行。因此GKD-BASE PL/SQL引擎可分为编译器和解释器两部分,如图1。编译器接收到PL/SQL语句块后进行预处理,将句子分为SQL语句和过程语句。对于SQL语句,编译器建立SQL语句节点,进行相应的变量绑定和语法检查;检查无误后产生中间代码。对于过程语句,编译器对语句成分进行语法分析并建立相应的符号表,也生成中间代码。因此,可以把编译器划分为SQL语言解析、过程语言解析、符号表生成与管理、中间代码表示与管理等模块。解释器的作用是对编译器生成的中间代码进行解释执行[3],与编译器对应,具有独立的SQL语句解释模块和过程语句解释模块。解释器还包括执行状态堆栈的管理、与GKD-BASESQL引擎的调用接口。异常处理模块主要实现程序运行时的错误检查和报告,并支持用户自定义异常和预定义异常的检查和处理。

2 GKD-BASE PL/SQL编译器实现中的一些关键问题

GKD-BASE PL/SQL编译器主要是对PL/SQL源程序进行词法分析、语法分析和语义处理[4]。本文借助构建词法分析器的Lex和编译程序自动产生工具Yacc[5],实现了对PL/SQL源程序的编译。下面分别说明符号表的设计与管理、SQL语句解析以及游标解析。

2.1 符号表的设计与管理

符号表是一个包含程序中的变量、自定义类型和函数信息的数据库。通过索引对应于库中的一条记录;每条记录对应着一个对象的信息,如变量的类型或函数的返回值等[2]。

考虑到PL/SQL语言的块结构和名字作用域,可以使用名字堆栈存放源程序中所使用的标志符的索引、名字和类型。每个项目只包括名字本身和用来表明它的类型的标志值,以及该名字在符号表中的项目索引。名字堆栈采用层次结构,是链表型的堆栈,堆栈的每一层存放了解析的语句块嵌套层内的所有名字信息,如图2。在进入或退出一个嵌套层时调用相应的压栈和弹栈操作;查找符号时,从栈顶向栈底搜索。名字堆栈实现了标志符名称与相应的符号表索引间的映射,解决了标志符的作用域问题和可见性问题,满足了对符号表管理和调用的要求。

    2.2 SQL语句的解析

为了避免SQL语句在执行时出现语法错误,需要提前检查其语法的正确性。SQL语句是面向集合的数据操作语言,只能交由SQL引擎处理。但是PL/SQL语言为了增强SQL语句与过程式语句的交互能力,在SQL语句中引入变量,GKD-BASE的SQL引擎无法识别,必须在提交之前提取出变量,替换为SQL引擎可以识别的格式。如:SELECT empno,name INTO v_empno, v_name FROM empWHERE birthday=v_date;

这个SELECT语句首先把变量v_date绑定到列名birthday,然后根据条件查出相应的结果 (empno,name),并赋值给预先定义的变量(v_empno,v_name)。对于GKD-BASE的SQL引擎来说,只能识别出如下格式的SELECT语句:

SELECT empno,name INTO:v_empno,:v_nameFROM emp WHERE birthday=:1;

在把SQL语句交由GKD-BASE SQL引擎处理之前,识别出变量v_empno、v_name及v_date进行格式转换,在into之后的变量前面添加“:”,where后面的变量用带有冒号的数字序号代替,构造出符合SQL引擎要求的语句;完成这些处理之后,把新的语句作为字符串交由SQL引擎进行语法分析,检查这条语句的语法是否正确,以及语句中的变量与对应的列是否匹配;最后返回结果,报错或者生成语法树。

2.3 游标的解析

游标是指向内存中上下文区的句柄或指针。借助于游标,PL/SQL程序可以控制上下文区和语句处理过程中游标的变化。PL/SQL游标按使用方式可以分为显式游标和隐式游标。

显式游标的使用包括声明游标、打开游标、游标检索、关闭游标四个步骤。编译游标声明语句时,首先调用SQL引擎分析SQL语句成分,转换为SQL引擎可以识别的格式,把游标的索引信息加入名字堆栈和符号表中。游标打开操作在名字堆栈中搜索游标名字,获取声明阶段在符号表保存的相关信息并加入到语法树中。游标检索语句的编译首先获取游标的符号表的信息;然后关联游标中SQL语句的信息和取值变量链表的信息,检查游标变量与游标引用列是否匹配;最后保存相关信息,加入语法树。游标的关闭操作释放资源并把游标状态初始化,把游标在符号表中的信息保存并加入语法树。

隐式游标一般用于对DML语句的处理。每条DML语句对应于一个隐式游标,编译时可以作为一般的SQL语句来处理,直接调用GKD-BASE的SQL引擎对其进行编译。这些语句的游标处理是由SQL引擎自动完成的,不需要PL/SQL引擎对干涉。

图3

3 GKD-BASE PL/SQL解释器实现中的一些关键问题

解释器实现中的关键问题有语句的执行、执行状态堆栈的设计以及返回值的处理。

对于语句的执行,可分为SQL语句执行和过程语句执行两部分,根据语法树上相应节点分别编写函数来完成解释任务。这些函数例程之间也是树状的层次调用结构,树根的解释执行依赖于其子树上各个节点的解释函数的成功运行。

sql语言篇4

【关键词】C语言;数据库;应用;SQL语言

C语言的普遍性特点是它最突出的一个特点,C语言可以普遍的适用在多种机型上,也可以适用在像DOC、Windows、Unix等等多种多样的操作系统,C语言结合了高级语言的基本语句以及结构,能够直接的对计算机最基本的地址、位以及工作单元的字节进行直接的操作,很灵活方便。本文就此介绍了C语言在数据库中的应用从而来体现C语言的特点。

一、C语言的程序设计

1.基本的要求

(1)能够运用结构化的程序设计方法对程序进行编写。

(2)掌握常用的算法和基本的数据结构。

(3)能够熟练的运用C语言处理数据。

2.C语言的结构

(1)mian函数以及程序的构成,其他函数。

(2)要有头文件、数据的说明、函数开始和结束的标志。

(3)对于源程序书写格式的规范。

(4)C语言的使用风格。

3.数据的类型及其运算

(1)数据的类型和他们使用的方法,数据的类型包括:基本类型、指针类型、构造类型和空类型。

(2)运算的优先级,运算符的种类以及结合性。

(3)不同的数据类型间的运算与转换。

(4)表达式的类型以及他们进行求值的规则,表达式的类型有:算术表达式、赋值表达式、关系表达式、条件表达式、逻辑表达式和逗号表达式。

4.C语言中用到的基本语句

(1)空语句、表达式语句和复合语句。

(2)对数据进行输入和输出,对输入函数和输出函数的调用。

(3)复合语句的使用。

(4)语句标点以及go to语句的使用。

5.对选择结构的程序设计

(1)选择结构的实现可以运用if语句。

(2)用switch语句可以实现多分支的选择结构。

(3)对选择结构进行嵌套。

6.对循环结构的程序设计

(1)利用for循环语句结构。

(2)do while和while循环语句结构的应用。

(3)break和continue语句的使用。

(4)循环语句的嵌套。

二、C语言在数据库中的应用

1.利用C语言对数据库文件进行读取

在数据库的管理系统中,DBF文件的存储是由文件的结构说明部分的文件头和数据的记录体两个部分所组成的,结构说明的部分主要包括具有固定的存储长度数据库的说明部分和不确定的存储长度字段的说明部分。数据库的说明部分进行存储时的长度为32个字节,那么其中在00H处所存放的标志是数据库,04H-07H处所存放的是用于记录数据库的数据;在08H-09H处所存放的是数据库文件头的长度,用这个数除以32后再减1就会得到数据的新的字段数;在0A-0B处所存放的是所记录数据的长度。在数据库的说明部分后所存储的就是数据字段的说明部分,并且每个字段的长度为32个字节,总的长度是用字段数乘以32个字节的字数。用“0DH”作为文件结构说明部分的结束标志,那么紧接其后所存储的便是数据库的记录,各个记录都是按照他们的物理顺序进行存放的,记录的中间要用20H分隔,而内容要以ASCII的方式进行存放,每个记录的第一个字节都是逻辑删除的标志位,例如字节的内容为2AH,那么则表示这个记录已经被使用,用DELETE命令再进行逻辑的删除,正常就为20H,数据库的文件要以1AH作为结束的标志。

2.利用C语言进行数据库信息的加密

数据库的文件主要是由文件头和记录体所组成的,因为文件头是以0DH为结束标志,它总的长度是不会超过4130个字节的。而管理数据库要根据文件头的信息进行管理,因此,一旦改变对文件头的信息进行更改,那么整个数据库就不能使用了。对数据库进行加密的方法是要对文件头的每个定常数或者是字节数,用“破坏”文件头的信息的方法从而达到对数据库信息进行加密的作用,要想解密就要利用二次还原的性质或者利用异或运算加密后的文件再进行同样的操作便可。

三、C语言中SQL语句的介绍

1.嵌入式的SQL语句

嵌入式的SQL语句是指在数据库的应用程序中嵌入了的SQL语句。该程序称为主程序或者叫做宿主程序,用于书写该程序的语言称之为主语言或者是宿主语言。嵌入式的SQL语句主要包括两种类型,即说明性的SQL语句和执行性的SQL语句。

说明性的SQL语句是用来说明SQL语句中所用到的变量和通信区域的,说明性的SQL语句不会对通信区产生影响,也不生成所执行的代码。

执行性的SQL语句可以用来定义、连接、操纵和查询数据库中的所有数据,真正的实现对数据库的操作,操作完成后,将执行的信息存放在通信区域内。

2.静态的SQL语句

静态的SQL语句是在进行编译时确定好了所引用的列表。宿主变量不能改变列和表的信息。但是可以使用主变量来改变所查询的参数值,强调一点是不能用主变量来代替列名和表名。

3.动态的SQL语句

动态的SQL语句是在程序运行时提供SQL的表和列,而不是在程序进行编译时提供。然后将SQL语句的文本传递给DBMS进行执行。静态的SQL语句在编译的时候已经生成了执行的计划,但是动态的SQL语句只有在程序进行执行时才生成执行的计划。

四、总结

在各种各样的软件开发领域及科研领域,我们运用C语言可以进行嵌入式的开发软件同时还可以编写动画。一般的高级语言的语法要求都非常严格,以至于出现的语法错误都能被查出,但是C语言在语法的限制上却没有那么严格,所以进行程序编写时我们要善于运用C语言。通过以上对C语言在数据库中的应用,我们就可全面的了解了C语言这门网络技术语言的优点及其它在数据库中的重要作用。

参考文献:

[1]郑海洋,张晋军.C语言在数据库中的应用[J].固原师专学报,1998(3).

sql语言篇5

关键词 SQL语句优化 绑定变量 物化视图

中图分类号:TP312 文献标识码:A

SQL语言由IBM实验室的Donald Chamberlin及其同事在1974年定义,被称为结构化查询语言(Structured Query Language),现在SQL语言已经形成了标准的应用和开发体系。

1 SQL语句的使用

虽然很多数据库都对SQL语句进行了再开发和扩展,但是包括SELECT, INSERT, UPDATE, DELETE以及MERGE在内的标准的SQL命令仍然可以被用来完成几乎所有的数据库操作。

SELECT查询语句用来从一个或多个表中或者其他数据库对象中提取数据。SELECT 查询的一般格式是

5 select {[distinct|all] columns | *}

1 from {tables | views | other select}

2 where conditions

3 group by columns

4 having conditions

6 order by columns;

其中,每行代码前的数字表示了SELECT语句在ORACLE执行顺序。在执行查询语句时是由ORACLE的基于成本的优化器(cost-based optimizer,CBO)来负责编译的,因此SELECT查询语句的执行顺序和我们的逻辑思维有所不同。从执行顺序可以直观的看出,减少FROM语句涉及到的数据源数量,可以大幅减少数据访问量,增加SELECT查询语句的执行速度。

2 硬解析与软解析

为了不重复解析相同的语句,在每一次执行SQL语句前ORACLE会去检查内存中是不是存在相同的语句。在第一次解析SQL语句之后,ORACLE将SQL语句存放在系统全局内存区域SGA中。因此,当用户执行一个SQL语句时,如果它和之前执行过得语句完全相同,ORACLE会将取回之前的解析信息并重用,这种解析类型被称为软解析。相反的,如果之前没有执行过完全相同的语句,ORACLE会将它解析执行并把解析信息存入SGA中便于以后重用,这种解析类型被称为硬解析。不难看出,当数据块在内存中缓存时的访问速度要大于通过OS获取数据块的访问速度。

3 绑定变量的使用

一个硬解析不仅仅耗费大量的系统资源,更重要的是会占据重要的们闩(latch)资源。当一个SQL语句提交后,ORACLE会首先检查一下共享缓冲池(shared pool)里有没有与之完全相同的语句,如果有的话只须执行软解析即可,否则就得进行硬解析。有以下两条SQL语句:

SQL>select * from emp where deptno=10;

SQL>SELECT * FROM EMP WHERE DEPTNO=10;

这两条语句返回的结果集是完全相同的,也就是说对于用户来说这两条语句执行结果是相同的。现在来对v$sql表1进行查询。

从返回的结果可以发现,尽管这两条语句的结果是相同的,但是ORACLE认为它们是不同的。这是由于在执行SQL语句时,ORACLE首先将该语句字符的散列值作为它存放在SGA中的主键。当执行其他语句时,ORACLE会将执行语句的散列值与内存中现有的散列值一一比较。在执行字符转换散列值时,大写字母与小写字母产生的散列值是不同的。当使用绑定变量时,即使用户改变了绑定变量的值,ORACLE还是可以共享这个语句。

参考文献

sql语言篇6

关键词:SQL Injection;数据库;Web应用系统

中图分类号:TP393文献标识码:A 文章编号:1009-3044(2008)30-0557-02

Use Programming Method to Prevent SQL Injection Attacks

WANG Li-hai,FANG Mao-wu

(Network Information Center,Yangtze River Water Resources Committee Hydrographic Bureau,Wuhan 430010,China)

Abstract: This article first introduced SQL Injection attacks,and gave some analyses of the SQL Injection attacks with examples.The article also showed the programming method to prevent SQL Injection attacks,and gave a brief introduction of some necessary measures to prevent SQL Injection attacks.

Key words: SQL Injection;database;web application system

1 引言

随着Internet技术的发展,Web应用系统被广泛应用到各行各业。Web应用系统在方便传播信息的同时,也越来越容易受到攻击, SQL Injection 攻击是威胁最大、最普遍的Web攻击手段之一。攻击者使用SQL Injection 方式通过网页对网站数据库进行攻击,可实现对数据库的增删改,甚至在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限,利用获得的管理员权限可任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,给Web应用系统和Web应用系统用户都带来巨大危害。本文意在透过分析SQL Injection攻击本质,用编程方法防范SQL Injection攻击。

2 SQL Injection攻击介绍

目前没有对SQL注入技术的标准定义,微软中国技术中心从2个方面进行了描述[1]:

1) 脚本注入式的攻击

2) 恶意用户输入用来影响被执行的SQL脚本

Stephen Kost给出了这种攻击形式的另一个特征[2],“从一个数据库获得未经授权的访问和直接检索”,SQL注入攻击就其本质而言,它利用的工具是SQL的语法,针对的是应用程序开发者编程过程中的漏洞,“当攻击者能够操作数据,往应用程序中插入一些SQL语句时,SQL注入攻击就发生了” 。实际上,SQL Injection攻击的是SQL语法。当Web应用系统开发者对SQL语句的严密性疏忽时,攻击者可以通过推敲Web应用系统中SQL语句的构造,并据此构造一些畸形的输入请求,攻击者能够操作这种请求语句进而去获取预先未知的结果。理论上说,对于所有基于 SQL 语言标准的数据库软件包括SQL Server,Oracle,MySQL, DB2,Informix等以及与之连接的Web应用程序包括基于ASP,JSP,PHP等语言开发的Web应用都是有效的。

3 实例分析SQL Injection攻击本质

以下我们结合实例分析SQL Injection攻击的本质。

在Web应用系统中最基础的操作就是SELECT 查询操作,而进行查询的两种方式为Get和Post,一般的SELECT 语句为:

SQL = “SELECT WHAT FROM WHICHTABLE WHERE CONDITION”

SQL Injection攻击也就是从这里开始。

3.1 Web应用系统为Get查询方式下的攻击

当查询一个人的用户信息时,正常查询地址是

localhost/showinfo.asp?personid=1,

查询语句为:SQL = “SELEC PERSONINFO FROM PERSONTABLE WHERE PERSONID =” + Request.QueryString(“PERSONID”)。

攻击者输入访问地址为

localhost/showinfo.asp?personid=1’

localhost/showinfo.asp?personid=1+2

……

通过页面返回的信息,判断存在SQL injection漏洞;通过构造畸形输入提交SQL判断数据库连接用户是否具有sysadmin权限,

SQL = “SELEC PERSONINFO FROM PERSONTABLE WHERE PERSONID = 1 And Cast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00) as varchar(1)) = 1 ”

然后构造畸形SQL向数据库中插入数据,如:

SQL = “SELEC PERSONINFO FROM PERSONTABLE WHERE PERSONID = 1;dEcLaRe @t vArChAr(255),@c vArChAr(255) dEcLaRe tAbLe_cursoR cUrSoR FoR sElEcT a.nAmE,b.nAmE FrOm sYsObJeCtS a,sYsCoLuMnS b wHeRe a.iD=b.iD AnD a.xTyPe='u' AnD (b.xTyPe=99 oR b.xTyPe=35 oR b.xTyPe=231 oR b.xTyPe=167) oPeN tAbLe_cursoR fEtCh next FrOm tAbLe_cursoR iNtO @t,@c while(@@fEtCh_status=0) bEgIn exec('UpDaTe ['+@t+'] sEt ['+@c+']=rtrim(convert(vArChAr,['+@c+']))+''</title><script src=xxx/virus.js></script>''') fEtCh next FrOm tAbLe_cursoR iNtO @t,@c eNd cLoSe tAbLe_cursoR dEAlLoCaTe tAbLe_cursoR ”

如果系统存在SQL注入,上面的代码将会被执行,通过游标遍历数据库中的所有表和列,并实现向数据库列中插入代码:

</title><script src=xxx/virus.js></script>

只要Web业务系统从数据库中读取带有此代码的列,便会出现错误,也就是会从xxx网站中读取virus.js文件,用户访问此页面时就有可能中毒,造成巨大危害。

3.2 Web应用系统为Post查询方式下的攻击

Post查询下的攻击与Get查询下的攻击不尽相同,Web应用系统一般会对Post数据进行校验,因此攻击者往往会根据正常页面的结构构造Post表单,从而避开校验。避开校验后,进行攻击的步骤与Get查询下的攻击相同。

SQL Injection攻击的步骤可归纳为:

1) 针对Web应用的参数,使用特殊字符发送请求,使得在服务器端的SQL语句变成畸形SQL语句,然后利用服务器响应判断漏洞的存在;

2) 继续通过服务器响应确定SQL Injection攻击点

3) 根据所确定的SQL Injection攻击点的特征,构造具有攻击性质的畸形请求,如对数据库增删改,甚至增加数据库用户等。

因此,SQL Injection攻击的本质就是攻击者构造畸形的输入请求,进而获取Web应用系统预先未知的结果,实现攻击目的。

针对SQL Injection攻击的防御,目前被提出的方案有:

1) 在服务端正式处理之前对提交数据的合法性进行检查;

2) 封装客户端提交信息;

3) 替换或删除敏感字符/字符串;

4) 屏蔽出错信息。

其中方案(1)被公认是最根本的解决方案,在确认客户端的输入合法之前,服务端拒绝进行关键性的处理操作,不过这需要开发者能够以一种安全的方式来构建网络应用程序。“在服务端正式处理之前对提交数据的合法性进行检查”可在客户端和服务端进行两级检查,只要任一级检查没有通过,提交的信息就不会进入query语句,不会构成攻击。在客户端和服务端进行合法性检查的函数基本相同。客户端检查的主要 作用是减少网络流量,降低服务器负荷,将一般误操作、低等级攻击与高等级攻击行为区分开来。技术上,客户端的检查是有可能被有经验的攻击者绕开的,在这种情形下,提交的数据被直接发往服务端,通过在服务器端设定二级检查就显得十分必要[3]。

4 用编程的方法防范SQL Injection 攻击

根据上节分析可知,在客户端和服务器端对提交数据的合法性进行检查可有效防止SQL Injection注入。将SQL Injection攻击所用到的命令定义为非法字符,提交的数据包含非法字符时则限制发往服务器端执行。SQL Injection攻击的关键命令:'、;、and、(、)、exec、insert、select、delete、update、count、*、%、chr、mid、truncate、char、declare等。

1) 客户端:对于Post查询方式的应用,可用js、Action等方式限制用户输入非法字符,使得非法字符无法从正常通道送达服务器端。

2) 服务器端:对于Get查询方式的应用及高级攻击,只能在服务器端进行检查。

根据Get、Post两种查询方式的特点可如下编程(以ASP为例)检查:

Get查询方式:

Function SQLInjectForGet

Dim strTemp

If LCase(Request.ServerVariables("HTTPS")) = "off" Then

strTemp = ""

Else

strTemp = ""

End If

strTemp = strTemp & Request.ServerVariables("SERVER_NAME")

If Request.ServerVariables("SERVER_PORT")<>80 Then strTemp = strTemp & ":" & Request.ServerVariables("SERVER_PORT")

strTemp = strTemp & Request.ServerVariables("URL")

If Trim(Request.QueryString) <> "" Then strTemp = strTemp & "?" & Trim(Request.QueryString)

strTemp = LCase(strTemp)

If instr(strTemp,"declare%20")>0or instr(strTemp," ")>0or instr(strTemp,"'")>0or Instr(strTemp,"select%20")>0 or Instr(strTemp,"insert%20")>0or Instr(strTemp,"delete%20")>0 or Instr(strTemp,"count(")>0or Instr(strTemp,"drop%20")>0 or Instr(strTemp,"update%20")>0 or Instr(strTemp,"truncate%20")>0 or Instr(strTemp,"asc(")>0 or Instr(strTemp,"mid(")>0 or Instr(strTemp,"char(")>0 or Instr(strTemp,"xp_cmdshell")>0 or Instr(strTemp,"exec%20")>0 or Instr(strTemp,"net%20localgroup")>0or Instr(strTemp,"net%20user")>0 or Instr(strTemp,"%20or%20")>0or Instr(strTemp," chr ")>0 then

Response.Write "<p align =center>严重警告:您使用非法地址访问本服务器。</p>"

Response.End

End If

sql语言篇7

随着Internet的发展和普及,越来越多的单位和个人都建立了自己的网站,以便更好地进行各种信息交流或者宣传自身,亦或者通过管理系统提高工作效率,迈入信息化、高效化的快节奏时代。Web开发人员比较青睐Wamp的开发环境,即WAMP(Windows+Apache+MySQL+PHP),是指是基于Windows 操作系统下,Apache作为 Web 服务器,MySQL 作为数据库以及PHP(部分网站也使用 Perl 或 Python)作为服务器端脚本解释器完美组合,也是目前较为广泛使用的WEB 应用程序平台。这其中MySQL数据库作为网站运行更新的桥梁纽带,起着举足轻重的作用。

【关键词】数据库 MySQL 管理系统

那什么叫数据库呢?可以理解为是存储数据的仓库。举例来说:比如你的记录本上有你的学生的学号、姓名、电话、家庭地址,这些记录就是数据。把这些数据按照学号、姓名、电话、家庭住址存放在一个表里,再把这样的表放到数据库里供我们或者人查询使用,这就是我们说的数据库。如今:已经存在Oracle、SQL Server等诸多优秀的数据库。同时,还有MySQL、PostgreSQL都是很优秀的开源数据库。

MySQL是一个小型关系型数据库管理系统,是一款非常优秀的自由软件。由瑞典 MySQ LAB 公司开发,它之所以流行,是因为它有着自己独特的优势:体积小、速度快、总体拥有成本低,最重要的是代码开源,共享。作为商业运行网站,为了降低网站总体成本而选择这样的数据库当然是显而易见的。

1 MySQL支持的语言---SQL

1.1 什么是SQL语言

结构化查询语言(Structured Query Language,简称SQL)是一种介于关系代数与关系演算之间,并且使用范围限定的形式化语言。它专门用于与关系数据库管理系统进行数据交互,并且能够完成数据查询、数据操作、数据定义和数据控制四个方面的功能,是一种通用的、功能性强大的关系数据库语言。

1.2 SQL语言的特点

(1)统一的语言。SQL语言可用于所有用户的数据库模型,包括系统管理员数据库管理员应用程序开发人员及许多其他类型终端用户。所有用SQL编写的程序都是可以移植的。

(2)语言简洁、易学易用。SQL语言用了九个动词完成率数据定义(CREATE、DROP、ALTER)、数据查询(SELECT)、数据操作(INSERT、UPDATE、DELETE)、数据控制(GTANT、REVOKE)的大部分功能.。

(3)高度非过程化。降低了数据库使用的复杂度,也提高了数据的独立性。

(4)SQL语言既可以交互式使用,也可以以嵌入形式使用

(5)面向集合的操作方式

(6)SQL语言支持关系数据库三级模式结构。数据库三级模式指:内模式对应于存储文件,模式对应于基本表,外模式对应于视图。

2 MySQL与其他数据库

2.1 甲骨文的Oracle

Oracle数据库是世界上第一个支持SQL语言的数据库。主要应用于大型系统。随着网格技术的发展和应用,Oracle公司推出以网格计算模型的关系型数据库管理系统。尽可能以最低成本和最高的服务质量提供信息,它提供了企业网格计算所需的集群、工作负载管理、数据中心自动化、易用性。

2.2 IBM的DB2

DB2是IBM公司研制的一种关系型数据库系统。主要应用于OS、Windows等平台下。DB2提供了高层次的数据利用性,数据的完整性好。而且DB2的安全性高,具有很强的可恢复性。DB2数据库主要用于大型系统当中。

2.3 开源的MySQL

MySQL数据库是一个开放源代码的数据库。是由瑞典MySQLAB公司开发的。MySQL广泛地应用于Internet上的中小型网站,针对不同客户群提供Community Server、Enterprise Server和Embedded Server3种套件,体现了良好的伸缩能力。SQL Server 数据库也是微软公司开发的。SQL Server是基于客服机/服务器模式的大型数据库管理系统,能够支持大吞吐量的事务处理,能在网络环境下进行数据的存取,能用于开发决策支持系统等软件。

2.4 微软的Access和SQL Server

Access 数据库是微软公司开发的小型数据库。Access数据库是Microsoft公司Office系列软件之一,在程序设计概念上更加接近大型DBMS。

3 MySQL数据库的价值

3.1 MySQL是开放源代码

MySQL是源代码可共享、开放的数据库,任何人都可以获取该数据库的源代码,基于此基础进行二次开发,修正MYSQL的缺陷,完善数据库代码,是一款可自由运用的数据库。

3.2 MySQL的跨平台性

MYSQL可以在Windows系列的操作系统上运行,还能在MacOS、UNIX、Linux等操作系统上运行。

3.3 功能强大

MySQL 是一个真正的多用户、多线程 SQL 数据库服务器。MySQL 是以一个客户机/服务器结构的实现,它由一个服务器守护程序 mysqld 和很多不同的客户程序和库组成。

总之,与其他的大型数据库如 Oracle、DB2、SQL Server 等相比,MySQL 虽有不足之处,如规模小、功能有局限等,但是这并没有浇灭Web开发人员对它的钟爱热情。因为对于一般的个人使用者和中小型企业来说,MySQL 提供的功能已经绰绰有余,目前互联网上流行的网站构架平台是 WAMP开发环境,MySQL 加 PHP 的结合在网际网路上的应用较常见,且获得了“动态配对”(Dynamic Duo)的雅号,它的强大功能、灵活性、丰富的应用编程接口(API)以及精巧的系统结构,受到了广大自由软件爱好者甚至是商业软件用户的青睐,因而MySQL一跃成为了当今最流行的数据库。

sql语言篇8

【关键词】Oracle;OCI;数据库

引言

Unix的稳定性好,又具有成本低、维护性好与扩展性高的优点,使其成为服务器的首选。Unix和Oracle数据库的结合已成为金融、电信、国防等通信实时性、安全稳定性要求高的领域的服务器的首选。

Unix下提供了多种Oracle通信接口,考虑到底层开发和平台的可移植性,用C语言开发是最好的选择。目前比较常用的接口方式有pro*c/c++,ODBC和OCI三种方式,每一种方式都各有其优缺点,本文重点介绍C语言通过OCI接口来访问Oracle数据库的过程。

一、OCI开发接口简介

OCI是Oracle数据库调用接口,是由用于开发前端应用程序及中间件的C/C++开发类库。通过OCI,我们可以控制所有类型的SQL语句的执行,包括控制语句(会话、事务、系统)、DDL、DML、查询、PL/SQL,以及嵌入式SQL。

OCI能最大程度控制程序的运行,执行Oracle服务器所允许的所有数据库的操作,可以访问Oracle数据库服务器里的所有数据类型,可以用引用的方式访问对象及元数据,还可以动态地获取、修改对象属性值。综上所述,OCI程序既具有SQL非过程性的优点,也具有第三代程序设计语言的过程性和灵活性,使开发的产品具有很强的数据处理能力。

同时,OCI在所有能够运行Oracle的平台上具有很好的可移植性,程序不需要太大的修改即可运行在Linux/Unix/Windows甚至嵌入式环境下。OCI还是其它Oracle开发接口的底层实现,少了很多封装,可以提供Oracle与应用程序的直接连接,因此OCI能够提供最佳的性能。

二、Oracle下基于OCI实现数据库访问

(一)OCI程序的基本结构

OCI是由头文件和库函数等组成的一个访问Oracle数据库的应用程序编程的接口,它允许使用人员在第三代编程语言(如C,C++,FORTRAN与COBOL)中通过SQL语句来操纵Oracle数据库。

在一个应用程序中,我们主要是通过调用OCI提供的库函数来实现对Oracle数据库的操纵的。OCI提供了很多函数,都是以OCI开头的。

一般情况下,一个OCI应用程序是在多用户的环境下的。在一个n层网络结构配置中,客户端的应用程序需要完成一些数据的操纵,包括处理数据与交换数据。一个OCI应用程序的基本结构包括:

(1)初始化OCI的环境和线程;(2)分配需要的句柄和数据结构;(3)建立和数据库的连接,创建用户会话;(4)通过SQL与Oracle服务器来交换数据、做数据处理;(5)结束用户会话,断开与数据库的连接;(6)释放程序中分配的句柄。

(二)在OCI应用程序中执行SQL的步骤

一条SQL语句在OCI应用程序中执行步骤一般情况如下:

(1)准备SQL语句。

(2)在SQL语句中绑定输入到SQL语句中的变量。对于DML语句来说,由于它带有输入变量,所以我们可以通过调用一个或多个函数OCIBindByName()、OCIBindByPos()等把输入变量的地址绑定到DML语句中的占位符中。

(3)执行SQL语句。调用OCIStmtExecute()函数,对于DDL语句到这一步就完成了一条语句的执行。

(4)描述SQL语句中的输出数据。我们可以通过调用函数OCIAttr-

Get()与OCIParamGet()来获取我们所读取的记录的字段个数、字段的数据类型以及字段数据定义的最大长度。

(5)定义输出变量。对于DQL语句,需要定义变量用来接收所选列的数据。我们可以调用OCIDeflneByPos()、OCIDefineObject()等函数来完成这个任务。

(6)获取数据。我们可以调用函数OCIStmtFetch()来把用SELECT选中数据赋予应用程序中的变量。

三、OCI实现操作Oracle数据库的编程实例

本实例在Unix下执行,通过将OCI函数进行封装来完成对Oracle数据库的各种操作,其中包括Oracle数据库的连接,SQL语句的执行,本实例主要是Select语句的实现,将结果输出,以表test_t(id,name)为例。

封装的函数_DB_Connect用来实现数据库的连接,_DB_Select用来执行SQL语句,_DB_FetchData用来逐条查询数据,_DB_Disconnect用来断开和数据库的连接。下面简单介绍实例的执行过程和结果:

1.执行makefile文件,生成可执行程序:

2.执行可执行程序,输出查询结果:

参考文献:

[1]庞维翰,陈有青.用OCI封装类进行数据库间应用系统的移植[J].计算机工程与应用,2005(29):3.

[2]范严军.强大的微机UNIX平台—Solaris[J].软件世界,1996(4):4.

[3]黄伟.ORACLE与C语言通过调用接口的实现[J].计算机与数字工程,2005(5).

作者简介:

sql语言篇9

关键词:SQL Server;Oracle;Transact-SQL;企业管理器;查询分析器

中图分类号:TP311文献标识码:A文章编号:1009-3044(2009)14-3614-02

Large and Medium-sized Database Management System Performance Analysis of Differences

ZHANG Qun-hui, WANG Cong, TONG Xin

(Hunan Information Science Vocational College, Changsha 410151, China)

Abstract: The article introduces the architecture, security model, database file management method, data conversion, backup, restore and replication as well as the Transact-SQL language design. Describes the application process and the flip-flop storage to ensure data integrity and consistency between the realization of the process. Focus on the underlying SQL Server database configuration, management data, performance optimization and security management in detail. Finally, the above study, the SQL Server 2000 and oracle database performance comparison, summed up the characteristics of their own. At present, the practical application in the database field, a lot of database management are some problems still exist, resulting in poor database performance. To study the subject for the selection and application of database systems have a certain significance.

Key words: SQL Server; Oracle; Transact-SQL; Enterprise Manager; Query Analyzer

1 引言

SQL Server 2000是微软公司最新版的大型数据库服务器,其性能指标在各方面都有赶超Oracle数据库的趋势。在经历了SQL Server 6.5和7.0两个版本的尝试之后,微软公司终于开始向大规模的业务领域进发了。微软公司聘请了世界上最优秀的数据库专家而且专门搭建了信息量可谓空前庞大的地理信息系统,励精图治。有了强大的性能和功能支持,并且彻底脱离了Sybase,它将数据库连接到Internet,并通过Web浏览器显示数据操作,具有客户机/服务器结构,并与Microsoft公司的其他产品及第三方产品具有良好的兼容性,能方便的实现无缝操作。此外,SQL Server 2000还提供了对分布式事务处理的支持,为大型数据库项目提供优秀的企业级的解决方案。再配合其一向为人称道的易用性,SQL Server可以说成为了开发者手中的一柄利器。

因此,在数据库需求日益增长的今天。学好SQL对于开发和维护数据库,以及研究其他数据库是非常重要的。

2 SQL Server体系结构

SQL Server是由一系列数量众多的数据组件组成。这些组件在功能上互相补充,在使用方式上彼此协调,以满足用户在数据存储和管理、大型Web站点支持和企业数据分析处理上的需求。从不同的应用和功能角度出发,SQL Server具有不同的系统结构分类。具体可以划分为:

・数据库体系结构

・客户机/服务器体系结构

・关系数据库引擎体系结构

・服务器管理体系结构

其中,客户机/服务器体系结构又可以划分为客户端组件、服务器组件和通信组件三部分。用户不用直接访问 SQL Server进行分析服务的,而是使用客户应用程序来访问数据的。客户端-服务器组件体系结构如图1。

3 SQL Server主要功能

SQL Server充分整合Analysis Services 和资料采集(Data Mining),因而可以调整资讯,掌握机会。领先业界支持XML、增强系统管理和调整等工具,以及在企业和电子商务等应用上有着可调适性和可靠性。其主要功能包括管理数据库文件,管理的安全性,执行管理任务等方面,具体如图2所示。

由于篇幅的关系,在这里主要介绍SQL Server在安全方面的管理特点。SQL Server的安全性机制分为4个等级。

・客户机操作系统的安全性

・SQL Server的登录安全性

・数据库的使用安全性

・数据库对象的使用安全性

每个安全等级就好像一道门,如果门没有上锁或用户拥有开门的钥匙,则用户可以通过这道门达到一个安全等级。如果通过了所有的门,则用户就可实现对数据库的访问了。这个关系用图3来表示。

4 SQL Server性能优化

数据库是企业信息的核心,其应用水平的高低直接影响到企业管理水平。选择了一个高性能的数据库产品不等于就有一个好的数据库应用系统,如果数据库系统设计不合理,不仅会增加客户端和服务器端程序的编程和维护的难度,而且还会影响系统实际运行的性能。

4.1 影响SQL Server性能主要因素及解决办法

影响SQL Server数据库性能的因素有很多。比如:在开发工具、数据库设计、应用程序的结构、查询设计、接口选择等发面都有多种选择,这取决于特定的应用环境和应用需求。平常在优化SQL Server性能,主要从以下几个方面着手:

・数据库设计问题

・应用系统设计

・操作系统相关优化

4.2 SQL Server优化器

SQL Server优化器通过分析查询语句,自动对查询进行优化并决定最有效的执行方案。主要是通过查询分析、索引选择、合并选择三个阶段完成的。完成以上三个过程后,优化器就会生成一个基于费用的查询执行计划,这个计划充分利用了可用的索引,并以最小的系统开支和良好的执行性能访问原来的数据。

4.3 SQL Server优化应用分析

在实际操作过程中,可以先使用SQL事件侦查器创建一个工作负荷文件,来跟踪一段时间内某个指定数据库的活动。然后根据跟踪记录,使用索引优化向导来对索引进行优化。

5 SQL Server与Oracle数据库的比较

5.1 SQL Server的优越性

SQL Server是当今最重要的数据库管理系统之一。之所以能够在现代数据库管理系统行列中立于不败之地,SQL Server有着他独自的优点。主要体现在以下以个方面:

1)非过程化语言

SQL是一个非过程化的语言,因为它一次处理一个记录,对数据提供自动导航。

2)统一的语言

SQL可用于所有用户的DB活动模型,包括系统管理员、数据库管理员、 应用程序员、决策支持系统人员及许多其它类型的终端用户。基本的SQL 命令只需很少时间就能学会,最高级的命令在几天内便可掌握。

3)是所有关系数据库的公共语言

由于所有主要的关系数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS(关系数据库管理系统)转到另一个,所有用SQL编写的程序都是可以移植的。

5.2 Oracle数据库介绍

Oracle9i是业界第一个完整、简单的用于互联网的新一代智能化的、协作各种应用的软件基础架,其主要特点体现在:

1)支持大数据库、多用户的高性能的事务处理。

2)ORACLE遵守数据存取语言、操作系统、用户接口和网络通信协议的工业标准。

3)实施安全性控制和完整性控制。

4)支持分布式数据库和分布处理。

5)具有可移植性、可兼容性和可连接性。

5.3 两种数据库的比较结果

通过对SQL Server数据库的学习和Oracle数据库的查阅。总结出两种数据库大致区别,如下所示:

1)开放性

SQL Server:只能在Windows下运行,没有丝毫的开放性。

Oracle:能在所有主流平台上运行(包括 Windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。

2)可伸缩性和并行性

SQL Server:并行实施和共存模型并不成熟,很难处理日益增多的用户数和数据卷,伸缩性有限。

Oracle:平行服务器通过使一组结点共享同一簇中的工作来扩展Window NT的能力,提供高可用性和高伸缩性的簇的解决方案。如果WindowsNT不能满足需要, 用户可以把数据库移到UNIX中。

3)安全性

SQL server:没有获得任何安全证书。

Oracle Server:获得最高认证级别的ISO标准认证。

4)性能

SQL Server:多用户时性能不佳,C/S结构,只支持Windows客户,可以用ADO,DAO,OLEDB,ODBC连接。

Oracle:性能最高, 保持WindowsNT下的TPC-D和TPC-C的世界记录。多层次网络计算,支持多种工业标准,可以用ODBC,JDBC,OCI等网络客户连接。

5)操作简便

SQL Server:操作简单,但只有图形界面。

Oracle:较复杂, 同时提供GUI和命令行,在Windows NT和Unix下操作相同。

6)使用风险

SQL Server:完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。并不十分兼容早期产品。使用需要冒一定风险。

Oracle:长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险。

以上是SQL Server与Oracle数据库之间较为粗略的比较。具体要考虑该使用什么软件时,还要根据自己的业务需求和基础设施来综合考虑。

6 数据库系统回顾与展望

纵观当今的商用数据库市场,称之为群雄割据毫不为过。自20世纪70年代关系模型提出后,由于其突出的优点,迅速被商用数据库系统所采用。据统计,70年代以来新发展的DBMS系统中,近百分之九十是采用关系数据模型, 80年代和90年代是RDBMS产品发展和竞争的时代。各种产品经历了从集中到分布,从单机环境到网络环境,从支持信息管理到联机事务处理(OLTP),再到联机分析处理(OLAP)的发展过程;对关系模型的支持也逐步完善;系统的功能也不断增强。

Oracle9i已经出炉,它增强了针对电子商务的新特性,和对因特网应用的支持,提供了对大数据量的在线事务处理(OLTP)环境、查询密集型数据仓库以及要求苛刻的互联网应用的高效、可靠及安全的数据管理能力。

SQL Server 2000的下一代产品YuKon预计在今年推出。YuKon主要增强的特性大概是集群,每个服务器自己进行数据处理、管理内存、加锁和事务处理,与此同时保持与集群中其他及其的内部联系,能做到集群中一台机器不能工作,不会影响整个系统的工作。

7 结束语

在信息量日益增多的今天,数据的管理及安全问题已成为众多企业的“头等大事”。随之而来的,是众多大中型数据库管理系统相继推出,选择一个好的数据库系统能在某种程度上来弥补企业数据管理上的一些不足。有鉴于此,本文详细分析了SQL Server数据库管理系统的原理,无论是从其安全性能方面,还是从其操作方面来说,SQL Server数据库基本能满足多数企业用户的需要。特别是在安全等级方面,通过图文并茂的方式得以体现,让用户一看就懂,希望能对读者了解SQL Server数据库带来帮助。

参考文献:

[1] Microsoft.企业级数据库的安装、配置和管理[M].北京:高等教育出版社,2003.8.

[2] 李真文.SQL Server 2000开发人员指南[M].北京:北京希望电子出版社.2001.5.

[3] Microsoft.SQL Server 2000系统管理[M].北京:清华大学出版社,2001.11.

[4] 李晓,张晓辉,李祥胜.SQL Server2000管理及应用系统开发[M].北京:人民邮电出版社,2002.12.

[5] 刘耀儒.新概念SQL Server 2000教程[M].北京:北京科海集团公司出版,2000.9.

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

sql语言篇10

摘 要 针对一些文献存在的问题,本文指明了特性谓词在元组关系演算中的表达形式,给出了含量词的元组关系演算表达式到sql语句的转化过程,并通过具体实例加以说明。 关键词 元组关系演算;特性谓词;全称量词;存在量词;sql 1 引言 20世纪60年代诞生的数据库技术,经过近半个世纪的发展,形成了坚实的理论基础、成熟的商业产品和广泛的应用领域。e.f codd 提出的关系数据模型为当今主流的数据库管理系统提供了坚实的数学基础。关系数据模型有三种等价的操作语言:关系代数、sql、关系演算(元组关系演算和域关系演算),它们的非过程化程度依次递增,主要应用领域也不同。sql是关系数据库的标准语言,关系代数和关系演算是它的理论基础。大多商用的dbms先把用户提交的sql查询转化成等价的扩展关系代数表达式,在执行之前需要根据等价规则对其优化[9]。关系演算是以数理逻辑中的谓词演算为中心的,按谓词变元的不同,分为元组关系演算和域关系演算。在实际应用中,元组关系演算通常用来辅助生成带量词的sql语句[3][4][6],域关系演算以著名的qbe为代表,直观易学,适合于非专业人员使用,目前在access、powerbuilder的查询生成器中有类似的应用。 将用户提出的查询要求转化为可执行的sql语句,是一个非形式化描述向形式化规范转变的过程,完全借助计算机来实现是非常困难的,一般由专业技术人员根据经验来完成。sql语言是非过程化的,与常用的过程化的命令式语言有很大的区别。用户要完成一个查询,只需要用sql语言提出要求,无须指明怎么做。在实际应用中,用户往往提出含有“全部”、“至少”等条件的查询,它们不容易采用sql表达,这时可求助于元组关系演算,大致过程为:①写出查询的元组关系演算表达式;②根据等价转化规则得到不含全称量词的元组关系演算表达式;③将元组关系演算表达式转化为sql语句。迄今为止,国内外有很多文献和书籍都讨论过相关的内容,然而有些理论细节并没有详细解释,在一定程度上妨碍了人们对数据库知识的理解和应用,产生了一些错误[1][2][5]。本文将就这一问题进行讨论。 2 元组关系演算与sql 确定一个元组关系演算表达式,首先要分析需要使用的关系模式,确定相互之间的参照完整性约束。在特殊情况下,一个关系模式还有可能使用多次,则可通过引入不同的元组变量来区分。其次,将赋值和限定条件加入到元组关系演算表达式中。关于限定条件如何表示这一问题,很多数据库教材和文献中并没有仔细讨论,结果产生了一些问题。 在谓词逻辑中,全总个体域包含了所有个体变元的所有个体域,它统一了个体变元的取值范围,但不同论述对象需用不同的特性谓词加以再刻画[8]。对于全称量词,特性谓词作为蕴涵式的前件加入;对于存在量词,特性谓词作为合取项加入。在元组关系演算表达式中,元组的限定条件即是特性谓词,书写时也必须遵循上述两条基本规则。在文献[1]、[2]、[5]中,对于全称量词,均将限定条件作为合取项,这样造成元组关系演算表达式的语义不符合查询要求,无法表示正确的查询结果。我们经常会遇到这样的情况:对于同一个查询,从不同的角度理解,可以写出不同的元组关系演算表达式。假定有两个不同的表达式a和b,且a是正确的,那么根据谓词逻辑的完备性,如果由a无法通过推理规则得到b,则a与b的语义不同,那么b一定是一个错误的表达式。这种方法通常被用来判断一个元组关系演算表达式是否正确。 在上述分析的基础上,对于含“全部”、“至少”等条件的查询,从分析入手,得到元组关系演算表达式,再转化为sql语句,一般要经历下面三个过程: 根据查询的语义,以元组变量为主导,写出一个“规范”的元组关系演算表达式。这里所谓的“规范”,是指针对每个元组变量,其后的原子公式均以关系模式、限定条件和赋值的顺序出现,在最大的限度上保证量词辖域收缩到最小情况。特别需要注意的是限定条件(关系模式也可认为是一种特殊的限定条件)针对全称量词和存在量词的不同表示方法。 将元组关系演算表达式中的全称量词∀全部转化为存在量词∃。因为在sql语言中不存在全称量词,只有与存在量词对应的exists谓词,需要使用下列的等价式将元组关系演算表达式中的全称量词转化为存在量词。 将元组关系演算表达式转化为sql语句,处理的过程由外向内,依次为: (1)将最外层的∃、本层的限定条件和最后的赋值部分转换为select、from、where子句。 (2)内层的∃、本层的限定条件转化为select、from、where子句,此子查询作为exists谓词的条件加入到上一层sql语句的where子句中。 注意:由于带有exists谓词的子查询只产生逻辑真假值,不返回任何数据,因此内层的sql语句的目标列表达式通常都使用*。 3 例子 下面以“供应商供应工程零件”这一数据库模式为例[6],对由元组关系演算表达式得到sql语句的过程加以解释。该数据库模式包含四个表:供应商表s(sno, sname, status, city),各属性分别表示供应商代码、供应商姓名、供应商状态、供应商所在城市;零件表p(pno, pname, color, weight),各属性分别代表零件代码、零件名、颜色、重量;工程项目表j(jno, jname, city),各属性分别代表工程项目代码、项目名、项目所在城市;供应情况表spj(sno, pno, jno, qty),各属性分别代表供应商代码、零件代码、工程项目代码、供应数量,表示某供应商将某种零件以一定数量供应给某工程项目。要求查询至少使用了供应商s1所供应的全部零件的工程号jno。

分析此查询,发现查询结果中的工程信息来源于表j,而供应商s1供应的所有零件,工程使用所有的零件这两种信息都来源于同一个表spj,在元组关系演算表达式中需要使用两个元组变量来加以区分,可得到如下的元组关系演算表达式: {t|∃u(j(u) ∧ ∀v(spj(v) ∧ v[1]='s1' ∃w(spj(w) ∧ w[1]=v[1] ∧ w[2]=v[2] ∧ w[3]=u[1])) ∧ t[1]=u[1])} 注意在上述的表达式中,蕴涵不能使用合取来替代。此查询的元组关系演算表达式可能出现多种形式,只要是正确的,就一定可以通过谓词逻辑的推理规则进行等价推导,得到上述“规范”的元组关系演算表达式。 根据全称量词向存在量词的等价转换公式,可以得到: {t|∃u(j(u) ∧ ∃v(spj(v) ∧ v[1]='s1' ∧ ∃w(spj(w) ∧ w[1]=v[1] ∧ w[2]=v[2] ∧ w[3]=u[1])) ∧ t[1]=u[1])} 这个元组关系演算表达式的语义为:对所求的工程,不存在这样的零件,供应商s1供应了它,而工程没有使用 。从而在语义上也印证了上面语法推导的正确性。 根据前面的元组关系演算表达式到sql语句的转化规则,写出如下sql语句。 select jno from j where not exists (select * from spj x where x.sno='s1' and not exists (select * from spj y where y.jno=j.jno and y.pno=x.pno and y.snoo=x.sno)); 参考文献[7]中的元组演算表达式和sql语句,发现与本文有两点区别: 文献[7]中的元组演算表达式和sql语句使用的关系模式不是一一对应的,而且在sql语句中使用的关系全部为spj。这样如果spj中没有任何元组,查询结果为空,而本文中的sql语句将会从j中选择所有的工程号。 对比本文的结果,文献[7]中的元组演算表达式缺少了限定条件w[1]=v[1],相应在sql语句中缺少了y.sno=x.sno。假设出现这样的情况:若供应商s1供应的零件供应商s2也供应,工程j2使用了s2供应的所有零件,但是没有使用s1生产的零件,那么执行文献[7]中的sql语句,结果将包含工程j2,而这显然是不正确的。 4 结语 数理逻辑在计算机科学中具有不可动摇的重要地位,e.w.dijkstra就曾经说过,我现在年纪大了,搞了这么多年软件,错误不知犯了多少,现在觉悟了。我想,假如我早年在数理逻辑上好好下点功夫的话,我就不会犯这么多的错误。数理逻辑是数据库理论研究的基础,同时谓词逻辑是sql语言的数学基础。计算机专业人员必须完全掌握谓词逻辑的语法、语义和推理规则,才能写出正确、优美的sql语句。 参考文献: [1]丁宝康,“sql语言中量词和空值的使用技术[j]”,《计算机研究与发展》,1994,31 [2]刘智斌,“关系演算运行机制的分析与研究[j]”,《计算机应用研究.》,2003,10 [3]马林德,“浅谈带量词的sql语句的使用方法[j]”,《苏州大学学报(工学版)》,2003,23 [4]宗恒,“关系演算和sql中使用量词和实现蕴涵的教学方法探讨[j]”,《高师理科学刊》, 2005,25 [5]黄德才,数据库原理及其应用教程[m],北京,科学出版社,2002 [6]萨师煊、王珊,数据库系统概论[m],北京,高等教育出版社,2000 [7]王珊、朱青,《数据库系统概论》学习指导与习题解答[m],北京,高等教育出版社,2003 [8]方世昌,离散数学[m],西安,西安电子科技大学出版社,1996 [9]ramez elmasri,shamkant b. navathe,数据库系统基础[m],北京,人民邮电出版社,2002