代碼詳解:用SQL GROUP BY語句,找出最強精靈寶可夢

2021-01-08 讀芯術

全文共3168字,預計學習時長6分鐘

圖片來源:Unsplash/Jay

知道如何在SQL內完成基礎操作後(如果不知道,請閱讀「Python SQL基礎簡介」,就可以開始使用SQL提供的更多其他工具了。

GROUP BY語句是SQL中一個很實用的工具。有了它,就可以對數據進行深入研究,並使用一些函數將相同數據進行分組。

如果一欄中不同的行具有相同的值,這些行就會被放到一個單獨的分組中。

使用GROUP BY語句要注意以下重要的三點:

1. GROUP BY 是與SELECT語句一起使用的。

2. 查詢時,GROUP BY位於WHERE語句之後。

3. 查詢時,GROUP BY置於ORDER BY語句之前(如果使用到ORDER BY)。

在了解這些基本規則以後,就可以打開筆記本電腦進行實操了!

設置

以下例子將使用Kaggle數據集中Pokémon遊戲的數據。

圖片來源:unsplash.com/@melvina

儘管使用遊戲數據是為了給SQL增加趣味性,這些例子同樣也非常適用於更加商業化的決策,比如按照年齡段,收入水平,地理位置等給人群進行分組。

首先導入所需的庫,並在python中加載CSV文件。

import pandas as pd

import sqlite3

cnx = sqlite3.connect(':memory:')

csvfile = ('/Users/randy/Documents/GitHub/Pokemon-Stat-Predictor/Pokemon.csv') #Original data

columns = ['#','name','type1','type2','total','hp','attack','defense',\

'sp_atk','sp_def','speed','generation','legendary']

#open the csv file

df = pd.read_csv(csvfile, names=columns, header=0

接下來,先清理數據,然後將其導入SQLite資料庫:

#find NaN values

nan_rows = df[df.isnull().T.any().T]

nan_rows.head()

這一步將會找到所有空值並返回其中一部分(如果有的話)。

當所有空值都出現在type2一欄時,將所有空值都變成「none」。

#change all Type 2 NaN values to 'None':

df['type2'] = df['type2'].fillna('none')

因為SQL對字符串很敏感(同一字符串大寫與小寫代表含義不同),所以要將所有字符都設置為小寫形式。

#change all strings within the dataframe to lower case

df = df.astype(str).apply(lambda x: x.str.lower())

然後將其設置為一個SQL資料庫。

#set the database for pokemon

df.to_sql('pokemon', con=cnx, if_exists='append', index=False)#function for the SQL queries below

def sql_query(query):

return pd.read_sql(query, cnx)

太棒了,接下來可以開始執行一些SQL語句!

GROUP BY的基本語法

GROUP BY函數的基本語法是:

SELECT column_name(s), function_name(column_name)

FROM table_name

WHERE condition

GROUP BY column_name(s)

ORDER BY column_name(s);

function_name: SUM(), AVG(), MIN(), MAX(), COUNT().

table_name: name of the table. In this example, there is only the pokemon table

condition: condition used.

有了它,就可以重新組織和操作數據,以得到更好的分析。

簡單的GROUP BY語句

如果只想得到Pokémon中能力最高的那個精靈的名稱,類別與總能力值,可以以一個簡單的MAX()查詢開始:

query = '''

SELECT name, type1, type2, MAX(total)

FROM pokemon

WHERE legendary = 'true';

'''

sql_query(query)

這個操作將輸出超級Mewtwo X,一個同時具有精神與戰鬥屬性,總能力值高達780的Pokémon。

但如果只想要了解type1種類下能力最強的Pokémon呢?GROUP BY語句在這時就展現出其用武之地了:

query = '''

SELECT name, type1, type2, MAX(total)

FROM pokemon

WHERE legendary = 'true'

GROUP BY type1;

'''

sql_query(query)

現在輸出的就不只是一個Pokémon(超級Mewtwo X)了,而是14個傳奇的小精靈。

SQL查詢找到了所有傳奇小Pokémon,並基於type1欄將它們分到了單獨的組中。

Pokémon在被分到了暗系、龍系、電系、飛行系等不同的組後,SQL查詢將返回每一個組中小Pokémon的名字、type1、type2與總能力值。

GROUP BY和HAVING語句

WHERE語句能給各欄加設條件,但如果想要給組加設條件呢?引入HAVING語句!

由於WHERE關鍵詞不能用在聚合函數中,在此選用帶有GROUP BY的HAVING語句。

可以用HAVING語句輸入條件來決定哪一組將會成為最終結果的一部分。同樣的, WHERE語句對聚合函數不起任何作用。所以如果想要加設條件,就要將HAVING語句用於聚合函數中。

HAVING語句的基本語法:

SELECT column_name(s)

FROM table_name

WHERE condition

GROUP BY column_name(s)

HAVING condition

ORDER BY column_name(s);

帶有HAVING語句的GROUP BY

圖片來源:unsplash.com/@jeshoots

如果想知道所有Pokémon的數量、type1、最小和最大總能力值與所有type1分組下小Pokémon的平均HP,且只包含那些總HP值高於4000的Pokémon組:

query = '''

SELECT COUNT(name) as pokemon_count, type1, MIN(total), MAX(total), AVG(HP)

FROM pokemon

GROUP BY type1

HAVING SUM(HP) > 4000;

'''

sql_query(query)

這有助於確定哪些小Pokémon組在其類別中具有最高的HP值,同時也能剔除事先設定好的HP小於4000的Pokémon組。

如果想從具有高HP值的小Pokémon裡進行挑選,最好選擇普通type1組,其中的小精靈具有最高平均HP值(77.28)且非常耐打。

HAVING語句真的有助於精簡數據,並得出更有用更深刻的結果。

留言 點讚 關注

我們一起分享AI學習與發展的乾貨

如需轉載,請後臺留言,遵守轉載規範

相關焦點

  • 精靈寶可夢GO最強精靈組合屬性克制詳解
    精靈寶可夢GO最強精靈組合屬性克制詳解。很多玩家都想在知道什麼精靈最強,今天小編就是來告訴大家,精靈沒有最強。都是互相克制的。接下來就和18183小編木子一起來看看吧。 因為所有的精靈屬性之間存在克制,和被克制。所以大家不要盲目追求一些主流的精靈,有一些看似很弱的精靈,在道館防禦戰的時候會帶來奇效果。
  • 《精靈寶可夢go》道館聲望怎麼刷 道館聲望獲取詳解
    導 讀 精靈寶可夢go道館聲望怎麼得?下面小編為大家帶來精靈寶可夢go道館聲望獲取詳解,希望這篇攻略詳解能夠對大家有所幫助。
  • 《精靈寶可夢go》哪個寵物更好用 寵物選擇攻略詳解
    導 讀 精靈寶可夢go初期用什麼寵物好?下面小編為大家帶來精靈寶可夢go初期寵物選擇詳解,希望這篇攻略詳解能夠對大家有所幫助。
  • 精靈寶可夢Lets Go超夢對戰隊伍推薦 超夢隊配置詳解
    精靈寶可夢Lets Go超夢對戰隊伍推薦 超夢隊配置詳解 精靈寶可夢LetsGo超夢是本版本最強王者之一,那麼怎樣的寶可夢配合超夢組隊才最合適呢
  • 最強解讀MyBatis是如何執行SQL語句的?
    MyBatis 如何獲取 sql 語句?MyBatis 如何執行 sql 語句?MyBatis 如何實現不同類型數據之間的轉換?在過去程式設計師使用JDBC連接資料庫,總會帶來諸多不便。MyBatis 如何獲取 sql 語句? 與獲取資料庫源類似,只要解析Mapper配置文件中的對應標籤,就可以獲得對應的sql語句。
  • 《精靈寶可夢LetsGo皮卡丘伊布》寶可夢連鎖機制詳解
    連鎖機制是《精靈寶可夢Let's Go 皮卡丘/伊布》中比較核心的一個系統,想要獲得閃光或高個體值寶可夢就需要利用到連鎖,許多玩家還不清楚連鎖機制是怎樣的,下面小編就為大家帶來一篇由「NS新聞速報」分享的寶可夢連鎖機制詳解,一起來看看吧。
  • 精靈寶可夢GO烈焰馬技能搭配 烈焰馬詳解
    精靈寶可夢GO烈焰馬怎麼樣?精靈寶可夢GO烈焰馬如何爭取搭配技能?關於精靈寶可夢GO中的烈焰馬,今天安趣網小編就為各位玩家小夥伴來好好的講解下,讓我們一起來看看,精靈寶可夢GO中的烈焰馬怎麼搭配組合陣型的吧!
  • 《精靈寶可夢go》補給點有什麼作用 補給點詳解
    導 讀 精靈寶可夢go補給點有什麼用?下面小編為大家帶來精靈寶可夢go補給點作用詳解,希望這篇攻略詳解能夠對大家有所幫助。 補給站是用於補給大家的道具。
  • 揭秘:一條SQL語句的執行過程是怎麼樣的?
    原始碼裡的主要目錄及其作用如下,我們需要分析的代碼基本都在 sql 目錄下,它包含了編譯器和服務端的核心組件。另外,也有少量幾個代碼文件是用 C 語言編寫的。為了跟蹤 MySQL 的執行過程,你要用 Debug 模式編譯 MySQL。如果你用單線程編譯,大約需要 1 個小時。編譯好以後,先初始化出一個資料庫來:.
  • Oracle優化:sql語句的執行順序
    理解 sql 語句的執行順序對我們優化 sql 有很大的幫助,那麼 sql 語句的執行順序是怎樣的呢,以一條簡單的的語句做分析:① 先執行 from 子句,明確數據的來源,從哪個表或哪個視圖來查詢② 接著執行 where 子句,根據列出來的條件篩選數據
  • 《精靈寶可夢Let's Go》卡拉卡拉配招是什麼 卡拉卡拉進化圖鑑詳解
    如果你喜歡這個寶可夢的話,就來看看這篇精靈寶可夢Let's Go卡拉卡拉進化圖鑑詳解來深入了解一下它吧。 《精靈寶可夢Let... 卡拉卡拉從最初登場到現在一直都是帶著一個頭骨的樣子,沒有人見過它的真面目。
  • 日進一步第三天,SQL語句之order by
    數據分析之小白的第一條sql語句第二天的group by則是方便快捷分組語句數據分析之小白的第二條sql語句今天帶來的是ORDER BY---排序語句為了對檢索出的結果進行排序,一般我們就會用到ORDER BY了,它的含義是:根據欄位……進行排序。
  • 使用explain和show profile來分析SQL語句實現優化SQL語句
    SQL語句優化是建立在慢查詢分析的基礎上,通過慢查詢定位有問題的SQL語句,關於慢查詢的介紹及其分析工具,可以參考[mysql慢查詢及慢查詢日誌分析工具]一、通過explain查詢1 用法:explain sql2 作用:用於分析sql語句(1)、id:執行explain的一個編號(沒有實際意義)(2)、
  • 精靈寶可夢go精靈最強十大輸出技能推薦
    精靈寶可夢go精靈最強十大輸出技能推薦,精靈寶可夢go精靈技能有哪些?該怎麼選擇?下面跟小編一起來看吧! 最強輸出技能NO.10 名稱:vine whip藤鞭 所需能量:10 輸出:800 最強輸出技能NO.9 名稱:zen headbutt思念頭錘 所需能量:15 輸出:825DPM 最強輸出技能
  • 《精靈寶可夢go》道館對戰怎麼打 道館對戰打法技巧詳解
    導 讀 精靈寶可夢go道館對戰怎麼打?下面小編為大家帶來精靈寶可夢go道館對戰打法詳解,希望這篇攻略詳解能夠對大家有所幫助。
  • 數據分析之小白的第二條sql語句
    數據分析之小白的第一條sql語句認識下今天的SQL語句WHERE(篩選)和GROUP BY……(按照什麼分組)WHERE employee_id>10GROUP BY employee_group這兩條語句的含義分別是1、篩選員工id大於10的員工
  • 精靈寶可夢lets go紫苑鎮怎麼過_紫苑鎮攻略詳解
    精靈寶可夢lets go紫苑鎮怎麼過?紫苑鎮是一個非常經典的地圖,在最早版本的精靈寶可夢中,還流傳過紫苑鎮靈異事件。那麼本作的紫苑鎮有哪些需要注意的地方呢?很多小夥伴還不清楚,下面就給大家帶來紫苑鎮攻略詳解,希望能幫到大家。除此之外,小夥伴們也可以了解一下寵物進化類網路遊戲,希望大家喜歡。
  • 《精靈寶可夢go》快龍怎麼克制 快龍克制打法
    導 讀 精靈寶可夢go快龍怎麼克制?下面小編為大家帶來精靈寶可夢go快龍克制詳解,希望這篇攻略詳解能夠對大家有所幫助。
  • 精靈寶可夢:我是最強的寶可夢!超夢再次回歸觀眾視線,小智小豪挑戰...
    最近《精靈寶可夢》新無印又推出了神仙劇情,編劇拋出了"收服超夢"這個主題,派小智小豪一起挑戰"最強"的寶可夢——超夢。按照小豪之前暴打閃電鳥的表現,他還真有可能收服超夢,但編劇不是傻子,觀眾也不是憨憨,小豪收服超夢這個情節一播出,《精靈寶可夢》這個招牌就不用要了,在新無印最新一集裡,超夢吊錘了小豪和小智的寶可夢,再度證明了自己的實力。
  • Pokemon go遛寵新功能曝光 精靈寶可夢GO遛寵得糖果
    精靈寶可夢GO溜寵功能怎麼玩?精靈寶可夢GO溜寵功能是幹什麼用?對於精靈寶可夢GO中的全新溜寵功能,今天安趣網小編就為各位玩家小夥伴帶來了,精靈寶可夢GO溜寵功能詳解,讓我們一起來看看的吧!