今天是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、关于数据库体系结构
数据块是组成oracle逻辑存储结构的最小单位,也即输入输出数据库的最小存储单位;表空间是最大的逻辑存储结构;
在实际的物理存储结构中,表空间包括的物理文件有:数据文件、控制文件、重要日志文件、归档日志文件、参数文件、口令文件和警告日志文件等。可以看到每个表空间可以包含一个或多个数据文件,一个数据文件只能属于一个表空间;
日志文件主要功能是记录对数据库所作的几乎所有修改,在出现问题时,可以通过日志文件得到原始数据,从而保障不丢失已有的操作成果。 b 、系统全局区(SGA)
在oracle中系统全局区是所有用户共享的一块内存区域,SGA主要包括:高速数据缓冲区、共享池、重要日志缓冲区、Java池等
1) 高速数据缓冲区中存放着系统最近访问过的数据块,也叫做缓存块;
2) 共享池主要用于缓存SQL语句、PL/SQL语句、数据字典等。存放着最近用过的SQL语句、PL/SQL语句的文本和执行计划,当下一次执行相同的SQL语句或PL/SQL语句时,可直接在共享池中找到之前已经生成的执行计划,不需再次解析从而提高系统执行效率。
共享池的内存空间大小是可以改变的:
Alter system set shared_pool_size=30mc、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两种
函数的创建基本与存储过程一致,只计算和返回一个值。
调用函数时,也是要先declare变量来接收返回值;且函数调用时只能作为表达式的一部分
(2)数据库维护
主要包括对三种物理文件:数据文件、控制文件、日志文件的管理。
a、这里主要讲数据文件,数据文件主要有数据表对象(table)、索引对象(index)、视图对象(view)。关于索引和视图的介绍可以翻看下面两篇文章。
(http://www.jianshu.com/p/4d521d9a9c78; http://www.jianshu.com/p/c6d55ab63364)b、表分区和索引分区
对应的如何创建表分区、分区策略、管理表分区见
(http://www.jianshu.com/p/a531f66ab062)
(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 ;
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