写了好几天理财的,今天重回技术,写一写数据库,预计三篇,今天第二篇。
6.数据库范式
(1)第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。例如,地址字段,实际上可以拆解成为省市区街道地址的,拆分完成后,无法再次拆分才是满足第一范式的。
(2)第二范式,首先要满足第一范式,每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。可以看下面的例子
订单信息表,其中会出现重复的两条订单数据,后边的客户,所属单位,联系方式都是重复的,需要拆解成子表
拆解后的表,可以看到订单信息表只有一条数据,而且没有重复的信息
image(3)第三范式同样要先满足第一第二范式,另外需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。例如,学生表(学生编号,学生姓名,班级名称,学校名称,学校地址,学校电话),其中后边两个地址和电话和学生不是直接关联的,需要单独拆成学校表。拆解后学生表(学生编号,学生姓名,班级名称,学校编号),学校表(学校编号,学校地址,学校电话)。
7.存储过程与触发器的区别
(1)存储过程,是一段可以重复执行的SQL逻辑代码,通过指定的输入参数(可不输入),按照SQL语句执行具体操作,最终返回指定的输出结果,通过其他存储过程或者EXECUTE方式调用(Java代码中可以使用该方式调用)
(2)触发器,也是一段SQL逻辑代码,但是是由指定的表在特定的操作下触发(例如update,insert等操作时)的执行语句。比较常见的是多个表关联紧密,当删除了某个表的数据,需要同时删除其他关联表的数据,可以使用触发器来操作。
8.什么情况下设置了索引但无法使用
(1)表中数据较少,建立索引无意义,没有全表扫描速度快。
(2)该列数据重复度高,大量的重复数据,因此在该列上建立索引查询时,仍然需要通过全表扫描。
(3)like '%dfdfd'模糊匹配时,注意是前面模糊匹配,后边匹配dfdfd,需要匹配大量数据,无法走索引。当修改为like 'dfdfd%',有可能走索引也可能不走索引,主要看匹配的数据量超过30%则不走索引。
(4)使用OR时候,前后两部分中存在某一部分没有建立索引。
(5)字段存在索引,但条件中使用函数时,例如SUBSTR(COLUMN,2,5) = 'abcde',这种情况不走索引。如果需要走索引要单独建立函数索引。
(6)数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)。
9.什么情况下不宜建立索引?
(1)字典表这种或者数据很少的,几十条数据,建立索引反而慢,因为要多一道手续。
(2)字段重复度极高,往往超过三分之一的重复数据的字段,即使建立索引,也是全表查询。
(3)没有查询意义的字段,不应该建立索引。
(4)另外一个表索引建议在三个以及以下,否则如果查询语句比较多的时候会造成索引冲突,反而不走最佳的索引。
10.解释MySQL外连接、内连接与自连接的区别
(1)内连接,最常用的,关联表直接通过where条件写出的
//第一种写法
select * from taba a INNER JOIN tabb b on a.key1 = b.key1;
//第二种写法,省去了INNER JOIN
select * from taba a,tabb b where a.key1 = b.key1;
(2)外连接,分为左连接(以左表数据为准,例如班级和学生,班级左表,学生右表,有的班级还没有分学生,这样能够把所有的班级的学生查询出来,有的班级即使没有学生也会展示,只是学生部分为null),右连接(以右表数据为准,和左连接反着,实际就是把班级表放右边,学生左表,结果和左连接类似,只是这次以右表为准),全外连接(这个特殊,班级左表,学生右表,存在没有学生的班级,也存在没有分班的学生,查询的结果展示有学生的班级,展示班级和学生;没有学生的班级,学生为null,只展示班级;没有学生的班级,班级为null,只展示学生,这样把所有的数据都展示出来)
//左连接
SELECT * FROM Table_A A LEFT JOIN Table_B B ON A.Key = B.Key;
//右连接
SELECT * FROM Table_A A RIGHT JOIN Table_B B ON A.Key = B.Key;
//全外连接
SELECT * FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key;
(3)自连接,不太常用,就是有时候数据自己与自己关联,比如全班考试,想知道比张三分数高的学生,可以写成一条SQL
//复杂写两次
select a.score from student a where a.name='张三';
//上面SQL得到15分的结果
select a.* from student a where a.socre>15;
//直接捅过自连接写成一条SQL
select b.* from student a,student b
where a.name = '张三' and b.socre>a.score;
谢各位的阅读,谢谢您动动手指点赞,万分感谢各位。另外以下是我之前写过的文章,感兴趣的可以点进去继续阅读。
历史文章
Hadoop系列-入门安装
Hadoop系列-HDFS命令
JAVA面试汇总(五)数据库(一)
JAVA面试汇总(五)数据库(二)
JAVA面试汇总(五)数据库(三)
JAVA面试汇总(四)JVM(一)
JAVA面试汇总(四)JVM(二)
JAVA面试汇总(四)JVM(三)
JAVA面试汇总(三)集合(一)
JAVA面试汇总(三)集合(二)
JAVA面试汇总(三)集合(三)
JAVA面试汇总(三)集合(四)
JAVA面试汇总(二)多线程(一)
JAVA面试汇总(二)多线程(二)
JAVA面试汇总(二)多线程(三)
JAVA面试汇总(二)多线程(四)
JAVA面试汇总(二)多线程(五)
JAVA面试汇总(二)多线程(六)
JAVA面试汇总(二)多线程(七)
JAVA面试汇总(一)Java基础知识
网友评论