數(shù)據(jù)庫(kù)開(kāi)發(fā)崗面試準(zhǔn)備(1)——Python、MongoDB、Oracle

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

    1.png

    數(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=30m

  • c、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://m.itdecent.cn/p/5a90ccd9b643
    2) 這里主要弄清楚在PL/SQL塊中調(diào)用存儲(chǔ)過(guò)程時(shí),參數(shù)輸入輸出怎樣改變的問(wèn)題。
    參數(shù)有IN和OUT兩種
2.png
3.png

函數(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://m.itdecent.cn/p/4d521d9a9c78; http://m.itdecent.cn/p/c6d55ab63364)

  • b、表分區(qū)和索引分區(qū)
    對(duì)應(yīng)的如何創(chuàng)建表分區(qū)、分區(qū)策略、管理表分區(qū)見(jiàn)
    (http://m.itdecent.cn/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 ;

4.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容