개발이야기/MySQL

[MySQL] JOIN(조인) 설명과 사용법 예제 (INNER, LEFT, RIGHT)

후린개발자 2023. 9. 6.
반응형

MySQL에서 JOIN은 데이터를 추출하기 위해서 두 개 이상의 테이블을 연결하고 데이터를 검색하는 데 사용되는 중요한 SQL 연산입니다.
JOIN으로 테이블 간의 관계를 활용해서 복잡한 쿼리문을 작성할 수도 있습니다. JOIN의 유형에 대해 설명드리겠습니다.

 

JOIN 유형

1. INNER JOIN

두 개 이상의 테이블에서 일치하는 행만을 반환합니다. 테이블 사이의 교집합을 찾는 데 사용됩니다.

 

2. LEFT JOIN 또는 LEFT OUTER JOIN

LEFT JOIN은 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 행을 반환합니다. 만약 오른쪽 테이블에 일치하는 행이 없으면 NULL 값으로 반환됩니다. 이를 사용하면 주로 왼쪽 테이블의 모든 레코드와 연결된 오른쪽 테이블의 정보를 가져올 때 유용합니다.

 

3. RIGHT JOIN 또는 RIGHT OUTER JOIN

RIGHT JOIN은 LEFT JOIN의 반대입니다. 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 일치하는 행을 반환합니다. MySQL에서는 RIGHT JOIN 대신 LEFT JOIN을 사용하는 것을 권장하며 결과는 동일합니다.

 

예제

1. 테이블 생성

CREATE TABLE `employees` (
  `employee_id` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
  `employee_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `department_id` int(11) DEFAULT NULL,
  `salary` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`employee_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `employees` VALUES ('user1', '사용자1', '1', '50000.00');
INSERT INTO `employees` VALUES ('user2', '사용자2', '3', '48000.00');
INSERT INTO `employees` VALUES ('user3', '사용자3', '2', '60000.00');
INSERT INTO `employees` VALUES ('user4', '사용자4', '1', '55000.00');
INSERT INTO `employees` VALUES ('user5', '사용자5', '2', '52000.00');
INSERT INTO `employees` VALUES ('user6', '사용자6', null, '32000.00');
INSERT INTO `employees` VALUES ('user7', '사용자7', '2', null);
INSERT INTO `employees` VALUES ('user8', '사용자8', null, null);

CREATE TABLE `departments` (
  `department_id` int(11) NOT NULL,
  `department_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`department_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ----------------------------
-- Records of departments
-- ----------------------------
INSERT INTO `departments` VALUES ('1', '인사');
INSERT INTO `departments` VALUES ('2', '경리');
INSERT INTO `departments` VALUES ('3', '마케팅');

CREATE TABLE `projects` (
  `project_id` int(11) NOT NULL AUTO_INCREMENT,
  `project_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `employee_id` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`project_id`),
  KEY `employee_id` (`employee_id`),
  CONSTRAINT `projects_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `employees` (`employee_id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ----------------------------
-- Records of projects
-- ----------------------------
INSERT INTO `projects` VALUES ('1', 'Project A', 'user1');
INSERT INTO `projects` VALUES ('16', 'Project B', 'user2');
INSERT INTO `projects` VALUES ('17', 'Project C', 'user3');
INSERT INTO `projects` VALUES ('18', 'Project D', 'user1');
INSERT INTO `projects` VALUES ('19', 'Project E', 'user4');

 

employees 테이블

 

departments 테이블

 

projects 테이블

 

2. INNER JOIN 예제

SELECT
    employees.employee_name,
    departments.department_name,
    projects.project_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id
INNER JOIN projects ON employees.employee_id = projects.employee_id;

 

INNER JOIN을 사용하여 조인하고, 각 직원의 이름, 부서 이름, 그리고 관련 프로젝트 이름을 가져오는 쿼리입니다.

employees 테이블의 "department_id" 열과 departments 테이블의 "department_id" 열을 기준으로 두 테이블 간의 일치하는 행을 찾습니다. 각 직원의 "department_id"와 부서 정보를 결합합니다.
employees 테이블의 "employee_id" 열과 projects 테이블의 "employee_id" 열을 기준으로 두 테이블 간의 일치하는 행을 찾습니다. 결과적으로, 각 직원의 "employee_id"와 관련된 프로젝트 정보를 결합합니다.

 

INNER JOIN 결과

 

3. LEFT JOIN 예제

SELECT 
    employees.employee_name,
    IFNULL(departments.department_name, '부서 없음') AS department_name,
    IFNULL(projects.project_name, '프로젝트 없음') AS project_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id
LEFT JOIN projects ON employees.employee_id = projects.employee_id;

 

위의 쿼리는 LEFT JOIN을 사용하여 모든 직원을 포함하고, 부서 또는 프로젝트 정보가 없는 경우에도 결과에 해당 정보를 표시합니다.

LEFT JOIN 결과

 

SELECT departments.department_name, COUNT(employees.employee_id) AS employee_count
FROM departments
LEFT JOIN employees ON departments.department_id = employees.department_id
GROUP BY departments.department_name;

 

위의 쿼리는 LEFT JOIN을 사용하여 부서별로 직원 수를 계산하는 쿼리입니다.

 

LEFT JOIN 결과

 

SELECT employees.employee_name, COUNT(projects.project_id) AS project_count
FROM employees
LEFT JOIN projects ON employees.employee_id = projects.employee_id
LEFT JOIN departments ON employees.department_id = departments.department_id
GROUP BY employees.employee_name;

 

위 쿼리는 LEFT JOIN을 사용하여 직원의 이름과 해당 직원이 참여한 프로젝트 수가 나타납니다.

 

LEFT JOIN 결과

반응형

댓글

💲 추천 글