かっちゃんのプログラミング奮闘記

このブログは、僕がプログラミング学習をしていく上で、知識のインプットを図るためのアウトプット場所として活用している場所です。

【SQL】SELECT文にだけ使える検索に関する修飾

検索の命令文であるSELECT文でしか利用できない抽出されたものをさらに加工(並び替え)して検索結果を返すことができる「修飾」をメモ書き程度に書き残していく。

DISTINCT(重複した行を除外してくれる)

列(カラム)内の重複した行(row)を除外して、同一で複数あるものを1つだけにしてくれる。同じものは保存されない。↓

・before       ・After
列(費目)       列(費目)
 食費           食費
 食費     →    光熱費
 光熱費         水道費
 水道費
 光熱費

※DISTINCTを使用する時は、必ず最初にSELECT をする。

SQLが読み込まれる順番は、まずはSELECTの様な代表的な命令形で抽出される。

その後にそのSELECTで選択されている結果をさらに加工(修飾)する。

SELECT DISTINCT 入金
  FROM 家計簿

Railsで対応するメソッド①

DISTINCTはRailsでのメソッドだと、distinctメソッドがこれに該当する。

User.select(:first_name, :age).distinct

Railsdistinctメソッドを利用する場合は、必ずselectメソッドで指定してあげてからじゃないと、重複を除外してくれない。

ORDER BY(検索結果を並び替える)

SELECT文の最後に「ORDER BY」を記述することで、指定した列を好きな様に並び替えられる。

 SELECT * FROM 家計簿
 ORDER BY 日付 DESC

これを利用すれば、ランキング機能なんかも作れる。

Railsで対応するメソッド②

orderメソッドがこの並び替えの処理をしてくれる。

Client.order(:create_at)

OFFSET - FETCH(任意の場所から数行だけ取得する)

行を限定して取得する。
この修飾を活用すれば、ランキング上位5を表示させるとかもできる様になる。

また、3番目に高いものだけ取得するとか範囲を限定に絞ってもできる。

SELECT 列名… FROM テーブル名
  ORDER BY 列名…
OFFSET 先頭から除外する行数(数値で) ROWS
  (FETCH NEXT 1(取得行数) ROWS ONLY)

Railsで対応するメソッド③

limitメソッドやoffsetメソッドで任意で取り出し場所を指定できる。

Book.order(price: :desc).limit(3).offset(6)

この時の数字は、0が1番目で、2番目は1。3は4番目なので、順番数えるの間違えない様に。