校招知识点总结篇之数据库

1.基础知识

数据库系统DBS:由数据库DB、数据库管理系统DBMS、应用系统、数据库管理员DBA构成;

数据库:三级模式(模式-全局逻辑1、外模式(子模式)-局部逻辑n、内模式(存储模式)-物理结构1)、两级映像(外模式/模式-逻辑、模式/内模式-物理)

       逻辑独立性:模式改变,外模式不变;

       物理独立性:模式不变,内模式改变;

校招知识点总结篇之数据库_第1张图片

非关系型数据库:Hbase、Redis、MongodDB、Neo4j、NewSQL(NoSQL)、Cloudant;

关系型数据库:Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL;

2.sqlite升级,增加字段的语句

3.数据库框架对比和源码分析

4.数据库优化

好的数据库管理工具、数据分区、索引、缓存机制、加大虚存、分批处理、临时表(中间表)的使用、查询语句优化、视图、存储过程、排序、用抽样数据进行数据挖掘

数据库索引

优缺点:优点——提高数据库检索速度,创建唯一性索引,保证数据库表中每一行数据的唯一性,减少磁盘IO;缺点——需要占用磁盘空间(物理空间),创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加;、

分类:普通索引、唯一索引(保证在索引列中的全部数据是唯一的);单个索引(对单个字段建立索引)、复合索引(索引建立语句中同时包含多个字段名);顺序、散列、位图索引;

Mysql 联合索引:MySQL使用联合索引只能使用左侧的部分,例如INDEX(a,b,c),当条件为a或a,b或a,b,c时都可以使用索引,但是当条件为b,c时将不会使用索引。离散度更高的索引应该放在联合索引的前面,因为离散度高索引的可选择性高。

数据库优化方案:避免全局扫描,首先考虑在where 和order by涉及的列上建立索引;最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库(避免where子句中对NULL进行判断、避免使用!= 或 <> 操作符、避免使用or连接条件、避免in和not in慎用,可用exists(not exists/ LEFT OUTER JOIN)替换、避免在 where子句中对字段进行表达式操作、避免在where子句中对字段进行函数操作、)、索引不是越多越好,会降低 insert 及 update 的效率、避免使用游标、在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF、避免大事务操作、避免向客户端返回大数据;

性能优化:两个指标——延时(响应时间)、带宽(吞吐量),数据库访问优化漏斗法则

减少数据/磁盘访问(创建并正确使用index);返回更少的数据(减少网络传输/磁盘访问,数据分页处理);减少交互次数(批量交互、in list、设置Fetch Size、使用存储过程、优化业务逻辑、使用ResultSet游标处理记录);减少CPU及内存开销(使用绑定变量、合理使用排序、减少比较操作、大量复杂运算在客户端处理);利用更多的资源(增加资源、客户端多进程并行访问、数据库并行处理)

数据库的索引有什么用,有几种类型,在哪里新建,在哪里修改

5.数据库数据迁移问题

6.SQL语言

数据查询:select * from table where 条件 group by …having…order by[ASC/DESC]

数据操作DML:insert into table(字段1,字段2,…)values(值1,值2,…)

              Insert into table(字段1,字段2,…) select 查询

              Update table set 字段名=字段值 where 条件

              Delete from table where 条件表达式

数据定义DDL:create  table 表名(列名-类型-列级约束,…表级完整性约束)

              Create index 索引名 on 表名(列名-次序)

              Create view 视图名(列名1,…) as 子查询 with check option

              Alter table 表名 add 新列名-类型-约束/drop 约束

              Drop table 表名/index 索引名/view 视图名

数据控制DCL:grant 权限 on对象类型 对象名 to 用户(with grant option)

              Revoke 权限 on对象类型 对象名 from 用户

查询前几名:select top 5/limit 0,5 (limit 2,1 /limit 1 offset 2读取第三条数据,不包括)

生成空表:select col1,col2 into #t from t where 1=0

去除重复记录: distinct

Where 、having、group by的用法及区别:

Where: 用于在初始表中筛选查询。它是一个约束声明,用于约束数据,在返回结果集之前起作用。

Having: :用于对where和group by查询出来的分组经行过滤,查出满足条件的分组结果。它是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作。having 子句中的每一个元素也必须出现在select列表中,having语句可以使用聚合函数,而where不使用,子句限制的是组,而不是行。

Group by: 对select查询出来的结果集按照某个字段或者表达式进行分组,获得一组组的集合,然后从每组中取出一个指定字段或者表达式的值,与聚合函数配合使用。

执行顺序:select –>where –> group by–> having–>order by

7.数据库并发控制:

并发操作带来的数据不一致性:丢失修改——两个事务T1和T2读入同一数据并修改,T2提交的结果破环了T1提交的结果,导致T1修改结果丢失;不可重复读——事务T1读取某一数据后,事务T2对其做了修改/删除/插入,当T1再一次读取时得到与前一次不同的值/记录消失/记录增加;读脏数据——事务T1修改数据,事务T2读取之后,T1撤回修改,被修改过的数据恢复原值,造成T2读取数据不一致;

死锁——原因:资源不足、进程运行推进顺序不当、资源分配不当;必要条件:互斥,每个资源每次只能被一个进程使用;请求与保持等待;不可剥夺;环路等待;解决方案:银行家算法;

共享锁:即读锁,S锁,事务T对数据A加S锁,其他事务只能对A加S锁

互斥锁:排他锁,X锁,事务T对数据A加X锁,其他事务不能对A加任何类型的锁

7.范式

第一范式:最低要求;

第二范式:消除非主属性对码的部分依赖,不满足产生的问题:插入、删除异常、修改复杂;投影分解

第三范式:消除非主属性对码的传递函数依赖;

BCNF;消除非主属性对码的部分和传递函数依赖;

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

8.事务

事务:并发控制的基本单位,由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元,以begin transaction开始,以commit、rollback结束;

特性:原子性——事务包含的所有操作要么全部成功,要么全部失败回滚(为保证执行结果正确);一致性——一个事务执行之前和执行之后都必须处于一致性状态,数据库只包含事务成功提交的结果;隔离性——多个用户并发访问数据库时,多个并发事物之间要相互隔离,不相互干扰(为了应对数据库崩溃的情况);持续性——一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

隔离级别:读未提及(允许读脏数据)、读已提及(不同的时候执行的时候只能获取到已经提交的数据)、可重复读(保证在事务处理过程中,多次读取同一个数据时,该数据的值和事务开始时刻是一致的)、顺序度(最严格的事务隔离级别,它要求所有的事务排队顺序执行,即事务只能一个接一个地处理,不能并发)

事务(数据库)并发问题:脏读、不可重复读、幻读;

事务故障

内部故障:事务没有达到预期的终点(commmit或者显式的rollback ),恢复强行回滚事务,如溢出运算、违反某些完整性限制;

系统故障:软故障,是指造成系统停止运转的任何事件,使得系统重新启动,如特定类型的硬件错误、操作系统故障、系统断电、DBMS代码错误;

介质故障:硬故障,指外存故障,如磁盘故障、磁头故障、瞬时强磁场干扰等,这类故障破环数据库或部分数据库并影响正在存取这部分数据的所有事务;

计算机病毒:

数据恢复:建立数据冗余——数据转存和登陆日志;

9.数据库设计步骤:

需求分析(困难、耗时、数据字典、数据项、数据流、数据存储描述)

概念结构设计(E-R图、数据字典、数据流图)、

逻辑结构设计(关系模型、非关系模型、系统结构图)、物理结构设计(模块设计、IPO表):把概念结构设计阶段设计好的基本实体-关系图转换为与选用的数据库管理系统产品所支持的数据模型相符合的逻辑结构

数据库实施、数据库运行和维护

10.存储过程

创建:create Procedure 过程名([参数1,参数2,…]) as ;

执行:call/perform Procedure过程名([参数1,参数2,…]);

删除:DROP Procedure 过程名();

11.游标、触发器(启动、删除)

游标:是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成

触发器:触发器是针对数据表(库)的特殊的存储过程,当表发生了 Insert、Update或Delete操作时,会自动激活执行的。在SQL Server 2005中,触发器有了更进一步的功能,在数据表(库)发生Create、Alter和Drop操作时,也会自动激活执行。

12.Truncatedropdelete的区别

Truncate: 一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的;删除的过程中不会激活与表有关的删除触发器;执行速度快; 表和索引所占用的空间会恢复到初始大小; 只删除数据; 操作立即生效,原数据不放到 rollback segment中,会隐式提交,不能回滚,不会触发触发;

drop:将表所占用的空间全释放掉; 只能对TABLE;删除整个表(数据和结构);操作立即生效,原数据不放到 rollback segment中,不能回滚;

delete: 删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作; 不会减少表或索引所占用的空间; DELETE可以是table和view; 只删除数据;

13.SQL四种连接

内连接:等值连接和自然连接(去重),使用比较运算符根据每个表共有的列的值匹配两个表中的行;

外连接:左外连接——结果集包括LEFT OUTER子句中指定的左表的所有行,不仅是联接列所匹配的行。右外连接——右向外联接是左向外联接的反向联接,将返回右表的所有行。全连接——返回左表和右表中的所有行;

交叉连接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

15.数据库分页查询、删除重复记录、行列转换、连续三天、查询表结构、全局临时表(防止两地登陆)、查找指定节点的所有子节点的子节点

数据库分页方式:MYSQL——limit firstindex,pageindex(firstindex表示实际的索引 pageindex表示每页显示的记录数),用法:limit (pageNumber-1)*pageSize,pageSize/ limit pageSize offset (pageNumber-1)*pageSize(pageSize表示每页要显示的条数,pageNumber表示页码,每页条数为pageSize);

            SQL SeverROW_NUMBER() OVER(),例select row_number() over(order by orderColumn) as rownumber,* from……、offset fetch next,例:--order by ArtistId offset 页数 rows fetch next 条数 rows only ----、top not in,例:where Id not in (select top 条数*页数  ArtistId  from ArtistModels)  、方法四:用存储过程的方式进行分页;

            Oracle——ROWNUM查询分页、row_number()解析函数分页查询

16.SQL计算

17.拼多多数据分析师笔试(知识点汇总)

1)日期类型处理:统计1天,1周,1月,半年的销售数量;统计某一天,每小时登陆次数超过10,时间粒度分别为小时/分钟的用户;

按天:select sum(),day(date) as ‘’ from table1 where year([datetime])=’2018’ group by day([date])

select convert(char(8/10),date,112/120)sum() from table group by convert(char(8),date,112/120);      

oracle to_char(date,'yyyy-dd ')

select DATE_FORMAT(create_time,'%Y%m%d') days,count(caseid) count from tc_case group by days; 

按周:select sum(),datename(week,[date]) from table1 where year([datet])=’2018’ group by datename(week,[date]) 

to_char(date,'yyyy-iw')

select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case group by weeks;

select datepart(weekdate), sum() from Table where year(date)=year(getdate()) group by datepart(week, date)

按月:select sum(),month(datetime) from table1 where year([datetime])=’2018’ group by month([datetime])

to_char(date,'yyyy-mm')

select DATE_FORMAT(create_time,'%Y%m') months,count(caseid) count from tc_case group by months;

select  convert(char(7), date, 120), sum() from Table group by convert(char(7), date, 120)

半年\季度:select sum(),datename(half/quarter,[datetime]) from table1 where year([datetime])=’2018’ group by datename(half/quarter,[datetime])

to_char(date,'yyyy');

TO_CHAR(t.static_time,'yyyy-Q')按季度;

时间函数:SQL Sever Oracle—— MySql——DATE_FORMAT(date,format)

DATE-ADD():向日期添加指定时间间隔,时间间隔类型有:

例:SELECT OrderId,DATE_ADD(OrderDate,INTERVAL 45 DAY) AS OrderPayDate FROM Orders

DATEDIFF()返回两个天数之间的天数:

例:SELECT DATEDIFF('2008-11-30','2008-11-29') AS DiffDate

DATE_FORMAT()用于显示不同格式显示的日期/时间数据;

例:

DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p') DATE_FORMAT(NOW(),'%m-%d-%Y') DATE_FORMAT(NOW(),'%d %b %y') DATE_FORMAT(NOW(),'%d %b %Y %T:%f')

2)排名函数:并列排序问题,名次并列、名次+1

select name, rank() over(order by score) rank from t;字段相同排名相同且占位,跳跃排序

select name, dens_rank() over(order by score) rank from t;连续排序

select ROW_NUMBER() OVER(order by score desc) as rank from t;依次排序不会重复

select NTILE(3) OVER(order by [score] desc) as ~ from t对序号进行分组返回此行所属组编号

3)判断:用户行为特征分析(购买、收藏)

SELECT uid,uname,(CASE WHEN pay.time!=null THEN '已购买' WHEN pay.time=null && fav_time!=null  THEN '收藏未购买'  END) FROM customers,orders;

 

Sumcountcase结合使用,实现分段统计:

select uid,oid,sum/count(case when pay.time!=null THEN 1) as'已购买' ,sum/count(case when pay.time=null && fav_time!=null  THEN 1) as '收藏未购买'  END) FROM customers,orders;

4)比例:各平台用户占平台总用户的比例;按每周同比增长的比例

PERCENTILE_CONT ( numeric_literal )  WITHIN GROUP ( ORDER BY order_by_expression [ ASC | DESC ] )   OVER ( [ ] )  :计算百分位的数值,连续性

PERCENTILE_DISC ( numeric_literal ) WITHIN GROUP ( ORDER BY order_by_expression [ ASC | DESC ] )   OVER ( [ ] ):计算百分位的数值,离散型

PERCENT_RANK( )  OVER ( [ partition_by_clause ] order_by_clause ) : 计算当前值按百分比计算所处在百分位位置

5)LAG():取出某个字段前N条记录的值

例: SELECT *,LAG(price,1) OVER(ORDER BY id) AS lag FROM Orders

(查找第一行以后按id排序的price)

LEAD():取出某个字段后N条记录的值;

你可能感兴趣的:(校招篇)