掌握数据库知识,轻松学习大数据处理技巧

发表时间: 2024-08-01 09:08

5、数据库的信息:TRUNCATE,DELETE,DROP放在一起比较:

TRUNCATE TABLE:删除内容、释放空间但不删除定义。

DELETE TABLE:删除内容不删除定义,不释放空间。

DROP TABLE:删除内容和定义,释放空间。

注意:TRUNCATE TABLE不能回滚,DELETE TABLE可以回滚,因为DELETE TABLE删除的数据写入到日志中。

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。

但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。 DELETE 语句每次删除一行,

并在事务日志中为所删除的每行记录一项。

TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

6、创建表的sql语句

create table test(表名)(

id(列名) int(类型),

name varchar(25),

sex varchar(4) default '男' //为空时默认为男

);

7、修改表结构(以下都是对oracle数据库的操作):

7.1、添加列:

alter table test(表名)

add

(

age(列名) int(类型),

sex(列名) int(类型)

)

xxx

MySQL添加字段到指定列后面

alter table sms_industry_statistics

add parent_id bigint(20) COMMENT '父级部门ID' AFTER org_id

7.2、修改列定义(列类型):

alter table test(表名)

modify id(列名) varchar(111)(类型)

7.3、删除列

alter table test

drop column sex(列名)

注意:如果改列存在外键约束,要先删除约束,才能删除列

7.4、修改列名

alter table test(表名)

rename column id(老列名) to no(新列名);

7.5、修改表名

alter table test(表名) rename to mytest(新表名)

7.6、删除表

drop table test(表名)

8、truncate 表名 :将表中的所有数据删除,truncate的速度比delete的速度快

9、数据库的约束:

NOT NULL:非空约束,指定某列不能为空

UNIQUE:唯一约束,指定某列或几列组合不能重复

PRIMARY KEY:主键,指定该列的值可以唯一的标识该条记录

FOREIGN KEY:外键,指定该行记录从属于主表中的一条记录,注意用于保证参照完整性

CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。

salary number(5,0) check(salary>0) // 列名 列类型 check(表达式)

10、多列约束和单列约束

多列约束是由多个列组成的约束,如:primary key(name,password);

单列约束是由一列组成的约束,如:primary key(id);

11、添加和删除主键约束

添加主键约束:alter table test(表名) add primary key(id(列名));

删除主键约束: alter table test(表名) drop primary key;

12、添加和删除外键约束

添加外键约束(注意括号):

alter table test1(表名)

add foreign key (tid-主表列名) references test2(表名)(id-从表列名)

删除外键约束:

alter table test1(表名)

drop foreign key tid;

13、在定义外键约束时添加on delete cascade 或 on delete set null

on delete cascade:当主表记录删除时,从表记录也全部删除(根据主表记录删除的id)

on delete set null:当主表记录删除时,从表记录的外键值全部设置为空(根据主表记录删除的id)

14、视图,视图本身是没有数据的,视图相当于一个查询结果集。

15、比较运算符:>,>=,<,<=,=,<>

特殊的比较运算符:between, in ,like ,is null

16、%:代表任意多个字符,

_:代码任意一个字符。

17、逻辑运算符:not ,and ,or

注意:比较运算符的优先级高于逻辑运算符

18、数据库函数

concat函数:连接函数,将多个列的值进行连接

distinct函数:去掉重复的行

avg函数:计算多行的平均值

count函数:计算总条数

max函数:计算多行的最大值

min函数:计算多行的最小值

sum函数:计算多行的总和

19、事务的几大特性:原子性(A)、一致性(C)、隔离性(I)、持续性(持久性)(D)

原子性:事务中所有数据的修改,要么全部执行,要么全部不执行

一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

隔离性:一个事务的执行不能干扰其它事务。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

持续性(持久性):持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

事务的几个动作:创建、提交、回滚、关闭数据库连接

20、数据库的三大范式:

第一范式(1NF):字段具有原子性,不可再分。

第二范式:要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主

关键字或主键。注意:第二范式必须先满足第一范式

第三范式:每一个表都不包含其他表已经包含的非主关键字信息。注意:第三范式必须先满足第二范式

BCNF范式:数据库表中不存在任何字段对任一候选关键字段的传递函数依赖。

1NF:无重复的列(数据库表中的每一列都是不可分割的基本数据项)

2NF:满足1NF且非主键列都完全函数依赖于主键。

3NF:满足2NF且非主属性列都不传递依赖于主键。

BCNF:满足3NF且不允许主键的一部分被另一部分或其它部分所决定(即满足3范式,并且主属性之间没有依赖关系)

21、函数依赖:若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作X → Y 。

官方定义:设一个关系为R(U),X和Y为属性集U上的子集,若对于X上的每个值都有Y上的一个唯一值与之对应,则称X和Y具有函数依赖关系,并称X 函数决定Y,或称Y函数依赖于X,记作X→Y,称X为决定因素。

理解:在一个表中,将所有字段分为两部分X和Y,如果X中的一条数据可以唯一确定Y中的一条数据,则称X和Y具有函数依赖关系,并称为X函数决定Y,或Y函数依赖于X,记为:X一>Y,X 为决定因素

函数依赖的分类:

完全函数依赖

设有关系模式R(U),U是属性集,X和Y是U的子集,如果X→Y是一个函数依赖,且对X的任何一个真子集X'都不存在X'→Y,则称X→Y是一个完全函数依赖(Full Functional Dependency),即Y完全函数依赖于X

即在一张表中字段分为 X 和 Y 两个集合,X集合数据唯一确定一条数据 Y ,X集合字段中的任何一个字段都不能确定唯一一条数据 Y ,就称 Y 完全函数依赖于 X

如:(学号,课程号)——>(成绩)

部分函数依赖

设有关系模式R(U),U是属性集,X和Y是U的子集,如果X→Y是一个函数依赖,且对X的任何一个真子集X'都存在X'→Y,则称X→Y是一个部分函数依赖(Full Functional Dependency),即Y部分函数依赖于X

即在一张表中分为 X 和 Y 集合,X集合数据唯一确定一条数据Y,并且X中任意字段或组合字段都可以唯一确定Y集合数据,则称 Y 部分函数依赖于 X

如:(学号,课程号)——>(姓名) 存在 (学号)——>(姓名)

传递函数依赖

在关系模式R(U)中,设X,Y,Z是U的不同的属性子集,如果X确定Y、Y确定Z,且有X不包含Y,Y不确定X,(X∪Y)∩Z=空集合,则称Z传递函数依赖(transitive functional dependency) 于X。

即在一张表中,字段分为 X、Y、Z,如果X可以决定Y,Y决定Z,但是Y不能决定X,则称Z传递函数依赖于X

平凡函数依赖:若X->Y,且Y是X的子集(对任一关系模式,平凡函数依赖必然成立),就是平凡函数依赖。

如果X决定Y,而且Y属于X,也就是Y是X 的真子集,则称该依赖为平凡依赖;否则为非平凡依赖。

简单的讲,X可以推导出自己活着自己的一部分。

例如:

在学生表(学号,姓名,年级)中,(学号,姓名)可以推出学号和姓名其中的任何一个,这就是平凡函数依赖.

直白点说,就是只要Y是X的子集,Y就依赖于X

非平凡函数依赖:若X->Y,但Y不是X的子集,就是非平凡函数依赖。

在学生表(学号,姓名,年级)中,通过(学号,姓名)可以推出这个学生所在的年级,但年级不是(学号,姓名)的子集,这是非平凡函数依赖.((学号,姓名)就是一个x,学号或者姓名就是一个x’)。

22、redo即重做,undo即撤销还原

redo日志 记录某数据块被修改后的值,可以用来恢复未写入data file 的已成功事物更新的数据,redo即重做

undo日志 记录某数据被修改前的值,可以在事物失败时进行rollback;undo即撤销还原

23、选码、主码、全码、外码、主属性、主键、主关键字、非主属性清晰总结
:https://blog.csdn.net/sumaliqinghua/article/details/85872446#commentBox

1、码=超键:能够唯一标识一条记录的属性或属性集。

标识性:一个数据表的所有记录都具有不同的超键

非空性:不能为空

有些时候也把码称作“键”

2、候选键=候选码:能够唯一标识一条记录的最小属性集

标识性:一个数据表的所有记录都具有不同的候选键

最小性:任一候选键的任何真子集都不能唯一标识一个记录(比如在成绩表中(学号,课程号)是一个候选键,单独的学号,课程号都不能决定一条记录)

非空性:不能为空

候选键是没有多余属性的超键

举例:学生ID是候选码,那么含有候选码的都是码。

少部分地方也有叫超级码的,但是见得不多

3、主键=主码:某个能够唯一标识一条记录的最小属性集(是从候选码里人为挑选的一条)

唯一性:一个数据表只能有一个主键

标识性:一个数据表的所有记录都具有不同的主键取值

非空性:不能为空

人为的选取某个候选码为主码

4、主属性 包含在任一候选码中的属性称主属性。简单来说,主属性是候选码所有属性的并集

非主属性 不包含在候选码中的属性称为非主属性。 非主属性是相对于主属性来定义的。

5、外键(foreign key):子数据表中出现的父数据表的主键,称为子数据表的外键。

6、全码:当所有的属性共同构成一个候选码时,这时该候选码为全码。(教师,课程,学生)假如一个教师可以讲授多门课程,某门课程可以有多个教师讲授,学生可以听不同教师讲授的不同课程,那么,要区分关系中的每一个元组,

这个关系模式R的候选码应为全部属性构成 (教师、课程、学生),即主码。

7、代理键:当不适合用任何一个候选键作为主键时(如数据太长等),添加一个没有实际意义的键作为主键,这个键就是代理键。(如常用的序号1、2、3)

8、自然键:自然生活中唯一能够标识一条记录的键(如身份证)

超键包含着候选键,候选键中包含着主键。主键一定是惟一的。

24、数据库范式
:https://blog.csdn.net/Haode258/article/details/114316559

https://blog.csdn.net/weixin_30379911/article/details/96180100

https://www.cnblogs.com/ybwang/archive/2010/06/04/1751279.html

1NF——>2NF:消除非主属性对码的部分函数依赖

2NF——>3NF:消除非主属性对码的传递函数依赖

3NF——>BCNF:消除主属性对码的部分和传递函数依赖

BCNF——>4NF:消除非平凡且非函数依赖的多值依赖

检测范式违例:

1.当多个值存储在一个单元中时会发生1NF违例。

2.2NF违例只会发生在具有关联键的表中,且非键字段只依赖于主键的一部分。

3.3NF违例发生在一个非键字段确定另一个非键字段的情况下,表可能有一个任何大小的键。

4.BCNF违例出现在非键字段确定主键的一部分的情况下。这些违例只能发生在主键是有关联键组成的表中。

5.4NF违例发生在表的主键至少由3个键连接而成且没有非键字段的情况下,此外,键的一部分确定键的另一部分的多个值。

25、数据流程
:https://blog.csdn.net/shulianghan/article/details/109271777

加工 ( 核心 )使用 圆形 / 圆角矩形 表示加工(P) 描述 “输入数据流” 到 “输出数据流” 之间的变换 , 即 对数据进行了什么样的处理 , 使得 “输入数据流” 变为 “输出数据流” ;

数据存储使用 双横线 / 半框形矩形 表示(D) 表示 暂时存储的数据 , 数据存储的粒度是以 表 为单位

外部实体 矩形 表示(E)

26、E-R图的绘图规范
:https://blog.csdn.net/Edraw_Max/article/details/110244759

https://blog.csdn.net/weixin_51966461/article/details/116505235

1 矩形框:表示实体,在框中记入实体名。数据库的表名就可以做一个实体对象。一个系统是由很多个实体对象构成的,然后它们之间存在一定的关系和属性。

2 菱形框:表示联系,在框中记入联系名。

3 椭圆形框:表示实体或联系的属性,将属性名记入框中。对于主属性名,则在其名称下划一下划线。

4 连线:实体与属性之间;实体与联系之间;联系与属性之间用直线相连,并在直线上标注联系的类型。

(对于一对一联系,要在两个实体连线方向各写1; 对于一对多联系,要在一的一方写1,多的一方写N;对于多对多关系,则要在两个实体连线方向各写N,M。)

5 双实线长方形:表示弱实体。

什么是弱实体?如果一个实体依赖于某个实体而存在,那么前者是弱实体,后者为强实体。例如订单实体依赖于商品实体而存在,为什么?因为如果没有商品你能够下订单吗?不可能!所以订单为弱实体,商品为强实体。

6 双实线椭圆形:表示多值属性。

什么是多值属性?例如一个用户可能拥有多个电话号码,所以电话号码可以作为多值属性。一个用户只能拥有一个身份证号码,所以身份证号不能作为多值属性。

7 虚线椭圆形:表示派生属性。

什么是派生属性?例如一个用户的年龄我们可以作为派生属性,为什么?因为它可以通过身份证号推导出来。所以需要注意的是能推导出来的属性我们都可以作为派生属性。

8 双实线菱形:表示弱关系。什么是弱关系?弱关系一般是和弱实体一起使用的,只有弱实体才会用到弱关系。

9 单竖线倒三角形:表示概化。什么是概化?说直白点就是分组!!!一个商品类型可能包含图书类、服装类、数码类等。

10 双竖线倒三角形:表示全部概化。什么是全部概化?说直白点也是分组!!!但是!!!一个商品类型只能包含图书类、服装类、数码类。这就是概化与全部概化的区别。

27、无损连接定义:无损连接是指分解后的关系通过自然连接可以恢复成原来的关系,即通过自然连接得到的关系与原来的关系相比,既不多出信息、又不丢失信息。

28、一、Armstrong公理系统设关系模式R<U,F>,其中U为属性集,F是U上的一组函数依赖,那么有如下推理规则:

① A1自反律:若Y⊆X⊆U,则X→Y为F所蕴含;

② A2增广律:若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含(XZ表示X∩Z,对应XZ属性值相等);

③ A3传递律:若X→Y,Y→Z为F所蕴含,则X→Z为F所蕴含。

根据上面三条推理规则,又可推出下面三条推理规则:

④ 合并规则:若X→Y,X→Z,则X→YZ为F所蕴含;

⑤ 伪传递规则:若X→Y,WY→Z,则XW→Z为F所蕴含;

⑥ 分解规则:若X→Y,Z⊆Y,则X→Z为F所蕴含。

注意:Y⊆X表示Y是X的子集,如:

Y⊆X⊆U

U为(学生姓名,年龄,电话号码)

X为(学生姓名,年龄)

Y为(学生姓名)

29、数据库事务加入排它锁后,不能加入共享锁;而加入共享锁后也不能加入排它锁但是能加入共享锁。

30、sql优化的常用方法:

1)查询sql时尽量不要用*号代替具体的字段,因为用*号数据库还要将*号解析为具体字段

.字段多时,大表能达到100多个字段甚至达200多个字段

.只取需要的字段,节省资源、减少网络开销

.select * 进行查询时,很可能不会用到索引,就会造成全表扫描

2)应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描

3)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

4)避免在where中对字段进行表达式操作

.SQL解析时,如果字段相关的是表达式就进行全表扫描

.字段干净无表达式,索引生效

5)避免在where子句中使用!=或<>操作符

应尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。记住实现业务优先,实在没办法,就只能使用,并不是不能使用。如果不能使用,SQL也就无需支持了。

.使用!=和<>很可能会让索引失效

6)去重distinct过滤字段要少用

.带distinct的语句占用cpu时间高于不带distinct的语句。因为当查询很多字段时,如果使用distinct,数据库引擎就会对数据进行比较,过滤掉重复数据,然而这个比较、过滤的过程会占用系统资源,如cpu时间

7)where中使用默认值代替null

.并不是说使用了is null 或者 is not null 就会不走索引了,这个跟mysql版本以及查询成本都有关

.如果mysql优化器发现,走索引比不走索引成本还要高,就会放弃索引,这些条件 !=,<>,is null,is not null经常被认为让索引失效,其实是因为一般情况下,查询的成本高,优化器自动放弃索引的

.如果把null值,换成默认值,很多时候让走索引成为可能,同时,表达意思也相对清晰一点

8)批量删除优化:避免同时修改或删除过多数据,因为会造成cpu利用率过高,会造成锁表操作,从而影响别人对数据库的访问。

.一次性删除太多数据,可能造成锁表,会有lock wait timeout exceed的错误,所以建议分批操作

9)提高group by语句的效率:可以在执行到该语句前,把不需要的记录过滤掉,也就是用where字句替换HAVING字句

10)不要有超过5个以上的表连接

.关联的表个数越多,编译的时间和开销也就越大

.每次关联内存中都生成一个临时表

.应该把连接表拆开成较小的几个执行,可读性更高

.如果一定需要连接很多表才能得到数据,那么意味着这是个糟糕的设计了

.阿里规范中,建议多表联查三张表以下

11)尽量使用union all替代union

.union和union all的区别是,union会自动去掉多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复

.union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序

.union在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION

12)为常用搜索字段建索引

13)当只需要1条查询结果时,limit 1的使用

14)使用查询缓存

15)EXPLAIN 查询语句

16)使用JOIN来代替子查询

17)将小表作为基表来驱动大表,小表驱动大表

18)使用truncate代替delete

19)用>= 替代 >

20)尽量多使用COMMIT,因为COMMIT可以释放资源

21)避免频繁创建和删除临时表,以减少系统表资源的消耗。

31、如何设计数据库

1、数据库设计最起码要占用这个项目开发的40%以上的时间

2、数据库设计不仅仅停留在页面demo的表面

页面内容所需字段,在数据库设计中只是一部分,还有系统运转、模块交互、中转数据、表之间的联系等等所需要的字段,因此数据库设计绝对不是简单的基本数据存储,还有逻辑数据存储。

3、数据库设计完成后,项目80%的设计开发都要存在你的脑海中

每个字段的设计都要有他存在的意义,要清楚的知道程序中如何去运用这些字段,多张表的联系在程序中是如何体现的。

4、数据库设计时就要考虑效率和优化问题

数据量大的表示粗粒度的,会冗余一些必要字段,达到用最少的表,最弱的表关系去存储海量的数据。大数据的表要建立索引,方便查询。对于含有计算、数据交互、统计这类需求时,还要考虑是否有必要采用存储过程。

5、添加必要的冗余字段

像创建时间、修改时间、操作用户IP、备注这些字段,在每张表中最好都有,一些冗余的字段便于日后维护、分析、拓展而添加。

6、设计合理的表关联

若两张表之间的关系复杂,建议采用第三张映射表来关联维护两张表之间的关系,以降低表之间的直接耦合度。

7、设计表时不加主外键等约束关联,系统编码阶段完成后再添加约束性关联

8、选择合适的主键生成策略

数据库的设计难度其实比单纯的技术实现难很多,他充分体现了一个人的全局设计能力和掌控能力,最后说一句,数据库设计,很重要,很复杂。