精华内容
下载资源
问答
  • 数据库范式

    2021-06-04 13:23:29
    如何设计一个数据库,怎样评判关系型数据库模型设计的是否合理? 范式化理论就是辅助判断该问题的 相关概念 闭包(左边元素的组合)-> 所有元素 候选码 能够唯一标识元组的一个属性或者属性集 主属性 ...

    数据库范式

    如何设计一个数据库,怎样评判关系型数据库模型设计的是否合理?
    范式化理论就是辅助判断该问题的

    相关概念

    • 闭包(左边元素的组合)-> 所有元素

    • 候选码
      能够唯一标识元组中的一个属性或者属性集

    • 主属性
      包含在主码中的各个属性

    • 非主属性
      不包含在任何候选码中的属性

    • 主码
      从多个候选码中选择一个作为 查询、插入、删除元组的操作变量被称为主码(主键)

    • 外码
      A中的一个或一组属性是B的主码则称这些属性为外码(其实就是外建)

    • 超码、全码?待补充

    范式种类

    • 1NF:是指数据库表的每一列都是不可分割的基本数据项
      例如:如果人的属性包含家属,家属不是不可再划分
    • 2NF 属性完全依赖于主键[消除部分子函数依赖]
    • 3NF 属性不依赖于其它非主属性[消除传递依赖]
    • BCNF 不存在部分依赖以及
    展开全文
  • 根据候选码判断关系F的函数关系是否满足第二范式,若不满足则为关系模式的规范化最高为第一范式 然后判断是否存在非主属性传递依赖,如果存在则不满足第二范式,如果不存在则关系模式的规范化最高为第三范式. 通俗...

    求关系模式最高达到第几范式的步骤

    1. 根据给定的U和F,首先求它的候选码
    2. 根据候选码判断关系F中的函数关系是否满足第二范式,若不满足则为关系模式的规范化最高为第一范式
    3. 然后判断是否存在非主属性传递依赖,如果存在则不满足第二范式,如果不存在则关系模式的规范化最高为第三范式.

    通俗理解1NF,2NF,3NF.

    • 1NF的定义:

       一个关系模式R的所有属性都是不可分的基本数据项.
      

      1NF容易理解就不多解释了,在这里举两道简单的题帮助理解.

      1. 规范化的关系模式中,所有属性都必须是( C)。
        A.相互关联的
        B.互不关联的
        C.不可分解的
        D长度可变的
      2. 关系数据库中的每个关系必须最低到达__第一范式__,且该范式中的每个属性都是__不可再分__的。
    • 2NF的定义:

       在1NF的基础上,关系中每一个非主属性完全函数依赖于码. 
       所以满足第二范式则一定满足第一范式.
       对这个非主属性完全函数依赖于码不清楚可以看最后**函数依赖中的图**来理解.
      
    • 3NF的定义:

       在满足2NF的基础上,满足每个非主属性既不部分依赖于码也不传递依赖于码.
      满足3NF的同时一定满足2NF.
      

    如何求关系模式的候选码

    • 首先对于给定的R(U)和函数依赖集F,可以将它的属性化分为4类:
    • L类:仅出现在F的函数依赖左部的属性.
    • R类:仅出现在F的函数依赖右部的属性.
    • N类:在F的函数依赖左部和右部未出现的属性.
    • LR类:在F的函数依赖左部和右部均出现那的属性.

    下图的题中:A->C
    C->A
    B->AC
    D->AC
    L:找出这些式子中在箭头左边的
    R:找出式子在
    出现在箭头右边的
    N:找出所有的R中既没有出现箭头在左边又没有出现在箭头右边的
    LR:找出既出现在箭头左边又出现在箭头右边的

    如下图所示.

    那么求出这些L,R,N,LR类后我们根据三个定理来确定候选码的成员:

    • 定理1:对于给定的关系模式R以及其函数依赖集F,若X(x∈R)是L类,则X必为R的任一候选码的成员.
    • 定理2:对于给定的关系模式R以及其函数依赖集F,若X(x∈R)是R类,则X不在任何候选码中.
    • 定理3:设有关系模式R以及函数依赖集F,如果X是R的N类属性,则X必包含在R的任一候选码中.
    • 推论2:如果X是R的N类和L类组成的属性集,且X+包含了所有的属性,则X是R的唯一候选码.

    简单的来说就是对于在 L和N类中的都是候选码的成员:
    在这里插入图片描述
    确定了候选码的成员后如何确定最后的候选码呢?我们看到上面有这个B+或者(BD)+这在求B的闭包,下面我们来了解以下如何求闭包吧.

    如何求闭包

    闭包就是由一个属性直接或间接推导出所有属性的集合.引用: http://blog.sina.com.cn/s/blog_7f6c91720101jkhm.html.了解了闭包的概念后我们要学会如何求闭包,
    步骤如下:
    属性集的闭包步骤
    在这里插入图片描述
    当我们求出所由候选码成员的闭包后,我们根据上面的推论2,

    • 推论2:如果X是R的N类和L类组成的属性集,且X+包含了所有的属性,则X是R的唯一候选码.
      假设上图中BC为候选码的成员,求到的(BC)+的闭包为ABCE;
      而U={A,B,C,D,E},并没有全部包含所有属性,所以它不是关系模式R的码.

    F={A->E,AC->B,B->A,D->A,D->C}
    下面我来求一下D的闭包(D)f+

    根据D->A,D->c将A,C 目前(D)+=ACD;
    (ACD)={A,C,D,AD,AC,CD}
    A->E AC->B 变成(D)f+=(ABCDE)

    (D)f+包含了R中的所有属性,所以D为R的码.

    函数依赖

    求出码后我们就根据2NF,3NF中的函数依赖来判断关系模式的规范化最高为?
    1.这个中AB为候选码,但是存在非主属性依赖于B,不满足所有非主属性完全依赖于码.在这里插入图片描述

    2.再看一道题
    在这里插入图片描述
    最后总结两个常考的知识点

    1. 在一个关系R中,若X→Y,并且X的任何真子集都不能函数决定Y,则称X→Y为___完全___函数依赖
    2. 若X→Y,并且X的一个真子集也能够函数决定Y,则称X→Y为___部分___函数依赖。
    3. 一个关系模式R中的候选码可能有多个.
    展开全文
  • 关于如何数据库里的关系模式,教你 学会关系模式范式求解。
  • 数据库范式理解:1NF,2NF,3NF,BCNF,4NF详析

    千次阅读 多人点赞 2020-03-28 12:28:45
    数据库入门(一)最简单的范式理解引言范式种类第一范式(1NF)符合1NF的关系的每个属性都不可再分存在问题Cohen-Sutherland代码裁剪算法基本思想Cohen-Sutherland操作步骤中点分割裁剪算法(对分法)基本思想线段...

    引言

    Normal Form范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。一脸懵逼的我们如何理解这句话呢,简单地说可以把他理解为一张数据表的表结构所符合的设计标准级别,像英语的四六级,相对代表了英语水平的高低。
    满足这些规范的数据库是简洁的,结构明晰的,同时不会发生插入(insert),删除(delete)和更新(update)操作的异常

    范式种类

    数据库范式分为1NF,2NF,3NF,BCNF,4NF,5NF。一般在我们设计关系型数据库的时候,最多考虑到BCNF就够。符合高一级范式的设计,必定符合低一级范式

    第一范式(1NF)

    符合1NF的关系中的每个属性都不可再分

    • 在使用数据库管理系统的时候比如mysql,sqlserver等数据表都必须满足第一范式。
    • 属性不可再分的意思是每一个字段都是最小的,不包含其他字段,不重复,原子性
      在这里插入图片描述

    存在问题

    在这里插入图片描述
    如上例,第一范式的不全面性造成了许多问题。

    • 数据冗余:如学号、姓名、系名、系主任这些数据重复多次
    • 插入异常:如学校新建了一个系,但是暂未招生学生无法将系插入表内(缺少主键)。
    • 删除异常:如将某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也就随之消失了。

    第二范式(2NF)

    在1NF基础上消除了非主属性对码的部分函数依赖

    • 码(候选码):一个表里面,可以惟一决定一个元组属性的集合。
      主属性:码里面的属性。
      非主属性:不是码里面的属性。
    • 函数依赖:若在一张表中,在属性(或属性组)XX的值确定的情况下,必定能确定属性YY的值,那么就可以说YY函数依赖于XX,写作 XYX → Y
      在这里插入图片描述
    • 完全函数依赖:在一张表中,若XYX → Y,且对于 X 的任何一个真子集(假如属性组XX包含超过一个属性的话)XYX ’ → Y不成立,那么我们称YY对于XX完全函数依赖,记作 XFYX\stackrel{F}{\longrightarrow} Y,如:
      在这里插入图片描述
    • 部分函数依赖:假如YY函数依赖于XX,但同时YY并不完全函数依赖于 XX,那么我们就称YY部分函数依赖于XX,记作 XPYX\stackrel{P}{\longrightarrow} Y,如:
      在这里插入图片描述

    二范式判断步骤

    • 找出数据表中所有的
    • 找出主属性和非主属性
    • 查看是否存在非主属性对码的部分函数依赖
    • 将表拆分使每一个非主属性都完全函数依赖于候选码
      在这里插入图片描述

    优缺点

    优:

    • 减少数据冗余
    • 修改异常解决。
      缺:
    • 插入异常
    • 删除异常
      在这里插入图片描述

    第三范式(3NF)

    在2NF基础上消除非主属性对码的传递函数依赖

    • 传递函数依赖:设X,Y,ZX,Y,Z是关系RR中互不相同的属性集合,存在XY(Y!X),YZ(YXZY)X→Y(Y !→X),Y→Z(如果Y依赖于X,Z又依赖于Y),则称ZZ传递函数依赖XX

    对于原学生表,主码为学号,主属性为学号,非主属性为姓名、系名和系主任。因为 学号 → 系名,同时系名 → 系主任,所以存在非主属性系主任对于码学号的传递函数依赖,所以学生表的设计,继续拆分修改使其满足3NF的要求:
    在这里插入图片描述

    优缺点

    • 优点
      基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题,作为数据库设计人员,至少应该知道,3NF的要求是怎样的。
    • 缺点
      查询耗时间,可能要查好几张表。

    BCNF范式(3NF的改进形式)

    BCNF条件

    1.所有非主属性对每一个码都是完全函数依赖。
    2.所有的主属性对每一个不包含它的码,也是完全函数依赖。
    3.没有任何属性完全函数依赖于非码的任何一组属性。

    为什么引入BCNF

    下面看看这样一个问题,假设仓库管理关系表(仓库号,存储物品号,管理员号,数量),满足一个管理员只在一个仓库工作;一个仓库可以存储多种物品,则存在如下关系:
    ()()(仓库号,存储物品号)\rightarrow(管理员号,数量)

    ()()(管理员号,存储物品号)\rightarrow(仓库号,数量)

    {:()():,, \left\{ \begin{aligned} &码:(仓库号,存储物品号)(管理员号,存储物品号)\\ &主属性:仓库名,管理员,物品名\\ &非主属性:数量 \end{aligned} \right.
    https://img-blog.csdnimg.cn/20200328095809258.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpdXlpbWluZzIwMTk=,size_16,color_FFFFFF,t_70]#pic_center)
    (仓库号,存储物品号)和(管理员号,存储物品号)都是仓库管理关系表的候选码,表中唯一非关键字段为数量,此关系模式已经属于了 3NF,那么这个关系模式是否存在问题呢?我们来看以下几种操作:

    • 插入异常:新增加一个仓库,但尚未存放任何物品,无法为该仓库指派管理员——物品名也是主属性,根据实体完整性的要求,主属性不能为空
    • 删除异常:某仓库被清空后,需要删除所有与这个仓库相关的物品存放记录——仓库本身与管理员的信息也被随之删除
    • 更新异常:如果某仓库更换了管理员,这个仓库有几条物品存放记录,就要修改多少次管理员信息。

    解决方法

    我们可以得出结论,在某些特殊情况下,即使关系模式符合 3NF 的要求,仍然存在着插入异常,修改异常与删除异常的问题,仍然不是 ”好“ 的设计。这是由于存在如下决定关系:
    {()()()() \left\{ \begin{aligned} &(仓库号)\rightarrow(管理员号)\\ &(管理员号)\rightarrow(仓库号)\\ \end{aligned} \right.

    关键字段决定关键字段的情况。把仓库管理关系表分解为两个关系表仓库管理表(仓库号,管理员号)和仓库表(仓库号,存储物品号,数量),这样这个数据库表是符合BCNF的,并消除了删除异常、插入异常和更新异常。

    第四范式(4NF)

    限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。下面介绍几个概念:

    相关概念介绍

    多值依赖

    • 多值依赖定义:
      设R(U)是一个属性集U上的一个关系模式, X、 Y和Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖 X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关,如下,任意调换β\betaRαβR-\alpha-\beta皆满足
      在这里插入图片描述

    • 判定方法:
      对于任意关系中,如果存在两个元组(就是行),记为A,B,如果他们的某一属性X的值相等,那么我们交换它们另外的属性Y的值后,得到的新的两个元组,在表中是可以在原来的表中找到与它们相匹配的元组的。
      如:
      在这里插入图片描述
      我们可以找到第一和第四行,它们的属性X=物理是相同的,当我们交换Y=教员属性后得到(物理,王军,普通物理学)和(物理,李勇,普通物理学),与原来的表相比,是一毛一样的。我们也可以交换第三行和第四行,得到(物理,王军,物理习题集)和(物理,李勇,普通物理学),与原来表相比,我们还是能找到与它们相匹配的元组的。

    Teaching模式中存在的问题

    Teach具有唯一候选码(C,T,B), 即全码
    (1)数据冗余度大:有多少名任课教师,参考书就要存储多少次
    (2)插入操作复杂:当某一课程增加一名任课教师时,该课程有多少本参照书,就必须插入多少个元组
    (3) 删除操作复杂:某一门课要去掉一本参考书,该课程有多少名教师,就必须删除多少个元组
    (4) 修改操作复杂:某一门课要修改一本参考书,该课程有多少名教师,就必须修改多少个元组
    产生原因: 存在多值依赖

    平凡函数依赖和非平凡的函数依赖

    平凡函数依赖:当关系中属性集合Y是属性集合X的子集时(YX),存在函数依赖X→Y,即一组属性函数决定它的所有子集,这种函数依赖。

    多值依赖与函数依赖的区别

    1)若函数依赖X→Y在R(U)上成立,则对于任何Y’ 属于Y均有X→Y’ 成立(一对一)。
    2)多值依赖X→→Y若在R(U)上成立,不能断言对于任何Y’ 属于Y有X→→Y’ 成立,因为多值依赖中,其实就是一对一组,一个老师可能教多门课,不同老师可能有教相同的课,所以不能推出X→→Y’ 成立。
    3)把一组改为一个,实际上就是函数依赖,所以说函数依赖是多值依赖的特例,多值依赖不一定是函数依赖,但函数依赖一定是多值依赖。

    了解4NF

    1)消除非平凡且非函数依赖的多值依赖
    2)函数依赖是4NF
    3)平凡的多值依赖是4NF

    Point

    • 4NF所允许的非平凡多值依赖实际上是函数依赖。
    • 当一个表中的非主属性互相独立时(3NF),这些非主属性不应该有多值

    总结

    • 一范式:原子性。

    • 二范式:非主属性不存在部分函数依赖。

    • 三范式:非主属性不存在传递函数依赖。

    • BCNF范式:主属性对不包含它的码,不存在部分函数依赖。

    • 四范式:不允许有非平凡且非函数依赖的多值依赖

    • 更多学习链接(可以康康的资料):
      六大范式详解
      数据库中的范式和多值依赖

    展开全文
  • 5.Sql中如何判断是否为null?6.Sql中模糊查询怎么写?7.having和where的区别?8.常用的聚合函数有哪些?9.左外连接和右外连接的区别?10.Rowid和Rownum的区别?11.Oracle中分页如何实现?Mysql中...

    面试是进入一家公司的门槛,每一个求职者都需要经历,但是最苦逼最头疼的就是面试题,我帮大家整理了一些数据库部分的面试题,希望对你们有所帮助。整理不易,感谢支持!

    1.三大范式?

    ①.第一范式的目标是确保每列的原子性,如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)
    ②.第二范式的要求在满足第一范式的基础上,每个表只描述一件事情(2NF)
    ③.第三范式要求表中各列必须和主键依赖相关,不能间接依赖(3NF)
    在开发中,有时候会违反第三范式增加冗余字段往往为了实现单表查询,规避多表查询带来的效率低的问题。
    选择使用冗余字段的两个标准
    A、往往用来查询显示频率比较高的字段。
    B、冗余字段读的概率大于写的概率。

    2.RBAC模型是什么?(权限模块的理论基础)

    RBAC:基于角色的权限访问控制(Role-Based Access Control)
    ①.RBAC是一套成熟的权限模型。在传统权限模型中,我们直接把权限赋予用户。而在RBAC中,增加了“角色”的概念,我们首先把权限赋予角色,再把角色赋予用户。这样,由于增加了角色,授权会更加灵活方便。
    ②.在RBAC中,根据权限的复杂程度,又可分为RBAC0、RBAC1、RBAC2、RBAC3。其中,RBAC0是基础,RBAC1、RBAC2、RBAC3都是以RBAC0为基础的升级。我们可以根据自家产品权限的复杂程度,选取适合的权限模型。
    在这里插入图片描述
    RBAC模型表设计示例:

    t_user (id,角色ID,用户名,用户密码)—用户表
    u001 r001 (u001拥有会员角色)
    u002 r002 (u002拥有商家角色)

    用户-角色表(id,用户ID,角色ID)
    t_role(id,角色名称)—角色表
    r001 会员角色
    r002 商家角色
    项目中角色的往往来源于这个用户在这个组织中职位(例如:张三在某个局是局长,系统就会有个局长的角色)

    t_menu(id, 菜单名称,菜单URL)—菜单表
    m001 订单查看 http://IP:端口/orders
    m002 商品管理 http://IP:端口/goods

    t_auth(id,角色ID,菜单ID)—角色-菜单-表
    a001 r001 m001 (会员角色拥有订单查看菜单的权限)
    a002 r002 m002(商家角色拥有商品管理菜单的权限)

    表命名规则
    t_模块名_XXXXX
    例如:t_sys_user,t_sys_menu, t_sys_role,t_sys_auth
    字段命名规则
    1、单词小写,单词与单词之间一般用“_”分割;
    2、命名的时候尽可能英文,实在没法翻译就用拼音的缩写,例如:ykq(遥控器的拼音的缩写);
    3、字段的备注要有;
    4、增加4个字段create_user(创建者—Insert使用),create_date(创建时间—Insert使用),modify_user(修改者—Update使用),modify_date(修改时间—Update使用) ,目的想知道这行数据谁什么时间创建的,谁什么时间最后修改的,便于数据的追溯;
    5、同样含义的字段名称要一致。

    3.Truncate和Delete的区别是?

    区别1:delete逐条删除,truncate整个表截断即删除表中所有记录。(当确定一张表的数据不再使用,应该使用truncate)
    区别2:最根本的区别是:delete是DML(数据操纵语言,可以回滚)truncate是DDL(数据定义语言,不可以回滚)
    区别3:Delete需要事务删除大量数据的时候速度慢,Truncate不需要事务,删除大量数据快
    区别4:Delete不会释放空间,truncate会
    区别5:delete会产生碎片,truncate不会。

    4.Sql中去重的关键字是什么?

    在select语句中,可以使用distinct关键字删除重复的行。

    5.Sql中如何判断是否为null?

    使用where子句判断where 列名 is null

    6.Sql中模糊查询怎么写?

    可以在where子句中使用like运算符。
    (不答)下划线(_):表示匹配某个位置的字符(模糊查询不用下划线)。
    (模糊查询只用%)百分号(%):表示在某个位置的任意个字符。
    模糊查询:当数据量比较大的时候,针对于模糊查询需要采用类似搜索引擎技术进行实现,例如Elasticsearch或者solr,优先选择Elasticsearch(简称ES)。

    7.having和where的区别?

    1.Where 子句是用来指定 “行” 的条件的,对from的数据进行筛选,而Having 子句是指定 “组” 的条件的,对分组后的数据进行筛选。
    2.不能在where子句中使用聚合函数,可以在having中使用聚合函数。
    3.Having子句不能离开group by子句单独使用,where比having效率更高。
    扩展:
    1.Group by 和Order by 后面的字段,一般是大范围向小范围过渡。
    例如:省—》城市—》县(区)。
    2.数据筛选顺序:From—>Where—>Group by—>Having

    8.常用的聚合函数有哪些?

    AVG(x):返回x的平均值
    COUNT(x):返回统计的行数
    MAX(x):返回x的最大值
    MIN(x):返回x的最小值
    SUM(x):返回x的总计值
    聚合函数可以用在group by 、having、order by后面,不能用在where后面。

    9.左外连接和右外连接的区别?

    a.左外链接,以左表为参照,显示所有数据;左边有的,右边没有的,右边的为null。
    b.右外链接,以右表为参照,显示所有数据;左边没有的,右边有的,左边的为null。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    扩展补充
    ①.一定要有主表和从表这个概念,分清那张是主表,哪张是从表。
    ②.把你想查询基础表当成左表。想把谁全部都查询出来就当成主表。
    到底哪张是主表哪张是从表?最终还看你的需求。
    ③.一般我们把主表放在左边,使用左外连接。
    ④.一般情况下,我们就用左连接就行了。

    10.Rowid和Rownum的区别?

    ROWID(记录编号):是用来唯一标识表中的一条记录,并且间接给出了表行的物理位置,定位表行最快的方式,是唯一的,使用insert语句插入数据时,oracle会自动生成rowid并将其值与表数据一起存放到表行中。
    ROWNUM(行号):是在查询操作时由ORACLE为每一行记录自动生成的一个编号。rownum不是表中原本的数据,每一次查询ROWNUM都会重新生成。(查询的结果中Oracle给你增加的一个编号,根据结果来重新生成)。
    ROWNUM永远按照默认的顺序生成。(不受order by的影响)
    rowid 用于定位数据表中某条数据的位置,是唯一的、也不会改变。(面试背)
    rownum 表示查询某条记录在整个结果集中的位置, 同一条记录查询条件不同对应的 rownum 是不同的而 rowid 是不会变的。(面试背)
    扩展:
    1、主键命名要么id要么表名_id;
    2、主键的值要么是UUID(32位全球唯一码),要么自增型的数字;
    3、java中UUID.randomUUID()生成uuid是36位的,需要去掉-,成为32位。
    UUID.randomUUID().toString().replaceAll("-", “”)
    4、oracle中select sys_guid() from dual;

    11.Oracle中分页如何实现?Mysql中分页如何实现?

    使用分页目的:是为了避免将大量的数据返回给用户。
    Oracle 中使用 rownum 来进行分页, 这个是效率最好的分页方法。从1开始
    select * from(select a.*,rownum rn from (select * from TABLENAME) a where rownum <=end ) where rn >= begin;
    Select * from (select rownum rn,字段1,字段2 from 表名) t where t.rn>=某页开始行数 and t.rn <=某一页结束的行数
    Mysql使用limit的关键字可以实现分页。从0开始
    select * from TABLENAME limit start , end;

    12.Oracle的索引有哪些?

    B树——默认的索引类型,平衡树索引,适用于高基数(不同值的程度高)的列。除非有特殊原因需要使用不同的索引类型或功能,否则用正常的B树索引即可
    唯一索引——B树索引的一种形式,用于强制执行列值的唯一性.经常与主键和唯一键约束一起使用,但也可以独立于约束而创建
    位图索引——对于包含低基数列(存储数据少的列,比如性别列)以及在SQL语句的WHERE子句中使用许多AND或OR运算符的数据仓库环境,非常适合使用这种索引,只做查询和分析。
    函数索引——适用于应用了SQL函数的列。可与B树索引类型或位图索引类型结合使用,避免索引失效建立的函数索引。
    索引说明
    在这里插入图片描述
    1.索引的内容是oracle数据库自己维护的,他会根据索引字段自动进行分组排列,将其rowid(地址)存储起来。
    2.通过条件查询,oracle会自动拿条件的字段,自动搜索有没有这个字段的索引,如果有,那么先从索引中寻找符合条件的值的一组地址,将其拿出来,然后根据地址,直接到数据库获取数据。(表只需要扫描有限次,大大提升了效率。)
    3.上面索引的数据结构类似Map(key=部门编号,value=List<rowid1,rowid2,rowid3…rowidn>)。
    4.当索引列使用了函数或者在like “%输入条件%”,会造成索引失效!!

    13.视图和表的区别?

    ①.视图是基于已知的一张或多张表的查询,一个视图可以对应一个基本表,也可以对应多个基本表
    ②.视图是虚拟的内存表,视图实际并不存储数据,表是物理存在的,数据存储实际是存储在表中
    ③.查询视图与查询普通表的查询方式是一样的,使用视图修改数据会有许多限制,一般在实际开发中视图仅用作查询

    14.横纵表的区别?

    纵表和横表的概念,纵表方便数据的存储(字典表),横表方便数据的展示;
    ①.横表
    优点
    :一行表示了一个实体记录,清晰可见,一目了然。
    缺点:如果现在要给这个表加一个字段,那么就必须重建表结构。
    ②.纵表
    优点:如果现在要给这个表加一个字段,只需要添加一些记录。
    缺点:数据描述不是很清晰,而且会造成数据库数据很多。另如果需要分组统计,要先group by,较繁琐。
    ③.结论 :应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。

    扩展补充
    create table SCORE_VERTICAL
    (
    student_name VARCHAR2(20),
    subject VARCHAR2(20),
    score NUMBER
    );

    insert into SCORE_VERTICAL (student_name, subject, score)
    values (‘张三’, ‘语文’, 78);
    insert into SCORE_VERTICAL (student_name, subject, score)
    values (‘张三’, ‘数学’, 80);
    insert into SCORE_VERTICAL (student_name, subject, score)
    values (‘李四’, ‘语文’, 67);
    insert into SCORE_VERTICAL (student_name, subject, score)
    values (‘李四’, ‘英语’, 90);
    insert into SCORE_VERTICAL (student_name, subject, score)
    values (‘王五’, ‘数学’, 100);
    insert into SCORE_VERTICAL (student_name, subject, score)
    values (‘王五’, ‘英语’, 80);

    将纵表数据转换成横表的显示
    select
    s.student_name,
    sum(case s.subject when ‘语文’ then s.score end) as 语文,
    sum(case s.subject when ‘数学’ then s.score end) as 数学,
    sum(case s.subject when ‘英语’ then s.score end) as 英语
    from score_vertical s
    group by s.student_name;
    结果
    在这里插入图片描述
    在这里插入图片描述
    调SQL注意事项
    1、先梳理清楚数据的来源,来源于哪几个表
    2、编写SQL。
    3、验证查询的数据对不对?
    4、出现问题,看看SQL的问题,数据也可能存在问题。

    15.数据库级联删除?

    当数据库中的表,有存在主子表关系的时候:
    No Action:如果子表有对应记录,主表不能删除。
    Cascade:如果子表有对应记录,主表删除时候,会连带把子表的记录删除掉。
    Set null:如果子表有对应记录,主表删除时候,会连带把子表的外键置为NULL。

    16.union all和union的区别?

    union all:两个以上表连接查询不去重不排序。
    union:两个以上表连接查询去重,排序。

    17.事物的特点ACID?

    原子性(atomicity):事务是一个完整的操作,事务的各步操作是不可分的(原子的),要么都执行,要么都不执行。比如银行转账,转出跟转入这两个包含在一个事务里的动作就是原子的。要么不转出也不转入,转出了就要转入。
    一致性(consistency):在事务处理执行前后,数据必须处于一致状态。比如转账前与转账后两人存款的总和始终不变。
    隔离性(isolcation):并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务。比如转账,代码怎么写?就两行代码,是先转出扣钱,再转入加钱。两行代码中间,也就是转出之后,转入之前,此时数据是不一致的。那怎样始终保证数据一致?那就用一个类似自欺欺人的办法,让转账这个事务在完成之前对别人都不可见,事务完成之前别人看到的都是转账前的状态,看不到转账步骤中间不一致的状态,所谓”隔离”。
    持续性(durability):事务处理的效果能够被永久保存下来。就像钱转给别人后当前这比转账交易就结束了,不可能再倒回来。
    事务的总结
    最初,为了保证数据的完整性—》于是,数据库提供了事务功能—》但是,在实际中,事务的并发执行又产生了脏读、不可重复读、幻读的问题—》于是,数据库又采用事务隔离级别在不同程度上解决并发产生的问题。

    18.Oracle的存储过程如何创建(定义,优点,语法)?

    存储过程(Stored Procedure )是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数**(如果该存储过程带有参数)来执行它。
    优点**:
    (1)允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。
    (2)允许更快执行,如果某操作需要执行大量 SQL 语句或重复执行,存储过程比 SQL 语句执行的要快。
    (3)减少网络流量,例如一个需要数百行的 SQL 代码的操作由一条执行语句完成,不需要在网络中发送数百行代码。
    (4)更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。
    存储过程创建语法
    Create or replace procedure XXX (参数1,参数2) as 声明变量
    Begin
    查询
    Exception
    异常处理
    End;

    19.存储过程和函数的区别?

    ①.函数必须有返回值,而过程没有。
    ②.函数可以单独执行,而过程必须通过 call,execute 执行。
    ③.函数可以嵌入到 SQL 语句中执行,而过程不行。
    扩展补充
    如何选择存储过程和存储函数?
    原则上,如果只有一个返回值,用存储函数,否则,就用存储过程。
    但是,一般我们会直接选择使用存储过程,原因是:
    ①.函数是必须有返回值,存储可以有也可以没有,存储的更灵活!
    ②.既然存储也可以有输出参数,可以代替存储函数。.
    ③.Oracle的新版本中,已经不推荐使用存储函数了。

    20.如何使用Oracle的游标?

    ①.Oracle 中的游标分为显示游标和隐式游标
    ②.显示游标是用 cursor…is 命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理;
    ③.隐式游标是在执行插入 (insert)、删除(delete)、修改(update) 和返回单条记录的查询(select)语句时由 PL/SQL 自动定义的。
    ④.显式游标的操作:定义游标、打开游标、操作游标、关闭游标;隐式游标的操作PL/SQL 隐式地打开 SQL 游标,并在它内部处理 SQL语句,然后关闭它。

    21.触发器的定义,语法,作用?

    定义
    触发器是指被隐含执行的存储过程,通常用的针对于Insert、Delete、Update之类的DML触发器。在进行特定的增删改操作时触发触发器。
    语句级触发器和行级触发器区别
    1.在语法上:
    行级触发器就多了一句话:for each row
    2.在表现上
    行级触发器,在每一行的数据进行操作的时候都会触发。
    语句级触发器,对表的一个完整操作才会触发一次。
    简单的说:行级触发器,是对应行操作的;语句级触发器,是对应表操作的。

    语法
    create [or replace] trigger 触发器名 触发时间 触发事件
    on 表名
    [for each row]
    begin
    pl/sql语句
    End

    作用
    1.数据确认;
    2.实施复杂的安全性检查;
    3.做审计,跟踪表上所做的数据操作等;
    4.数据的备份和同步。
    (备份:在删除时,触发触发器。创建一个新的表将要删除的数据先插入这个新表中,然后再删除数据)

    触发器注意事项
    ①.触发器会引起锁,降低效率!使用时要慎重。如无必要,尽量不要使用触发器。
    ②.行级触发器会引发行级锁(锁行数据)
    ③.语句级触发器可能会引起表级锁(锁表)

    22.如何进行数据库的优化?

    从三个方面解答即可:
    1、合理的数据库设计;
    2、索引的使用;
    3、SQL语句的调优
    具体如下

    1、合理的数据库设计(优化的根本)
    要点1:合理数据库设计非常重要,好的设计对优化很重要,采用第1,2,3范式进行数据库的设计。
    要点2:对比较频繁的数据表关联查询应适当提高数据冗余设计(违反了范式要求,但利大于弊)。
    要点3:通过复杂计算的列,在存储就计算好存放。例如:存放语文,数学,英语成绩时,在insert时候,顺带把三个科目的总分存进去。
    要点4:把频繁被访问的数据同较少被访问的数据分开存储(分库实现,读写分离)。

    2、索引的使用
    要点1:索引是改进查询性能的最简单、最有效的方法,尤其是当您总是对几个关键字字段进行搜索时,这种方法最合适。
    要点2:索引并不是越多越好,索引固然可以提高相应的select 的效率,但同时也降低了insert 及update 的效率,因为insert 或update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
    要点3:WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描。
    要点4:分离表和索引。

    3、SQL语句的调优
    要点1:在FROM子句中包含几个表的情况下,记录少的放在右边,如果是三个以上的表,交叉表放在右边。
    要点2:可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
    要点3:SELECT子句中避免使用*。
    要点4:减少访问数据库的次数,尽量sql一次读取数据,避免多次读取。
    要点5:使用DECODE减少处理时间。
    要点6:用Where子句替换HAVING子句
    要点7:含有子查询的SQL语句中,要特别注意减少对表的查询
    要点8:使用表的别名(Alias)

    4、其他优化策略
    要点1:尽量多使用COMMIT
    要点2:用TRUNCATE替代DELETE

    23.MyISAM和InnoDB的区别?

    MyISAM:不需事务,不支持数据行锁定和外键约束,空间小,以查询访问为主
    InnoDB:多删除、更新操作,安全性高,事务处理及并发控制

    24.MySQL的索引有哪些?

    从用途上可分为
    普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点;
    唯一索引
    :索引列中的值必须是唯一的,但是允许为空值;
    主键索引:是一种特殊的唯一索引,不允许有空值。(主键约束,就是一个主键索引)
    组合索引
    :在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。例如,这里由id、name和age3个字段构成的索引,索引行中就按id/name/age的顺序存放,索引可以索引下面字段组合(id,name,age)、(id,name)或者(id)。如果要查询的字段不构成索引最左面的前缀,那么就不会是用索引,比如,age或者(name,age)组合就不会使用索引查询。
    全文索引:只有在MyISAM引擎上才能使用,只能在char,varchar,text
    类型字段上使用全文索引,介绍了要求,说说什么是全文索引,就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行,比如有"你是个大学生,程序员 …" 通过大学生,可能就可以找到该条记录。(可以认为保存的是一篇文章,在这篇文章中查询关键字)

    25.原生的JDBC开发的步骤?

    1:Class.forName()加载数据库连接驱动;
    2:DriverManager.getConnection()获取数据连接对象;
    3:使用Statement、PreparedStatement 根据SQL获取sql会话对象。
    4:执行SQL处理结果集,执行SQL前如果有参数值就设置参数setXXX();
    5:关闭结果集、关闭会话、关闭连接。
    JDBC在开发过程中,容易犯的问题就是生成SQL有问题,通过查看生成的SQL,来修复问题。

    26.为什么使用PreparedStatement?

    1.最重要的一点是极大地提高了安全性。比如Statement容易被SQL注入(只是安全中的一方面),而 PreparedStatement传入的内容不会和sql语句发生任何匹配关系。
    2.PreparedStatement尽最大可能提高性能。DB有缓存机制,相同的预编译语句再次被调用不会再次需要编译,所以其执行速度要快于 Statement 对象。
    3.提高了代码的可读性和可维护性。Statement需要不断地拼接,而 PreparedStatement不会。
    补充

    1.对sql进行预编译处理,sql的格式固定。可以放置预编译。
    2.PrepareStatment 进行了预编译的处理,当下次执行相同格式的sql的时候,sql不会在进行编译。比statement的效率高。
    3.statement每执行一次sql进行一次编译。
    项目中原始生JDBC开发优先使用PrepareStatment!!!

    27.关系数据库中连接池的机制是什么?

    前提:为数据库连接建立一个缓冲池(缓存Connection对象、缓存Statement及PreparedStatement)。
    1.从连接池获取或创建可用连接
    2.使用完毕之后,把连接返回给连接池
    3.在系统关闭前,断开所有连接并释放连接占用的系统资源
    (能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值。)
    (为了复用连接,代替传统的频繁占用系统资源和耗费时间的方式)

    28.什么是Dao模式?

    Dao模式极简介绍
    封装了对单表的增删改查。
    Dao模式的组成部分
    1.实体类
    2.Dao接口
    3.Dao实现类
    4.Dao实现类的父类(BaseDao)

    29.说说你对3层架构的理解?

    表示层(H5、CSS、JSP):主要负责获得数据以及为用户展现数据
    业务逻辑层:(Service,将相关的Dao作为其属性成员,封装了对多表的增删改查,需要事务)
    数据访问层:(Dao)

    展开全文
  • 读写分离如何实现当我们的数据量很大时,数据库服务器的压力变大,这时候我们需要从架构方面来解决这一问题,在一个网站读的操作很多,写的操作很少,这时候我们需要配置读写分离,把读操作和写操作分离出来,最大...
  • 函数依赖的部分函数依赖、完全函数依赖、传递函数依赖;对给定的实际问题可以确定函数依赖;掌握码的定义,对实际问题可以确定码;掌握1NF,2NF,3NF,BCNF的定义ÿ...
  • 前言 Redis是企业级系统高并发、高可用架构非常重要的一个环节。Redis主要解决了关系型数据库并发量低的问题,有助于缓解关系型数据库在高...1. 数据库范式判断、E-R图 2. innodb和myisam存储引擎的区别 3. 索
  • Mysql校招、实习常见面试题总结1(较基础)

    千次阅读 多人点赞 2020-04-30 02:26:35
    2.数据库的三范式是什么? 第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要 求,否则,将有很多基本操作在这样的关系...
  • 该章主要学习了如何判断一个数据库模式的优劣程度,或者说为设计关系模式做一些理论参考 1、范式涉及的参数1.1 关系模式复习1.2 数据依赖1.2.1 函数依赖1.2.2 多值依赖1.3 码 1、范式涉及的参数 1.1 关系模式复习 ...
  • 3.2.6 IP地址如何数据库中存储? 3.2.7 new/delete和malloc/free的底层实现? 3.2.8 overload、override、overwrite的介绍? 3.2.9 小端/大端机器? 3.3.0 守护进程 3.3.1 多线程的优缺点 3.3.2 长连接与短连接 ...
  • 【基础】Java中如何实现序列化,有什么意义? 34 【WEB】session与cookie的区别与联系;session的生命周期 34 session与cookie的区别与联系 34 session的生命周期 35 【WEB】servlet 生命周期 35 【WEB】阐述JDBC...
  • php网络开发完全手册

    热门讨论 2009-03-02 13:17:26
    16.2 数据库中的程序逻辑与数据的关系 262 16.3 存储过程的设计 263 16.3.1 定界符重定义 263 16.3.2 存储过程的创建与调用 264 16.3.3 存储过程的参数 265 16.3.4 复合语句 267 16.3.5 变量 268 16.3.6 条件语句 ...
  • 15、jquery中如何操作样式的? 28 16、如何设置和获取HTML和文本的值? 28 17、Jquery能做些什么? 28 18、在ajax中data主要有哪几种? 28 19、jQuery中ajax由几部分组成? 28 20、js和jQuery获取value值得区别 29 ...
  • java面试题

    2018-04-27 19:55:38
    答:声明式的事务管理主要是将在进行对数据库中数据的添加或者修改时需要执行事务管理,主要是为了避免在执行添加或修改的时候添加或修改不完全正确,导致数据丢失。spring使用AOP面向切面的思想进行事务管理的。 ...
  • asp.net知识库

    2015-06-18 08:45:45
    如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件的中文编码问题的小工具 慎用const关键字 装箱,拆箱以及反射 动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/...
  • 8.4.3 数据库具体设计工作的技巧 136 8.5 规范化 137 8.5.1 起点 137 8.5.2 第一范式 138 8.5.3 第二范式 139 8.5.4 第三范式 140 8.5.5 规范化理论 141 8.6 层次关系的处理 143 8.6.1 层次关系的处理...
  • 13.5 数据库中的.NET 358 13.6 本章小结 358 13.7 练习 358 第14章 事务和锁 359 14.1 事务 359 14.1.1 BEGIN TRAN 360 14.1.2 COMMIT TRAN 360 14.1.3 ROLLBACK TRAN 361 14.1.4 SAVE TRAN 361 14.2 SQL ...
  • Powerbuilder9.0实用教程源代码

    千次下载 热门讨论 2004-01-16 00:00:00
    3.3.1 向数据库中添加数据表 82 3.3.2 编辑数据表属性 84 3.3.3 为数据表指定主键、外键和索引 87 3.3.4 浏览数据表 90 3.3.5 插入、修改和更新记录 91 3.3.6 为数据表创建视图 92 3.4 创建查询 94 3.4.1 ...
  • 7.12.1MySQL如何判断缓存命中309 7.12.2查询缓存如何使用内存311 7.12.3什么情况下查询缓存能发挥作用313 7.12.4如何配置和维护查询缓存316 7.12.5InnoDB和查询缓存319 7.12.6通用查询缓存优化320 7.12.7查询...
  • C++程序员面试宝典

    热门讨论 2013-04-01 13:36:19
    面试题104 在C++中如何实现多态 109 第10章 继承(教学视频:44分钟) 113 10.1 继承 113 面试题105 派生类与基类的转换 113 面试题106 什么是虚成员?有什么作用 115 面试题107 构造函数与析构函数的调用时机 116 ...
  • Java语言基础下载

    热门讨论 2010-09-07 21:56:38
    数据库三个范式 280 范式总结 282 创建数据库 283 创建表 287 内容总结 290 独立实践 291 第十七章: 数据库(二) 292 学习目标: 292 查询(从基本到高级) 293 模糊查询 293 排序 295 集合操作-并 296 集合操作-交 ...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...
  • Java面试宝典2010版

    2011-06-27 09:48:27
    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户。...
  • Java面试宝典-经典

    2015-03-28 21:44:36
    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...
  • Java面试宝典2012版

    2012-12-03 21:57:42
    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...
  • java面试宝典2012

    2012-12-16 20:43:41
    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 117 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...
  • 18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...
  • Java面试笔试资料大全

    热门讨论 2011-07-22 14:33:56
    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...
  • Java面试宝典2012新版

    2012-06-26 19:20:00
    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

数据库中如何判断范式