코드 그라데이션
Day05-3. OUTER JOIN, CROSS JOIN 본문
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;
실행 결과
위와 동일한 결과를 얻기 위해서 구문을 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