1. 조인 Join
👾 두 개 이상의 테이블을 서로 묶어서 하나의 결과 집합으로 만들어내는 것
⚡️ 데이터베이스 테이블은 중복과 공간 낭비를 피하고 데이터 무결성을 위해 여러 개 테이블로 분리해 저장
⚡️ 분리된 테이블은 서로 관계 Relation 를 맺고 있는데, 가장 많이 사용하는 관계는 '1대 다' 관계
ex. 학생 한 명이 여러 과목의 학점을 받는 것, 한 개의 아이디로 여러 상품을 주문하는 것
1) INNER JOIN (내부 조인)
SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인될 조건>
[WHERE 검색조건]
· 첫 번째 테이블은 구매테이블(buytbl), 두 번째 테이블은 회원테이블(usertbl)
SELECT * FROM buytbl
INNER JOIN usertbl
ON buytbl.userID = usertbl.userID
WHERE buytbl.userID = 'JYP';
📌 추출 과정
1. 구매 테이블의 userID인 'JYP'를 추출한다.
2. 'JYP'와 동일한 값을 회원 테이블의 userID열에서 검색한 후 찾으면 구매 테이블과 회원 테이블의 두 행을 결합
📌 WHERE 절을 생략하면 buytbl 테이블의 모든 행에 대해서 위와 동일한 방식으로 추출
👾 필요한 열만 추출하는 방법
SELECT userID, name, prodName, addr, CONCAT(mobile1, mobile2) AS '연락처'
FROM buytbl
INNER JOIN usertbl
ON buytbl.userID = usertbl.userID
ORDER BY num;
📌 위의 구문을 실행하면 다음과 같은 에러 코드가 뜬다.
Error Code: 1052. Column 'userID' in field list is ambiguous
💡 userID의 경우 두 테이블 모두에 들어 있어 어느 테이블의 userID 추출할 지 명시해줘야 함
SELECT buytbl.userID, name, prodName, addr, CONCAT(mobile1, mobile2) AS '연락처'
FROM buytbl
INNER JOIN usertbl
ON buytbl.userID = usertbl.userID
ORDER BY num;
👾 코드가 길어지면 복잡해 보이기 때문에 각 테이블에 '별칭 Alias' 을 부여하는 방법
SELECT B.userID, U.name, B.prodName, U.addr, CONCAT(U.mobile1, U.mobile2) AS '연락처'
FROM buytbl B
INNER JOIN usertbl U
ON B.userID = U.userID
WHERE B.userID = 'JYP';
📌 위와 같이 FROM 절에 나오는 테이블의 이름 뒤에 별칭을 붙여주면 된다.
👾 세 개의 테이블을 조인하는 방법
· 첫 번째 stdTbl(학생테이블) / 두 번째 stdclubTbl / 세 번째 clubTbl
-- 학생 테이블, 동아리 테이블, 학생동아리 테이블을 이용해서 학생을 기준으로 학생 이름/지역/가입한 동아리/동아리방을 출력
SELECT S.stdName, S.addr, C.clubName, C.roomNo
FROM stdTbl S
INNER JOIN stdclubTbl SC
ON S.stdName = SC.stdName
INNER JOIN clubTbl C
ON SC.clubName = C.clubName
ORDER BY S.stdName;
2) OUTER JOIN (외부 조인)
👾 주종관계에 있는 테이블에서 주테이블의 모든 레코드를 보여주고 조건을 만족하는 부테이블의 필드를 같이 출력
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
<LEFT|RIGHT|FULL> OUTER JOIN <두 번째 테이블 (RIGHT 테이블)>
ON <조인될 조건>
[WHERE 검색조건];
📌 전체 회원의 구매기록 구하기 (단, 구매 기록 없는 회원도 출력)
SELECT U.userID, U.name, B.prodName, U.addr, CONCAT(U.mobile1, U.mobile2) AS '연락처'
FROM usertbl U
LEFT OUTER JOIN buytbl B -- LEFT OUTER JOIN은 왼쪽 테이블(usertbl)의 것은 모두 출력되어야 한다는 뜻
ON U.userID = B.userID
ORDER BY U.userID;
📌 RIGHT OUTER JOIN을 사용해서 동일한 결과 값을 얻으려면 단순히 왼쪽과 오른쪽 테이블 위치만 바꿔주면 됨
💡 FULL OUTER JOIN (전체 조인) : LEFT JOIN + RIGHT JOIN
➡️ 왼쪽 테이블과 오른쪽 테이블의 모든 행을 반환. 조인 조건에 맞는 데이터가 없는 경우, 해당 테이블의 열에는 NULL 값이 채워짐
3) CROSS JOIN (상호 조인)
👾 한쪽 테이블의 모든 행들과 다른 쪽 테이블의 모든 행을 조인시키는 기능
➡️ 결과 개수는 두 테이블의 개수를 곱한 개수
👾 카티션 곱 Cartesian Product이라고도 부른다.
👾 ON 구문 사용 x, 용도는 테스트로 사용할 많은 용량의 데이터를 생성할 때 주로 사용
📌 회원 테이블과 구매 테이블의 CROSS JOIN 구문
SELECT COUNT(*) AS '데이터 개수' FROM buytbl CROSS JOIN usertbl;
4) SELF JOIN (자체 조인)
👾 자기 자신과 자기 자신이 조인한다는 의미
👾 대표적인 예가 조직도와 관련된 테이블
-- 우대리 상관의 연락처를 확인
SELECT A.emp AS '부하직원' , B.emp AS '직속상관', B.empTel AS '직속상관연락처'
FROM empTbl A
INNER JOIN empTbl B
ON A.manager = B.emp
WHERE A.emp = '우대리';
[ 내용 참고 : 책 '이것이 MySQL'이다 ]
'Database > MySQL' 카테고리의 다른 글
MySQL 새 계정 만들기 (Mac ver) - terminal VS. MySQL 워크벤치 (0) | 2024.07.25 |
---|---|
[MySQL] JDBC 예제 (0) | 2024.02.25 |
[MySQL] JDBC 정의, 로딩, 프로그램 개발 절차 (0) | 2024.02.25 |
[MySQL] 데이터베이스 모델링 | 참조 무결성 (1) | 2024.02.25 |
[MySQL] 데이터베이스 모델링 | 1~3 정규화, 역정규화 (1) | 2024.02.25 |