🙆♀️
MYSQLクエリをRubyコードへ置き換え
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
name
level
カラムのデータを取得する
「players」テーブルから、SQLクエリ
SELECT name, level FROM players;
Rubyコード
Player.select(:name, :level)
level
が7以上)したレコードを取得する
「players」テーブルから、指定(SQLクエリ
SELECT * FROM players WHERE level >= 7;
Rubyコード
Player.where('level >= ?', 7)
level
が7以上のレコードと、job_id
が6と等しくない)したレコードを取得する
「players」テーブルから、複数指定(SQLクエリ
SELECT * FROM players WHERE level >= 7 AND job_id <> 6;
Rubyコード
Player.where('level >= ? AND job_id <> ?', 7, 6)
level
が7以上)したレコードと、name
level
のカラム選択を組み合わせ取得する
「players」テーブルから、指定(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
job_id
が6と等しくない)に合ったデータの件数を表示する
「players」テーブルから、条件(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)
job_id
ごと人数を集計する
「players」テーブルから、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)
name
level
vitality
)を取得する
「players」テーブルと「jobs」テーブルを内部結合して、指定したカラム(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')
strength
が5以上)で、name
level
strength
カラムのレコードを取得する
「players」テーブルと「jobs」テーブルを内部結合して、条件(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
RubyではなくActiveRecordですね。Arelだったらまた書き方が変わってきます。ORマッパーの思想の違いですね。
遊びで書いてる時はいいですが、仕事で使う時はRubyの機能なのかRailsの機能なのか他のgemの機能なのかきとんと区別する必要があります。