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 |
+------------+-----------------+-----------------+----------------+-----------------+

よく使うものだと思いますけど、自分は馴染みがなかったので、ここに書いておきます。