2018年12月9日日曜日

開発環境

Head First SQL ―頭とからだで覚えるSQLの基本 (Lynn Beighley (著), 佐藤 直生 (監訳)、松永 多苗子 (翻訳)、オライリージャパン)の2章(SELECT文 - 天賦のデータ検索)、エクササイズ(p. 112).を取り組んでみる。

コード(Emacs)

Python 3

#!/usr/bin/env python3
import psycopg2 as sql

conn = sql.connect(database='gregs_list', user='kamimura')
cursor = conn.cursor()

_sql = '''
create table if not exists black_book(
date_name varchar(20),
rating varchar(20))
'''

cursor.execute(_sql)

_sql = '''insert into black_book values(%s, %s)'''
values = [('アレックス', '斬新'),
          ('ジェームス', '退屈'),
          ('イアン', '驚くべき'),
          ('ポリス', 'つまらない'),
          ('メルビン', '下層階級'),
          ('エリック', '情けない'),
          ('アンソニー', '楽しい'),
          ('サミー', 'かなりいい'),
          ('イヴァン', '陰気'),
          ('ヴィック', '話にならない')]

cursor.executemany(_sql, values)
conn.commit()

tables = ['easy_drinks', 'drink_info', 'black_book']
for table in tables:
    print(table)
    _sql = f'select * from {table}'
    cursor.execute(_sql)
    print(', '.join([column[0] for column in cursor.description]))
    for row in cursor.fetchall():
        print(row)

_sqls = [
    '''
select drink_name
from easy_drinks
where amount1 >= 1.50
''',
    '''
select drink_name
from drink_info
where ice <> 'Y'
''',
    '''
select drink_name
from drink_info
where calories >= 20
''',
    '''
select drink_name
from drink_info
where calories > 0
''',
    '''
select drink_name
from drink_info
where carbs < 3
or carbs > 5
''',
    '''
select date_name
from black_book
where substring(date_name from 1 for 1)
not between 'ア' and 'イ'
'''
]


for _sql in _sqls:
    print(_sql)
    cursor.execute(_sql)
    for row in cursor.fetchall():
        print(row)

cursor.close()
conn.close()

入出力結果(Terminal, cmd(コマンドプロンプト), Jupyter(IPython))

$ ./sample11.py
easy_drinks
drink_name, main, amount1, second, amount2, directions
('ブラックソーン', 'トニックウォーター', 1.5, 'パイナップルジュース', 1.0, '氷と一緒にかき混ぜ、濾してカクテルグラスに入れ、レモンを一搾り加える')
('ブルームーン', 'ソーダ', 1.5, 'ブルーベリージュース', 0.75, '氷と一緒にかき混ぜ、濾してカクテルグラスに入れ、レモンを一搾り加える')
('オーマイゴッシュ', '桃果汁', 1.0, 'パイナップルジュース', 1.0, '氷と一緒にかき混ぜ、濾してショットグラスに入れる')
('ライムフィズ', 'スプライト', 1.5, 'ライムジュース', 0.75, '氷と一緒にかき混ぜ、濾してカクテルグラスに入れる')
('キスオンザリップス', 'チェリージュース', 2.0, 'あんず果汁', 7.0, '氷の上に注いで、ストローを付ける')
('ホットゴールド', '桃果汁', 3.0, 'オレンジジュース', 6.0, '熟したオレンジジュースをマグカップに注いで、桃果汁を加える')
('ローンツリー', 'ソーダ', 1.5, 'チェリージュース', 0.75, '氷と一緒にかき混ぜ、濾してカクテルグラスに入れる')
('グレイハウンド', 'ソーダ', 1.5, 'グレープフルーツジュース', 5.0, '氷の上に注いで、よく混ぜる')
('インディアンサマー', 'アップルジュース', 2.0, 'ホットティー', 6.0, 'ジュースをマグカップに加え、ホットティーで仕上げる')
('ブルフロッグ', 'アイスティー', 1.5, 'レモネード', 5.0, '氷の上に注いでライムを一切れ加える')
('シーダアンドイット', 'ソーダ', 2.0, 'グレープジュース', 1.0, '氷を入れずに、カクテルグラスでシェイクする')
drink_info
drink_name, cost, carbs, color, ice, calories
('ブラックソーン', 3.0, 8.4, '黄', 'Y', 33)
('ブルームーン', 2.5, 3.2, '青', 'Y', 12)
('オーマイゴッシュ', 3.5, 8.6, '橙', 'Y', 35)
('ライムフィズ', 2.5, 5.4, '緑', 'Y', 24)
('キスオンザリップス', 5.5, 42.5, '紫', 'Y', 171)
('ホットゴールド', 3.2, 32.1, '橙', 'N', 135)
('ローンツリー', 3.6, 4.2, '赤', 'Y', 17)
('グレイハウンド', 4.0, 14.0, '黄', 'Y', 50)
('インディアンサマー', 2.8, 7.2, '茶', 'N', 30)
('ブルフロッグ', 2.6, 21.5, '黄褐色', 'Y', 80)
('ソーダアンドイット', 3.8, 4.7, '赤', 'N', 19)
black_book
date_name, rating
('アレックス', '斬新')
('ジェームス', '退屈')
('イアン', '驚くべき')
('ポリス', 'つまらない')
('メルビン', '下層階級')
('エリック', '情けない')
('アンソニー', '楽しい')
('サミー', 'かなりいい')
('イヴァン', '陰気')
('ヴィック', '話にならない')

select drink_name
from easy_drinks
where amount1 >= 1.50

('ブラックソーン',)
('ブルームーン',)
('ライムフィズ',)
('キスオンザリップス',)
('ホットゴールド',)
('ローンツリー',)
('グレイハウンド',)
('インディアンサマー',)
('ブルフロッグ',)
('シーダアンドイット',)

select drink_name
from drink_info
where ice <> 'Y'

('ホットゴールド',)
('インディアンサマー',)
('ソーダアンドイット',)

select drink_name
from drink_info
where calories >= 20

('ブラックソーン',)
('オーマイゴッシュ',)
('ライムフィズ',)
('キスオンザリップス',)
('ホットゴールド',)
('グレイハウンド',)
('インディアンサマー',)
('ブルフロッグ',)

select drink_name
from drink_info
where calories > 0

('ブラックソーン',)
('ブルームーン',)
('オーマイゴッシュ',)
('ライムフィズ',)
('キスオンザリップス',)
('ホットゴールド',)
('ローンツリー',)
('グレイハウンド',)
('インディアンサマー',)
('ブルフロッグ',)
('ソーダアンドイット',)

select drink_name
from drink_info
where carbs < 3
or carbs > 5

('ブラックソーン',)
('オーマイゴッシュ',)
('ライムフィズ',)
('キスオンザリップス',)
('ホットゴールド',)
('グレイハウンド',)
('インディアンサマー',)
('ブルフロッグ',)

select date_name
from black_book
where substring(date_name from 1 for 1)
not between 'ア' and 'イ'

('ジェームス',)
('ポリス',)
('メルビン',)
('エリック',)
('サミー',)
('ヴィック',)
$

0 コメント:

コメントを投稿