加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

《数据库技术》1.2.1.2.5 选择运算(Selection)

(2009-03-10 19:48:12)
标签:

it

分类: 数据库

1.2.1.2.5 选择运算(Selection)
    选择运算是使用频率最高的一种运算,也就是我们应用最频繁的(Select … Where…)语句,从语义上就是“选择那些满足…条件的记录”。它的作用是在给定的一个关系或者在多个关系执行完连接运算的基础上,对给定数据作筛选,只返回符合筛选条件的数据。选择运算是一个单操作数的运算,如果某个选择运算的操作对象是一个关系,则选择运算的结果是这个关系的子集;如果某个选择运算的操作对象是多个关系,则这个选择运算的结果是这多个关系的笛卡尔积的一个子集。理解选择运算,我们可以想象在每一个关系数据表之上都有一个指针(Oracle中成为Cursor,游标),在做选择运算时,游标会依次指向每一条记录作判断(如果是多个关系的选择运算,则会在这多个关系的笛卡尔积上生成一个Cursor),如果满足Where条件,则作为SQL语句的输出(输出的形式也是多样的)。Ullman形式化地给出了选择运算的概念:

     如果F是一个逻辑表达式(如age>25 and gender=’Male’ or age>35 and profession=’Management’),并且包含如下成员:
    (a)操作数(不是关系操作数,而是逻辑操作数)是常数,或者操作数是元组的属性标号,如$2,第i个属性一般表示为$i。
    (b)算术表达式使用的比较运算符,>,<,=,≤,≥,≠。
    (C)使用了逻辑运算符∧(并且),∨(或者),¬(并非)。在SQL语句中,这三个逻辑算符被替代为and,or,not。


   δF(R)是一个元组集μ,μ是R的一个子集,且满足对于μ中任何一个元组,如果我们把公式中的$i替换为第i个属性的值,公式F都会成立,即对于每个元组公式F的运算结果是true。我们称δF(R)是选择运算。选择运算在数据库应用中被广泛地用来进行筛选和查找的工作。我们来看一个例子:
    《数据库技术》1.2.1.2.5 <wbr>选择运算(Selection)

Figure 1.2.1.2.3 在单个关系上作选择运算的例子

 这个例子演示了从一个法规数据库中筛选出需要的法律条文来,税法是一个关系,我们要看的是涉及到增值税的视同销售的情形。则我们的对单个的关系进行的选择运算用关系代数的形式表达如下:

δ$3=”增值税$6>”2000”∧$4 like(“%视同销售%”)(税法)

注意这个表达式使用的是字段在元组中的顺序号,而不是字段名称,因为对于关系代数关系是以元组的形式出现的,元组本身不包括元数据,元组各个字段的先后顺序是重要的。在实用的数据库中,SQL语句使用字段名进行选择运算,如

δ$3=”增值税$6>”2000”∧$4 like(“%视同销售%”)(税法) 可以用SQL语句

Select * from 税法 Where 类别=’增值税

And >’2000’ And 内容 Like ‘%视同销售%’

表示,关系代数和SQL只是在表现方式上不同,但都使用了关系模型。另外在这个例子中,我们不仅使用了算术比较运算符,我们还使用了字符串比较的运算符LikeLike用于对两个字符串进行匹配(Like的详细资料以及其他的字符处理函数或其它的数据类型的处理函数请参阅具体的数据库系统的手册)。

目前虽然说ANSI/SQL正在成为一个标准,但目前绝大多数的数据库厂商之间为了竞争,为了发展自己的独有技术,即使是在最基本的SQL上,也对SQL-92标准作了大量的扩充和修改,有的是作了精炼。“Entry Level SQL92”,该标准版本由以下要素组成:表、列、数据类型、键索引、schema操作、行和表约束、视图、基本关系操作以及编程语言绑定等。如MS SqlServer2000开发了Case When子句,并且引入了多维数据分析的概念,把一个分组求和的SQL语句返回的结果看作是一个多维数据立方体,可以对RDBMS进行Rollup操作等等,但Oracle 8却对Compute by子句都不支持,只能让用户使用Group by子句进行分组求和的运算。数据库厂商对SQL本身就执行了不同的策略,更不用去说存储过程的编写语法、数据类型、字符串处理函数、日期类型处理、大文本、多媒体、数据库安全、约束、规则等等了。所以,即使对关系模型和SQL语句十分熟悉也很难保证对任何一种数据库系统的运用自如。例如,对于MS SQLServer和Sybase数据库,对日期型数据的处理比较类似于字符串的处理,如:

 insert into profile(name,birthdate) values

(‘Kate’,’1963/02/12 18:32:46’)  --Kate,出生时间精确到秒

当我们要查询出1949年10月1日零点零分之后出生的,可以

   Select * from profile Where birthdate>=’1949/10/01 0:0:0’

但在Oracle系统中,如果数据表中的字段是日期型(Date)的,则凡是对该字段进行插入、修改、查询等操作,必须要用到To_Date()函数先进行强制数据类型转换,把字符串类型转换为日期型。如:

Select * from profile Where

 birthdate>=To_date(’1949.10.01’,’YYYY.MM.DD’)

我们注意到还要对输入的日期型的数据进行转换,YYYY表示年份,MM表示月份,DD表示具体几号。

各个数据库厂商之间对SQL支持的差异性我们在后面的章节中讨论。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有