SQL-Rails 語法對照表-查詢檔案

Mino chen
CodeForMyself
Published in
3 min readMar 2, 2021

因為 ORM 太寵我們了,下達的 CRUD 指令通通會幫你翻譯成 SQL 語法,你是不是多多少少會覺得有點不踏實呢?

萬一有一天不是寫 rails 之後就好像武功全廢?

所以我就決定來好好的了解一下它們之間對照的關係,這樣無論世界怎麼變,時間越快,心則慢(?)

  1. 查全部檔案 Hero.all,SQL 語法是SELECT * FROM heroes;
  2. 查詢某個條件的欄位 Hero.where(hero_level:'S')
    SQL 語法是
SELECT * 
FROM heroes
WHERE hero_level = "S";

3. 查詢某兩個以上同時成立條件的欄位 Hero.where(hero_level:'S', gender:'F')

SELECT * 
FROM heroes
WHERE hero_level = "S" AND gender = 'F';

4. 查詢某兩個以上個別成立條件的欄位Hero.where(hero_level: ['S','A'])

#列出S和A等級
SELECT *
FROM heroes
WHERE hero_level = "S" OR hero_level = "A";

#WHERE ... IN
SELECT *
FROM heroes
WHERE hero_level IN ('S','A');

5. 查詢部分資料,不要全部資料,Hero.select(:hero_level, :gender).where(hero_level = "S")

#就會只撈 hero_level, gender 這兩個欄位
SELECT hero_level, gender
FROM heroes
WHERE hero_level = "S";

6. 查詢未填資料的欄位 is NULL,Hero.where(hero_level: nil)

SELECT *
FROM heroes
WHERE age is NULL;

#如果是查空白的資料要用 age = ""

7. 關鍵字搜尋

#硬寫字串給他,rails 沒有 like 寫法,但會有 injection 風險
Hero.where("name like '%背心%'" )

#或是這樣寫找出包含使用者 id 的 id
Hero.where("id = ?", params[:id])

SQL 語法

SELECT *
FROM heroes
WHERE name like '%背心%';

#就會查到所有名字裡有背心的人物

8. 查詢排除某個條件的方法 Hero.where.not(age: 10)

--找出不是 10 歲的英雄
SELECT *
FROM heroes
WHERE age != 10;

#SQL語法還可以支援這樣
SELECT *
FROM heroes
WHERE age <> 10;

除了提醒自己 SQL 語法也同等重要外,也希望能夠提供一起在 rails 努力的朋友一些統整後的資料。

--

--