sqlの検索結果の加工
典型的なrailsエンジニアなので、sql文がなかなか覚えれないので、学習しています。
うん、書かないとどうあがいても覚えれないです。
容量が悪いので、量でカバーするしかない!
というわけで、sql文の検索結果の加工についてです。
前提条件
こんなtableがあったとします。
create table db_name.household_account_book (date date, expense_item varchar(20), memo varchar(100), deposit_amount integer, amount_invested integer)
distinct
重複を消す。
select distinct expense_item from household_account_book; → +-----------------+ | expense_item | +-----------------+ | 食費 | | 給料 | | 教育娯楽費 | | 交際費 | | 水道光熱費 | +-----------------+
order by
並び替えをする
mysql> select * from household_account_book -> order by date; +------------+-----------------+--------------------------+----------------+-----------------+ | date | expense_item | memo | deposit_amount | amount_invested | +------------+-----------------+--------------------------+----------------+-----------------+ | 2013-02-03 | 食費 | コーヒーを購入 | 0 | 0 | | 2013-02-10 | 給料 | 1月の給料 | 280000 | 0 | | 2013-02-11 | 教育娯楽費 | 書籍を購入 | 0 | 2800 | | 2013-02-14 | 交際費 | 同期会の会費 | 0 | 5000 | | 2013-02-18 | 水道光熱費 | 1月の電気代 | 0 | 7560 | | 2016-06-20 | 食費 | ドーナツを買った | 0 | 260 | +------------+-----------------+--------------------------+----------------+-----------------+
desc(Desecing)は降順になります。
出金額順に並べる
mysql> select * -> from household_account_book -> order by amount_invested desc; +------------+-----------------+--------------------------+----------------+-----------------+ | date | expense_item | memo | deposit_amount | amount_invested | +------------+-----------------+--------------------------+----------------+-----------------+ | 2013-02-18 | 水道光熱費 | 1月の電気代 | 0 | 7560 | | 2013-02-14 | 交際費 | 同期会の会費 | 0 | 5000 | | 2013-02-11 | 教育娯楽費 | 書籍を購入 | 0 | 2800 | | 2016-06-20 | 食費 | ドーナツを買った | 0 | 260 | | 2013-02-03 | 食費 | コーヒーを購入 | 0 | 0 | | 2013-02-10 | 給料 | 1月の給料 | 280000 | 0 | +------------+-----------------+--------------------------+----------------+-----------------+
limit
先頭から数行だけ抜き出す
出金額の上位3つだけ抜き取る
mysql> select * -> from household_account_book -> order by amount_invested desc limit 3; +------------+-----------------+--------------------+----------------+-----------------+ | date | expense_item | memo | deposit_amount | amount_invested | +------------+-----------------+--------------------+----------------+-----------------+ | 2013-02-18 | 水道光熱費 | 1月の電気代 | 0 | 7560 | | 2013-02-14 | 交際費 | 同期会の会費 | 0 | 5000 | | 2013-02-11 | 教育娯楽費 | 書籍を購入 | 0 | 2800 | +------------+-----------------+--------------------+----------------+-----------------+
offset
をつけることで、先頭から除外することができます。
3番目だけが欲しい場合
mysql> select * -> from household_account_book -> order by amount_invested desc limit 1 offset 2; +------------+-----------------+-----------------+----------------+-----------------+ | date | expense_item | memo | deposit_amount | amount_invested | +------------+-----------------+-----------------+----------------+-----------------+ | 2013-02-11 | 教育娯楽費 | 書籍を購入 | 0 | 2800 | +------------+-----------------+-----------------+----------------+-----------------+
よく使うものだと思いますけど、自分は馴染みがなかったので、ここに書いておきます。