IT企業未経験30代 100日後に自社のシステムを作れるようにする。⑩
今回は、前回で作成したテーブルから結合(JOIN)を使用した例を作成したいと思います。
内部結合(INNER JOIN)について
内部結合とは、テーブルとテーブルを結合をするのですが、互いの条件に一致するレコードを抽出することです。
今回は、employee_attendancesテーブルとusersテーブルで情報を分けていきます。勤怠テーブルの中にsex、date_of_birth、date_of_employementのカラムは変わらないデータになるので重複して入力しないためテーブルを分けています。
usersテーブルを作成していきます。
CREATE TABLE users(
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL COMMENT '従業員名',
sex enum('male', 'female') default 'male' NOT NULL COMMENT '性別',
date_of_birth DATE COMMENT '誕生年月日',
date_of_employment DATE NOT NULL COMMENT '入社年月日',
PRIMARY KEY (id)
);
INSERT INTO users(name, sex, date_of_birth, date_of_employment) VALUES('Tanaka Tarou', 'male', '2004-1-1', '2024-9-1');
INSERT INTO users(name, sex, date_of_birth, date_of_employment) VALUES('Yamada Hanako', 'female', '2005-2-2', '2024-9-2');
INSERT INTO users(name, sex, date_of_birth, date_of_employment) VALUES('Suzuki Kenta', 'male', '2006-3-3', '2024-9-3');
INSERT INTO users(name, sex, date_of_birth, date_of_employment) VALUES('Tanaka Jirou', 'male', '2006-4-4', '2024-9-4');
INSERT INTO users(name, sex, date_of_birth, date_of_employment) VALUES('Nakata Saburou', 'male', '2006-5-5', '2024-9-5');
employee_attendancesの中身を少し修正していますので、修正コードは余談スペースに貼りつけておきます。
employee_attendancesとusersをuser_id=idで結合します。
Nakata Saburouさん(users.id=5)はまだ出勤してないため実行結果に表示されていません。
SELECT ea.id, ea.user_id, u.name, ea.check_in_datetime, ea.check_in_message FROM employee_attendances AS ea INNER JOIN users AS u ON ea.user_id = u.id ORDER BY ea.id;
外部結合 (OUTER JOIN)
外部結合とは、指定したテーブルの情報がすべて出力されます。
左外部結合 (LEFT OUTER JOIN) usersテーブルを基準にして誰が出勤しているか確認したい場合
SELECT ea.id, ea.user_id, u.name, ea.check_in_datetime, ea.check_in_message FROM users AS u LEFT OUTER JOIN employee_attendances AS ea ON ea.user_id = u.id
ORDER BY ea.id;
Nakata SaburouさんがNULLになっているので出勤していないことが分かります。
注意点まとめ・余談・修正コード
内部結合
- INNER JOINの場合 INNERを省略することができる
- テーブルはエイリアス名をつけてあげる
外部結合
- OUTER JOINの場合 OUTERを省略することができる
- 基本的にはLEFTを使用する
- 元のテーブルにない情報はNULLで表示される
今回テーブル作成時エラーが出た時に(,)をつけ忘れていたためエラー発生しました。
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(user_id))' at line 7
エラーが出た場合、なぜエラーが出たのかを理解してから次に進むように心がけています!
修正コードまとめ
- TRUNCATEでテーブル内の全データ削除
- nameのカラム削除
- user_idの追加
- AUTO_INCREMENTの初期化
- INSERTの追加
TRUNCATE employee_attendances;
ALTER TABLE employee_attendances DROP COLUMN name;
ALTER TABLE employee_attendances ADD user_id BIGINT DEFAULT NULL COMMENT '従業員ID' AFTER id;
ALTER TABLE employee_attendances auto_increment = 1;
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(1, '2024-09-04-07:30:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(2, '2024-09-04-07:40:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(3, '2024-09-04-07:50:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(1, '2024-09-05-07:50:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(2, '2024-09-05-07:40:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(3, '2024-09-05-07:30:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(1, '2024-09-06-07:00:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(2, '2024-09-06-07:10:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(3, '2024-09-06-07:20:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(1, '2024-09-07-07:30:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(2, '2024-09-07-07:40:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(3, '2024-09-07-07:50:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(1, '2024-09-08-07:30:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(2, '2024-09-08-07:40:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(3, '2024-09-08-07:50:00', 'NULL');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(4, '2024-09-08-08:00:00', 'NULL');
次回は外部キーについてまとめていきます。
また次回よろしくお願いします。
~2024年9月27日~