はじめに
非エンジニアの勉強ログ。
超初心者プレイのため、内容は自分の勉強メモです。
昨日まで
- Day7はMySQLへのCSV取り込み方など
- 結局面倒で、A5M2のCSVインポート機能を利用
今日のゴール
- MySQL サブクエリ~トランザクション~テーブル結合、と小ネタ
環境
- ホストOS:Windows10 Pro 1903
- こちらで構築した環境を利用する
- MySQL:5.7.27
- SQL開発ツール:A5:SQL Mk-2 2.14.4
参考資料・引用元など
- ドットインストール:MySQL入門 ←勉強はこれを基軸に進める
- Qiita:よく使うMySQLコマンド集
サブクエリ
- 一時的にしか使わないなら、テーブルつくらずサブクエリ
mysql
select
abg(u.age),
u.ivent
from
(select
id,
user_name,
age,
case
when age = 20 then 'congratulation'
when age = 30 then 'marverous'
else null
end as ivent
from persons) as u
gropu by u.ivent;
トランザクション
- 一連の処理を止めずに行う
- データの確定はcommit,もとにもどすならrollback
テーブル結合
- inner join:2つのテーブルで一致するレコードのみ出す
- outer join:2つのテーブルで不一致でもレコード出す
mysql
select users.id, users.name, users.job, items.name from users inner join items on users.id = items.user_id;
outer joinの場合は
left = 左に書いたtableが軸。右のtableに該当がなかったらその部分はnull
right = 右に書いたtableが軸。leftの逆
mysql
select * from users left outer join items on users.id = items.user_id;
select * from users right outer join items on users.id = items.user_id;
キーの制約
- テーブルAにIDがなかったら、テーブルBにレコードつくっちゃだめ! みたいな制約
- 整合とれる反面、互いのテーブルが連動して容易に削除とかはしづらくなる
- alterで操作 addしたりdropしたり
mysql
-- itemsテーブルのuser_idはusersテーブルのidカラムで制約
alter table items add constraint fk_items foreign key (user_id) references users (id);
-- 制約捨てる場合はdrop foreign key
alter table items drop foreign key fk_items;
小ネタ
直前のレコードNoを取得
異なるテーブルのレコードを連続で更新するときに
関連する直前に挿入されたレコードのNoを取得する場合など
mysql
insert into users (name, job) values ('taro', 'police');
insert into items (user_id, item) values (last_insert_id(), 'key');
トリガー
あるテーブル情報を変更したときに
連動して別の処理を行うよう、事前に指定が出来る
mysql
create trigger users_insert_trigger after insert on users for each row insert into user_logs (history) values ('user added.');
あとがき
- サブクエリあたりから長くなるから混乱する