Python | DB・SQL:SQL 基本

Python
スポンサーリンク

概要(SQL は「データベースに話しかける言語」)

SQL(エスキューエル)は、データベースに対して「これして」「あれして」と命令を出すための言語です。
Excel の表をもっと厳密にしたものが「テーブル」、そのテーブルに対して

どんな行を取り出すか
どんな行を追加するか
どんな行を変更するか
どんな行を削除するか

を指示するのが SQL だ、とイメージするとつかみやすいです。

ここでは、SQL の超重要 4 つの基本操作

SELECT(読む)
INSERT(追加する)
UPDATE(更新する)
DELETE(削除する)

を、初心者向けにかみ砕いて説明していきます。


テーブルとレコードのイメージを先につかむ

テーブル=「行と列からなる表」

SQL が扱うデータは、基本的に「テーブル」という形で保存されています。
テーブルは、行(レコード)と列(カラム)からなる表です。

例えば、ユーザーを管理する users テーブルがあるとします。

users テーブル

id | name   | age | email
---+--------+-----+--------------------
 1 | Taro   | 25  | taro@example.com
 2 | Hanako | 30  | hanako@example.com
 3 | Ken    | 19  | ken@example.com

このとき、

1 行 1 行が「レコード」
name や age が「カラム(列)」

です。

SQL の基本操作は、
このテーブルに対して「どの行をどうするか」を指定することだ、
と覚えておくと迷いにくくなります。


SELECT 文(データを読む)

一番よく使う「取り出し」コマンド

SELECT は「データを読む」ためのコマンドです。
基本形はこうです。

SELECT 列1, 列2
FROM テーブル名
WHERE 条件
ORDER BY 列1 ASC;
SQL

最低限覚えたいのは、次の 2 つです。

どの列を取り出すか → SELECT の後ろ
どのテーブルから取るか → FROM の後ろ

例えば、users テーブルから全員の名前と年齢を取り出すならこうです。

SELECT name, age
FROM users;
SQL

すべての列を取りたいときは、* を使います。

SELECT *
FROM users;
SQL

WHERE で「欲しい行だけ」に絞る

WHERE は「条件」を指定する場所です。
例えば、20 歳以上のユーザーだけ取り出したいならこうです。

SELECT name, age
FROM users
WHERE age >= 20;
SQL

メールアドレスが特定のもののユーザーだけならこうです。

SELECT *
FROM users
WHERE email = 'taro@example.com';
SQL

ポイントは、「WHERE を書かないと全部の行が対象になる」ということです。
UPDATE や DELETE でも同じなので、WHERE の付け忘れは本当に危険です。

ORDER BY で並び順を変える

ORDER BY は「並び替え」です。
年齢の若い順に並べたいならこうです。

SELECT name, age
FROM users
ORDER BY age ASC;
SQL

年齢の高い順なら DESC(降順)を使います。

SELECT name, age
FROM users
ORDER BY age DESC;
SQL

SELECT は「欲しい列」「欲しい行」「欲しい順番」を組み合わせて、
必要なデータだけをきれいに取り出すためのコマンドだ、
という感覚を持っておくとよいです。


INSERT 文(データを追加する)

新しい行を 1 行追加する基本形

INSERT は「新しいレコード(行)を追加する」コマンドです。
基本形はこうです。

INSERT INTO テーブル名 (列1, 列2, 列3)
VALUES (値1, 値2, 値3);
SQL

users テーブルに新しいユーザーを追加する例を見てみましょう。

INSERT INTO users (name, age, email)
VALUES ('Jiro', 22, 'jiro@example.com');
SQL

これで、users テーブルに 1 行追加されます。

id | name   | age | email
---+--------+-----+--------------------
 1 | Taro   | 25  | taro@example.com
 2 | Hanako | 30  | hanako@example.com
 3 | Ken    | 19  | ken@example.com
 4 | Jiro   | 22  | jiro@example.com  ← 追加

id は多くの場合「自動採番(AUTO_INCREMENT)」になっているので、
INSERT では指定しないことが多いです。

列名を省略できるが、最初は省略しない方が安全

テーブルのすべての列に値を入れる場合、
列名を省略してこう書くこともできます。

INSERT INTO users
VALUES (5, 'Mika', 28, 'mika@example.com');
SQL

ただし、列の順番を正確に把握していないと危険ですし、
テーブル定義が変わったときに壊れやすくなります。

初心者のうちは、
必ず (name, age, email) のように列名を書く癖をつける方が安全です。


UPDATE 文(データを更新する)

特定の行の特定の列を変更する

UPDATE は「既存のレコードを変更する」コマンドです。
基本形はこうです。

UPDATE テーブル名
SET 列1 = 新しい値1, 列2 = 新しい値2
WHERE 条件;

例えば、id が 1 のユーザーの年齢を 26 に更新したいならこうです。

UPDATE users
SET age = 26
WHERE id = 1;
SQL

メールアドレスも一緒に変えたいなら、SET にカンマで並べます。

UPDATE users
SET age = 26,
    email = 'taro_new@example.com'
WHERE id = 1;
SQL

WHERE を書き忘れると「全件更新」になる

UPDATE で一番危険なのが、WHERE の書き忘れです。

UPDATE users
SET age = 26;
SQL

と書いてしまうと、
users テーブルの全員の age が 26 になってしまいます。

実務では、UPDATE や DELETE を打つ前に

まず同じ WHERE で SELECT して、本当に対象が合っているか確認する

という習慣をつけると事故が減ります。


DELETE 文(データを削除する)

特定の行を削除する

DELETE は「レコードを削除する」コマンドです。
基本形はこうです。

DELETE FROM テーブル名
WHERE 条件;
SQL

id が 3 のユーザーを削除したいならこうです。

DELETE FROM users
WHERE id = 3;
SQL

これで、id=3 の行がテーブルから消えます。

WHERE を書かないと「全件削除」になる

UPDATE と同じく、DELETE も WHERE が超重要です。

DELETE FROM users;
SQL

と書くと、users テーブルの全行が削除されます。
(テーブル自体は残るが、中身が空になる)

本番環境でこれをやると、
本当にシャレにならないので、

DELETE を打つ前に、必ず同じ WHERE で SELECT して確認する

というのを、強くおすすめします。


まとめてイメージする(CRUD と SQL の対応)

4 つの基本操作を「CRUD」で覚える

ここまでの 4 つを、まとめて整理します。

Create(作る) → INSERT
Read(読む) → SELECT
Update(更新) → UPDATE
Delete(削除) → DELETE

この 4 つをまとめて CRUD(クルード)と呼びます。
SQL の基本は、この CRUD をテーブルに対して行うことです。

最初に身につけるべき「筋の良い練習方法」

初心者向けの練習としては、
小さな users テーブルを一つ用意して、

INSERT で何人か追加する
SELECT で条件を変えながら取り出してみる
UPDATE で一人の情報を変えてみる
DELETE で一人だけ消してみる

というサイクルを、自分の手で何度も回すのが一番早いです。

そのとき、必ず

UPDATE / DELETE の前に、同じ WHERE で SELECT して確認する

という習慣をセットで身につけておくと、
この先 Django や他のフレームワークを使うときにも
「データベースで何が起きているか」をイメージしやすくなります。


さいごに(次の一歩のヒント)

ここまでが「SQL の超基本」です。
この先は、

WHERE をもっと複雑にする(AND / OR / LIKE など)
ORDER BY や LIMIT で結果を整える
GROUP BY と集計関数(SUM, COUNT, AVG など)を使う
複数テーブルを JOIN する

といった方向に広がっていきます。

タイトルとURLをコピーしました