標籤:

3分鐘帶你了解SQL高級操作

這是菜鳥學Python的第94篇原創文章

閱讀本文大概需要3分鐘

前面一篇講了SQL最最基本的7招,光學會這個是不夠的,只能應付普通的增刪改查,如果碰到一些高級的,複雜的操作怎麼辦~~不急,SQL資料庫內置了很多眼花繚亂的高級功能,可以滿足你的各種需求,總有一款適合你,下面就帶領小夥伴繼續探討資料庫的對於單表的高級操作.

比如我們有一個這樣的資料庫,裡面是記錄員工的名字,年齡,性別和工資的一些二維數據表

1.分組

比如對於上面的資料庫,老闆交代任務希望我們能按照某一些類別去過濾,怎麼辦呢,SQL裡面有一個GROUP BY 關鍵字,可以按照類別來進行分組

1).統計出按照男,女性別的薪資總數:

cursor=conn.execute("SELECT sex,sum(salary) "n "FROM Employee GROUP BY sex ")nfor row in cursor:n print rown

>>

(uM, 30000.0)

(uW, 36500.0)

2).統計出年齡超過30歲以上的員工的薪資

cursor=conn.execute("SELECT sex,sum(salary) "n "FROM Employee "n "WHERE Employee.age>=30 "n "GROUP BY sex ORDER BY salary ")nfor row in cursor:n print rown

>>

(uW, 22500.0)

(uM, 25000.0)

3).統計出年齡20-30歲的員工的薪資

cursor=conn.execute("SELECT sex,sum(salary) "n "FROM Employee "n "WHERE age>20 and age<=30 "n "GROUP BY sex ORDER BY salary ")nfor row in cursor:n print rown

>>

(uM, 5000.0)

(uW, 26500.0)

  • 上面三種情況都是以sex為類別進行GROUP BY 分組,加上WHERE來做條件判斷,並且加上ORDER BY 排序
  • 但是有一點要注意GROUP BY 必須要在WHERE 之後,然後ORDER BY 之前

2.匹配通配符

有的時候我們需要在資料庫裡面模糊查詢,Python裡面有正則可以做類似的操作,資料庫裡面有沒有類似的呢~~有啊,有的SQL裡面有兩個關鍵字可以搞定:LIKE 和GLOB

SQLite 的 LIKE 運算符:

是用來匹配通配符指定模式的文本值

百分號 (%):代表零個、一個或多個數字或字元。

下劃線 (_):代表一個單一的數字或字元

SQLite 的 GLOB運算符:

星號 (*):代表零個、一個或多個數字或字元

問號 (?):代表一個單一的數字或字元

有同學說這兩個不是一回事嗎,怎麼要兩個關鍵字呢,這位同學觀察真仔細,其實是有區別的,GLOB 是大小寫敏感的,而Like不區分大小寫

1).用like過濾出所有字母J打頭的員工的薪資:

cursor=conn.execute("SELECT name,age,salary "n "FROM Employee WHERE name LIKE j% ")nfor row in cursor:n print rown

>>

(uJack, 23, 5000.0)

(uJames, 31, 11000.0)

2).用Glob過濾出所有字母J打頭的員工的薪資:

cursor=conn.execute("SELECT name,age,salary "n "FROM Employee WHERE name GLOB J* ")nfor row in cursor:n print rown

>>

(uJack, 23, 5000.0)

(uJames, 31, 11000.0)

3.取查詢數量

當資料庫的數量非常大的時候,我們有的時候希望取頭部,或者中間的一部分數據

比如:取排序之後的Top3,怎麼辦呢,SQL裡面有一個關鍵字Limit

1).取出資料庫里的工資最高的3人

cursor=conn.execute("SELECT * FROM Employee "n "ORDER BY salary DESC LIMIT 3")nfor row in cursor:n print rown

>>

(4, uMartin, 35, uM, 14000.0)

(5, uSuan, 28, uW, 14000.0)

(3, uLily, 30, uW, 12500.0)

2).我們希望從資料庫裡面的第3個開始取3個人的薪資

(1, uJack, 23, uM, 5000.0)

(2, uJames, 31, uM, 11000.0)

(3, uLily, 30, uW, 12500.0)

(6, uLisa, 32, uW, 10000.0)

(4, uMartin, 35, uM, 14000.0)

(5, uSuan, 28, uW, 14000.0)

怎麼操作呢,很簡單,看源碼:

cursor=conn.execute("SELECT * FROM Employee "n "ORDER BY name DESC LIMIT 3 OFFSET 2")nfor row in cursor:n print rown

>>

(6, uLisa, 32, uW, 10000.0)

(3, uLily, 30, uW, 12500.0)

(2, uJames, 31, uM, 11000.0)

LIMIT 3 OFFSET 2: 表示從第三行開始,向下偏移2行,這樣一共取3行的數據

4.二次過濾

上面的關鍵字都是進行一次過濾得到了一些分組結果,如果我們想在上面過濾出的結果中,再進行二次過濾,怎麼辦呢,SQL有一個關鍵字Having

1).先按名字進行過濾分組:

cursor=conn.execute("SELECT name,age FROM Employee "n "GROUP BY name ")nfor row in cursor:n print rown

>>

(uJack, 23)

(uJames, 31)

(uLily, 30)

(uLisa, 32)

(uMartin, 35)

(uSuan, 28)

2).在上面的分組結果,再進行二次過濾,篩選出薪資>10000

cursor=conn.execute("SELECT name,age,salary FROM Employee "n "GROUP BY name HAVING salary>10000")nfor row in cursor:n print rown

>>

(uJames, 31, 11000)

(uLily, 30, 12500)

(uMartin, 35, 14000)

(uSuan, 28, 14000)

5.去重複的元素

如果我們的資料庫裡面的名字有重複的怎麼辦,我如何統計唯一的名單,我們知道在Python中用set()去掉列表重複元素,那麼資料庫中如何操作呢,用關鍵字Distinct

比如:我們的資料庫有2個人名是一樣的

(1, uJack, 23, uM, 5000.0)

(2, uJames, 31, uM, 11000.0)

(3, uLily, 30, uW, 12500.0)

(4, uLisa, 32, uW, 10000.0)

(5, uMartin, 35, uM, 14000.0)

(6, uSuan, 28, uW, 14000.0)

(7, uJack, 28, uW, 6000.0)

(8, uJames, 31, uM, 12000.0)

現在我們要統計這個資料庫裡面的人名(唯一性)

cursor=conn.execute("SELECT DISTINCT count(name) "n "FROM Employee ")nfor row in cursor:n print rown

>>

6

結論:

好了,SQLite資料庫的高級操作就講到這裡,是不是很簡單啊,如果大家對今天的內容有什麼疑問,歡迎留言一起討論,上面這些都是單表的複雜操作。資料庫還有很多一對多,多對多的操作,以及最複雜的多表聯合查詢和精選的實戰例子,敬請期待吧.

歡迎大家關注 菜鳥學Python",更多好玩有趣的Python原創教程,趣味演算法,經驗技巧,行業動態,盡在菜鳥學Python,一起來學python吧

歷史人氣文章

Python語言如何入門

Python寫個迷你聊天機器人|生成器的高級用法

同學,學Python真的不能這樣學

全網爬取6500多隻基金|看看哪家基金最強

用Python破解微軟面試題|24點遊戲

一道Google的演算法題 |Python巧妙破解


推薦閱讀:

TAG:Python |