zoukankan      html  css  js  c++  java
  • 数据库常考知识点

    1. 并发控制:

    无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制问题。在处理并发读或者写时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种锁叫做共享锁排他锁。也叫读锁写锁。读锁是共享的,写锁则是排他的。

    锁粒度: 任何时候,在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可。表锁是MySQL中最基本的锁策略,并且是开销最小的策略,它会锁定整张表。行级锁可以最大程度地支持并发处理,同时也带来了最大的锁开销。

    2. 事务

    事务是一组原子性的SQL查询,或者说是一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果有任何一条语句因为崩溃或其他原因无法执行,阿么其他的语句都不会执行。事务内的语句,要么全部执行成功,要么全部执行失败。

    事务的ACID特性:

    原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

    一致性(consistency): 数据库总是从一个一致性的状态转换到另外一个一致性的状态。

    隔离性(isolation):通常来说一个事务所做的修改在最终提交之前,对其他事务是不可见的。

    持久性(durability): 一旦事务提交,则其所作的修改就会永久保存到数据库中。

    3. 隔离级别

    READ UNCOMMITTED(未提交读):事务中的修改,即使没有提交,对其他的事务也是可见的。 事务可以读取未提交的数据,这个称为脏读

    READ COMMITTED(提交读): 大多数数据库系统的默认隔离级别都是READ COMMITTED(但是MySQL不是)。一个事务开始时,只能“看见”已经提交的事务所做的修改。这个级别也叫作不可重复读。因为两次执行同样的查询,可能会得到 不一样的结果。

    REPEATABLE READ:可重复读  解决了脏读的问题。该级别保证了在同一个事务中多次读取同样记录的结果是一致的。但是还是无法解决另一个幻读的问题。幻读是指当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生换行。

    SERIALIZABLE(可串行化): 是最高的隔离机制,他通过事务串行执行,避免了幻读的出现。

    4. 数据库的关系完整性

    关系完整性的用于保证数据库中数据的正确性。系统在进行更新、插入或删除等操作时都要检查数据的完整性,核实其约束条件,即关系模型的完整性规则。在关系模型中有四类完整性约束:实体完整性域完整性参照完整性用户定义的完整性,其中实体完整性和参照完整性约束条件,称为关系的两个不变性。

    实体完整性指表中行的完整性。主要用于保证操作的数据(记录)非空、唯一且不重复。即实体完整性要求每个关系(表)有且仅有一个主键,每一个主键值必须唯一,而且不允许为“空”(NULL)或重复。

    域完整性(Domain Integrity)是指数据库表中的列必须满足某种特定的数据类型或约束。其中约束又包括取值范围、精度等规定。表中的CHECK、FOREIGN KEY 约束和DEFAULT、 NOT NULL定义都属于域完整性的范畴。

    参照完整性(Referential Integrity)属于表间规则。对于永久关系的相关表,在更新、插入或删除记录时,如果只改其一,就会影响数据的完整性。

    用户定义完整性(User-defined Integrity)是对数据表中字段属性的约束,用户定义完整性规则(User-defined integrity)也称域完整性规则。包括字段的值域、字段的类型和字段的有效规则(如小数位数)等约束,是由确定关系结构时所定义的字段的属性决定的。如,百分制成绩的取值范围在0~100之间等。

     5. 常用的命令

         show  status  显示服务器的信息

         show create database   /   show create table   显示创建特定数据库或者表

         show grants   显示授予用用户

         SELECT prod_id,  prod_name,  prod_price   FROM products          // 检索多个列

         SELECT *    FROM    products               检索所有列

         SELECT DISTINCT vend_id FROM products;           //  检索不同的行

         SELECT prod_name FROM products  LIMIT 5        

         SELECT prod_name FROM products ORDER BY prod_name  DESC          对输出按降序排序

         SELECT prod_price FROM products ORERDE BY prod_price DESC LIMIT 1     //   order by  和 limit 组合找出一个列中的最小值或最低值

         SELECT vend_id, prod_name FROM products WHERE vend_id  <>  1003    //  不匹配检查

         SELECT vend_id, prod_name FROM products WHERE prod_price BETWEEN 5 AND 10   // 范围值检查

          通配符进行过滤使用   LIKE,% 表示任何字符出现任意次

          SELECT prod_id, prod_name FROM products  WHERE prod_name LIKE    'jet%'   // 找出所有以jet开头的产品

          LIKEREGEXP的区别:

          LIKE 匹配整个列,  REGEXP 在列值内进行匹配。

          SELECT Concat (vend_name,  '(',  vend_country,  ')' ) FROM vendors  ORDER BY vend_name;   // 将两个列拼接起来     

          聚集函数: 运行在行组上,计算和返回单个值的函数。常用的有: AVG(),   COUNT(),    MAX(),   MIN(),   SUM().

          SELECT AVG(prod_price) AS avg_price  FROM products.     //  AVG()只能用来确定特定数值列的平均值

          

          SELECT vend_id ,  COUNT(*)  AS num_prods  FROM products GROUP BY vend_id  

           WHERE 过滤行,HAVING 过滤分组

          SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id  HAVING COUNT(*) >= 2

           理解数据库的几种种连接。

           连接分为三种:内连接外连接交叉连接

           内连接:  1.   等值连接  概念:在连接条件中使用等于号(=)运算符,其查询结果中列出被连接表中的所有列,包括其中的重复列。

                            2.   在连接条件中使用除等于号之外运算符(>、<、<>、>=、<=、!>和!<)

           外连接:  外连接分为左连接(LEFT JOIN)或左外连接(LEFT OUTER JOIN)、右连接(RIGHT JOIN)或右外连接(RIGHT OUTER JOIN)、全连接(FULL JOIN)或全外连接(FULL OUTER JOIN)。我们就简单的叫:左连接、右连接和全连接。

                            左连接:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。左连接显示左表全部行,和右表与左表相同行。

                            右连接:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

                            全连接:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值

           交叉连接(CROSS JOIN):也称迪卡尔积:不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积(例如:                              T_student和T_class,返回4*4=16条记录),如果带where,返回或显示的是匹配的行数

    6.  数据库的索引问题

               聚集索引非聚集索引的区别:

               聚集索引的顺序就是数据的物理存储顺序,而非聚集索引的解释是索引顺序与数据的物理排列顺序无关。一个表最多只能有一个聚集索引。

                聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到第一个值得行后,便可以确保包含后续索引值的行在物理相邻。

              数据库索引的

    7.   数据库的四大范式

        第一范式(1NF):属性不可拆分 或 无重复的列

            这个简单,就是一个属性不允许再分成多个属性来建立列。事实上,在目前的DBMS中是不可能拆分属性的,因为他们不允许这么做。

        第二范式(2NF):完全函数依赖

           先讲讲什么是部分函数依赖。

           部分函数依赖,就是多个属性决定另一个属性,但事实上,这多个属性是有冗余的。例如,(学号,班级)->姓名,事实上,只需要学号就能决定姓名,因此班级        是冗余的,应该去掉。满足第二范式的数据库设计必须先满足第一范式。因此第二范式的目标就是消除函数依赖关系中左边存在的冗余属性。

         第三范式(3NF):消除传递依赖

           不依赖于其他非主属性(消除传递依赖)。

           满足第三范式的数据库必须先满足第二范式。

           也就是,数据库中的属性依赖仅能依赖于主属性,不存在于其他非主属性的关联。

           例如,图书,图书室的关系。图书包括编号、出版商、页码等信息,图书室包括图书室编号、所存图书(外键)。其中,图书室的表中不应该存储任何图书的具体         信息(例如,出版商。。),而只能通过主键图书编号来获得对应图书的信息。

        BC范式(BCNF):

           (1)所有非主属性对每一个码都是完全函数依赖;

           (2)所有的主属性对于每一个不包含它的码,也是完全函数依赖;

           (3)没有任何属性完全函数依赖于非码的任意一个组合。

            R属于3NF,不一定属于BCNF,如果R属于BCNF,一定属于3NF。

        第四范式(4NF):

           对于每一个X->Y,X都能找到一个候选码( 若关系中的某一属性组的值能唯一地表示一个元组,而其真子集不行,则称该属性组为候选码)。

           最后举个例子(网上的):

    学生表
    学号
    姓名
    教师学生关系编号
    系编号
    爱好编号
    一范式,就是表里的字段不能在划分属性了。
    二范式,满足一范式基础,表里不存在与学号没关系的信息
    三范式,满足二范式的基础上,表里不存在其他字段的关联,
    BC范式,满足三范式的基础上,就是学生表里的每行都不存在重复的信息
    第四范式,满足BC范式,就是连爱好这样字段,也不能出现 ”篮球,足球“;要建立一个爱好编号表,

    插入数据: insert into table values (, , , )




  • 相关阅读:
    Lintcode: Two Strings Are Anagrams
    Leetcode: House Robber
    Leetcode: Binary Tree Right Side View
    Leetcode: Number of Islands
    Lintcode: Subarray Sum
    Lintcode: Sort Letters by Case
    Lintcode: Sort Colors II
    Lintcode: Single Number III
    Lintcode: Search Range in Binary Search Tree
    Lintcode: Binary Tree Serialization (Serialization and Deserialization Of Binary Tree)
  • 原文地址:https://www.cnblogs.com/simplepaul/p/7652379.html
Copyright © 2011-2022 走看看