zoukankan      html  css  js  c++  java
  • 面试知识点总结之数据库

      1、sqlserver用exec调用存储过程

          mysql和oracle用call调用存储过程,不能省略参数,但是可以用null来代替

    2、关于触发器

    A、 触发程序与表相关,当对表执行INSERT、DELETE或UPDATE语句时,将激活触发程序。可以将
    触发程序设置为在执行语句之前或之后激活。例如,可以在从表中删除每一行之前,或在更新了

    要想创建触发程序或舍弃触发程序,可使用CREATE TRIGGER或DROP TRIGGER语句
     

    B、触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL

    (允许存储程序通过参数将数据返回触发程序)。
     

    C、使用OLD和NEW关键字,能够访问受触发程序影响的行中的列(OLD和NEW不区分大小写)。
    在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用
    OLD.col_name,没有新行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一

    行的列,也能使用NEW.col_name来引用更新后的行中的列。
     
    D、 触发程序不能使用以显式或隐式方式开始或结束事务的语句,如START TRANSACTION、
    COMMIT或ROLLBACK。
    在MySQL中,下列关于触发机器的描述正确的是()

    正确答案: A C    

    A、MySQL的触发器只支持行级出发,不支持语句级触发
    B、触发器可以调用将数据返回客户端的存储程序
    C、在MySQL中,使用new和old引用触发器中发生的记录内容
    D、在触发器中可以使用显示或者隐式方式开始或结束事务的语句

    3、索引关键字的选取原则

    1、  表的某个字段值得离散度越高,该字段越适合选作索引的关键字。主键字段以及唯一性约束字段适合选作索引的关键字,原因就是这些字段的值非常离散。尤其是在主键字段创建索引时,cardinality(基数,集的势)的值就等于该表的行数。MySQL在处理主键约束以及唯一性约束时,考虑周全。数据库用户创建主键约束的同时,MySQL自动创建主索引(primary index),且索引名称为Primary;数据库用户创建唯一性索引时,MySQL自动创建唯一性索引(unique index),默认情况下,索引名为唯一性索引的字段名。

    2、  占用存储空间少的字段更适合选作索引的关键字。例如,与字符串相比,整数字段占用的存储空间较少,因此,较为适合选作索引关键字。

    3、  存储空间固定的字段更适合选作索引的关键字。与text类型的字段相比,char类型的字段较为适合选作索引关键字。

    4、  Where子句中经常使用的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引。

    5、  更新频繁的字段不适合创建索引,不会出现在where子句中的字段不应该创建索引。

    6、  最左前缀原则。

    7、  尽量使用前缀索引。

    引入索引的目的就是提高数据的检查效率,因此索引关键字的选择与select语句息息相关。这句话有两个含义:一是,select语句的设计可以决定索引的设计;索引的设计也同样影响着select语句的设计。例如原则1与原则2,可以影响select语句的设计;而select语句中的where子句、group by子句以及,又可以影响索引的设计。两个表的连接字段应该创建索引,外键约束一经创建,MySQL会自动地创建与外键相对应的索引,这是由于外键字段通常是两个表的连接字段。

      复合索引还有一个优点,它通过被称为“最左前缀”(leftmost prefixing)的概念体现出来的。假设向一个表的多个字段(例如fristname、lastname、address)创建复合索引(索引名为fname_lname_address).当where查询条件是以下各种字段的组合是,MySQL将使用fname_lname_address索引。其他情况将无法使用fname_lname_address索引。可以理解:一个复合索引(firstname、lastname、address)等效于(firstname,llastname,age)、(firstname,lastname)以及(firstname)三个索引。基于最做前缀原则,应尽量避免创建重复的索引,例如,创建了fname_lname_address索引后,就无需再first_name子段上单独创建一个索引。

    如果数据库表的存储引擎是MyISAM,那么创建主键的约束的同时,MySQL会自动创建主键索引。如果数据库表的存储引擎是InnoDB,那么创建主键约束的同时,MySQL会自动创建聚簇索引。

      MySQL还支持全文索引(fulltext),当查询数据量大的字符串信息时,使用全文索引可以大幅提升字符串的检索效率。需要注意的是,全文索引只能创建在char、varchar或者text字符串类型的字段上,且全文索引不支持前缀索引。

    &&、数据库三范式

    1.1 第一范式(1NF)无重复的列

          所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。
    说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。 

    1.2 第二范式(2NF)属性完全依赖于主键[消除部分子函数依赖]

          第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。 
            第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键。 

    1.3 第三范式(3NF)属性不依赖于其它非主属性[消除传递依赖]

                满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。 
     
     
    &&、索引类型分类:
    ①主索引:主索引是一种只能在数据库表中建立不能在自由表中建立的索引。在指定的字段或表达式中,主索 引的关键字绝对不允许有重复值。
    ②候选索引:和主索引类似,它的值也 不允许在指定的字段或表达式中重复。一个表中可以有多个 候选索引。
    ③唯一索引:唯一索引允许关键字取重复的值。当有重复值 出现时,索引文件只保存重复值的第1次出现。提供唯一索引主要是为了兼容早期的 版本。
    ④普通索引:普通索引允许关键字段有相同值。在一对 多关系的多方,可以使用普通索引
     
     
    &&、格式应该是:grant [权限] on [table] to 'username'@'localhost';
     
    &&、增加或删除主键的SQL
    表中删除主键为:
    alert table table_test drop primary key;
    表中增加主键为:
    alert table table_test add primary key(id);
     
    &&、数据库引擎MyISAM,InnoDB
    MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用: 

    MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。 

    MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎: 

    · MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。 

    · MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。 

    注释:MEMORY存储引擎正式地被确定为HEAP引擎。 

    · InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。 

    · EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在 MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。 

    · NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中,我们想要添加其它平台对这个引擎的支持,包括Windows。

    · ARCHIVE存储引擎被用来无索引地,非常小地覆盖存储的大量数据。 

    · CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。 

    · BLACKHOLE存储引擎接受但不存储数据,并且检索总是返回一个空集。 

    · FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。

    比较常用的是MyISAM和InnoBD

       

      
      MyISAM 

      
      InnoDB 

      
      构成上的区别: 

      
      每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。

      .frm文件存储表定义。

      数据文件的扩展名为.MYD (MYData)。

      索引文件的扩展名是.MYI (MYIndex)。

      
      基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB
      
      事务处理上方面 : 

      
      MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持

      
      InnoDB提供事务支持事务,外部键(foreign key)等高级数据库功能

      
      SELECT   UPDATE,INSERT ,Delete 操作 
      
      如果执行大量的SELECT,MyISAM是更好的选择

      
      1.如果你的数据执行大量的INSERT 或UPDATE,出于性能方面的考虑,应该使用InnoDB表

      2.DELETE   FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

      3.LOAD   TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用

      
      对AUTO_INCREMENT的操作 

      
      
      每表一个AUTO_INCREMEN列的内部处理。

      MyISAM 为 INSERT 和 UPDATE 操作自动更新这一列。这使得AUTO_INCREMENT列更快(至少10%)。在序列顶的值被删除之后就不能再利用。(当AUTO_INCREMENT列被定义为多列索引的最后一列,可以出现重使用从序列顶部删除的值的情况)。

      AUTO_INCREMENT值可用ALTER TABLE或myisamch来重置

      对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引

      更好和更快的auto_increment处理

      
      如果你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值。

      自动增长计数器仅被存储在主内存中,而不是存在磁盘上

      关于该计算器的算法实现,请参考

      AUTO_INCREMENT 列在 InnoDB 里如何工作 

      
      表的具体行数 
      
      select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含   where条件时,两种表的操作是一样的

      
      InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行

      
      锁 
      
      表锁

      
      提供行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in
       SELECTs),另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表, 例如update table set num=1 where name like “%aaa%”
  • 相关阅读:
    [转]C# 动态调用 WebService
    [转]走进 LINQ 的世界
    [转]mybatis-generator 代码自动生成工具(maven方式)
    [转]Netty入门(最简单的Netty客户端/服务器程序)
    FastJson 常见问题
    初识 ElasticSearch
    Maven Gradle 区别
    IDEA 自动生成serialVersionUID
    restful 架构详解
    初识shell expect
  • 原文地址:https://www.cnblogs.com/boucher/p/5875469.html
Copyright © 2011-2022 走看看