【SQL】SQL基本①
はじめに
こんにちは!大ちゃんの駆け出し技術ブログです。
この間まで面接で出てきそうな質問シリーズについて深掘りするという記事を9記事にも渡って執筆しました。それをすることで基本がいかに大事であるかを再認識しました、、!そして自分は基本からやり直す必要があるなと感じたので、今回からまたシリーズものでSQLについて複数の記事に渡って書いていきたいと思います!
O/Rマッピング
話題に入る前にO/Rマッピングについて触れておきます。
O/Rマッピングとは以下のように説明されています。
オブジェクト指向プログラミング言語におけるオブジェクトとリレーショナルデータベース(RDB)の間でデータ形式の相互変換を行うこと
https://e-words.jp/w/O-Rマッピング.html
「オブジェクト指向プログラミング言語でデータベースをSQLを書くことなしに操作できる」という方が理解しやすいかもしれません。そして、この表現で思い出すのがRailsのActive Recordだと思います。Active RecordがあることでSQLを覚えることなしにRubyのコードでデータの取り出し、作成、更新、削除を簡単に実行することができます。
しかし、Active Record(O/Rマッピング)があることで「SQLを覚えられない」というデメリットがあると思います。SQLを覚えられないことがどれほど問題かというと、サーバーサイドを理解できていないことになるんですね。
サーバーサイドの基本中の基本はSQLです。そしてどのサーバーサイド言語を使っていても、コードが違うだけで全てSQLを操作しているんですね。なのでSQLを理解しないことはサーバーサイドエンジニアとしてはちょっとダメだと思います。
今回は最初なので基本中の基本ですが、データの取り出し、作成、更新、削除の基本SQL4つを解説します。
使用するテーブル
今回は下記のテーブルを流用させていただきます。
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メソッドを使うと列を取得できるようです。
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について書きます!
以上、大ちゃんの駆け出し技術ブログでした!