概要
研修のまとめ。普段何気なく使っているけれど、そもそもそれ自体に色々と種類とかあるよね?というおさらい。MySQLを前提に書く。
DBの基本的な考え方
狭き門が良き。あとで変更するかもしれないな・・・と思って制限をゆるくするのはよろしくない。変更することが確実にわかっているのであれば、場合によってはよし。
SQLのコマンド種別
- データを操作するための言語(データ操作言語:DML)
- データを定義するための言語(データ定義言語:DDL)
- データを制御するための言語(データ制御言語:DCL)
DML:データ操作言語(Data Manipulation Language)
- INSERT INTO (行データもしくは表データの挿入)
- SELECT 〜 FROM 〜 WHERE (表データの検索、結果集合の取り出し)
- UPDATE 〜 SET (表を更新)
- DELETE FROM (表から特定行の削除)
INSERT
INSERT INTO テーブル名(カラム名1,カラム名2) VALUES(値1,値2)
バルクインサート
1回のINSERT文で復数のデータを登録する方法。
1個1個INSERT文でデータを挿入していくよりも、データを挿入できる速度が高速になる。
INSERT INTO users (name, password, email, created_at, updated_at)
VALUES
('name_sample1', 'PassW0rd!','sample1@gmail.com', NOW(), NOW()),
('name_sample2', 'paSs-WoRd','sample2@gmail.com', NOW(), NOW()),
('name_sample3', 'paSS_W0rd!','sample3@gmail.com', NOW(), NOW()),
('name_sample4', 'paSS_Word!', 'sample4@gmail.com', NOW(), NOW())
PHP/MySQL でレコードを N 件ずつバルクインサート - Born Too Late
http://blog.yuyat.jp/archives/2018
バルクインサートとインサートで処理速度を比較してみた | ニクニクドットミー
http://nikuniku.me/?p=306
UPDATE
UPDATE テーブル名
SET カラム名2=値2, カラム名3=値3
WHERE カラム名1=値1
DELETE
DELETE FROM テーブル名
WHERE カラム名1=値1
物理削除と論理削除
データベースのデータ削除として、物理削除 と 論理削除 の2つの方法がある。
物理削除
物理削除とは、SQLのDELETE文を使ってデータベース上からデータを削除してしまう方法。
データベースを触ったことがある人は、この方法でデータを削除していることが多かったのでは?
論理削除
論理削除とは、レコードに削除フラグを用意して、削除する際にフラグを有効にすることで、データベース上には 存在するが、システム的にデータが存在しないことにする方法。
論理削除を利用する場合のメリットとしては、データ自体は残っているため、何か問題が発生した際にデータを戻すことができる。逆にデメリットとしては、データが残り続けてるため、データベースのパフォーマンスが低下したり、データを参照する際にフラグを確認するなどがある。
物理削除?論理削除?どっちを利用する?
どちらを利用するかは、状況によるので、絶対的な正解はない。
大事なのは、それぞれのメリット・デメリットを理解して、何故そっちを選ぶのかを説明出来ること。
DELETE_FLAG を付ける前に確認したいこと。@Jxck_
DDL:データ定義言語(Data Definition Language)
- CREATE (データベースオブジェクト(表、インデックス、制約など)の定義)
- DROP (データベースオブジェクトの削除)
- ALTER (データベースオブジェクトの定義変更)
昨今のフレームワークで "マイグレーション" と呼ばれているものはこの部分を扱うユーティリティ!
DCL:データ制御言語(Data Control Language)
- GRANT (特定のデータベース利用者に特定の作業を行う権限を与える)
- REVOKE (特定のデータベース利用者からすでに与えた権限を剥奪する)
- BEGIN (トランザクションの開始)
- COMMIT (トランザクションの確定)
- ROLLBACK (トランザクションの取り消し)
- SAVEPOINT (任意にロールバック地点を設定する)
WHEREの指定で便利な奴ら
LIKE(部分一致)
SELECT *
FROM テーブル名1
WHERE カラム名1 LIKE '文字列%'
AND カラム名2 LIKE '%文字列'
AND カラム名2 LIKE '%文字列%'
ORDER BY カラム名1
IN(OR条件でまとめて値を指定して比較)
SELECT *
FROM テーブル名1
WHERE カラム名1 IN(値1, 値2, 値3)
BETWEEN(範囲指定)
SELECT *
FROM テーブル名
WHERE カラム名 BETWEEN 2 AND 3
GROUP BYとHAVING
行のグループ化とグループ化したものに対する条件
SELECT カラム名1
FROM テーブル名1
WHERE カラム名1 = '値1'
GROUP BY カラム名1
SELECT カラム名1, COUNT(カラム名1)
FROM テーブル名1
WHERE カラム名1 = '値1'
GROUP BY カラム名1, カラム名2
HAVING COUNT(カラム名1) > 2