Day3 前半のゴール
「SQLiteで知っている基本操作を、“MySQLの文法とクセ”で再確認する」
今日はあえて「復習レベル」でいきます。
テーマはこの3つです。
CREATE TABLE
INSERT / SELECT
UPDATE / DELETE
SQLite経験者なので、文法そのものはほぼ知っています。
Day3 前半の狙いは、
SQLiteとほぼ同じところ
MySQLで“ちょっとだけ違う”ところ(型・AUTO_INCREMENT・エンジン)
を意識しながら、基本操作を一度きれいに通すことです。
CREATE TABLE のおさらい
「“型・AUTO_INCREMENT・ENGINE”をセットで書く癖をつける」
まずはテーブル作成から。
Day2でやった内容を、もう少し「基本操作」の目線で整理します。
SQLite だと、こんな感じでした。
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
email TEXT
);
SQLMySQL では、こうなります。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL
) ENGINE=InnoDB;
SQLここで意識してほしいのは、3つの“お約束”です。
INT AUTO_INCREMENT PRIMARY KEY
SQLiteの INTEGER PRIMARY KEY に相当します。
MySQLでは、自動採番を明示する必要があります。
「IDは自動で増える整数」
→ INT AUTO_INCREMENT PRIMARY KEY
と、ほぼテンプレで覚えてしまってOKです。
VARCHAR / DATETIME などの型
Day2でやったとおり、MySQLは型をきっちり決めます。
名前 → VARCHAR(50)
メール → VARCHAR(255)
作成日時 → DATETIME
「とりあえず TEXT」ではなく、
「この項目は何文字くらいか」「これは日時か」を考えて選びます。
ENGINE=InnoDB
最後の ENGINE=InnoDB は、
「このテーブルは InnoDB で管理してね」という指定です。
トランザクション・外部キー・安全性を考えると、
基本は InnoDB 一択でOKです。
INSERT のおさらい
「AUTO_INCREMENT に任せて、“意味のある値”だけ入れる」
次に、データの追加です。
SQLiteとほぼ同じですが、AUTO_INCREMENT を意識します。
INSERT INTO users (name, email, created_at)
VALUES ('山田太郎', 'taro@example.com', NOW());
SQLここで重要なのは、
id を書いていない
→ MySQL が勝手に 1,2,3,… を振ってくれる
という点です。
SQLiteのときも「id を省略すれば自動採番」でしたが、
MySQLでも同じ感覚で使えます。
複数行を一気に入れることもできます。
INSERT INTO users (name, email, created_at)
VALUES
('山田太郎', 'taro@example.com', NOW()),
('佐藤花子', 'hanako@example.com', NOW());
SQLここまで来ると、
SQLiteとほとんど同じ書き心地だと感じるはずです。
SELECT のおさらい
「“どのテーブルから、どのカラムを、どんな条件で”を意識する」
SELECT も基本は同じです。
SELECT id, name, email
FROM users;
SQL条件付きも同じです。
SELECT id, name, email
FROM users
WHERE email = 'taro@example.com';
SQLここで、MySQLならではの“よく使うお約束”を1つだけ足すとしたら、LIMIT です。
SELECT id, name, email
FROM users
ORDER BY id DESC
LIMIT 10;
SQL「新しい順に10件だけ欲しい」という、
ログ画面・一覧画面でよくあるパターンです。
SQLiteでも LIMIT はありましたが、
MySQLでも同じように使える、と再確認しておいてください。
UPDATE のおさらい
「“必ずWHEREを書く”を体に叩き込む」
UPDATE も文法はほぼ同じです。
UPDATE users
SET name = '山田太郎(改名)'
WHERE id = 1;
SQLここで一番大事なのは、
文法ではなく「心構え」です。
WHERE を書き忘れると、
全行が書き換わります。
UPDATE users
SET name = '山田太郎(改名)';
-- 全ユーザーのnameが同じになる
SQLSQLiteでも同じ危険はありましたが、
MySQLは「本番で使われることが多い」ので、
被害が一気に大きくなります。
実務では、UPDATEを書くときに、
本当にこの条件で1件だけか?
先に SELECT * FROM users WHERE ...; で確認したか?
と、自分に問いかける癖をつけます。
これはセキュリティというより「事故防止」ですが、
結果的にデータの安全性を守ることにつながります。
DELETE のおさらい
「“戻せない操作”だと意識する」
DELETE も同じです。
DELETE FROM users
WHERE id = 1;
SQLこれも、WHERE を書き忘れると地獄です。
DELETE FROM users;
-- 全削除
SQLSQLiteでも同じでしたが、
MySQLは「サーバー上の本番データ」を消す可能性があるので、
より慎重さが求められます。
実務では、
本当に削除すべきか?
論理削除(フラグを立てるだけ)でよくないか?
という判断も入ってきますが、
Day3の段階では、
DELETE は「戻せない操作」
UPDATE / DELETE は必ず WHERE を付ける
この2つを強く意識しておけば十分です。
SQLite と MySQL の基本操作の“差分”を整理する
「文法はほぼ同じ、でも“設計と慎重さ”が一段階上がる」
ここまで見てきて分かるとおり、
CREATE TABLE
INSERT
SELECT
UPDATE
DELETE
の文法は、SQLiteとほとんど同じです。
差分は主にここです。
CREATE TABLE
→ 型(VARCHAR / DATETIME / INT)をちゃんと決める
→ AUTO_INCREMENT と ENGINE=InnoDB を書く
INSERT
→ AUTO_INCREMENT に任せて、id を自分で入れない
UPDATE / DELETE
→ 本番運用を前提に、「WHERE を絶対に付ける」意識を強く持つ
つまり、
「SQLの書き方」よりも、「設計と慎重さ」が一段階上がる
これが、SQLiteからMySQLに来たときの本当の差分です。
Day3 前半のまとめ
CREATE TABLE は、SQLiteと文法は似ているが、MySQLでは INT AUTO_INCREMENT PRIMARY KEY・VARCHAR・DATETIME・ENGINE=InnoDB をセットで書くのが“基本形”になる。
INSERT は、AUTO_INCREMENT に任せて id を指定せずに入れるのが基本で、複数行INSERTもSQLiteと同じ感覚で使える。
SELECT は、FROM・WHERE・ORDER BY・LIMIT の組み合わせで、SQLiteとほぼ同じ書き心地だが、「新しい順に何件だけ」といった現場でよくあるパターンを意識しておくと実戦に強くなる。
UPDATE / DELETE は文法こそ同じだが、「WHEREを書き忘れると全件更新・全件削除になる」というリスクが、サーバーDBであるMySQLではより致命的になり、実務では“必ず先にSELECTで対象を確認する”という慎重さが求められる。
後半では、
実際に1つの小さなテーブルを作り、INSERT → SELECT → UPDATE → DELETE を一連で回しながら、
「MySQLならではの挙動(AUTO_INCREMENTの動き、DATETIMEの扱い)」を手で確かめていきます。
