大ちゃんの駆け出し技術ブログ

RUNTEQ受講生のかわいいといわれるアウトプットブログ

【SQL】SQL基本①

はじめに

こんにちは!大ちゃんの駆け出し技術ブログです。

この間まで面接で出てきそうな質問シリーズについて深掘りするという記事を9記事にも渡って執筆しました。それをすることで基本がいかに大事であるかを再認識しました、、!そして自分は基本からやり直す必要があるなと感じたので、今回からまたシリーズものでSQLについて複数の記事に渡って書いていきたいと思います!

O/Rマッピング

話題に入る前にO/Rマッピングについて触れておきます。

O/Rマッピングとは以下のように説明されています。

オブジェクト指向プログラミング言語におけるオブジェクトとリレーショナルデータベース(RDB)の間でデータ形式の相互変換を行うこと

https://e-words.jp/w/O-Rマッピング.html

オブジェクト指向プログラミング言語でデータベースをSQLを書くことなしに操作できる」という方が理解しやすいかもしれません。そして、この表現で思い出すのがRailsActive Recordだと思います。Active RecordがあることでSQLを覚えることなしにRubyのコードでデータの取り出し、作成、更新、削除を簡単に実行することができます。

しかし、Active Record(O/Rマッピング)があることで「SQLを覚えられない」というデメリットがあると思います。SQLを覚えられないことがどれほど問題かというと、サーバーサイドを理解できていないことになるんですね。

サーバーサイドの基本中の基本はSQLです。そしてどのサーバーサイド言語を使っていても、コードが違うだけで全てSQLを操作しているんですね。なのでSQLを理解しないことはサーバーサイドエンジニアとしてはちょっとダメだと思います。

今回は最初なので基本中の基本ですが、データの取り出し、作成、更新、削除の基本SQL4つを解説します。

使用するテーブル

今回は下記のテーブルを流用させていただきます。

https://i.gyazo.com/7041586f99d97b4dbcba1f7a7aca3b19.png

https://www.sejuku.net/blog/72964

SELECT

データの取得にあたるSQLではSELECTを使用します。Active Recordでは以下のメソッドが実行された時などに発行されます。

  • find
  • find_by
  • where

基本構文は以下のとおりです。

SELECT 列名 
FROM テーブル名
(~その他WHEREなどの修飾);

例えば、名前だけを取り出したい場合は以下のようになります。

SELECT 名前 
FROM game_character;

出力結果

名前
--------------------------
| ヤマダ       |
| スズキ       |
| タナカ       |
| タカハシ     |
| ワタナベ     |

複数のレコードを列を取得するには「,」で列名を区切ります。

SELECT 列名1,列名2,列名3...
FROM テーブル名;

IDも同時に取得すると

SELECT ID,名前
FROM game_character;

出力結果

名前
--------------------------
|1, ヤマダ       |
|2, スズキ       |
|3, タナカ       |
|4, タカハシ     |
|5, ワタナベ     |

全列のデータを取得する際は「*」を使用します。

SELECT *
FROM game_character;
----------------------------------------------------
| id   | name         | job          | level |
----------------------------------------------------
|    1 | ヤマダ       | 勇者         |    30 |
|    2 | スズキ       | 戦士         |    42 |
|    3 | タナカ       | 戦士         |    25 |
|    4 | タカハシ     | 魔法使い     |    60 |
|    5 | ワタナベ     | 僧侶         |    20 |
----------------------------------------------------

Active Recordの場合、全列の取得がほとんどかなと思いますが、一応selectメソッドを使うと列を取得できるようです。

豊富なサンプルコードでselectメソッドを理解する!

UPDATE

データの更新にあたるSQLではUPDATEを使用します。Active Recordではupdateですね。

  • update

基本構文は以下のとおりです。

UPDATE テーブル名 
SET 列名=値1, 列名=値2...
(~その他WHEREなどの修飾);

SELECTと見た目が異なる部分は1文目はテーブル名、2文目が列名を指定しているところです。実際に名前を更新してみます。

UPDATE game_character
SET 名前=DAIKI;

上記のSQLを発行すると、あら不思議!名前のレコードが全てDAIKIと同じになりました。。。

SQLで列を更新する場合、一般的には更新したいレコードを指定するべきです。そうでないとその列全ての値が同じになってしまいます。Active Rercordでも値を更新する際は指定されたレコードの値を更新しています。例えば上のテーブルのIDが1の人の名前をActive Recordで書く場合は一度どのユーザを更新するかを指定してから値の更新をするupdateメソッドを実行します。

@user = User.find(1) <= レコードを指定
@user.update(name: "DAIKI")

これと同じようにレコードを指定してSQLを発行します。その時に使用するのがWHERE句です。実際に上記のActive Recordと同じようにIDが1の人の名前をSQLで値を更新します。

UPDATE game_character
SET 名前=DAIKI
WHERE ID = 1;

WHERE句を使用してIDが1である条件をつけます。これでテーブルのIDが1である人の名前を更新できます。

DELETE

データの削除にあたるSQLではDELETEを使用します。Active Recordではdeleteとdestroyです。

  • delete
  • destroy

基本構文は以下のとおりです。

DELETE
FROM テーブル名
(~その他WHEREなどの修飾);

DELETEを使用する場合WHEREを指定しないとテーブルそのものが削除されてしまいます。ですのでここでもWHEREは必須です。

DELETE
FROM game_character
WHERE ID = 1;

上記の文章でIDが1である人のレコードが削除されます。

INSERT

データの作成にあたるSQLではINSERTを使用します。CREATEではありません!ここ意外と間違えます。Active Recordではcreateやsaveです。

  • create
  • save

基本構文は以下のとおりです。

INSERT INTO テーブル名
        (列名1,列名2...)
        VALUES (値1,値2...)

今までの3つはかなり構文の見た目が違いますね。。。正直覚えづらいです。。。

こちらも最初にActive Recordを例にしてみます。

@user = User.new(name: "大樹", job: "魔剣士", level: 20)
@user.save

上記と同じ処理をSQLでするには以下のようになります。

INSERT INTO game_character
        (name, job, level)
        VALUES (大樹, 魔剣士, 20)

INSERT文は少し覚えづらいので定着するまでは何度も確認する必要があるかなと思います!

終わりに

次回もSQLについて書きます!

以上、大ちゃんの駆け出し技術ブログでした!