この記事で学ぶこと
前回(#4)はGoからDBにデータを保存・取得しました。ただSQLについては最低限しか触れていません。この記事からはデータベースそのものを基礎から学びます。
この記事を終えると以下ができるようになります。
- リレーショナルデータベース(RDB)の基本概念を説明できる
- SQLでデータの取得・追加・更新・削除(CRUD)ができる
- psqlでDBを直接操作できる
DBはバックエンドの心臓部です。AIにSQLを書かせるだけでなく、自分で読み書きできて「何が起きているか」を理解できるようになることを目指します。
リレーショナルデータベースとは
データを「表」で管理する
リレーショナルデータベース(RDB)は、データを 表(テーブル) の形で管理するデータベースです。PostgreSQL、MySQL、Oracleなどが代表例です。
前回作った users テーブルはこんな表になっています。
| id | name | age |
|---|---|---|
| 1 | washi | 30 |
| 2 | taro | 25 |
| 3 | hanako | 28 |
-
テーブル → 表そのもの(
users) -
カラム(列) → 縦の項目(
id,name,age) -
レコード(行) → 横1行のデータ(
1, washi, 30)
Excelの表をイメージすると分かりやすいです。違いは、DBは大量のデータを高速に検索でき、複数人が同時にアクセスしても安全に扱える点です。
なぜ「リレーショナル」なのか
「リレーション(関係)」が名前の由来です。複数のテーブルを関連づけて管理できます。たとえば「ユーザー」と「注文」を別々のテーブルで持ち、「どのユーザーがどの注文をしたか」を関連づけられます。この関連づけは #7 のJOINで扱います。
SQLの基本(CRUD)
DBを操作する言語がSQLです。基本操作は4つで、頭文字をとって CRUD(クラッド) と呼びます。
| 操作 | SQL | 意味 |
|---|---|---|
| Create | INSERT | データを追加する |
| Read | SELECT | データを取得する |
| Update | UPDATE | データを更新する |
| Delete | DELETE | データを削除する |
前回(#3)学んだHTTPメソッド(POST/GET/PUT/DELETE)と対応していることに気づくと思います。APIのメソッドとDBの操作はだいたい対応します。
【手を動かす①】DBに接続する
前回起動したPostgreSQLコンテナにSQLを直接打ち込んでみましょう。
コンテナが止まっている場合
前回docker stopで止めたならdocker start pg-practiceで再開できます。削除した場合は前回(#4記事相当)のdocker runコマンドで作り直してください。
コンテナが起動していることを確認します。
docker ps
# pg-practice が Up になっていればOK
コンテナの中のPostgreSQLに接続します。
docker exec -it pg-practice psql -U postgres -d testdb
-
docker exec -it pg-practice→ pg-practiceコンテナの中でコマンドを実行(-itは対話モード) -
psql→ PostgreSQLの対話ツール -
-U postgres→ ユーザー名postgresで -
-d testdb→ testdbデータベースに接続
接続できるとtestdb=#というプロンプトに変わります。ここでSQLを打てます。
SELECT(取得)
SELECT * FROM users;
users テーブルの全データを取得します。* は「全カラム」の意味。前回作ったデータが表示されるはずです。
特定のカラムだけ取得:
SELECT name, age FROM users;
SELECT 取得したいカラム FROM テーブル名; が基本の形です。
WHERE(条件で絞り込む)
SELECT * FROM users WHERE age >= 28;
age が28以上のレコードだけ取得します。WHERE は条件指定です。
SELECT * FROM users WHERE name = 'washi';
名前が washi のレコードを取得。文字列はシングルクォートで囲みます。
主な比較演算子:
| 演算子 | 意味 |
|---|---|
= |
等しい |
>= <=
|
以上・以下 |
> <
|
より大きい・より小さい |
!= または <>
|
等しくない |
LIKE |
部分一致(LIKE 'wa%' で wa で始まるもの) |
INSERT(追加)
INSERT INTO users (name, age) VALUES ('jiro', 22);
新しいレコードを追加します。id は SERIAL(自動採番)なので指定しません。
INSERT INTO テーブル名 (カラム) VALUES (値); が基本の形です。
UPDATE(更新)
UPDATE users SET age = 31 WHERE name = 'washi';
washi の年齢を31に更新します。
最重要の注意:WHERE を忘れると全レコードが更新されます。
UPDATE users SET age = 0;
-- WHEREがないので全員のageが0になる!絶対やってはいけない
これは現場でもやらかしがちな事故です。UPDATEとDELETEを打つときは、必ずWHEREがあるか確認する癖をつけてください。
DELETE(削除)
DELETE FROM users WHERE name = 'jiro';
jiro のレコードを削除します。これも WHERE を忘れると全削除されるので要注意です。
psqlを抜ける
\q
【手を動かす②】CRUDを一通り試す
psqlに接続した状態で、以下を順番に実行してみてください。
-- 現在のデータを確認
SELECT * FROM users;
-- 新規追加
INSERT INTO users (name, age) VALUES ('saburo', 40);
-- 追加されたか確認
SELECT * FROM users WHERE name = 'saburo';
-- 更新
UPDATE users SET age = 41 WHERE name = 'saburo';
-- 更新されたか確認
SELECT * FROM users WHERE name = 'saburo';
-- 削除
DELETE FROM users WHERE name = 'saburo';
-- 削除されたか確認(0件になる)
SELECT * FROM users WHERE name = 'saburo';
CRUDの一連の流れが体感できます。
確認テスト
知識問題
- テーブル、カラム、レコードはそれぞれ何ですか?
- CRUDの4つの操作と対応するSQLを答えてください
-
SELECT * FROM users WHERE age >= 28;は何をしますか? - SQLで文字列を指定するとき、何で囲みますか?
- UPDATEやDELETEで一番気をつけるべきことは何ですか?
-
LIKE 'wa%'はどんな条件ですか?
実技問題
-
productsテーブルから価格が1000円以上の商品を全カラム取得するSQLを書いてください -
productsテーブルに「name=Coffee, price=500」を追加するSQLを書いてください -
washiというユーザーの age を 35 に更新するSQLを書いてください(usersテーブル、nameで絞り込む) -
taroというユーザーを削除するSQLを書いてください
確認テスト 解答・解説
1. テーブルは表そのもの。カラムは縦の項目(列)。レコードは横1行のデータ。
2. Create=INSERT(追加)、Read=SELECT(取得)、Update=UPDATE(更新)、Delete=DELETE(削除)。
3. usersテーブルから、ageが28以上のレコードを全カラム取得する。
4. シングルクォート(')で囲む。
5. WHEREを忘れないこと。WHEREがないと全レコードが対象になってしまう。
6. name が「wa」で始まる文字列(前方一致)。% は任意の文字列を表すワイルドカード。
7.
SELECT * FROM products WHERE price >= 1000;
8.
INSERT INTO products (name, price) VALUES ('Coffee', 500);
9.
UPDATE users SET age = 35 WHERE name = 'washi';
10.
DELETE FROM users WHERE name = 'taro';
次回: #6 テーブル設計と正規化