Database

MariaDB SQL JOIN - INNER JOIN, LEFT JOIN (LEFT OUTER JOIN), RIGHT JOIN (RIGHT OUTER JOIN)

carrotweb 2022. 8. 14. 23:07
728x90
반응형

JOIN

Table 사이에 Related Column(서로 관련된 열)을 기반으로 Row를 Combine(결합)합니다.

 

결합 방식으로 INNER JOIN과 OUTER JOIN이 있습니다.

 

 

INNER JOIN (두 Table의 교집합)

왼쪽 Table과 오른쪽 Table에서 Related Column(서로 관련된 열)들이 있는 Row를 Combine(결합)합니다. 

 

OUTER JOIN (두 Table의 합집합)

  • LEFT OUTER JOIN : 왼쪽 Table의 모든 Row를 기준으로 Combine(결합)하여 오른쪽 Table에 Related Column(서로 관련된 열)이 없으면 오른쪽 Table의 모든 Column은 NULL로 채워진다.
  • RIGHT OUTER JOIN : 오른쪽 Table의 모든 Row를 기준으로 Combine(결합)하여 왼쪽 Table에 Related Column(서로 관련된 열)이 없으면 왼쪽 Table의 모든 Column은 NULL로 채워진다.
  • FULL OUTER JOIN : 왼쪽 Table과 오른쪽 Table의 모든 Row를 기준으로 Combine(결합)하여 Related Column(서로 관련된 열)이 없으면 모든 Column은 NULL로 채워진다.



MariaDB에 Table에 Row 추가하기

-- 초기 데이터 추가
INSERT INTO MBR_ACCOUNT_TB (MBR_ID, MBR_PW, MBR_NAME, MBR_NICKNAME) VALUES ('testid1', 'testpw1', '홍길동', '홍반장');
SELECT SLEEP(0.1);
INSERT INTO MBR_ACCOUNT_TB (MBR_ID, MBR_PW, MBR_NAME, MBR_BIRTHYEAR) VALUES ('testid2', 'testpw2', '김철수', 1988);
SELECT SLEEP(0.1);

-- 초기 데이터 추가
INSERT INTO INT_FILE_TB (BRD_SEQ, INT_FILE_NAME, INT_FILE_SVRNAME, INT_FILE_PATH, INT_FILE_SIZE, REG_ID) VALUES (1, '파일1', '10234.txt', '/upload/board/files/file1.txt', 100, 'testid1');
SELECT SLEEP(0.2);
INSERT INTO INT_FILE_TB (BRD_SEQ, INT_FILE_NAME, INT_FILE_SVRNAME, INT_FILE_PATH, INT_FILE_SIZE, REG_ID) VALUES (1, '파일2', '25685.txt', '/upload/board/files/file2.txt', 200, 'testid1');
SELECT SLEEP(0.1);
INSERT INTO INT_FILE_TB (BRD_SEQ, INT_FILE_NAME, INT_FILE_SVRNAME, INT_FILE_PATH, INT_FILE_SIZE, REG_ID) VALUES (3, '파일3', '57894.txt', '/upload/board/files/file3.txt', 150, 'testid1');
SELECT SLEEP(0.3);
INSERT INTO INT_FILE_TB (BRD_SEQ, INT_FILE_NAME, INT_FILE_SVRNAME, INT_FILE_PATH, INT_FILE_SIZE, REG_ID) VALUES (4, '파일4', '13290.txt', '/upload/board/files/file4.txt', 120, 'testid3');
SELECT SLEEP(0.1);
INSERT INTO INT_FILE_TB (BRD_SEQ, INT_FILE_NAME, INT_FILE_SVRNAME, INT_FILE_PATH, INT_FILE_SIZE, REG_ID) VALUES (5, '파일5', '93741.txt', '/upload/board/files/file5.txt', 100, 'testid2');
SELECT SLEEP(0.2);

 

 

INNER JOIN

왼쪽 Table과 오른쪽 Table에서 Related Column(서로 관련된 열)들이 있는 Row를 Combine(결합)합니다.

 

INNER JOIN

SELECT column_name, column_name
  FROM table_name1
 INNER JOIN table_name2 ON table_name1.column_name = table_name2.column_name;

 

MariaDB에서 Table의 Row 선택하기

SELECT A.BRD_SUBJECT, B.INT_FILE_NAME, B.INT_FILE_SIZE
  FROM INT_BOARD_TB A
 INNER JOIN INT_FILE_TB B ON A.BRD_SEQ = B.BRD_SEQ;

 

INT_BOARD_TB과 INT_FILE_TB을 BRD_SEQ(게시판 시퀀스)으로 INNER JOIN하여 Row를 가져옵니다.

INT_BOARD_TB를 기준으로 INT_FILE_TB와 결합하여 파일 정보를 가져옵니다.

 

 

LEFT JOIN (LEFT OUTER JOIN)

왼쪽 Table의 모든 Row를 기준으로 Combine(결합)하여 오른쪽 Table에 Related Column(서로 관련된 열)이 없으면 오른쪽 Table의 모든 Column은 NULL로 채워집니다.

 

LEFT JOIN (LEFT OUTER JOIN)

SELECT column_name, column_name
  FROM table_name1
  LEFT JOIN table_name2 ON table_name1.column_name = table_name2.column_name;

 

MariaDB에서 Table의 Row 선택하기

SELECT A.BRD_SUBJECT, B.INT_FILE_NAME, B.INT_FILE_SIZE
  FROM INT_BOARD_TB A
 LEFT JOIN INT_FILE_TB B ON A.BRD_SEQ = B.BRD_SEQ;

INT_BOARD_TB과 INT_FILE_TB을 BRD_SEQ(게시판 시퀀스)으로 LEFT JOIN하여 Row를 가져옵니다.

INT_BOARD_TB를 기준으로 INT_FILE_TB와 결합하여 파일 정보를 가져오는데 만약 관련된 파일 정보가 없으면 NULL로 채워집니다.

 

 

RIGHT JOIN (RIGHT OUTER JOIN)

오른쪽 Table의 모든 Row를 기준으로 결합(Combine)하여 왼쪽 Table에 관련된 열(Related Column)이 없으면 왼쪽 Table의 모든 Column은 NULL로 채워진다.

 

RIGHT JOIN (RIGHT OUTER JOIN)

SELECT column_name, column_name
  FROM table_name1
 RIGHT JOIN table_name2 ON table_name1.column_name = table_name2.column_name;

 

MariaDB에서 Table의 Row 선택하기

SELECT A.BRD_SUBJECT, B.INT_FILE_NAME, B.INT_FILE_SIZE
  FROM INT_BOARD_TB A
 RIGHT JOIN INT_FILE_TB B ON A.BRD_SEQ = B.BRD_SEQ;

INT_BOARD_TB과 INT_FILE_TB을 BRD_SEQ(게시판 시퀀스)으로 RIGHT JOIN하여 Row를 가져옵니다.

INT_FILE_TB를 기준으로 INT_BOARD_TB와 결합하여 파일 정보를 가져옵니다.

 

 

JOIN의 ON WHERE 절보다 먼저 처리됩니다.

 

  • JOIN ON - ON 조건에 맞는 Row만 결합니다.
  • WHERE - JOIN으로 결합된 결과에서 조건에 맞는 Row를 결합니다.

 

그럼 LEFT OUTER JOIN에서 JOIN ON으로 처리한 것과 WHERE 절로 처리한 것을 비교하여 알아보겠습니다.

 

SELECT A.BRD_SUBJECT, B.INT_FILE_NAME, B.INT_FILE_SIZE
  FROM INT_BOARD_TB A
  LEFT JOIN INT_FILE_TB B ON A.BRD_SEQ = B.BRD_SEQ
            AND B.INT_FILE_SIZE > 100;

INT_BOARD_TB를 기준으로 INT_FILE_TB와 결합하여 파일 크기가 100보다 큰 파일 정보를 가져오는데 만약 관련된 파일 정보가 없으면 NULL로 채워집니다.

 

SELECT A.BRD_SUBJECT, B.INT_FILE_NAME, B.INT_FILE_SIZE
  FROM INT_BOARD_TB A
  LEFT JOIN INT_FILE_TB B ON A.BRD_SEQ = B.BRD_SEQ
 WHERE B.INT_FILE_SIZE > 100;

INT_BOARD_TB를 기준으로 INT_FILE_TB와 결합하고 파일 크기가 100보다 큰 파일 정보만 가져옵니다.

 

그래서 LEFT JOIN 할 때는 JOIN ON으로 할지 WHERE 절로 할지 가져올 결과 값에 맞게 사용해야 합니다.

 

그러나 INNER JOIN에서는 JOIN ON에서 처리하지 않고 WHERE 절에서 처리해도 같은 성능이 나옵니다.

728x90
반응형