25. 資料庫聯接操作,左連線,右鏈結,全鏈結的操作以及區別(手寫 sql 語句)
left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 (通俗點講就是,左邊的表是老大,要顯示全部內容,右邊的表是小弟,只有跟老大相同的東西才顯示出來,不相同的就是null);
right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄(通俗點講就是,右邊的表是老大,要顯示全部內容,左邊的表是小弟,只有跟老大相同的東西才顯示出來,不相同的就是null;
inner join(等值連線|全連線也叫內連線) 只返回兩個表中聯結字段相等的行(左右兩邊勢均力敵,不相上下。兩邊都不想妥協,所以只有共同的東西才顯示出來);
26. 資料庫的三大正規化的理解。
經過研究和對使用中問題的總結,對於設計資料庫提出了一些
規範,這些規範被稱為正規化。
• 第一正規化(
1nf)
:列不可拆分
, 即無重複的域。是指資料庫表的每一列都是不可分割的基本資料項。
符合第一正規化的特點就有:有主關鍵字、主鍵不能為空、主鍵不能重複,
欄位不可以再分。 •
第二正規化(
2nf)
:唯一標識 ,即擁有實體的唯一標識
(eg:
身份證、
id號等
)。指每個表必須有且僅有乙個資料元素為主關鍵字
(primary key),
其他資料元素與主關鍵字一一對應。這種關係為函式依賴。
符合第二正規化的特點就有:滿足第一正規化的前提下,消除部分函式依賴。
• 第三正規化(
3nf)
:引用主鍵
,即每列資料都與主鍵直接相關。
符合第三正規化的特點就有:不存在非主屬性對碼的傳遞性依賴以及部分性依賴 。
三大正規化只是一般設計資料庫的基本理念,可以建立冗餘較小、結構合理的資料庫。如果有特殊情況,當然要特殊對待,資料庫設計最重要的是看需求跟效能,需求》效能》
表結構。所以不能一味的去追求正規化建立資料庫。
27.什麼是sql注入?
sql是運算元據庫資料的結構化查詢語言,網頁的應用資料和後台資料庫中的資料進行互動時會採用sql。而sql注入是將web頁面的原url、表單域或資料報輸入的引數,修改拼接成sql語句,傳遞給web伺服器,進而傳給資料庫伺服器以執行資料庫命令。如web應用程式的開發人員對使用者所輸入的資料或cookie等內容不進行過濾或驗證(即存在注入點)就直接傳輸給資料庫,就可能導致拼接的sql被執行,獲取對資料庫的資訊以及提權,發生sql注入攻擊。
其特點如下:
1)、廣泛性
任何乙個基於sql語言的資料庫都可能被攻擊,很多開發人員在編寫web應用程式時未對從輸入引數、web表單、cookie等接受到的值進行規範性驗證和檢測,通常會出現sql注入漏洞。
2)、隱蔽性
sql注入語句一般都嵌入在普通的http請求中,很難與正常語句區分開,所以當前許多防火牆都無法識別予以警告,而且sql注入變種極多,攻擊者可以調整攻擊的引數,所以使用傳統的方法防禦sql注入效果非常不理想。
3)、危害大
攻擊者通過sql注入獲取到伺服器的庫名、表名、欄位名,從而獲取到整個伺服器中的資料,對**使用者的資料安全有極大的威脅。攻擊者也可以通過獲取到的資料,得到後台管理員的密碼,然後對網頁頁面進行惡意篡改。這樣不僅對資料庫資訊保安造成嚴重威脅,對整個資料庫系統安全也影響重大。
4)、操作方便
網際網路上有很多sql注入工具,簡單易學,攻擊過程簡單,不需要專業知識也能自如運用。
28. python的底層實現,用到的排序函式(手寫冒泡演算法)
答:共有八種
氣泡排序:
氣泡排序是最常見到的排序演算法,也是大學學習時遇到的第一種排序演算法,它的實現思想是:相鄰的兩個元素進行比較,然後把較大的元素放到後面(正向排序),在一輪比較完後最大的元素就放在了最後乙個位置,因為這一點像魚兒在水中吐的氣泡在上公升的過程中不斷變大,所以得名氣泡排序。在該排序演算法中,要遍歷n-1輪,每一輪都要比較陣列中的元素,所以時間複雜度是
o(n2)。氣泡排序具體實現的**如下:
def bubble_sort(alist):
length = len(alist)
for i in range(length - 1):
# i表示比較多少輪
for j in range(length - i - 1):
# j表示每輪比較的元素的範圍,因為每比較一輪就會排序好乙個元素的位置,
# 所以在下一輪比較的時候就少比較了乙個元素,所以要減去i
if alist[j] > alist[j + 1]:
alist[j], alist[j + 1] = alist[j + 1], alist[j]
9. 解釋一下 python 中的 gil 是什麼
1. gil是什麼:全域性解析器鎖
2. gil的作用:單核的情況下可以實現多工(併發)
3. gil的解決方案:
多程序vs多執行緒:最流行的方法是應用多程序方法,在這個方法中你使用多個程序而不是多個執行緒。每乙個python程序都有自己的python直譯器和記憶體空間,因此gil不會成為問題。
30. gil是單執行緒的,那麼python中多執行緒的實現有什麼用。
程序之間不能共享記憶體,但執行緒之間共享記憶體非常容易。
作業系統在建立程序時,需要為該程序重新分配系統資源,但建立執行緒的代價則小得多。因此,使用多執行緒來實現多工併發執行比使用多程序的效率高。
python 語言內建了多執行緒功能支援,而不是單純地作為底層作業系統的排程方式,從而簡化了 python 的多執行緒程式設計。
31. 對於多執行緒,我是怎麼去使用的,如果要我去設計乙個執行緒池,我該怎麼去設計。
方法一:使用threadpool模組,這是個python的第三方模組,支援python2和python3.
方法二:使用concurrent.futures模組,這個模組是python3中自帶的模組,但是,python2.7以上版本也可以安裝使用
方法3:重寫threadpool或者future的函式;
方法4:自己構建乙個執行緒池
32. python協程實現乙個生產者消費者模型。(手寫**)
def consumer(name):
print('%s開始準備吃包子了' % name)
while true:
baozi = yield
print('[%s]包子來了,被[%s]吃了' % (baozi, name))
def product(name):
print('%s開始做包子了' % name)
c = consumer('張三') # 生成器
c1 = consumer('李四')
c.__next__()
c1.__next__()
****:
執行結果:
老闆開始做包子了
張三開始準備吃包子了
李四開始準備吃包子了
做好了2個包子
[0]包子來了,被[張三]吃了
[0]包子來了,被[李四]吃了
做好了2個包子
[1]包子來了,被[張三]吃了
[1]包子來了,被[李四]吃了
做好了2個包子
[2]包子來了,被[張三]吃了
[2]包子來了,被[李四]吃了
做好了2個包子
[3]包子來了,被[張三]吃了
[3]包子來了,被[李四]吃了
做好了2個包子
[4]包子來了,被[張三]吃了
[4]包子來了,被[李四]吃了
做好了2個包子
[5]包子來了,被[張三]吃了
[5]包子來了,被[李四]吃了
做好了2個包子
[6]包子來了,被[張三]吃了
[6]包子來了,被[李四]吃了
做好了2個包子
[7]包子來了,被[張三]吃了
[7]包子來了,被[李四]吃了
做好了2個包子
[8]包子來了,被[張三]吃了
[8]包子來了,被[李四]吃了
做好了2個包子
[9]包子來了,被[張三]吃了
[9]包子來了,被[李四]吃了
process finished with exit code 0
u center相關學習筆記和問題整理
1.資訊 現error txbuf alloc的錯誤資訊內容。解決方案 可能是之前配置了錯誤的內容,可以恢復預設設定,在ubx cfg中選擇revert to default configuration,應該就可以恢復正常。參考 2.nmea資訊表示的內容 gprmc 推薦定位資訊 gpgga gp...
集合相關問題整理
1.集合的型別為什麼不能指定為基本資料型別?如 listlist new arraylist 答 集合中存放的可都是物件的引用,實際內容都在堆上面或者方法區裡面,但是基本資料型別是在棧上分配空間的,隨時就被收回的。但是通過自動包裝類就可以把基本型別轉為物件型別,存放引用就解決了這個問題。2.集合中存...
opencv相關問題整理(1)
1.如何將mat 轉換成iplimage,或者iplimage轉換成mat?iplimage cvgetimage const cvarr arr,iplimage image header cvmat cvgetmat const cvarr arr,cvmat header,int coi nu...