Free Lines Arrow
본문 바로가기
DataBase/DB 기초

[DB] Join

by skahn1215 2021. 8. 5.
728x90
반응형

Join 이란?

DB의 테이블을 만들때 효율성과, 가독성, 중복데이터를 피하기 위해 여러개의 Table을 만든다.

Join을 이용하여 나눠진 테이블을 조합할수 있다.

 

 

준비사항

H2를 설치하여 다음과 같이 SQL 문을 날려주자

기본키, 외래키를 지정해줘야 되지만 패스했다.

create table students(
    student_id int not null,
    student_name varchar(20) not null,
    subject_id int
);


INSERT INTO students VALUES(1, 'Jenna', 1);
INSERT INTO students VALUES(2, 'Dan', 2);
INSERT INTO students VALUES(3, 'Tom', 2);
INSERT INTO students VALUES(4, 'Grace',NULL);

create table subjects(
    subject_id int not null,
    subject_name varchar(20) not null
);

INSERT INTO subjects VALUES(1, 'C++');
INSERT INTO subjects VALUES(2, 'Java');
INSERT INTO subjects VALUES(3, 'GO');
INSERT INTO subjects VALUES(4, 'JSP');

 

 

 

Join 원리

학생 테이블에는 학생 Id 와 이름, 수강중인 과목이 있다고 가정해보자

수강 테이블에는 과목 Id 와 강의이름이 있다고 해보자.

 

DB에서 조회 할때 

학생이름, 수강중인 강의이름 을 출력하고 싶다.

이럴때 Join 을 써서 조회 하면된다.

 

학생 테이블

student_Id student_name subject_id
1 Jenna 1
2 Dan 2
3 Tom 2
4 Grace  

 

수강테이블

subject_Id subject_name
1 C++
2 Java
3 Go
4 JSP

 

출력

SELECT  st.STUDENT_ID, st. STUDENT_NAME, su.SUBJECT_NAME 
FROM students AS st 
JOIN subjects AS su 
ON st.SUBJECT_ID = su.SUBJECT_ID

 

student_Id Name subject
1 Jenna c++
2 Dan Java
3 Tom Java

 

 

 

 

 

Join의 종류

  • 위에서는 INNER join 을 사용하였다.
  • 대표적인 join의 종류는 다음과 같다.
  • INNER JOIN
    - 교집합

  • LEFT JOIN
    - 부분집합
    - 왼쪽 테이블에 있는걸 전부 출력
    - 오른쪽에 값이 없을때 는 NULL 로 출력
  • RIGHT JOIN
    - 부분집합
    - 오른쪽 테이블에 있는걸 전부 출력
    - 왼쪽에 값이 없을 경우 NULL 로 출력

 

 

 

 

그림 설명

그림 출처 https://www.w3schools.com/sql/sql_join.asp

 

 

 

 

 

 

INNER JOIN

SELECT  st.STUDENT_ID, st. STUDENT_NAME, su.SUBJECT_NAME 
FROM students AS st 
JOIN subjects AS su 
ON st.SUBJECT_ID = su.SUBJECT_ID
student_Id Name subject
1 Jenna c++
2 Dan Java
3 Tom Java

 

 

 

 

LEFT JOIN

STUDENT 기준으로 모두 출력한다.

SELECT  st.STUDENT_ID, st. STUDENT_NAME, su.SUBJECT_NAME 
FROM students AS st 
LEFT JOIN subjects AS su 
ON st.SUBJECT_ID = su.SUBJECT_ID

 

STUDENT_ID STUDENT_NAME SUBJECT_NAME
1 Jenna C++
2 Dan Java
3 Tom Java
4 Grace null

 

 

 

 

RIGHT JOIN

SUBJECTS 기준으로 모두 출력한다.

SELECT  st.STUDENT_ID, st. STUDENT_NAME, su.SUBJECT_NAME 
FROM students AS st 
RIGHT JOIN subjects AS su 
ON st.SUBJECT_ID = su.SUBJECT_ID
STUDENT_ID STUDENT_NAME SUBJECT_NAME
1 Jenna C++
2 Dan Java
3 Tom Java
null null GO
null null JSP

 

 

 

 

FULL OUTER JOIN

STUDENTS 와 SUBJECTS 모두 출력한다.

SELECT  st.STUDENT_ID, st. STUDENT_NAME, su.SUBJECT_NAME 
FROM students AS st 
LEFT JOIN subjects AS su 
ON st.SUBJECT_ID = su.SUBJECT_ID

UNION

SELECT  st.STUDENT_ID, st. STUDENT_NAME, su.SUBJECT_NAME 
FROM students AS st 
RIGHT JOIN subjects AS su 
ON st.SUBJECT_ID = su.SUBJECT_ID
STUDENT_ID STUDENT_NAME SUBJECT_NAME
null null GO
null null JSP
1 Jenna C++
2 Dan Java
3 Tom Java
4 Grace null
728x90
반응형

'DataBase > DB 기초' 카테고리의 다른 글

[DB] Index 기본  (0) 2023.02.09
[DB] NoSQL  (0) 2021.08.19
[DB] Index 기초  (0) 2021.08.19
[DB] GROUP BY  (0) 2021.08.05
[DB] 트랜잭션  (0) 2021.07.21

댓글