2013年4月17日水曜日

開発環境

初めてのコンピュータサイエンス(Jennifer CampbellPaul GriesJason MontojoGreg 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 コメント:

コメントを投稿