두 테이블 간의 공통 컬럼을 기준으로 일치하는 데이터만 반환.
조건을 만족하는 행만 결과에 포함하고 일치하지 않은 데이터는 제외.
SELECT A.column1, B.column2
FROM TableA A
INNER JOIN TableB B
ON A.common_column = B.common_column;
왼쪽 테이블의 모든 데이터와 오른쪾 테이블에서 조건에 맞는 데이터를 반환합니다. 오른쪽 테이블에 일치하는 데이터가 없으면 NULL로 채움.
SELECT A.column1, B.column2
FROM TableA A
LEFT JOIN TableB B
ON A.common_column = B.common_column;
오른쪽 테이블의 모든 데이터와 왼쪽 테이블에서 조건에 맞는 데이터를 반환. 왼쪽 테이블에 일치하는 데이터가 없으면 NULL로 채움.
SELECT A.column1, B.column2
FROM TableA A
RIGHT JOIN TableB B
ON A.common_column = B.common_column;
두 데이터의 모든 데이터를 반환. 조건에 맞지 않는 경우 NULL로 표시.
SELECT A.column1, B.column2
FROM TableA A
FULL OUTER JOIN TableB B
ON A.common_column = B.common_column;
두 테이블의 모든 행의 조합(데카르트 곱)을 반환
SELECT A.column1, B.column2
FROM TableA A
CROSS JOIN TableB B;
같은 테이블을 기준으로 조인합니다. 테이블에 별칭(Alias)을 사용하여 두 개의 다른 테이블처럼 조작합니다.
SELECT A.column1, B.column2
FROM TableA A
INNER JOIN TableA B
ON A.common_column = B.common_column;
신입 또는 취준생 Java, Spring 백엔드 개발자가 SQL JOIN에 대해 실습한다면, 다음과 같은 실습을 통해 데이터베이스와 JOIN의 실제 사용 사례를 경험할 수 있습니다. 각각의 JOIN 유형에 대해 이해를 돕는 단계적 실습을 제안합니다.
데이터베이스 준비
Employees 테이블: 직원 정보Departments 테이블: 부서 정보Projects 테이블: 프로젝트 정보Employee_Projects 테이블: 직원과 프로젝트 간의 관계CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name VARCHAR(50),
DepartmentID INT
);
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY,
DepartmentName VARCHAR(50)
);
CREATE TABLE Projects (
ProjectID INT PRIMARY KEY,
ProjectName VARCHAR(50)
);
CREATE TABLE Employee_Projects (
EmployeeID INT,
ProjectID INT,
PRIMARY KEY (EmployeeID, ProjectID),
FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID),
FOREIGN KEY (ProjectID) REFERENCES Projects(ProjectID)
);
샘플 데이터 삽입
INSERT INTO Employees VALUES (1, 'Alice', 1), (2, 'Bob', 2), (3, 'Charlie', NULL);
INSERT INTO Departments VALUES (1, 'HR'), (2, 'Engineering');
INSERT INTO Projects VALUES (1, 'Project A'), (2, 'Project B');
INSERT INTO Employee_Projects VALUES (1, 1), (2, 2);
Spring 환경 설정
application.properties 또는 application.yml 파일에 데이터베이스 정보를 입력합니다.각 JOIN을 이해하고 활용할 수 있도록 간단한 쿼리를 작성하고, 이를 Java + Spring 환경에서 실행하는 실습을 진행합니다.
SELECT e.Name, d.DepartmentName
FROM Employees e
INNER JOIN Departments d ON e.DepartmentID = d.DepartmentID;@Query("SELECT e.name, d.departmentName FROM Employee e JOIN Department d ON e.departmentId = d.id")
List<Object[]> findEmployeeWithDepartment();SELECT e.Name, d.DepartmentName
FROM Employees e
LEFT JOIN Departments d ON e.DepartmentID = d.DepartmentID;@Query("SELECT e.name, d.departmentName FROM Employee e LEFT JOIN Department d ON e.departmentId = d.id")
List<Object[]> findAllEmployeesWithDepartments();SELECT e.Name, d.DepartmentName
FROM Employees e
RIGHT JOIN Departments d ON e.DepartmentID = d.DepartmentID;@Query("SELECT e.name, d.departmentName FROM Employee e RIGHT JOIN Department d ON e.departmentId = d.id")
List<Object[]> findAllDepartmentsWithEmployees();SELECT e.Name, d.DepartmentName
FROM Employees e
LEFT JOIN Departments d ON e.DepartmentID = d.DepartmentID
UNION
SELECT e.Name, d.DepartmentName
FROM Employees e
RIGHT JOIN Departments d ON e.DepartmentID = d.DepartmentID;@Query("SELECT e.name, d.departmentName " +
"FROM Employee e LEFT JOIN Department d ON e.departmentId = d.id " +
"UNION " +
"SELECT e.name, d.departmentName " +
"FROM Employee e RIGHT JOIN Department d ON e.departmentId = d.id")
List<Object[]> findAllEmployeesAndDepartments();SELECT e.Name, p.ProjectName
FROM Employees e
CROSS JOIN Projects p;@Query("SELECT e.name, p.projectName FROM Employee e CROSS JOIN Project p")
List<Object[]> findAllEmployeeProjectCombinations();SELECT e1.Name AS Employee, e2.Name AS Manager
FROM Employees e1
INNER JOIN Employees e2 ON e1.ManagerID = e2.EmployeeID;@Query("SELECT e1.name, e2.name " +
"FROM Employee e1 JOIN Employee e2 ON e1.managerId = e2.id")
List<Object[]> findEmployeesWithManagers();페이징 처리
Pageable을 활용하여 페이징 처리된 결과를 반환합니다.필터 추가
JOIN 결과 활용
EmployeeWithDepartmentDTO에 데이터를 매핑.테스트 작성
이런 실습을 통해 JOIN의 개념을 코드로 체득하고, Spring과 연동하여 실제 프로젝트에서 어떻게 활용하는지 이해할 수 있습니다.