数据库开发岗面试准备(1)——Python、MongoDB、Oracle

今天是10.31r。

还是想感叹时间过的好快,想想这大半年来还算去了几个地方,北京、深圳、广州、武汉,加上可能去一趟的上海,如此陆陆续续算得把一线城市都要去到了。

信托是为项目募集资金进行投资,它只是起着中介者的角色;
基金公司募集资金或投于股票,可以理解为代客操作股票。

为接下来的几个面试再准备一下,这一篇主要讲Python、MongoDB、Oracle:


一、Python熟练程度?
抓取数据主要用到BeautifulSoup,requests,re库
数据分析主要用numpy、pandas、matplotlib库

  • 1、 Numpy库
    其中的ndarray 是一个多维的数组,其中所有元素的类型必须相同。这是与DataFrame不同的地方。

(1)、可以直接将列表数据a通过array函数转化为ndarray,数组用圆括号来标志“()”
例如:
a=[1,2,3],b=np.array(a),则b=([1,2,3])
a=[[1,2,3],[4,5,6]],b=np.array(a),则b=([1,2,3],[4,5,6])

(2)、numpy常用函数
** np.where(cond,x,y)**,其中cond表示条件
sum(),mean(),std(),括号中可以加相应的参数
x.sum(axis=0或1),其中axis=0 表示按行将每一列的向量相加,axis=1表示按列将每一行的向量相加。
numpy.random模块生成随机数
randint(low,high,size=xx)
表示从low到high范围内随机生成size个整数,且high值取不到。

  • 2、 Pandas库
    介绍Pandas中的DataFrame前先说一下Series,Series是一种类似与一维数组的对象,DataFrame则是多维的。
    import pandas as pd
    from pandas import Series,DataFrame

(1) 数据的生成
对于列表数据a=[9,-3,4,2],可以直接b=Series(a),则对应默认的index为0,1,2,3
b=Series([9,-3,4,2],index=['a','c','d','b'])

对于DataFrame,当a是字典数据,可以直接b=DataFrame(a);
也可以直接生成,例如:
frame2=DataFrame(data,columns=['name','grade','stature','birthdate'], index=['one','two','three','four'])

(2) pandas中DataFrame常用函数
a.describe():对每一列数据进行统计,包括计数,均值,std,各个分位数等。
a['x'] 那么将会返回columns为x的列;
a[0:3] 则会返回前三行的数据
a.groupby('gender'),按gender对数据进行分类,
对应为数字的列会自动求和,而为字符串类型的列则不显示;

  • 3、 Matplotlib
    import matplotlib.pyplot as plt

pd.date_range('xxxx',periods=xx,freq='D/M/Y....')函数生成连续指定天数的的日期列表,可以与plt画图结合使用。
例如:pd.date_range('20000101',periods=10),其中periods表示持续频数;pd.date_range('20000201','20000210',freq='D')也可以不指定频数,只指定起始日期。

画图时一条曲线对应一个Series,
a=DataFrame(np.random.randn(1000,4),index=pd.date_range('20100101',periods=1000),columns=list('ABCD'))
b=a.cumsum()
b.plot()
plt.show()

二、MongoDB使用?
import pymongo

(1)用find()函数进行查询
MongDB没有用select,而是一般通过for循环结合find()函数来筛选,用print函数来打印出来;
使用find()函数时,对应的条件都是以字典形式表示{'age':{'$gt':12},'xx':'xx'},有多个条件时,都放在一个{}内。

(2)也有count(),sort()函数
例如: print(db.users.find().count())

从第几行开始读取,读取多少行(LIMIT)
例如:for u in db.users.find().skip(2).limit(3): print u

(3)mongodb中数据类型转换
对于一条记录x,若其字段'price'为string型,则可以如下转换为int型。 x['price']=int(x['price'])

三、oracle数据库?
(1)基本知识
(2)数据库维护
(3)数据库调优


重点介绍第三部分

三、oracle数据库?

Oracle提供了多种数据库管理工具,这里主要讲SQL/Plus。

(1)基本知识

启动数据库实例:startup 常规的启动模式
关闭数据库实例:shutdown normal 正常关闭数据库

数据库管理系统中有三个重要的概念:数据库实例,数据库,数据库服务器,区别在于:
1) 数据库实例是一组oracle后台进程以及在服务器中分配的共享内存区域;它的功能是管理和控制数据库,比如通过实例对数据文件进行访问和其他操作;
2) 数据库则纯粹是用来存储数据的;
3) 数据库服务器则是指管理数据库的软件(sqlplus等)、实例和数据库。

  • a、关于数据库体系结构

    1.png

    数据块是组成oracle逻辑存储结构的最小单位,也即输入输出数据库的最小存储单位;表空间是最大的逻辑存储结构;
    在实际的物理存储结构中,表空间包括的物理文件有:数据文件、控制文件、重要日志文件、归档日志文件、参数文件、口令文件和警告日志文件等。

    可以看到每个表空间可以包含一个或多个数据文件,一个数据文件只能属于一个表空间;
    日志文件主要功能是记录对数据库所作的几乎所有修改,在出现问题时,可以通过日志文件得到原始数据,从而保障不丢失已有的操作成果。

  • b 、系统全局区(SGA)
    在oracle中系统全局区是所有用户共享的一块内存区域,SGA主要包括:高速数据缓冲区、共享池、重要日志缓冲区、Java池等
    1) 高速数据缓冲区中存放着系统最近访问过的数据块,也叫做缓存块;
    2) 共享池主要用于缓存SQL语句、PL/SQL语句、数据字典等。存放着最近用过的SQL语句、PL/SQL语句的文本和执行计划,当下一次执行相同的SQL语句或PL/SQL语句时,可直接在共享池中找到之前已经生成的执行计划,不需再次解析从而提高系统执行效率。
    共享池的内存空间大小是可以改变的:
    Alter system set shared_pool_size=30m

  • c、oracle 常用函数
    (一)、字符串函数:
    1、字符串截取
    select substr('abcdef',1,3) from dual

2、查找子串位置
select instr('abcfdgfdhd','fd') from dual

3、字符串连接
select concat('HELLO','hello world') from dual;
select 'HELLO'||'hello world' from dual;

4、去掉字符串中的空格
select ltrim(' abc') s1,
rtrim('zhang ') s2,
trim(' zhang ') s3 from dual

5、Replace(s1,s2,s3)用s3中的字符串替换所有s1中的s2字符串
select replace('abc','b','xy') from dual;

6、decode函数
DECODE(value,if1,then1,if2,then2,if3,then3,...,else),
表示如果value 等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。
decode函数常与nvl(),sign()函数一起使用;

7、case函数
SELECT CASE X-FIELD
WHEN X-FIELD < 40 THEN 'X-FIELD 小于 40'
WHEN X-FIELD < 50 THEN 'X-FIELD 小于 50'
WHEN X-FIELD < 60 THEN 'X-FIELD 小于 60'
ELSE 'UNBEKNOWN'
END
FROM DUAL
注:CASE语句在处理类似问题就显得非常灵活。当只是需要匹配少量数值时,用Decode更为简洁。

(二)、数字函数:
1、sign():返回值的符号(正数返回为1,负数为-1,如果n=0返回0)
select sign(-32),sign(293) from dual;

(三)、其他函数:
1、nvl(ex1,ex2):
ex1值为空则返回ex2,否则返回该值本身ex1(常用)
例:如果雇员没有佣金,将显示0,否则显示佣金
select comm,nvl(comm,0) from emp;

2、nullif(ex1,ex2):
值相等返空,否则返回第一个值
例:如果工资和佣金相等,则显示空,否则显示工资
select nullif(sal,comm),sal,comm from emp;

  • d、存储过程和函数
    存储过程是一种命名了的PL/SQL程序块,只能通过EXCUTE(简写为exec)命令执行或者在PL/SQL程序块内部被调用。
    1) 普通存储过程的创建和调用见:http://www.jianshu.com/p/5a90ccd9b643
    2) 这里主要弄清楚在PL/SQL块中调用存储过程时,参数输入输出怎样改变的问题。
    参数有IN和OUT两种
2.png
3.png

函数的创建基本与存储过程一致,只计算和返回一个值。
调用函数时,也是要先declare变量来接收返回值;且函数调用时只能作为表达式的一部分

(2)数据库维护

主要包括对三种物理文件:数据文件、控制文件、日志文件的管理。

(3)SQL语句优化和Oracle系统调优

应用系统的性能优化包括对SQL语句的优化、Oracle系统、操作系统等的调整,其中工作量最大的就是SQL语句的调整。关于oracle系统的调优主要是DBA通过调整系统配置参数让oracle的运行处于相对良好状态。

  • a、常规SQL语句优化
    1)建议不用“*”来代替所有列名
    因为oracle系统会通过查询字典将“*”转换成表的所有列名,这自然会消耗系统时间,建议直接写与访问表有关的实际列名。

2)用Truncate代替delete
在使用delete删除表中所有数据航时,oracle会使用撤销表空间来存放回复的信息,在这期间如果用户没有发出commit命令,而是发出rollback命令,oracle系统会将数据恢复到删除之前的状态。

而使用truncate则是直接删除数据,不会将删除的数据写入回滚段,速度自然快得多。

3)用[NOT] EXISTS 代替[NOT] IN
在子查询中,[NOT] IN将执行一个内部的排序与合并,它对子查询中的表进行了一个全表遍历,无论哪种情况下都是最低效的。可以用[NOT] EXISTS来代替。

  • b、表连接优化
    1) 驱动表的选择
    驱动表是指被最先访问的表(通常以全表扫描的方式被访问)
    2) Where子句的连接顺序
    Oracle采取自下而上的顺序解析where子句,因此表之间的连接必须写在其他where条件之前。那些可以过滤掉最大数据记录的条件必须写在where子句末尾。

  • c、合理使用索引
    索引的目的就是为了提高查询速度,判断一个索引是否被使用如下:
    Alter index schema.index_name monitoring usage;
    检查使用情况:select * from v$object_usage;

  • d、优化器的使用
    Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO),对所有的SQL语句执行EXPLAIN PLAN命令来了解每个SQL语句的执行计划。
    explain plan for select t.*, t.rowid from A5 t where t.l = '101214' and t.k like '%8号' order by i ;

4.png

1) 看执行计划时,我们首先从缩进最大的行读取,它是最先被执行的步骤。在执行计划中:id=3和id=4是最先被执行的。 两行缩进一样的,最上面的最先被执行,在这里就是id=3
2) 选择次之缩进的行数id=2,表连接方式为NESTED LOOPS。
3) 然后是id=1,扫描表的方式为TABLE ACCESS BY INDEX ROWID
4) 最后是id=0
我们翻译成语言大概如下,
从t2表第一行读取,查看每一行是否符合下面条件:"T1"."ID"="T2"."ID";
如果符合就拿出一行来,扫描整个t2表,这个过程就叫NESTED LOOPS
当整个t2表被扫描完之后,会产生一个结果集,这个结果集是IND_T1的一个索引集,然后oracle根据索引键值上的rowid去T1表中找到相应的记录,就是这一步:TABLE ACCESS BY INDEX ROWID
最后将结果返回:SELECT STATEMENT

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容