코드 그라데이션

Day05-3. OUTER JOIN, CROSS JOIN 본문

Database/Mega-MySQL

Day05-3. OUTER JOIN, CROSS JOIN

완벽한 장면 2023. 6. 21. 11:16

OUTER JOIN

  • 조인의 조건에 만족하지 않는 행까지도 포함시킴.
  • 자주 사용되지는 않지만 가끔 유용하게 사용함.

형식

SELECT <열 목록> FROM <첫 번째 테이블(LEFT 테이블)>
	<LEFT|RIGHT|FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
    	ON <조인될 조건>
[WHERE 검색조건];

 

"전체 회원의 구매기록을 보자. 단 구매 기록이 없는 회원도 출력되어야 한다."

-- OUTER JOIN
SELECT u.userID, u.name, b.prodName, u.addr, CONCAT(u.mobile1, u.mobile2) AS '연락처' 
FROM usertbl u -- 왼쪽
	LEFT JOIN buytbl b -- 오른쪽 
		ON u.userID = b.userID
ORDER BY u.userID;

실행 결과

LEFT OUTER JOIN의 결과

 

위와 동일한 결과를 얻기 위해서 구문을 RIGHT OUTER JOIN으로 바꾸려면

왼쪽과 오른쪽 테이블의 위치만 바꿔주면 된다.

SELECT u.userID, u.name, b.prodname, u.addr, CONCAT(u.mobile1, u.mobile2) AS '연락처' 
	FROM buytbl b
		RIGHT OUTER JOIN usertbl u ON u.userID = b.userID
ORDER BY u.userID;

실행 결과

 

 

이번에는 한 번도 구매한 적이 없는 유령 회원의 목록 추출

-- outer join은 중심 축을 잘 잡아야 한다.
SELECT u.userID, u.name, b.prodName, u.addr, CONCAT(u.mobile1, u.mobile2) AS '연락처'
FROM usertbl u
LEFT JOIN buytbl b ON u.userID = b.userID
WHERE b.prodName IS NULL
ORDER BY u.userID;

실행 결과

 

LEFT JOIN은 

"왼쪽 테이블의 것은 모두 출력되어야 한다."

RIGHT JOIN은 

"오른쪽 테이블의 것은 모두 출력되어야 한다."

정도로 해석하면 딱 좋다.

 

 

 

<실습>

동아리에 가입하지 않은 학생도 출력되게 만들기

  • INNER JOIN을 LEFT JOIN으로 변경하면 된다.
SELECT s.stdName, s.addr, c.clubName, c.roomNo
FROM stdtbl s
LEFT JOIN stdclubtbl sc ON s.stdName = sc.stdName
LEFT JOIN clubtbl c ON sc.clubName = c.clubName
ORDER BY s.stdName;

실행 결과

 

 

<문제> 동아리를 기준으로 가입된 학생을 출력하되, 가입 학생이 하나도 없는 동아리도 출력.

  • 클럽을 기준으로 조인해야 하므로 두 번째 조인은 RIGHT JOIN으로 처리해서 clubtbl이 기준이 되도록 설정하면 된다.
SELECT C.clubName, C.roomNo, S.stdName, S.addr
   FROM  stdtbl S
      LEFT OUTER JOIN stdclubtbl SC
          ON SC.stdName = S.stdName
      RIGHT OUTER JOIN clubtbl C
          ON SC.clubName = C.clubName
   ORDER BY C.clubName ;

실행 결과

 

결과를 하나로 합치기(동아리에 가입하지 않은 학생도 출력 + 학생이 한 명도 없는 동아리도 출력) => UNION 활용

 

CROSS JOIN(상호 조인)

  • 한쪽 테이블의 모든 행들과 다른쪽 테이블의 모든 행을 조인시키는 기능
  • 결과 개수는 두 테이블 개수를 곱한 개수

<문제> 회원 테이블과 구매 테이블의 모든 행을 조인시키기

-- CROSS JOIN
USE sqldb;
SELECT * 
   FROM buytbl 
     CROSS JOIN usertbl ;

 

실행 결과

 

CROSS JOIN에는 ON 구문을 사용할 수 없다.

 

개수만 세보기

USE employees;
SELECT  COUNT(*) AS '데이터 개수'
   FROM employees 
     CROSS JOIN titles;

실행 결과

 

728x90

'Database > Mega-MySQL' 카테고리의 다른 글

Day06-07. 제약 조건(1) - 기본 키 제약 조건  (0) 2023.06.22
Day06. SELF JOIN, UNION(ALL), (NOT)IN  (0) 2023.06.22
Day05-2. 피벗 JSON  (0) 2023.06.20
Day05-1. Join - INNER JOIN  (0) 2023.06.20
Day04-3. MySQL 내장 함수  (0) 2023.06.20
Comments