今天是10.31r杯瞻。
還是想感嘆時(shí)間過(guò)的好快,想想這大半年來(lái)還算去了幾個(gè)地方魁莉,北京睬涧、深圳、廣州旗唁、武漢畦浓,加上可能去一趟的上海,如此陸陸續(xù)續(xù)算得把一線城市都要去到了检疫。
信托是為項(xiàng)目募集資金進(jìn)行投資讶请,它只是起著中介者的角色;
基金公司募集資金或投于股票屎媳,可以理解為代客操作股票夺溢。
為接下來(lái)的幾個(gè)面試再準(zhǔn)備一下,這一篇主要講Python烛谊、MongoDB风响、Oracle:
一、Python熟練程度晒来?
抓取數(shù)據(jù)主要用到BeautifulSoup,requests,re庫(kù)
數(shù)據(jù)分析主要用numpy钞诡、pandas、matplotlib庫(kù)
-
1、 Numpy庫(kù)
其中的ndarray 是一個(gè)多維的數(shù)組荧降,其中所有元素的類(lèi)型必須相同接箫。這是與DataFrame不同的地方。
(1)朵诫、可以直接將列表數(shù)據(jù)a通過(guò)array函數(shù)轉(zhuǎn)化為ndarray辛友,數(shù)組用圓括號(hào)來(lái)標(biāo)志“()”
例如:
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常用函數(shù)
** np.where(cond,x,y)**邑滨,其中cond表示條件
sum(),mean(),std(),括號(hào)中可以加相應(yīng)的參數(shù)
x.sum(axis=0或1)钱反,其中axis=0 表示按行將每一列的向量相加掖看,axis=1表示按列將每一行的向量相加。
numpy.random模塊生成隨機(jī)數(shù)
randint(low,high,size=xx)
表示從low到high范圍內(nèi)隨機(jī)生成size個(gè)整數(shù)面哥,且high值取不到哎壳。
-
2、 Pandas庫(kù)
介紹Pandas中的DataFrame前先說(shuō)一下Series尚卫,Series是一種類(lèi)似與一維數(shù)組的對(duì)象归榕,DataFrame則是多維的。
import pandas as pd
from pandas import Series,DataFrame
(1) 數(shù)據(jù)的生成
對(duì)于列表數(shù)據(jù)a=[9,-3,4,2]吱涉,可以直接b=Series(a)刹泄,則對(duì)應(yīng)默認(rèn)的index為0,1,2,3
b=Series([9,-3,4,2],index=['a','c','d','b'])
對(duì)于DataFrame,當(dāng)a是字典數(shù)據(jù)邑飒,可以直接b=DataFrame(a);
也可以直接生成循签,例如:
frame2=DataFrame(data,columns=['name','grade','stature','birthdate'], index=['one','two','three','four'])
(2) pandas中DataFrame常用函數(shù)
a.describe():對(duì)每一列數(shù)據(jù)進(jìn)行統(tǒng)計(jì)级乐,包括計(jì)數(shù)疙咸,均值,std风科,各個(gè)分位數(shù)等撒轮。
a['x'] 那么將會(huì)返回columns為x的列;
a[0:3] 則會(huì)返回前三行的數(shù)據(jù)
a.groupby('gender')贼穆,按gender對(duì)數(shù)據(jù)進(jìn)行分類(lèi)题山,對(duì)應(yīng)為數(shù)字的列會(huì)自動(dòng)求和,而為字符串類(lèi)型的列則不顯示故痊;
-
3顶瞳、 Matplotlib
import matplotlib.pyplot as plt
pd.date_range('xxxx',periods=xx,freq='D/M/Y....')函數(shù)生成連續(xù)指定天數(shù)的的日期列表,可以與plt畫(huà)圖結(jié)合使用。
例如:pd.date_range('20000101',periods=10),其中periods表示持續(xù)頻數(shù)慨菱;pd.date_range('20000201','20000210',freq='D')也可以不指定頻數(shù)焰络,只指定起始日期。
畫(huà)圖時(shí)一條曲線對(duì)應(yīng)一個(gè)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()函數(shù)進(jìn)行查詢
MongDB沒(méi)有用select,而是一般通過(guò)for循環(huán)結(jié)合find()函數(shù)來(lái)篩選协饲,用print函數(shù)來(lái)打印出來(lái)畏腕;
使用find()函數(shù)時(shí),對(duì)應(yīng)的條件都是以字典形式表示{'age':{'$gt':12},'xx':'xx'}茉稠,有多個(gè)條件時(shí)描馅,都放在一個(gè){}內(nèi)。
(2)也有count(),sort()函數(shù)
例如: print(db.users.find().count())
從第幾行開(kāi)始讀取而线,讀取多少行(LIMIT)
例如:for u in db.users.find().skip(2).limit(3): print u
(3)mongodb中數(shù)據(jù)類(lèi)型轉(zhuǎn)換
對(duì)于一條記錄x流昏,若其字段'price'為string型,則可以如下轉(zhuǎn)換為int型吞获。 x['price']=int(x['price'])
三况凉、oracle數(shù)據(jù)庫(kù)?
(1)基本知識(shí)
(2)數(shù)據(jù)庫(kù)維護(hù)
(3)數(shù)據(jù)庫(kù)調(diào)優(yōu)
重點(diǎn)介紹第三部分
三各拷、oracle數(shù)據(jù)庫(kù)刁绒?
Oracle提供了多種數(shù)據(jù)庫(kù)管理工具,這里主要講SQL/Plus烤黍。
(1)基本知識(shí)
啟動(dòng)數(shù)據(jù)庫(kù)實(shí)例:startup 常規(guī)的啟動(dòng)模式
關(guān)閉數(shù)據(jù)庫(kù)實(shí)例:shutdown normal 正常關(guān)閉數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)管理系統(tǒng)中有三個(gè)重要的概念:數(shù)據(jù)庫(kù)實(shí)例知市,數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)服務(wù)器速蕊,區(qū)別在于:
1) 數(shù)據(jù)庫(kù)實(shí)例是一組oracle后臺(tái)進(jìn)程以及在服務(wù)器中分配的共享內(nèi)存區(qū)域嫂丙;它的功能是管理和控制數(shù)據(jù)庫(kù),比如通過(guò)實(shí)例對(duì)數(shù)據(jù)文件進(jìn)行訪問(wèn)和其他操作规哲;
2) 數(shù)據(jù)庫(kù)則純粹是用來(lái)存儲(chǔ)數(shù)據(jù)的跟啤;
3) 數(shù)據(jù)庫(kù)服務(wù)器則是指管理數(shù)據(jù)庫(kù)的軟件(sqlplus等)、實(shí)例和數(shù)據(jù)庫(kù)唉锌。
-
a隅肥、關(guān)于數(shù)據(jù)庫(kù)體系結(jié)構(gòu)
數(shù)據(jù)塊是組成oracle邏輯存儲(chǔ)結(jié)構(gòu)的最小單位,也即輸入輸出數(shù)據(jù)庫(kù)的最小存儲(chǔ)單位袄简;表空間是最大的邏輯存儲(chǔ)結(jié)構(gòu)腥放;
在實(shí)際的物理存儲(chǔ)結(jié)構(gòu)中,表空間包括的物理文件有:數(shù)據(jù)文件绿语、控制文件秃症、重要日志文件候址、歸檔日志文件、參數(shù)文件种柑、口令文件和警告日志文件等宗雇。可以看到每個(gè)表空間可以包含一個(gè)或多個(gè)數(shù)據(jù)文件,一個(gè)數(shù)據(jù)文件只能屬于一個(gè)表空間莹规;
日志文件主要功能是記錄對(duì)數(shù)據(jù)庫(kù)所作的幾乎所有修改赔蒲,在出現(xiàn)問(wèn)題時(shí),可以通過(guò)日志文件得到原始數(shù)據(jù)良漱,從而保障不丟失已有的操作成果舞虱。 b 、系統(tǒng)全局區(qū)(SGA)
在oracle中系統(tǒng)全局區(qū)是所有用戶共享的一塊內(nèi)存區(qū)域母市,SGA主要包括:高速數(shù)據(jù)緩沖區(qū)矾兜、共享池、重要日志緩沖區(qū)患久、Java池等
1) 高速數(shù)據(jù)緩沖區(qū)中存放著系統(tǒng)最近訪問(wèn)過(guò)的數(shù)據(jù)塊椅寺,也叫做緩存塊;
2) 共享池主要用于緩存SQL語(yǔ)句蒋失、PL/SQL語(yǔ)句返帕、數(shù)據(jù)字典等。存放著最近用過(guò)的SQL語(yǔ)句篙挽、PL/SQL語(yǔ)句的文本和執(zhí)行計(jì)劃荆萤,當(dāng)下一次執(zhí)行相同的SQL語(yǔ)句或PL/SQL語(yǔ)句時(shí),可直接在共享池中找到之前已經(jīng)生成的執(zhí)行計(jì)劃铣卡,不需再次解析從而提高系統(tǒng)執(zhí)行效率链韭。
共享池的內(nèi)存空間大小是可以改變的:
Alter system set shared_pool_size=30mc、oracle 常用函數(shù)
(一)煮落、字符串函數(shù):
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函數(shù)
DECODE(value,if1,then1,if2,then2,if3,then3,...,else)骗村,
表示如果value 等于if1時(shí)嫌褪,DECODE函數(shù)的結(jié)果返回then1,...,如果不等于任何一個(gè)if值呀枢,則返回else。
decode函數(shù)常與nvl(),sign()函數(shù)一起使用笼痛;
7裙秋、case函數(shù)
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語(yǔ)句在處理類(lèi)似問(wèn)題就顯得非常靈活琅拌。當(dāng)只是需要匹配少量數(shù)值時(shí),用Decode更為簡(jiǎn)潔摘刑。
(二)进宝、數(shù)字函數(shù):
1、sign():返回值的符號(hào)(正數(shù)返回為1,負(fù)數(shù)為-1枷恕,如果n=0返回0)
select sign(-32),sign(293) from dual;
(三)党晋、其他函數(shù):
1、nvl(ex1,ex2):
ex1值為空則返回ex2,否則返回該值本身ex1(常用)
例:如果雇員沒(méi)有傭金徐块,將顯示0未玻,否則顯示傭金
select comm,nvl(comm,0) from emp;
2、nullif(ex1,ex2):
值相等返空胡控,否則返回第一個(gè)值
例:如果工資和傭金相等扳剿,則顯示空,否則顯示工資
select nullif(sal,comm),sal,comm from emp;
-
d昼激、存儲(chǔ)過(guò)程和函數(shù)
存儲(chǔ)過(guò)程是一種命名了的PL/SQL程序塊庇绽,只能通過(guò)EXCUTE(簡(jiǎn)寫(xiě)為exec)命令執(zhí)行或者在PL/SQL程序塊內(nèi)部被調(diào)用。
1) 普通存儲(chǔ)過(guò)程的創(chuàng)建和調(diào)用見(jiàn):http://www.reibang.com/p/5a90ccd9b643
2) 這里主要弄清楚在PL/SQL塊中調(diào)用存儲(chǔ)過(guò)程時(shí)橙困,參數(shù)輸入輸出怎樣改變的問(wèn)題瞧掺。
參數(shù)有IN和OUT兩種
函數(shù)的創(chuàng)建基本與存儲(chǔ)過(guò)程一致,只計(jì)算和返回一個(gè)值凡傅。
調(diào)用函數(shù)時(shí)夸盟,也是要先declare變量來(lái)接收返回值;且函數(shù)調(diào)用時(shí)只能作為表達(dá)式的一部分
(2)數(shù)據(jù)庫(kù)維護(hù)
主要包括對(duì)三種物理文件:數(shù)據(jù)文件像捶、控制文件上陕、日志文件的管理。
a拓春、這里主要講數(shù)據(jù)文件释簿,數(shù)據(jù)文件主要有數(shù)據(jù)表對(duì)象(table)、索引對(duì)象(index)硼莽、視圖對(duì)象(view)庶溶。關(guān)于索引和視圖的介紹可以翻看下面兩篇文章。
(http://www.reibang.com/p/4d521d9a9c78; http://www.reibang.com/p/c6d55ab63364)b懂鸵、表分區(qū)和索引分區(qū)
對(duì)應(yīng)的如何創(chuàng)建表分區(qū)偏螺、分區(qū)策略、管理表分區(qū)見(jiàn)
(http://www.reibang.com/p/a531f66ab062)
(3)SQL語(yǔ)句優(yōu)化和Oracle系統(tǒng)調(diào)優(yōu)
應(yīng)用系統(tǒng)的性能優(yōu)化包括對(duì)SQL語(yǔ)句的優(yōu)化匆光、Oracle系統(tǒng)套像、操作系統(tǒng)等的調(diào)整,其中工作量最大的就是SQL語(yǔ)句的調(diào)整终息。關(guān)于oracle系統(tǒng)的調(diào)優(yōu)主要是DBA通過(guò)調(diào)整系統(tǒng)配置參數(shù)讓oracle的運(yùn)行處于相對(duì)良好狀態(tài)夺巩。
- a贞让、常規(guī)SQL語(yǔ)句優(yōu)化
1)建議不用“*”來(lái)代替所有列名
因?yàn)閛racle系統(tǒng)會(huì)通過(guò)查詢字典將“*”轉(zhuǎn)換成表的所有列名,這自然會(huì)消耗系統(tǒng)時(shí)間柳譬,建議直接寫(xiě)與訪問(wèn)表有關(guān)的實(shí)際列名喳张。
2)用Truncate代替delete
在使用delete刪除表中所有數(shù)據(jù)航時(shí),oracle會(huì)使用撤銷(xiāo)表空間來(lái)存放回復(fù)的信息美澳,在這期間如果用戶沒(méi)有發(fā)出commit命令销部,而是發(fā)出rollback命令,oracle系統(tǒng)會(huì)將數(shù)據(jù)恢復(fù)到刪除之前的狀態(tài)制跟。
而使用truncate則是直接刪除數(shù)據(jù)柴墩,不會(huì)將刪除的數(shù)據(jù)寫(xiě)入回滾段,速度自然快得多凫岖。
3)用[NOT] EXISTS 代替[NOT] IN
在子查詢中江咳,[NOT] IN將執(zhí)行一個(gè)內(nèi)部的排序與合并,它對(duì)子查詢中的表進(jìn)行了一個(gè)全表遍歷哥放,無(wú)論哪種情況下都是最低效的歼指。可以用[NOT] EXISTS來(lái)代替甥雕。
b踩身、表連接優(yōu)化
1) 驅(qū)動(dòng)表的選擇
驅(qū)動(dòng)表是指被最先訪問(wèn)的表(通常以全表掃描的方式被訪問(wèn))
2) Where子句的連接順序
Oracle采取自下而上的順序解析where子句,因此表之間的連接必須寫(xiě)在其他where條件之前社露。那些可以過(guò)濾掉最大數(shù)據(jù)記錄的條件必須寫(xiě)在where子句末尾挟阻。c、合理使用索引
索引的目的就是為了提高查詢速度峭弟,判斷一個(gè)索引是否被使用如下:
Alter index schema.index_name monitoring usage;
檢查使用情況:select * from v$object_usage;d附鸽、優(yōu)化器的使用
Oracle的優(yōu)化器有兩種,基于規(guī)則的優(yōu)化器(RBO)與基于代價(jià)的優(yōu)化器(CBO)瞒瘸,對(duì)所有的SQL語(yǔ)句執(zhí)行EXPLAIN PLAN命令來(lái)了解每個(gè)SQL語(yǔ)句的執(zhí)行計(jì)劃坷备。
explain plan for select t.*, t.rowid from A5 t where t.l = '101214' and t.k like '%8號(hào)' order by i ;
1) 看執(zhí)行計(jì)劃時(shí),我們首先從縮進(jìn)最大的行讀取情臭,它是最先被執(zhí)行的步驟省撑。在執(zhí)行計(jì)劃中:id=3和id=4是最先被執(zhí)行的。 兩行縮進(jìn)一樣的俯在,最上面的最先被執(zhí)行竟秫,在這里就是id=3
2) 選擇次之縮進(jìn)的行數(shù)id=2,表連接方式為NESTED LOOPS跷乐。
3) 然后是id=1肥败,掃描表的方式為T(mén)ABLE ACCESS BY INDEX ROWID
4) 最后是id=0
我們翻譯成語(yǔ)言大概如下,
從t2表第一行讀取,查看每一行是否符合下面條件:"T1"."ID"="T2"."ID"拙吉;
如果符合就拿出一行來(lái)潮孽,掃描整個(gè)t2表揪荣,這個(gè)過(guò)程就叫NESTED LOOPS
當(dāng)整個(gè)t2表被掃描完之后筷黔,會(huì)產(chǎn)生一個(gè)結(jié)果集,這個(gè)結(jié)果集是IND_T1的一個(gè)索引集仗颈,然后oracle根據(jù)索引鍵值上的rowid去T1表中找到相應(yīng)的記錄佛舱,就是這一步:TABLE ACCESS BY INDEX ROWID
最后將結(jié)果返回:SELECT STATEMENT