… DROP テーブルやデータベース等のオブジェクトを削除する DROP TABLE … DROP DATABASE … ALTER テーブルやデータベース等のオブジェクトの定義を変更する ALTER TABLE ADD COLUMN … ALTER TABLE ADD INDEX … TRUNCATE テーブル内のデータを全て削除する(DROPして再生成) TRUNCATE TABLE … CONFIDENTIAL 19
テーブルに新しいデータ追加する INSERT INTO User (…) VALUES (…); UPDATE テーブル内の既存のデータを変更する UPDATE User SET … WHERE …; DELETE テーブル内の既存のデータを削除する DELETE FROM User WHERE …; CONFIDENTIAL 20
SELECT id, name FROM User 1002 佐藤 200 2025-04-01 WHERE createdAt >= ‘2025-04-01’; 1003 山田 100 2025-04-30 WHERE 検索条件を比較演算子を用いて指定する = 等価比較 id = 1 >, <, >=, <= 大小比較 createdAt >= ‘2025-04-01’, age < 20 IN 複数値指定 id IN (1,2,3) BETWEEN 範囲指定 createdAt BETWEEN '2025-01-01' AND '2025-04-30' LIKE 曖昧比較 name like ‘%田’ CONFIDENTIAL 25
createdAt 1001 田中 100 2025-01-01 1002 佐藤 200 2025-04-01 1003 山田 100 2025-04-30 WHERE createdAt >= ‘2025-04-01’ AND officeId = 200; WHERE 論理演算子で条件を複数指定できる AND A かつ B createdAt >= ‘2025-04-01’ AND officeId = 200 OR A または B createdAt >= ‘2025-04-01’ OR officeId = 200 NOT A ではない NOT (officeId = 200) XOR A と B のどちらか一方のみ真 createdAt >= ‘2025-04-01’ XOR officeId = 200 CONFIDENTIAL 26
SELECT id, name FROM User 1002 佐藤 200 2025-04-01 WHERE createdAt >= ‘2025-04-01’ 1001 田中 100 2025-01-01 ORDER BY id DESC; ORDER BY データの並び替え基準を指定する。カンマ区切りで複数指定可。 ASC 昇順 ORDER BY id ASC DESC 降順 ORDER BY id DESC CONFIDENTIAL 27
SELECT u.id, u.name, u.officeId, o.officeName 1002 佐藤 200 2025-04-01 FROM User as u 1001 田中 100 2025-01-01 INNER JOIN Office as o on u.officeId = o.officeId WHERE u.createdAt >= ‘2025-04-01’ officeId officeName address ORDER BY u.id DESC; 100 ミッドタウン 東京都港区赤坂 200 ガーデンプレイス 東京都渋谷区恵比寿 INNER JOIN テーブル同士のデータを結合する。共通の列をON句で指定 CONFIDENTIAL 29
SELECT u.id, u.name, u.officeId, o.officeName 1002 佐藤 200 ガーデンプレイス FROM User as u INNER JOIN Office as o on u.officeId = o.officeId WHERE u.createdAt >= ‘2025-04-01’ ORDER BY u.id DESC; INNER JOIN テーブル同士のデータを結合する。共通の列をON句で指定 CONFIDENTIAL 30
B version: 2 current x = 11 x = 11 Repeatable Read 良さそうに見えるが... SELECT x = 1 current 古い値で上 書き x=1 同じデータを別々のトランザクションが更新する場合で も、更新文の形によって結果が異なる TRX_ID: A version: 3 事前にSELECTした x = 1 を使って固定値 x = 2 を書き戻す と、先行トランザクションの x = 11 を上書きする TX-A = Lost Update が発生 CONFIDENTIAL COMMIT SELECT x = 1 x=2 current x=2 UPDATE SET x = 2 69
for update TX:bbb 良さそうに見えるが... current TRX_ID: bbb version: 2 x = 11 current x = 11 TRX_ID: aaa version: 3 x = 12 x=1 write x + 1 current read for update x = 12 Lost Update が発生 TX: aaa → 読み出し時もSELECT FOR UPDATEを使い、 commit 他TXの読み出しをcommitまで待たせる → 古い値での上書きがなくなる(Lost Update 回避) CONFIDENTIAL 70
CONFIDENTIAL partitions type possible_keys NULL ALL スキャン方法 NULL key key_len ref rows filtered extra NULL NULL NULL 4 25.00 Using Where 使用可能なインデックス 走査される推定行数 データ取得時に実行された追加処理 74
USER NULL range NULL key key_len ref rows filtered extra id NULL xxx 10 25.00 Using Where type(スキャン方法) const: PK/ユニークインデックスで完全一致のレコードを取得 range: インデックスを使用した範囲検索 CONFIDENTIAL 76
USER NULL range NULL key key_len ref rows filtered extra id NULL xxx 10 25.00 Using Where key(実際に使用されるインデックス) ref(keyと比較される列名) rows(クエリで走査されるであろう推定行数) • CONFIDENTIAL 少ないほど絞り込みが効いている 78
USER NULL range NULL key key_len ref rows filtered extra id NULL xxx 10 25.00 Using Where extra(追加処理) • Using Index ◦ CONFIDENTIAL 必要なデータの取得をインデックスだけで解決できている 79
USER NULL range NULL key key_len ref rows filtered extra id NULL xxx 10 25.00 Using Where extra(追加処理) • Using Where ◦ 必要なデータの取得をインデックスだけでは解決できず、残りのWhere条件を 追加でフィルタリングしている CONFIDENTIAL ※ createdAtがインデックスにないので、id指定で取得した行を後から絞り込んでいる 80
USER NULL range NULL key key_len ref rows filtered extra id NULL xxx 10 25.00 Using Where extra(追加処理) • • CONFIDENTIAL Using Filesort ◦ ストレージエンジンでインデックスでソートできず結果に対して再度ソートが 発生 Using temporary ◦ 結果の整形に一時テーブル(Temporary Table)を作成している 81