美文网首页python面...python 学习我爱编程
数据库开发岗面试准备(1)——Python、MongoDB、Or

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

作者: 是蓝先生 | 来源:发表于2016-10-31 15:22 被阅读566次

    今天是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

    相关文章

      网友评论

        本文标题:数据库开发岗面试准备(1)——Python、MongoDB、Or

        本文链接:https://www.haomeiwen.com/subject/jpjeuttx.html