조인은 두개 이상의 테이블을 묶어서 하나의 결과 테이블을 만드는 것
내부 조인은 조인 중에서 가장 많이 사용되는 조인.
대부분의 업무에서 내부 조인을 사용하며, 일반적으로 조인이라고 하면 내부 조인을 가리킨다.
JOIN = INNER JOIN
SELECT <열 목록>
FROM <첫 번째 테이블 이름>
INNER JOIN <두 번째 테이블 이름> (JOIN도 가능)
ON <조인될 조건>
[WHERE 검색조건];
ON : 테이블이름.열이름으로 작성 ex) userTBL.userID
SELECT : select를 통해 필요한 열만 추출할 수 있다. 추출할 열의 이름이 중복될때는 테이블.열이름으로 작성
SELECT buyTBL.userID
FROM buyTBL
INNER JOIN userTBL
ON buyTBL.userID = userTBL.userID;
를
SELECT B.userID
FROM buyTBL B
INNER JOIN userTBL U
ON B.userID = U.userID;
처럼 테이블의 별칭을 통해 코드를 간결하게 할 수 있다.
여러 테이블이 관련되는 조인 연산에서는 유용하게 쓰인다.
SELECT U.userID
FROM userTBL U
INNER JOIN buyTBL B
ON U.userID = B.userID;
위의 쿼리문은 순서만 다를 뿐 큰 차이가 없다.
SELECT B.userID
FROM buyTBL B
INNER JOIN userTBL U
ON B.userID = U.userID
ODER BY U.userID;
를 통해 userID 순으로 정렬한 결과를 얻을 수 있다.
학 학생은 여러 개의 동아리에 가입할 수 있고, 하나의 동아리에는 여러 학생이 가입할 수 있다.
따라서 따라서 학생 테이블과 동아리 테이블은 '다대다' 관계이다.
학생테이블
동아리 테이블
학생_동아리 테이블
학생 테이블, 동아리 테이블, 학생_동아리 테이블을 내부 조인한 후 학생을 기준으로 이름, 지역, 가입한 동아리 동아리방 출력
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-2. 동아리를 기준으로 가입한 학생의 목록을 출력, 정렬기준은 동아리
SELECT C.clubName, C.roomNo, S.stdName, S.addr
FROM stdTBL S
INNER JOIN stdclubTBL SC
ON S.stdName = SC.stdName
INNER JOIN clubTBL C
ON SC.clubName = C.clubName
ORDER BY C.clubName;
외부 조인은 조인 조건을 만족하지 않는 행까지 포함하여 출력하는 조인
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
<LEFT | RIGHT> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
ON <조인될 조건>
[WHERE 검색조건];
외부 조인을 수행해 동아리에 가입하지 않은 학생도 출력
INNER JOIN -> OUTER JOIN
SELECT S.stdName, S.addr, C.clubName, C.roomNo
FROM stdTBL S
LEFT OUTER JOIN stdclubTBL SC
ON S.stdName = SC.stdName
LEFT OUTER JOIN clubTBL C
ON SC.clubName = C.clubName
ORDER BY S.stdName;
동아리에 가입하지 않은 김제동도 출력이 된다.
동아리를 기준으로 가입학생을 출력하되, 가입 학생이 한 명도 ㅇ벗는 동아리도 출력
SELECT C.clubName, C.roomNo,S.stdName, S.addr
FROM stdTBL S
LEFT OUTER JOIN stdclubTBL SC
ON S.stdName = SC.stdName
LEFT OUTER JOIN clubTBL C
ON SC.clubName = C.clubName
ORDER BY C.clubName;
동아리에 가입하지 않은 학생도 출력하고 학생이 한 명도 가입하지 않은 동아리도 출력하기
SELECT S.stdName, S.addr, C.clubName, C.roomNo
FROM stdTBL S
LEFT OUTER JOIN stdclubTBL SC
ON S.stdName = SC.stdName
LEFT OUTER JOIN clubTBL C
ON SC.clubName = C.clubName
UNION
SELECT S.stdName, S.addr, C.clubName, C.roomNo
FROM stdTBL S
LEFT OUTER JOIN stdclubTBL SC
ON SC.stdName = S.stdName
RIGHT OUTER JOIN clubTBL C
ON SC.clubName = C.clubName;
상호 조인은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는것을 말한다. 상호 조인 결과 테이블의 행수는 두 테이블의 행수를 곱한 값이다.
상호 조인은 카티션곱(cartesian product)라고도 한다.
SELECT *
FROM buyTBL
CORSS JOIN userTBL;
CORSS JOIN 문을 사용하지 않고 상호 조인을 하려면 WHERE 절 없이 FROM 절에 테이블 이름을 나열해도 가능하다.
SELECT *
FROM buyTBL, userTBL;
자체 조인은 자기 자신과 자기 자신을 조인하는 것으로 별도의 구문은 없다.
조직도 테이블 생성
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 = '우대리';
UNION은 두 쿼리의 결과를 행으로 합치는 연산
SELECT 문장1
UNION [ALL]
SELECT 문장2
SELECT 하는 두 쿼리가 수행했을 때 열의 개수가 같아야 하고 데이터의 형식도
각 열 단위로 같거나 서로 호환되는 형식이어야 한다.
만약 문장1의 결과가 정수형인데 문장2의 결과가 문자형이라면 오류가 발생
또한 중복된 열은 제거하고 데이터를 정렬하여 출력한다.
중복된 열까지 모두 출력하려면 UNION ALL을 사용
SELECT stdName, addr FROM stdTBL
UNION ALL
SELECT clubName, roomNo FROM clubTBL;
NOT IN은 첫 번째 쿼리의 결과 중에서 두 번째 쿼리에 해당하는 것을 제외하고 출력하는 연산자이다.
SELECT userName, CONCAT(mobile1, '-', mobile2) AS '전화번호' FROM userTBL
WHERE userName NOT IN (SELECT userName FROM userTBL WHERE mobile1 IS NULL);