PythonスクリプトからMySQLのDBのデータの平均値を求めよう
今回は新しくテーブルを作成して、そのデータの平均値を取得してみましょう。
テーブル名を「tb2」として、以下のようなカラムを持たせます。
カラム名 | タイプ | 内容 | 備考 |
name | VARCHAR(14) | 氏名 | NOT NULL |
lang | INT(3) | 国語の点数 | |
math | INT(3) | 数学の点数 | |
engl | INT(3) | 英語の点数 |
テーブルは、第2回の記事で使ったスクリプトの11行目を以下のように修正して作成します。
1 2 |
### 11行目 sql = "CREATE TABLE tb2 (name VARCHAR(14) NOT NULL, lang INT(3), math INT(3), engl INT(3))" |
データは、第3回の記事で使ったスクリプトの11行目と14行目を以下のように修正して挿入します。
1 2 3 4 5 |
### 11行目 members = [('山田太郎',100,80,100),('鈴木新之助',50,40,60),('佐藤明',30,80,20),('John Tanaka',18,85,99)] ### 14行目 sql = "INSERT INTO tb2 (name, lang, math, engl) VALUES (%s, %s, %s, %s)" |
平均値を求める関数
SQLで平均値を求めるには、AVG()関数を使います。
AVG([DISTINCT] 値)
DISTINCTオプションを使用すると、重複を除いた値で平均を出します。
値をまるめる関数
SQLで値をまるめるには、ROUND()関数を使います。
ROUND(値, 小数点以下の桁数)
平均値を求めるPythonスクリプト
平均値を求めるPythonスクリプトは、以下のようになります。
先にデータの一覧を出力して、そのあと各教科の平均値を出力します。
なお、Pythonでは全角も半角も1文字と計算されてしまい、全角と半角が混ざっていると表示する位置がずれてしまいます。
そのため、29~31行目で文字が何バイトあるかを計算して、表示桁数を揃えています。
全角に関する詳しい内容は、こちらの記事を参照してください。
また、平均値は1行しかないため、カーソル値の取得に fetchone()関数を使っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
### インポート import unicodedata import mysql.connector ### DB接続 cnx = mysql.connector.connect(host='192.168.11.10', user='user1', password='password1', database='db1') ### カーソル作成 cursor = cnx.cursor() ### SELECT文作成 sql1 = "SELECT * FROM tb2" sql2 = "SELECT ROUND(AVG(lang),1), ROUND(AVG(math),1), ROUND(AVG(engl),1) FROM tb2" ### データ取得実行 cursor.execute(sql1) ### ヘッダ出力 print("{} {} {} {}".format("氏名 ", "国語", "数学", "英語")) print("{} {} {} {}".format("--------------", "----", "----", "----")) ### データ出力 for col1, col2, col3, col4 in cursor: ### カウンター初期化 count = 0 ### キャラクター数取得 for chara in col1: if unicodedata.east_asian_width(chara) in "FWA": count += 1 ### データ出力 print("{:{width}s} {:4d} {:4d} {:4d}".format(col1, col2, col3, col4, width=14-count)) ### 改行 print() ### データ平均値取得実行 cursor.execute(sql2) ### ヘッダ出力 print("{} {} {}".format("国語", "数学", "英語")) print("{} {} {}".format("----", "----", "----")) ### データ出力 col1, col2, col3 = cursor.fetchone() print("{:4} {:4} {:4}".format(col1, col2, col3)) ### カーソルクローズ cursor.close() ### DB切断 cnx.close() |
プログラムを実行すると、以下のように結果が出力されます。