開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc., Emacs(Text Editor)
- プログラミング言語: Python
初めてのコンピュータサイエンス(Jennifer Campbell、Paul Gries、Jason Montojo、Greg Wilson(著)長尾 高弘(翻訳))の15章(データベース)の15.11(練習問題)を解いてみる。
1, 2.
コード(BBEdit)
sample.py
#!/usr/bin/env python3.3 #-*- coding: utf-8 -*- import sqlite3 as dbapi con = dbapi.connect('census.db') cur = con.cursor() try: cur.execute('DROP TABLE Density') except Exception as err: print(type(err), err, err.args) cur.execute('CREATE TABLE Density(State TEXT, Population INTEGER, Area REAL)') states = [('ニューファンドランド・ラブラドール州', 512930, 370501.69), ('プリンスエドワードアイランド州', 135294, 5684.39), ('ノバスコシア州', 908007, 52917.43), ('ニューブランズウィック州', 729498, 7135567), ('ケベック州', 7237479, 1357743.08), ('オンタリオ州', 11410046, 907655.59), ('マニトバ州', 1119583, 551937.87), ('サスカチュワン州', 978933, 586561.35), ('アルバータ州', 2974807, 639987.12), ('ブリティッシュコロンビア州', 3907738, 926492.48), ('ユーコン準州', 28674, 474706.97), ('ノースウェスト準州', 37360, 1141108.37), ('ヌナブト準州', 26745, 1925460.18)] for state in states: cur.execute('INSERT INTO Density VALUES(?, ?, ?)', (state[0], state[1], state[2])) con.commit() print('表') cur.execute('SELECT * FROM Density') print(cur.fetchall()) print('人口') cur.execute('SELECT Population FROM Density') print(cur.fetchall()) print('100万人未満の州') cur.execute('SELECT State, Population FROM Density WHERE Population < 1000000') print(cur.fetchall()) print('100万人未満か500万人より多い州') cur.execute(''' SELECT State, Population FROM Density WHERE Population < 1000000 OR 5000000 < Population ''') print(cur.fetchall()) print("100万人以上500万人以下") cur.execute(''' SELECT State, Population FROM Density WHERE 1000000 <= Population AND Population <= 5000000 ''') print(cur.fetchall()) print("面積が20万km^2よりも大きい州の人口") cur.execute(''' SELECT Population, Area FROM Density WHERE AREA > 200000 ''') print(cur.fetchall()) print("州と人口密度") cur.execute('SELECT d.State, d.Population / d.Area FROM Density d') print(cur.fetchall()) try: cur.execute('DROP TABLE Capitals') except Exception as err: print(type(err), err, err.args) cur.execute('CREATE TABLE Capitals(State TEXT, City TEXT, Population INTEGER)') capitals = [('ニューファンドランド・ラブラドール州', 'セント・ジョンズ', 172918), ('プリンスエドワードアイランド州', 'シャーロットタウン', 58358), ('ノバスコシア州', 'ハリファックス', 359183), ('ニューブランズウィック州', 'フレデリクトン', 81345), ('ケベック州', 'ケベック', 682757), ('オンタリオ州', 'トロント', 4682897), ('マニトバ州', 'ウィニペグ', 671274), ('サスカチュワン州', 'レジャイナ', 192800), ('アルバータ州', 'エドモントン', 937845), ('ブリティッシュコロンビア州', 'ビクトリア', 311902), ('ユーコン準州', 'ホワイトホース', 21405), ('ノースウェスト準州', 'イエローナイフ', 16541), ('ヌナブト準州', 'イカルイト', 5236)] for capital in capitals: cur.execute('INSERT INTO Capitals VALUES(?, ?, ?)', (capital[0], capital[1], capital[2])) con.commit() print("表の内容") cur.execute('SELECT * FROM Capitals') print(cur.fetchall()) print("州/準州人口、州/準州都人口") cur.execute(''' SELECT d.State, d.Population, c.Population FROM Capitals c INNER JOIN Density d WHERE c.State == d.State ''') print(cur.fetchall()) print("州/準州都の10万を超える州/準州の面積") cur.execute(''' SELECT c.City, c.Population, d.Area FROM Capitals c INNER JOIN Density d WHERE c.State == d.state AND c.Population > 100000 ''') print(cur.fetchall()) print("人口密度が2人/km^2未満かつ州/準州都人口が50万人より多い州/準州") cur.execute(''' SELECT d.State, d.Population / d.Area, c.Population FROM Density d INNER JOIN Capitals c WHERE d.State == c.State AND d.Population / d.Area < 2 AND c.Population > 500000 ''') print(cur.fetchall()) print("州/準州都人口の平均") cur.execute('SELECT AVG(Population) FROM Capitals') print(cur.fetchall()) print("もっとも人口の少ない州/準州都") cur.execute('SELECT State, MIN(Population) FROM Capitals') print(cur.fetchall()) print("もっとも人口の多い州/準州") cur.execute('SELECT State, MAX(Population) FROM Density') print(cur.fetchall()) print("人口密度の差が0.5人/km^2以下の州の組み合わせ") cur.execute(''' SELECT a.State, b.State FROM Density a INNER JOIN Density b WHERE ABS(a.Population / a.Area - b.Population / b.Area) <= 0.5 AND a.State < b.State AND a.State != b.State ''') print(cur.fetchall())
入出力結果(Terminal)
$ ./sample.py 表 [('ニューファンドランド・ラブラドール州', 512930, 370501.69), ('プリンスエドワードアイランド州', 135294, 5684.39), ('ノバスコシア州', 908007, 52917.43), ('ニューブランズウィック州', 729498, 7135567.0), ('ケベック州', 7237479, 1357743.08), ('オンタリオ州', 11410046, 907655.59), ('マニトバ州', 1119583, 551937.87), ('サスカチュワン州', 978933, 586561.35), ('アルバータ州', 2974807, 639987.12), ('ブリティッシュコロンビア州', 3907738, 926492.48), ('ユーコン準州', 28674, 474706.97), ('ノースウェスト準州', 37360, 1141108.37), ('ヌナブト準州', 26745, 1925460.18)] 人口 [(512930,), (135294,), (908007,), (729498,), (7237479,), (11410046,), (1119583,), (978933,), (2974807,), (3907738,), (28674,), (37360,), (26745,)] 100万人未満の州 [('ニューファンドランド・ラブラドール州', 512930), ('プリンスエドワードアイランド州', 135294), ('ノバスコシア州', 908007), ('ニューブランズウィック州', 729498), ('サスカチュワン州', 978933), ('ユーコン準州', 28674), ('ノースウェスト準州', 37360), ('ヌナブト準州', 26745)] 100万人未満か500万人より多い州 [('ニューファンドランド・ラブラドール州', 512930), ('プリンスエドワードアイランド州', 135294), ('ノバスコシア州', 908007), ('ニューブランズウィック州', 729498), ('ケベック州', 7237479), ('オンタリオ州', 11410046), ('サスカチュワン州', 978933), ('ユーコン準州', 28674), ('ノースウェスト準州', 37360), ('ヌナブト準州', 26745)] 100万人以上500万人以下 [('マニトバ州', 1119583), ('アルバータ州', 2974807), ('ブリティッシュコロンビア州', 3907738)] 面積が20万km^2よりも大きい州の人口 [(512930, 370501.69), (729498, 7135567.0), (7237479, 1357743.08), (11410046, 907655.59), (1119583, 551937.87), (978933, 586561.35), (2974807, 639987.12), (3907738, 926492.48), (28674, 474706.97), (37360, 1141108.37), (26745, 1925460.18)] 州と人口密度 [('ニューファンドランド・ラブラドール州', 1.384420135843375), ('プリンスエドワードアイランド州', 23.8009707286094), ('ノバスコシア州', 17.15893988048928), ('ニューブランズウィック州', 0.10223406212848958), ('ケベック州', 5.330521736115201), ('オンタリオ州', 12.570898175154742), ('マニトバ州', 2.0284583842743027), ('サスカチュワン州', 1.6689353978062142), ('アルバータ州', 4.648229483118348), ('ブリティッシュコロンビア州', 4.217776273802028), ('ユーコン準州', 0.060403579075318826), ('ノースウェスト準州', 0.03274009812056676), ('ヌナブト準州', 0.013890185981410428)] 表の内容 [('ニューファンドランド・ラブラドール州', 'セント・ジョンズ', 172918), ('プリンスエドワードアイランド州', 'シャーロットタウン', 58358), ('ノバスコシア州', 'ハリファックス', 359183), ('ニューブランズウィック州', 'フレデリクトン', 81345), ('ケベック州', 'ケベック', 682757), ('オンタリオ州', 'トロント', 4682897), ('マニトバ州', 'ウィニペグ', 671274), ('サスカチュワン州', 'レジャイナ', 192800), ('アルバータ州', 'エドモントン', 937845), ('ブリティッシュコロンビア州', 'ビクトリア', 311902), ('ユーコン準州', 'ホワイトホース', 21405), ('ノースウェスト準州', 'イエローナイフ', 16541), ('ヌナブト準州', 'イカルイト', 5236)] 州/準州人口、州/準州都人口 [('ニューファンドランド・ラブラドール州', 512930, 172918), ('プリンスエドワードアイランド州', 135294, 58358), ('ノバスコシア州', 908007, 359183), ('ニューブランズウィック州', 729498, 81345), ('ケベック州', 7237479, 682757), ('オンタリオ州', 11410046, 4682897), ('マニトバ州', 1119583, 671274), ('サスカチュワン州', 978933, 192800), ('アルバータ州', 2974807, 937845), ('ブリティッシュコロンビア州', 3907738, 311902), ('ユーコン準州', 28674, 21405), ('ノースウェスト準州', 37360, 16541), ('ヌナブト準州', 26745, 5236)] 州/準州都の10万を超える州/準州の面積 [('セント・ジョンズ', 172918, 370501.69), ('ハリファックス', 359183, 52917.43), ('ケベック', 682757, 1357743.08), ('トロント', 4682897, 907655.59), ('ウィニペグ', 671274, 551937.87), ('レジャイナ', 192800, 586561.35), ('エドモントン', 937845, 639987.12), ('ビクトリア', 311902, 926492.48)] 人口密度が2人/km^2未満かつ州/準州都人口が50万人より多い州/準州 [] 州/準州都人口の平均 [(630343.1538461539,)] もっとも人口の少ない州/準州都 [('ヌナブト準州', 5236)] もっとも人口の多い州/準州 [('オンタリオ州', 11410046)] 人口密度の差が0.5人/km^2以下の州の組み合わせ [('ニューブランズウィック州', 'ユーコン準州'), ('ニューブランズウィック州', 'ノースウェスト準州'), ('ニューブランズウィック州', 'ヌナブト準州'), ('サスカチュワン州', 'ニューファンドランド・ラブラドール州'), ('サスカチュワン州', 'マニトバ州'), ('アルバータ州', 'ブリティッシュコロンビア州'), ('ノースウェスト準州', 'ユーコン準州'), ('ヌナブト準州', 'ユーコン準州'), ('ヌナブト準州', 'ノースウェスト準州')] $
3.
コード(BBEdit)
sample.py
#!/usr/bin/env python3.3 #-*- coding: utf-8 import sqlite3 as dbapi con = dbapi.connect('tmp.db') cur = con.cursor() try: cur.execute('DROP TABLE Numbers') except Exception as err: print(type(err), err, err.args) cur.execute('CREATE TABLE Numbers(Val INTEGER)') cur.execute('INSERT INTO Numbers Values(1)') cur.execute('INSERT INTO Numbers Values(2)') cur.execute('SELECT * FROM Numbers WHERE 1/0') print(cur.fetchall()) cur.execute('SELECT * FROM Numbers WHERE 1/0 AND Val > 0') print(cur.fetchall()) cur.execute('SELECT * FROM Numbers WHERE Val > 0 AND 1/0') print(cur.fetchall())
入出力結果(Terminal)
$ ./sample.py [] [] [] $
4.
コード(BBEdit)
sample.py
#!/usr/bin/env python3.3 #-*- coding: utf-8 import sqlite3 as dbapi def run_query(db, query, args=None): con = dbapi.connect(db) cur = con.cursor() if args: cur.execute(query, args) else: cur.execute(query) data = cur.fetchall() cur.close() con.close() return data if __name__ == '__main__': db = 'census.db' s = 1000000 t = 200000 print(run_query(db, 'SELECT * FROM Density')) print(run_query(db, ''' SELECT State, Population, Area From Density WHERE Population <= (?) and Area >= (?) ''', (s, t)))
入出力結果(Terminal)
$ ./sample.py [('ニューファンドランド・ラブラドール州', 512930, 370501.69), ('プリンスエドワードアイランド州', 135294, 5684.39), ('ノバスコシア州', 908007, 52917.43), ('ニューブランズウィック州', 729498, 7135567.0), ('ケベック州', 7237479, 1357743.08), ('オンタリオ州', 11410046, 907655.59), ('マニトバ州', 1119583, 551937.87), ('サスカチュワン州', 978933, 586561.35), ('アルバータ州', 2974807, 639987.12), ('ブリティッシュコロンビア州', 3907738, 926492.48), ('ユーコン準州', 28674, 474706.97), ('ノースウェスト準州', 37360, 1141108.37), ('ヌナブト準州', 26745, 1925460.18)] [('ニューファンドランド・ラブラドール州', 512930, 370501.69), ('ニューブランズウィック州', 729498, 7135567.0), ('サスカチュワン州', 978933, 586561.35), ('ユーコン準州', 28674, 474706.97), ('ノースウェスト準州', 37360, 1141108.37), ('ヌナブト準州', 26745, 1925460.18)] $
0 コメント:
コメントを投稿