IN句

以前から理解したいと思っていたIN句について調べました〜

 

IN句とは

一致するかの条件をまとめて判断出来るSQLの構文です。

 

具体例

以下のようなeventsテーブルを操作するとします。

id name date description
1 Whistler 1999-11-09 Went hiking.
2 Puffball 1999-11-08 Chased
3 Bowser 1999-11-07 Go to park.
4 Momiji 2003-10-20 Came to the Hayashi family.
5 Buffy 2000-10-30 Climbed to the mountain.
6 jassmine 2005-10-10 Studied.

 

IN句を使う場合

以下のようにIN句を使うことで複数の条件を指定してデータを取得する事ができます。

SELECT * FROM events WHERE id IN (1,2);

id name date description
1 Whistler 1999-11-09 Went hiking.
2 Puffball 1999-11-08 Chased

 

※アティブレコードだと

> Event.where(id: [1,2])

  Event Load (0.4ms)  SELECT  `events`.* FROM `events` WHERE `events`.`id` IN (1, 2) LIMIT 11

=> #<ActiveRecord::Relation [#<Event id: 1, name: "Whistler", date: "1999-11-09", description: "Went hiking.", created_at: "2019-11-09 13:23:43", updated_at: "2019-11-09 13:25:38">, #<Event id: 2, name: "Puffball", date: nil, description: "Chased", created_at: "2019-11-09 13:26:48", updated_at: "2019-11-09 13:27:45">]>

 

 

IN句を使わない場合

SELECT * FROM events WHERE id = 1 OR id = 2;

id name date description
1 Whistler 1999-11-09 Went hiking.
2 Puffball 1999-11-08 Chased

 

※アティブレコードだと

 SELECT * FROM events WHERE id = 1 OR id = 2; というSQLが吐かれるメソッドはよく分かりませんでしたが、

IN句ではなくレコード数分SQLが吐かれるような書き方は以下です。

irb(main):004:0> arry =

=>

irb(main):005:0> [1,2].each do |i|

irb(main):006:1* arry << Event.find(i)

irb(main):007:1> end

  Event Load (7.7ms)  SELECT  `events`.* FROM `events` WHERE `events`.`id` = 1 LIMIT 1

  Event Load (0.8ms)  SELECT  `events`.* FROM `events` WHERE `events`.`id` = 2 LIMIT 1

=> [1, 2]

 

 この例くらいの単純なデータ取得ならわざわざ配列作ってeachを回すことはしないですが、関連テーブルまたいで云々~みたいに複雑な処理をする際は配列をeachで回してしまいがちです。。。( eachが使い慣れているので)

 

 

感想その他

以前rubyで書いたSQLが大量に吐かれるスクリプトを指摘され、同時にIN句についての話を少し教えてもらった事があったのですが、理解しきれておりませんでした。

railsのどのメソッド使うとどんなSQLが吐かれるかパッとイメージできるようになりたいです。

 

それと、サブクエリにつては後日調べますw