1-3 SQL入門 - データを操作する言語
SQL入門 - データを操作する言語¶
SQLはデータベースと会話するための言語である。4つの基本操作を覚えれば、データの取得・追加・更新・削除ができるようになる。
なぜこれを学ぶのか¶
前回までにデータベースとテーブルの概念を学んだ。しかし、データベースにデータを入れたり取り出したりするには「命令」が必要である。その命令を書くための言語がSQL。
SQLは「Structured Query Language」の略で、「構造化問い合わせ言語」と訳される。プログラミング言語とは少し違い、データベースに対する「注文」を書く言語である。
レストランで店員さんに「コーヒーをください」と注文するように、SQLでは「usersテーブルから30歳以上の人のデータをください」と注文する。店員さんが注文を聞いて料理を持ってくるように、データベースはSQLを受け取って結果を返してくれる。
CREATE TABLE文の構文解説¶
SQLを試す前に、まずテーブルを作成するSQL文を理解しよう。CREATE TABLE文を「英文法」のように分解して解説する。
基本構文¶
CREATE TABLE テーブル名 (
列名 データ型 制約,
列名 データ型 制約,
...
);
全体構造¶
| 部品 | 役割 | 例 |
|---|---|---|
CREATE TABLE |
「テーブルを作れ」という命令(動詞) | - |
users |
テーブルの名前(目的語) | users, products, orders |
( ... ) |
列の定義を囲む | - |
; |
文の終わり(句点) | - |
列の定義¶
各列は「列名 データ型 制約」の順で定義する。日本語に訳すと「〇〇という名前の、△△型の、□□な列」となる。
name VARCHAR(100) NOT NULL
↓ ↓ ↓
列名 データ型 制約
| 部品 | 意味 | 例での役割 |
|---|---|---|
name |
列の名前 | 「name」という名前の列 |
VARCHAR(100) |
データ型(最大100文字の文字列)。「バーキャラ」と読む | 文字列を格納できる |
NOT NULL |
制約(空を許可しない) | 必須入力 |
データ型の種類¶
| データ型 | 格納できる値 | 使用例 |
|---|---|---|
INTEGER |
整数(-2147483648〜2147483647) | 年齢、数量 |
SERIAL |
自動増加する整数 | ID |
VARCHAR(n) |
最大n文字の文字列 | 名前、メールアドレス |
TEXT |
長さ制限なしの文字列 | 本文、説明 |
BOOLEAN |
true / false | フラグ |
DATE |
日付(2024-01-15) | 誕生日 |
TIMESTAMP |
日時(2024-01-15 10:30:00) | 作成日時 |
制約の種類¶
| 制約 | 意味 | 例 |
|---|---|---|
PRIMARY KEY |
主キー(一意で必須) | id |
NOT NULL |
空を許可しない | 必須項目 |
UNIQUE |
重複を許可しない | メールアドレス |
DEFAULT 値 |
初期値を設定 | DEFAULT 0 |
例文の完全解説¶
以下のCREATE TABLE文を読み解いてみよう。
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL,
age INTEGER NOT NULL
);
| 列 | 読み方 |
|---|---|
id SERIAL PRIMARY KEY |
「idという名前の、自動採番される、主キーの列」 |
name VARCHAR(100) NOT NULL |
「nameという名前の、最大100文字の、必須の列」 |
email VARCHAR(255) NOT NULL |
「emailという名前の、最大255文字の、必須の列」 |
age INTEGER NOT NULL |
「ageという名前の、整数型の、必須の列」 |
SQLを試す環境¶
CREATE TABLE文の構文を理解したところで、実際にSQLを試してみよう。この記事のSQLは、ブラウザ上で実行できる。インストール不要で、今すぐ手を動かせる。
DB Fiddle(推奨)¶
DB Fiddle にアクセスし、左上のデータベースを「PostgreSQL 15」に設定する。
環境の準備手順¶
- DB Fiddle を開く
- 左上で「PostgreSQL 15」を選択
- 左側の「Schema SQL」に以下のテーブル作成SQLを貼り付ける
- 右側の「Query SQL」に実行したいSQLを入力
- 「Run」ボタンをクリック
テーブルを作成する¶
以下のSQLを「Schema SQL」欄に貼り付ける。先ほど学んだCREATE TABLE文と、サンプルデータを投入するINSERT文である。
-- usersテーブルを作成
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL,
age INTEGER NOT NULL
);
-- サンプルデータを投入
INSERT INTO users (name, email, age) VALUES
('田中太郎', 'tanaka@example.com', 28),
('山田花子', 'yamada@example.com', 35),
('佐藤一郎', 'sato@example.com', 42);
使用するテーブル¶
上記のSQLを実行すると、以下のusersテーブルが作成される。
| id | name | age | |
|---|---|---|---|
| 1 | 田中太郎 | tanaka@example.com | 28 |
| 2 | 山田花子 | yamada@example.com | 35 |
| 3 | 佐藤一郎 | sato@example.com | 42 |
以降のSQLは「Query SQL」欄に入力して試してほしい。
SELECT:データの取得¶
SELECTは、テーブルからデータを取り出す命令である。最も使う頻度が高い。
全件取得¶
SELECT * FROM users;
*は「すべての列」を意味する。このクエリは「usersテーブルから、すべての列・すべての行を取得せよ」という意味。
特定の列だけ取得¶
SELECT name, email FROM users;
結果:
| name | |
|---|---|
| 田中太郎 | tanaka@example.com |
| 山田花子 | yamada@example.com |
| 佐藤一郎 | sato@example.com |
必要な列だけを指定することで、無駄なデータ転送を減らせる。
WHERE句:条件を指定する¶
WHERE句は、処理対象の行を絞り込むための条件である。「〜の場合だけ」という指定ができる。
基本構文¶
SELECT * FROM テーブル名 WHERE 条件;
WHEREの後に条件を書くと、その条件に合う行だけが返る。
比較演算子一覧¶
| 演算子 | 意味 | 例 |
|---|---|---|
= |
等しい | age = 35(35である) |
<> |
〜ではない | age <> 28(28ではない) |
> |
より大きい | age > 30(30より大きい) |
< |
より小さい | age < 30(30より小さい) |
>= |
以上 | age >= 30(30以上) |
<= |
以下 | age <= 30(30以下) |
※ PostgreSQLでは != も「〜ではない」として使えるが、<> がSQL標準。
以下、具体例を見ていこう。
等しい(=)¶
SELECT * FROM users WHERE age = 35;
結果: 山田花子さんの行だけが返る。
| id | name | age | |
|---|---|---|---|
| 2 | 山田花子 | yamada@example.com | 35 |
以上・以下(>=, <=, >, <)¶
SELECT * FROM users WHERE age >= 30;
結果: 30歳以上のユーザーが返る。
| id | name | age | |
|---|---|---|---|
| 2 | 山田花子 | yamada@example.com | 35 |
| 3 | 佐藤一郎 | sato@example.com | 42 |
〜ではない(<>)¶
SELECT * FROM users WHERE age <> 28;
28歳ではないユーザーが返る。
WHERE句はSELECT以外でも使える¶
WHERE句はSELECTだけでなく、UPDATE(更新)やDELETE(削除)でも使える。「どの行を対象にするか」を指定する重要な構文である。
INSERT:データの追加¶
INSERTは、テーブルに新しい行を追加する命令である。
INSERT INTO users (name, email, age) VALUES ('鈴木次郎', 'suzuki@example.com', 25);
このクエリを実行すると、usersテーブルに新しい行が追加される。
| id | name | age | |
|---|---|---|---|
| 1 | 田中太郎 | tanaka@example.com | 28 |
| 2 | 山田花子 | yamada@example.com | 35 |
| 3 | 佐藤一郎 | sato@example.com | 42 |
| 4 | 鈴木次郎 | suzuki@example.com | 25 |
idは自動で割り振られるため、指定しなくてよい(自動採番)。
UPDATE:データの更新¶
UPDATEは、既存のデータを書き換える命令である。WHERE句で「どの行を更新するか」を指定する。
UPDATE users SET age = 29 WHERE id = 1;
このクエリは「usersテーブルのid=1の行のageを29に変更せよ」という意味。
| id | name | age | |
|---|---|---|---|
| 1 | 田中太郎 | tanaka@example.com | 29 |
| 2 | 山田花子 | yamada@example.com | 35 |
| 3 | 佐藤一郎 | sato@example.com | 42 |
WHERE句を忘れると危険¶
WHERE句を付け忘れると、全行が更新されてしまう。
-- 危険!全員の年齢が29になる
UPDATE users SET age = 29;
ベストプラクティス:先にSELECTで確認¶
UPDATEを実行する前に、同じWHERE句でSELECTを実行して対象行を確認すること。
-- まず確認(何件が対象か?)
SELECT * FROM users WHERE id = 1;
-- 確認できたら更新を実行
UPDATE users SET age = 29 WHERE id = 1;
DELETE:データの削除¶
DELETEは、テーブルから行を削除する命令である。WHERE句で「どの行を削除するか」を指定する。
DELETE FROM users WHERE id = 3;
このクエリは「usersテーブルからid=3の行を削除せよ」という意味。
| id | name | age | |
|---|---|---|---|
| 1 | 田中太郎 | tanaka@example.com | 28 |
| 2 | 山田花子 | yamada@example.com | 35 |
WHERE句を忘れると危険¶
UPDATEと同様、WHERE句を付け忘れると全行が削除される。
-- 危険!全データが消える
DELETE FROM users;
ベストプラクティス:先にSELECTで確認¶
DELETEを実行する前にも、SELECTで対象行を確認すること。
-- まず確認(削除される行は正しいか?)
SELECT * FROM users WHERE id = 3;
-- 確認できたら削除を実行
DELETE FROM users WHERE id = 3;
削除は取り消せない。本番環境では特に慎重に実行すべきである。
CRUD操作¶
SELECT、INSERT、UPDATE、DELETEの4つをまとめて「CRUD操作」(クラッド操作)と呼ぶ。
| 操作 | SQL | 意味 |
|---|---|---|
| Create | INSERT | 作成(追加) |
| Read | SELECT | 読み取り(取得) |
| Update | UPDATE | 更新 |
| Delete | DELETE | 削除 |
CRUDはデータ操作の基本である。この4つを覚えれば、データベースで「やりたいこと」の大半は実現できる。
まとめ¶
- SQLはデータベースを操作するための言語
- CREATE TABLEでテーブルを作成する
- SELECTでデータを取得する
- WHERE句で条件を指定し、処理対象を絞り込む
- INSERTでデータを追加する
- UPDATEでデータを更新する(WHERE句必須)
- DELETEでデータを削除する(WHERE句必須)
- この4つをCRUD操作と呼ぶ
用語¶
| 用語 | 説明 |
|---|---|
| SQL | Structured Query Language。データベースを操作するための言語 |
| クエリ | データベースへの命令文。SQLで記述する |
| CREATE TABLE | テーブルを新規作成する命令 |
| SELECT | データを取得する命令 |
| WHERE句 | 条件を指定するための構文。対象行を絞り込む |
| INSERT | データを追加する命令 |
| UPDATE | データを更新する命令 |
| DELETE | データを削除する命令 |
| CRUD | Create, Read, Update, Deleteの頭文字。データ操作の基本4種 |
| DB Fiddle | ブラウザ上でSQLを試せる無料サービス |
次の記事¶
SELECT文をさらに深く学びたい方はこちら。