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日~

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です