こんにちは、Railsエンジニアにょけんです。
Rails勉強中の方に向けて、「最低限これは抑えとこう!」というSQL関連の知識をまとめました。
データベースの基礎
まず、データベースの基礎用語が以下。
- テーブル→表全体
- レコード→データ1行
- カラム→データ1列
例えば、「rails g model Product name:string price:integer category:string」を実行して適当にデータを登録したと仮定します。
- テーブル→赤枠の中
- レコード→緑色の部分
- カラム→青枠の中(nameカラム)
| Product_Table |
|||
| id | name | price | category |
| 1 | シャーペン | 150 | 文房具 |
| 2 | コーラ | 200 | 飲み物 |
| 3 | ボールペン | 100 | 文房具 |
こんな感じ。
で、「SQL」は、このデータベースを操作するための言語です。
まずはこの3つ! 覚えとかなきゃ話にならんSQLコマンド
必須の3つが以下。
- SELECT→カラムを指定
- WHERE→レコードを指定
- FROM→テーブルを指定
例えば、Productsテーブルで、categoryが「文房具」である商品の「name」「price」を取得する場合は、
SELECT name, price FROM products WHERE category = “文房具”;
日本語にすると、Poductテーブルの中から、categoryが文房具であるnameとpriceを取得しろ
つまり、結果として、以下緑色の部分が取得できるわけです。
| Product_Table |
|||
| id | name | price | category |
| 1 | シャーペン | 150 | 文房具 |
| 2 | コーラ | 200 | 飲み物 |
| 3 | ボールペン | 100 | 文房具 |
基本はこの3つで、あとはこれにいろんなオプションを突っ込んでいく感じですね。
「〜以外」を指定する「NOT」
SELECT name, price FROM products WHERE NOT category = “文房具”;
とすると、さっきの逆なので「コーラ」「200円」というデータが取れます。
つまり、結果として、以下緑色の部分が取得できるわけです。
| Product_Table |
|||
| id | name | price | category |
| 1 | シャーペン | 150 | 文房具 |
| 2 | コーラ | 200 | 飲み物 |
| 3 | ボールペン | 100 | 文房具 |
NOTの入れる位置が感覚的にわかりにくいので注意!
複数の条件を指定するときは「AND」「OR」
条件は複数指定することができます。
どちらも満たしてほしい場合は「AND」
categoryが「文房具」で、かつ、priceが150以上のレコードを取得したければ、
SELECT * FROM products WHERE category = “文房具” AND price >=150;
| Product_Table |
|||
| id | name | price | category |
| 1 | シャーペン | 150 | 文房具 |
| 2 | コーラ | 200 | 飲み物 |
| 3 | ボールペン | 100 | 文房具 |
どちらかを満たす場合は「OR」
categoryが「文房具」で、または、priceが150以上のレコードを取得したければ、
SELECT name, price FROM products WHERE category = “文房具” OR price >=150;
| Product_Table |
|||
| id | name | price | category |
| 1 | シャーペン | 150 | 文房具 |
| 2 | コーラ | 200 | 飲み物 |
| 3 | ボールペン | 100 | 文房具 |
「任意の文字を含むデータ」を取得したいときは、「LIKE」と「ワイルドカード(%)」
「全データの中で、nameに『ペン』という文字を含むモノだけ欲しい!」って場合に便利なのが、LIKEとワイルドカードです。
SELECT * FROM products WHERE name LIKE”%ペン%”;
| Product_Table |
|||
| id | name | price | category |
| 1 | シャーペン | 150 | 文房具 |
| 2 | コーラ | 200 | 飲み物 |
| 3 | ボールペン | 100 | 文房具 |
このようにあいまいな指定をする場合は、「=」ではなく「LIKE」を使うので気をつけましょう。
値がnullのモノを取得するには、「NULL」
priceが「NULL」のカラムを取得したい場合は、
SELECT * FROM products WHERE price IS NULL;
priceが「NULL」以外のカラムを取得したい場合は、
SELECT * FROM products WHERE price IS NOT NULL;
並び替えは、「ORDER BY」
昇順・降順で並べるには「ORDER BY」を使います。(ASC→昇順、DESC→降順)
priceが高い順に並び替える場合は、
SELECT * FROM products ORDER BY price DESC;
| Product_Table |
|||
| id | name | price | category |
| 1 | コーラ | 200 | 飲み物 |
| 2 | シャーペン | 150 | 文房具 |
| 3 | ボールペン | 100 | 文房具 |
昇順は、DESCを「ASC」にするだけ。
取得する件数を指定するには「LIMIT」
例えば、priceが1番高いものだけ取得したければ
SELECT * FROM products ORDER BY price DESC LIMIT(1);
| Product_Table |
|||
| id | name | price | category |
| 1 | コーラ | 200 | 飲み物 |
| 2 | シャーペン | 150 | 文房具 |
| 3 | ボールペン | 100 | 文房具 |
重複データを省くには「DISTINCT」
categoryカラムが「文房具」のものが2つありますが、「1つだけしか使わない」みたいなときにDITINCTを使います。
SELECT DISTINCT(category) FROM products;
| Product_Table |
|||
| id | name | price | category |
| 1 | シャーペン | 150 | 文房具 |
| 2 | コーラ | 200 | 飲み物 |


