IN句
以前から理解したいと思っていたIN句について調べました〜
IN句とは
一致するかの条件をまとめて判断出来るSQLの構文です。
具体例
以下のようなeventsテーブルを操作するとします。
IN句を使う場合
以下のようにIN句を使うことで複数の条件を指定してデータを取得する事ができます。
SELECT * FROM events WHERE id IN (1,2);
※アティブレコードだと
> 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;
※アティブレコードだと
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