精华内容
下载资源
问答
  • 关系数据库管理系统能够实现的三种基本关系运算是选择(从关系中找出满足给定条件的元组的操作称为选择)、投影(从关系模式中指定若干个属性组成新的关系)、连接(是关系的横向组合)。选择使用比较运算符、逻辑运算符,...

    关系数据库管理系统能够实现的三种基本关系运算是选择(从关系中找出满足给定条件的元组的操作称为选择)、投影(从关系模式中指定若干个属性组成新的关系)、连接(是关系的横向组合)。

    f22460c1fee5bb1d68b730b9d97245e3.png

    选择

    使用比较运算符、逻辑运算符,挑出满足条件的元组,运算出结果!

    例子

    查询出工资大于2000的员工的姓名SELECT ename FROM emp WHERE sal > 2000;

    过程:首先查询出emp表的所有结果,使用选择运算筛选得出工资大于2000的结果,最后使用投影运算得出工资大于2000员工的名字!

    投影

    推荐课程:MySQL教程。

    投影的运算过程:

    首先按照j1,j2,…,jk的顺序,从关系R 中取出列序号为j1,j2,…,jk(或属性名序列为Aj1,Aj2,…,Ajk )的k 列,然后除去结果中的重复元组,构成一个以Aj1,Aj2,…,Ajk为属性顺序的k目关系。

    简单来说:取出一个查询结果中某某列,并消除重复的数据,这就是投影!

    投影是从列的角度进行的运算

    投影的下标可是列序号,也可是列属性名

    例子

    查询出所有部门的编号SELECT deptno FROM dept;

    查询时的过程:先查询得出dept表的所有结果,再通过投影运算只提取”deptno”的列数据,如果 SELECT 后边跟的是”*”,那么就是投影全部数据!

    连接运算

    连接运算其实就在笛卡尔积运算的基础上限定了条件(某列大于、小于、等于某列),只匹配和条件相符合的,从而得出结果!

    自然连接

    自然连接就是一种特殊的连接运算,它限定的条件是【某列等于某列】。自然连接我们经常使用到。消除笛卡尔积其实就是自然连接了!

    例子SELECT * FROM emp,dept WHERE dept.deptno = emp.deptno;

    设定将dept表的deptno列和emp的deptno列为相同【这就是自然连接】

    更多MySQL相关技术文章,请访问MySQL教程栏目进行学习!

    展开全文
  • 数据库关系代数运算之连接

    万次阅读 2018-06-26 15:03:24
    联接有三种:θ联接和自然联接(这里是算术比较符),外联接。(1) θ联接 (从R和S的笛卡儿乘积中选取满足条件“iθj”的元组•(2)自然联接(naturaljoin) 两个关系R和S的自然联接操作具体计算过程如下: ① ...

    联接有三种:θ联接和自然联接(这里是算术比较符),外联接。

    (1) θ联接 (从R和S的笛卡儿乘积中选取满足条件“iθj”的元组




    •(2)自然联接(naturaljoin)

     两个关系R和S的自然联接操作具体计算过程如下:

     ① 计算R×S ;

     ② 设R和S的公共属性是A1,…,AK,挑选R×S中满足R.A1=S.A1,…,R.AK=S.AK

      的那些元组;

     ③去掉S.A1,…,S.AK这些列。

    定义:

      πi1,…,im (σR.A1=S.A1∧... ∧R.AK=S.AK(R×S)),其中i1,…,im为R和S的全部属性,但公共属性只出现一次。

    (3)外连接

    R与S的左连接:对照关系R中,元组3、7、5不包含在自然连接中,在自然连接的基础上加上该元组,没有属性的列补空值。

    ABCD
    2468
    2462
    4685
    375null

    R与S的右连接:对照关系S中,元组5、6、7不包含在自然连接中,在自然连接的基础上加上该元组


    ABCD
    2468
    2462
    4685
    null567
    R与S的外连接RS):左连接+右连接

    ABCD
    2468
    2462
    4685
    357null
    null567

    注意:R()S,谁在前谁在后

    展开全文
  • 1. 概述 本文探讨如何在MSSQL、Sybase,及Oracle三种数据库中进行位运算。由于系统设计原因,MSSQL和Sybase可以很好的支持位运算,但是Oracle的愿生类型并不支持位运算。本文将介绍MSSQL和Sybase位运算的不同之处,...

    1. 概述

      本文探讨如何在MSSQLSybase,及Oracle三种数据库中进行位运算。由于系统设计原因,MSSQLSybase可以很好的支持位运算,但是Oracle的愿生类型并不支持位运算。本文将介绍MSSQLSybase位运算的不同之处,然后介绍如何在Oracle中模拟位运算。

     

    2. MSSQLSybase中的位运算

    2.1 支持位运算的数据类型

      通常,对于应用程序来说,位运算仅对整数有意义。在MSSQLSYBASE中,有三种数据类型用来表示整数。其定义和值范围见下表描述。

    类型

    字节数

    值范围

    tinyint

    1

    028-1

    smallint

    2

    -215215-1

    int

    4

    -231231-1

     

    可以看出,这些数据类型正好使用了字节的倍数来容纳其值,如同C语言一样。这样的数据类型是最适合于位运算的。

    MSSQL中还有一个bigint类型,它使用8个字节来容纳更大范围的整数。但是在Sybase中没有对应的类型。

    2.2 整数的二进制表达

    要介绍位运算,必须首先知道如何用二进制来表达整数。在MSSQL中,二进制常量均以 0x(一个零和小写字母x)开始,后面跟着位模式的十六进制表示。在Sybase中,以0x开始的数表示的仅为二进制,即只能出现0或者1

    因此,对于一些数字来说,虽然MSSQLSybase采用同样的表示方式,但是含义有所不同。原因在于MSSQL的十六进制数的形式对应于SYBASE的二进制数,而不是SYBASE的十六进制数。 是不是感到这话有点饶口?还是让例子来澄清一切吧。 打开MSSQL的查询分析器或者SYBASESQL Advantage,运行语句,结果如下表所示。

    数据库

    表达式

    结果

    MSSQL

    Select 0x1 + 0

    1

    SYBASE

    Select 0x1 + 0

    16777216

    MSSQL

    Select 0x001 + 0

    1

    SYBASE

    Select 0x001 + 0

    65536

    MSSQL

    Select 0x00001 + 0

    1

    SYBASE

    Select 0x00001 + 0

    256

    MSSQL

    Select 0x0000001 + 0

    1

    SYBASE

    Select 0x0000001 + 0

    1

    为何值的差异如此之大?原因在于上面表格中SYBASE的值是二进制数,不是十六进制数。SYBASE的二进制数以0x开头,最长允许8位。如果不足8位,则在右边添加0;如果超过8位,则截取左边8位。其值的计算可以用下面的公式来表示:

    v = v12 * 2^24 + v34 * 2^16 + v56 * 2^8 + v78 * 2^0

    其中:v12表示第12位组成的数的十进制值。v34v56v78的含义依次类推。 还必须说明,v12的填充方式是左填零,即101的值是相同的。SYBASE二进制数这种表示方式十分拗口。根据这个规则,来分析下面的SYBASE数字:

    Sybase数字

    右填充0后的结果

    V12

    V34

    V56

    V78

    结果

    0x1

    01000000

    1

    0

    0

    0

    1 * 2^24

    0x10

    10000000

    2

    0

    0

    0

    2 * 2^24

    0x000011

    00001100

    0

    0

    3

    0

    3 * 2^8

      本人认为,上面最难理解的是0x1为何没有填充成0x10000000!本人建议在书写Sybase的二进制数字时最好写成偶数位,以便理解。

     

    那么SYBASE的十六进制到底怎么表示呢?很简单,把MSSQL的十六进制数变成字符串即可,并且用hextoint函数来取得它的值。

    例如,MSSQL的语句

    if @action_in & 0x0ff

    可以变成SYBASE的语句

          if @action_in & hextoint(‘0x0ff’)

     注意,十六进制数采用左边填充零,’0x0ff’ 等于’0x000000ff’ 将十进制转为十六进制的函数是inttohex

    SYBASE之所以采用字符串的形式来表示十六进制时为了做到平台无关性。MSSQL完全不用考虑这个问题,因为它从来就只支持Windows

     

    位运算符通常对整数有效。这里必须明确指出,二进制值本身不是整数,所以不能直接写以下语句:

    select 0x001 & 0x011

    MSSQL会提示出错。

    但是如果写成

    select 1 & 0x011

    就可以进行计算。原因在于在这个语句中0x011会被自动转换成1的数据类型tinyint

     

    MSSQL中,要查看一个整数的二进制形式,可以使用CAST函数或者CONVERT函数。

    例如:

    select convert(varbinary, 435455)

    或者

    select cast(435455 as varbinary)

    显示结果为:

    0x0006A4FF

     

    Sybase中,可以使用inttohex函数来显示整数的二进制形式。

    2.3 位运算操作

    有四种基本的位操作运算:按位与&,按位或|,取反~,异或^

    本文不介绍这些操作的详细用法,因为在操作手册上已经说明清楚。

    通常不建议在数据库中大量使用位操作。数据库是进行数据存取的合适地点,但是不是进行数据运算的合适地点。

    在基本操作的基础上,可以发展出其他一些有用的操作。本人在实际应用中使用过很多操作,以下是其中一些例子:

    ·         取某一位的值

    ·         设置某一位的值

    ·         计算非零位个数

    ·         交换两个位的值

    下面占用一些篇幅来实现一下上面的几个例子。

    2.3.1 取某一位的值

    由于二进制是由01组成,取某一位的值等价于判断该位是01。因此,我们可以使用“按位与”的方法来取值。

    ·         如果想取第n位值,可使用:

    case @v_value & power(2,n-1) when 0 then 0 else 1 end

    例如,我们要取一个变量的第四位的值,可以另其与24-1即二进制值1000即十六进制值0x08进行与运算,如果结果是0,则该位值是0,否则为1

    MSSQLSybase中,可用以下语句实现:

    select (case @v_value & power(2,4-1) when 0 then 0 else 1 end)

    Sybase中,还可以更加明确的直接写出二进制:

    select (case @v_value & 0x00001000 when 0 then 0 else 1 end)

    2.3.2 设置某一位的值

    在设置某一位的值时,由于结果取决于给定值(01),不取决于原始值,因此给定值必须能够屏蔽原始值的影响。给定值不同,采用的方法也不同。

    ·         如果想把第n位值设置成1,可以使用“或”方法:

    @v_value | power(2, n-1)

    例如,执行以下语句将把数值2(二进制0010)的第4位变成1,因此结果变成10(二进制1010)

    select 2 | power(2, 4-1)

    ·         如果想把第n位值设置成0,可以使用“与”方法:

    @v_value & ~power(2, n-1)

    例如,执行以下语句将把数值10(二进制1010)的第4位变成0,因此结果变成2(二进制0010)

    select 10 & ~power(2, 4-1)

    2.3.3计算非零位个数

    计算非零个数用一句SQL是做不到了,可以用下面的一段T-SQL代码来实现:

    declare @v_result int,

            @v_value  int

    select @v_value = 11

     

    select @v_result = 0

    while @v_value != 0

    begin

        select @v_result = @v_result +

                          (case @v_value & 1 when 0 then 0 else 1 end)

        select @v_value = @v_value / 2

    end

     

    select @v_result

    上面代码中假设@v_value是要计算的值,变量@v_result存放结果并在最后显示。

    例如上面的11(二进制1011),其结果是3

    2.3.4 交换两个位的值

    交换两个位的值可以用一段代码来实现:

    declare @v_value int,

            @m       int,

            @n       int

           

    select @v_value = 11, @m=2, @n=3

    if @v_value & power(2,@n-1) <> @v_value & power(2,@m-1)

    begin

        if @v_value & power(2,@n-1) = 0

        begin

            select @v_value = @v_value | power(2, @n-1)

            select @v_value = @v_value & ~power(2, @m-1)

        end

        else

        begin

            select @v_value = @v_value | power(2, @m-1)

            select @v_value = @v_value & ~power(2, @n-1)

        end

    end

     

    select @v_value

    上述代码假设变量@v_value是将被变换的值,@m@n指明了位置。只有在两个位置的值不同时才进行交换。交换实际上是将两个不同位置的值分别取反。

    例如,13(二进制1011)2位和第3位交换后的结果是15(二进制1101)

    3. ORACLE中进行位运算

    3.1 PL/SQL不直接支持位操作

    在将包含位操作的T-SQL应用程序迁移到PL/SQL时,开发者发现Oracle并没有提供类似的位操作运算。这造成了一定的麻烦。

    由于Oracle在表示整数时,采用了与MSSQLSybase不同的方式,并不采用2的次方的字节数来容纳,这实际上从本质上限制了位操作。

    应用程序是否应该在数据库代码中使用位操作本身是一个设计问题,一般来说应该尽量避免。但是对于一些迁移自其他数据库的应用程序,要摒弃位操作会导致大量修改,甚至造成结构上的调整。因此,必须在Oracle中也实现位操作。

    通常有三种方式可以用来实现位操作,根据我的使用经验,其优先级别分别为:

    1. 使用Java存储过程
    2. 使用C外部过程
    3. 使用PL/SQL的函数进行模拟位运算

    3.2使用bitand函数

    虽然Oracle不直接支持位操作,单是为了方便起见,Oracle8i开始还是提供了一个函数bitand来模拟“与”操作。

    但是Oracle并没有提供其他位操作函数。因此,我们无法认为Oracle直接提供了位操作。

    3.3使用Java存储过程进行位运算

    Oracle有理由不直接提供位操作支持。由于Oracle提供了极为方便的Java存储过程,我们可以很方便的用来实现所有位操作。

    下面我们准备实现四种基本的位操作。关于Java存储过程的内容,本文不给予太多描述,只引用必要的部分用于阐述问题。

    首先,我们需要一个Java类,里面实现了位运算的四种基本功能。

    public class BitOper {

        public static int bitAnd(int a, int b) {

            return a & b;

        }

        public static int bitOr(int a, int b) {

            return a | b;

        }

        public static int bitXor(int a, int b) {

            return a ^ b;

        }

        public static int bitNot(int a) {

            return ~a;

        }

    }

    为了便于描述问题,我将这个类设计的相当简单。

    将其编译后得到BitOper.class

    接下来,使用Oracle提供的一个工具loadjava将上述类加载到数据库中。该工具在安装Oracle时已经自动安装。

    loadjava –user user_name/password@sid BitOper.class

    该命令执行完后,如果没有报错则表示加载成功。

    最后一步工作是创建PL/SQL包装函数。这里有两种选择,一种是创建独立的函数,一种是创建用包封装的函数。为了减少篇幅,我选择使用第一种。

    create or replace function bit_and

    (

      int1        number,

      int2        number

    ) return number

      DETERMINISTIC

    AS LANGUAGE JAVA

    NAME 'BitOper.bitAnd(int, int) return int';

    /

    create or replace function bit_or

    (

      int1        number,

      int2        number

    ) return number

      DETERMINISTIC

    AS LANGUAGE JAVA

    NAME 'BitOper.bitOr(int, int) return int';

    /

    create or replace function bit_xor

    (

      int1        number,

      int2        number

    ) return number

      DETERMINISTIC

    AS LANGUAGE JAVA

    NAME 'BitOper.bitXor(int, int) return int';

    /

    create or replace function bit_not

    (

      int1        number

    ) return number

      DETERMINISTIC

    AS LANGUAGE JAVA

    NAME 'BitOper.bitNot(int) return int';

    /

    将上述代码在SQLPLUS中执行后,当前用户就具备了四种基本位操作的功能。

    不妨使用几个例子来测试一下:

    select bit_and(9,8) "9and8",

           bit_or(3,4) "3or4",

           bit_xor(3,5) "3xor5",

           bit_not(3) "not3"

      from dual;

    其结果为:

         9and8       3or4      3xor5       not3

    ---------- ---------- ---------- ----------

             8          7          6         -4

     

      看起来一切都很简单,你是否这么认为呢?

    展开全文
  • 一、 1.假设A能推B:那么每个A1所对应的B的属性值应该一样,由于B的第一行和第三行分别是B1和B3,故A不能推B。...发现只存在C推D,AB推C,AB推D三种关系, 那么主键为AB。 由于没有非主属性部分依赖于.

    在这里插入图片描述

    一、

    1.假设A能推B:那么每个A1所对应的B的属性值应该一样,由于B的第一行和第三行分别是B1和B3,故A不能推B。
    2.假设A能推C:那么每个A1所对应的C的属性值应该一样,由于C的第一行和第三行分别是C1和C2,故A不能推C。
    3.假设A能推D:那么每个A2所对应的D的属性值应该一样,由于D的第四行和第五行分别是D1和D2,故A不能推D。

    二、

    对B和C和D,以及AB,AC,AD,BC,BD分别作上述假设,
    发现只存在C推D,AB推C,AB推D三种关系,
    那么主键为AB
    由于没有非主属性部分依赖于主属性(即非主属性们均完全依赖于主属性),故为2NF
    从C推D,AB推C里,得知非主属性D传递依赖于主属性AB(尽管AB可以直接推D,这里仍存在传递依赖),则消除该传递依赖即可满足3NF。
    分为**R1(ABC),R2(CD)**即可。

    展开全文
  • 传统的集合运算是二目运算,包括并、差、交、笛卡尔积4种运算 并:R∪S={t | t∈R ∨ t∈S} 要有相同列 差:R-S={t | t∈R ∧ t∉S} 交:R∩S={t | t∈R ∧ t∈S} 笛卡尔积:R×S={tr⌒ts | tr∈R ∧ ts∈
  • 关系数据库

    2016-04-24 15:43:00
    上一节总结了数据模型中的概念模型的大分类,现在我们从其中的关系数据模型展开,描述关系数据库  关系数据库是支持关系模型的数据库系统,按照数据模型的个要素,关系模型由关系数据结构,关系操作集合和关系...
  • 关系代数语言是一抽象的查询语言,通过对关系运算来表达查询。 关系代数的运算对象是关系运算结果也是关系运算对象、运算符和运算结果是关系代数的大要素。 关系代数的运算可分为以下两大类: 1.传统的...
  • 关系数据库是支持关系模型的数据库系统。 而对于关系模型的数据结构有以下重要定义: 二、关系操作 分为关系代数和关系演算: 关系代数 关系演算 SQL具有关系代数和关系演算双重特点。 、关系的完整性...
  • 摘要关系数据库访问层可以帮助您设计使用关系型数据库的应用程序,并且在业务对象级别反映关系运算,这种应用程序被称作数据驱动或representational[Mar95]。这种系统并不需要是面向对象的,您完全可以使用第代...
  • 关系代数是一抽象的查询语言,它用对关系运算来表达查询 关系代数: 运算对象是关系 运算结果亦为关系 关系代数的运算符有两类:集合运算符和专门的关系运算符。 传统的集合运算是从关系的“水平”方向即行的...
  • 数据模型的三种类型:概念模型、逻辑模型、物理模型 逻辑模型包括:层次数据模型、网状数据模型、关系数据模型 关系数据模型的四个特点: 数据结构单一 2)采用集合运算 3)数据完全独立 4)有数学理论支持 ...
  • 1、关系代数是一抽象的查询语言,用对关系运算来表达查询。运算对象、运算符、运算结果是运算要素。关系代数的运算对象是关系运算结果也是关系。 2、关系代数的运算按算符的不同可分为传统的集合运算和...
  • 关系数据库 此篇回答的是《数据库原理概论》中第二章的习题 1.定义并理解下列术语,说明他们之间的联系和区别: (1) 域,笛卡儿积,关系,元组,属性; 域(domain):域是一组具有相同数据类型的值的集合。 笛卡尔积...
  • 关系数据库 1、关系数据结构及形式化定义 依据数据模型的要素,关系模型由关系数据结构、关系操作集合和关系完整性约束部分组成。下面依次介绍: 1.1、关系 关系模型的数据结构非常简单,只包含单一的数据结构...
  • *数据更新:插入、删除、修改 查询的表达能力是其中的最主要的部分 *传统的集合运算是二目运算,包括并、交、差、广义笛卡尔积 *专门的关系运算包括:选择、投影、连接、除4种运算。 (1)并 ...
  • 2.关系数据库管理系统应能实现的专门关系运算包括 选择、投影、连接 3.五基本关系代数运算是 ∪- × σ π 4.关系代数中的连接操作是由选择和笛卡尔积操作组合而成 。 5.假设有关系R和S,关系代数表达式R-(R-S...
  • 数据库总结(4)-关系运算—验算、优化

    千次阅读 热门讨论 2014-09-13 17:28:12
    上次写到关系代数,关系代数的运算是... 公式是有原子公式组成的,原子公式的有三种形式。公式具有递归性(好像函数依赖也有)。  其实本章第四章关系代数主要讲的查询语句是如何在数据库内运作和运作的原理。既然是
  • 本篇内容为中国人民大学教授王珊、萨师煊的《数据库系统概论》自学课程的复习笔记,学习视频源于小破站(传送门),对应视频P9-P14,属教材“【第一篇 基础篇】”的“【第2章 关系数据库】”内容。 P9 关系数据...
  • 数据库连接运算(join)

    万次阅读 2015-10-15 21:04:56
    联接有三种:θ联接和自然联接(这里是算术比较符),外联接。 (1) θ联接 (从R和S的笛卡儿乘积中选取满足条件“iθj”的元组 •(2)自然联接(naturaljoin)  两个关系R和S的自然联接操作...
  • 一、SQL的组成:SQL是一查询语言,最初是由IBM开发。 1.数据定义语言(Data-Definition Language,DDL): 提供定义关系模式、删除关系和修改关系模式的命令; 2.数据操作语言(Data-Manipulation Language,DML): 提供...
  • 关系可以有三种类型:基本关系(通常又称为基本表或基表)、查询表和视图表。其中,基本表是实际存在的表,它是实际存储数据的逻辑表示;查询表是查询结果对应的表;视图表是由基本表或其他视图表导出的表,是虚表,不...
  • 数据库(二)—— 关系数据库以及关系代数和关系运算 数据库设计中的数据库表和表之间的关系有:一对一、一对多和多对多这三种关系。 可见,数据库表之间的关系是组合关系。 那么在面向对象程序设计当中有哪些...
  • 关系代数运算——(软考

    千次阅读 热门讨论 2015-10-09 21:39:35
     关系代数:是一抽象的查询语言,用对关系运算来表达 查询。关系代数运算的是关系运算结果亦是关系关系代数的基本关系包括:并、交、差、笛卡尔积、选择、投影、连接、除法运算。由于并、交、差运算很简单...
  • 哈尔滨工业大学数据库基础mooc同步讲义ppt。数据库系统基础讲义第05讲关系模型之关系演算 基本内容 1. 关系演算之关系元组演算 2. 关系演算之关系域演算 3. 关系演算之安全性 4. 关于三种关系运算的一些观点
  • 任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的结果。所以运算对象、运算符、运算结果是运算的大要素。 按运算符的不同分为传统的集合运算和专门的关系运算两类: 传统的集合运算包括:并(∪...
  • 4.关于三种关系运算的一些观点 主要是元组演算和域演算 关系元组演算公式的定义方法是:递归 评价:递归是一种定义语言的好方法 存在量词和全称量词是我们学习元组演算的关键之所在 公式记起来很简单,但是...
  • 数据库——关系代数

    2019-07-08 20:40:07
    传统集合运算均为二目运算,包括如下四,对于并、差、交就不再赘述 并 差 交 笛卡儿积 严格来讲为广义的笛卡儿积,因为这里的元素是元组。 两个分别为n目和m目的关系R和S的笛卡儿积是一个(n+m)列的元组的集合,...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 237
精华内容 94
关键字:

关系数据库三种运算