🙆‍♀️

MYSQLクエリをRubyコードへ置き換え

2023/08/05に公開1

Paizeでデータベース言語のSQLを学習したクエリを使用して、Rubyのコードに置き換えてみました。

データベーステーブル

  • 今回使用するテーブル名は、「players」及び「jobs」です。
  • 「players」及び「jobs」テーブルで使用するカラム名は、下の通りです。

「players」

id name level job_id

「jobs」

id job_name vitality strength agility intelligence luck

MYSQLクエリとRubyコード

「players」テーブルの全てのデータを取得する

SQLクエリ
SELECT * FROM players;
Rubyコード
Player.all

「players」テーブルから、name levelカラムのデータを取得する

SQLクエリ
SELECT name, level FROM players;
Rubyコード
Player.select(:name, :level)

「players」テーブルから、指定(levelが7以上)したレコードを取得する

SQLクエリ
SELECT * FROM players WHERE level >= 7;
Rubyコード
Player.where('level >= ?', 7)

「players」テーブルから、複数指定(levelが7以上のレコードと、job_idが6と等しくない)したレコードを取得する

SQLクエリ
SELECT * FROM players WHERE level >= 7 AND job_id <> 6;
Rubyコード
Player.where('level >= ? AND job_id <> ?', 7, 6)

「players」テーブルから、指定(levelが7以上)したレコードと、name levelのカラム選択を組み合わせ取得する

SQLクエリ
SELECT name, level FROM players WHERE level >= 7;
Rubyコード
Player.select(:name, :level).where('level >= ?', 7)

「players」テーブルから、データ件数を表示する

SQLクエリ
SELECT COUNT(*) FROM players;
Rubyコード
Player.count

「players」テーブルから、条件(job_idが6と等しくない)に合ったデータの件数を表示する

SQLクエリ
SELECT COUNT(*) FROM players WHERE job_id = 6;
Rubyコード
Player.where(job_id: 6).count

「players」テーブルから、データを昇順に並び替えて取得する

SQLクエリ
SELECT * FROM players ORDER BY level;
Rubyコード
Player.order(:level)

「players」テーブルから、データを降順に並び替えて取得する

SQLクエリ
SELECT * FROM players ORDER BY level DESC;
Rubyコード
Player.order(level: :desc)

「players」テーブルから、データを降順に並び替えて、上位3件だけ取得する

SQLクエリ
SELECT * FROM players ORDER BY level DESC LIMIT 3;
Rubyコード
Player.order(level: :desc).limit(3)

「players」テーブルから、job_idごと人数を集計する

SQLクエリ
SELECT job_id, COUNT(*) FROM players GROUP BY job_id;
Rubyコード
Player.group(:job_id).count

「players」テーブルと「jobs」テーブルを内部結合して、全てのデータを取得する

SQLクエリ
SELECT * FROM players INNER JOIN jobs ON jobs.id = players.job_id;
Rubyコード
Player.joins(:job)

「players」テーブルと「jobs」テーブルを左結合して、全てのデータを取得する

SQLクエリ
SELECT * FROM players LEFT JOIN jobs ON jobs.id = players.job_id;
Rubyコード
Player.left_outer_joins(:job)

「players」テーブルと「jobs」テーブルを内部結合して、指定したカラム(name level vitality)を取得する

SQLクエリ
SELECT name, level, vitality FROM players INNER JOIN jobs ON jobs.id = players.job_id;
Rubyコード
Player.joins(:job).select('players.name', 'players.level', 'jobs.vitality')

「players」テーブルと「jobs」テーブルを内部結合して、条件(strengthが5以上)で、name level strengthカラムのレコードを取得する

SQLクエリ
SELECT name, level, strength FROM players INNER JOIN jobs ON jobs.id = players.job_id WHERE strength >= 5;
Rubyコード
Player.joins(:job).select('players.name', 'players.level','jobs.strength') .where('jobs.strength >= ?', 5)

Discussion

meamea

RubyではなくActiveRecordですね。Arelだったらまた書き方が変わってきます。ORマッパーの思想の違いですね。
遊びで書いてる時はいいですが、仕事で使う時はRubyの機能なのかRailsの機能なのか他のgemの機能なのかきとんと区別する必要があります。