안녕하세요!
오늘은 JOIN 함수에 대해서 알아볼건데요,
그 전에 어제 배웠던 그룹함수를 좀 복습해보려고 합니다.
복습
제대로 복습을 하실 분들은 아래 버튼을 눌러서 복습을 해주시길 바랍니다!
그룹함수의 특징은 뭐가 있었죠?
첫번째로, NULL은 그룹함수 연산에서 무시된다였죠.
두번째는 GROUP BY 절에 작성된 컬럼 이외의 컬럼이 SELECT 절에 올 수 없다는 것이었죠?
이 부분은 논리적으로 생각해보면 쉽습니다.
GROUP BY 절로 묶었는데 SELECT 로 다시 조회한다?
말이 안되는거죠
마지막 세번째로는 WHERE 절에 그룹함수를 조건으로 사용할 수 없다 였죠?
단, HAVING 절에서는 그룹함수를 사용할 수 있었습니다.
그럼 몇가지 예시를 통해서 마무리하고 넘어가도록 하겠습니다.
첫번째의 기본 emp 테이블에서 두번째 결과처럼 조회하고 싶을때
쿼리를 어떻게 짜야할까요?
위와 같이 짜면 되겠죠?
여러가지 그룹함수를 사용하여 두번째 결과와 같이 조회할 수 있습니다.
저 쿼리에서 저는 COUNT(ename) 이라고 썼는데요,
어차피 중복되는 이름이 없기 때문에 행의 수를 알 수 있는 방법이라고 할 수 있습니다.
행의 수를 알 수 있는 정확한 방법은 COUNT(*) 을 사용해주시면 되겠습니다!
다음 예시 보도록 하겠습니다.
문제. emp 테이블을 이용하여 아래와 같은 결과가 조회되도록 쿼리를 작성해보세요.
단, deptno 대신 부서명이 나오도록 해주세요.
emp 기본 테이블을 보시면 부서명은 없고,
부서번호인 deptno 만 있습니다.
부서명이 나오도록 하려면 어떻게 해야 할까요?
위와 같이 작성해주시면 됩니다!
케이스 구문으로 deptno 에 따른 부서명을 입력해주시고,
얻고자 하는 값에 맞는 그룹합수를 사용하고,
부서별로 나타냈으니 GROUP BY 절을 사용하면 됩니다.
숫자 관련 함수인 ROUND 함수도 복습 한 번 하고 가시면 되겠습니다.
마지막 예시 보고 JOIN 으로 넘어가겠습니다.
emp 테이블을 이용해서 위와 같은 결과를 조회하려면 쿼리를 어떻게 작성해야 할까요?
우선, 문제를 보니 입사년월과 그 입사년월에 입사한 사람의 수를 나타낸것 같습니다.
하지만 우리는 입사년월'일' 까지 있는 hiredate 라는 데이터 뿐이니,
이 데이터를 가공 해야겠네요.
그리고 숫자를 세주시면 될 것 같습니다.
이렇게 말이죠.
TO_CHAR 로 원하는 데이터의 형식을 문제의 결과에 맞게 바꿔주고
그 바꿔준 결과별로 숫자를 세는것이니 GROUP BY 함수와
COUNT 함수를 사용하면 되겠습니다!
이상으로 그룹함수 복습을 마치고 JOIN 함수로 넘어가겠습니다!\
JOIN 함수
JOIN 이란 무엇일까요?
JOIN 의 영어사전적 뜻은 함께하다, 어울리다 이런 의미죠?
영단어의 뜻에서 유추할 수 있습니다.
컬럼을 확장하거나(데이터를 연결하는 것) 다른 테이블의 컬럼을 가져오는 것이 JOIN 입니다.
우리가 쓰는 RDBMS는 중복을 최소화하는 구조이기 때문에 하나의 테이블에 데이터를 전부 담지 않고,
목적에 맞게 설계한 테이블에 데이터가 분산됩니다.
이 분산된 데이터들을 조회할 때 다른 테이블의 데이터를 JOIN 으로 연결해서 컬럼을 가져올 수 있는 것이죠.
JOIN 을 작성하는 방법은 두 가지로 분류할 수 있습니다.
American National Standard Institute 의 약자인 ANSI SQL 방법과
ORACLE SQL 방법이 있습니다.
하나씩 차근차근 보도록 하겠습니다.
먼저 NATURAL JOIN 입니다.
조인하고자 하는 테이블간 컬럼명이 동일할 경우 해당 컬럼으로 행을 연결 합니다.
컬럼의 이름 뿐만 아니라 데이터 타입도 동일해야 합니다.
쉽게 말해 두 개의 테이블에서 중복되는 컬럼을 하나로 합쳐주면서
나머지 컬럼들을 병합시켜주는 명령어 입니다.
우선 emp 테이블와 dept 테이블을 다시 보여드리겠습니다.
위에서 두 테이블의 공통된 이름을 갖는 컬럼은 deptno 입니다.
우리는 이 컬럼을 기준으로 두 테이블을 하나로 합칠겁니다.
NATURAL JOIN
NATURAL JOIN 예시를 보겠습니다.
empno, ename 은 emp 테이블에,
dname 은 dept 테이블에 있고
deptno 를 공통 컬럼으로 사용해서 조인한 결과 입니다.
NATURAL JOIN 은 위의 쿼리와 같은 형식으로 사용하시면 됩니다.
주의할 점은, ANSI SQL 에서는 JOIN 조건으로 사용한 컬럼에 테이블 한정자를 붙이면 에러가 납니다!!
꼭 기억해 주세요!
그럼 위의 쿼리를 ORACLE SQL 버전으로 수정 해보겠습니다.
ORACLE 에서는 조인 조건을 WHERE절에 기술합니다.
위와 같이 말이죠.
ORACLE SQL 버전에서는 컬럼명 앞에 항상 한정자를 붙여줘야 합니다.
그리고 그 한정자는 위 처럼 Alias(별칭)로 대체할 수 있습니다.
두 쿼리를 조회해보면 결과는 위 처럼 동일하게 나옵니다.
아, 퀴즈를 하나 내보겠습니다.
위의 쿼리에서 WHERE 절에 있는 '=' 가 '!=' 가 된다면 결과가 어떻게 될까요??
한 번 생각해보고 직접 타이핑 해보시길 바랍니다 ㅎㅎ
JOIN with USING
조인의 또 다른 종류로 JOIN with USING 이 있습니다.
조인 테이블간 동일한 이름의 컬럼이 복수개일 때, 그 중 하나로 조인하고 싶을 때 사용합니다.
형식은 위처럼 사용해주시면 됩니다.
조인 하고자 하는 두개의 테이블 명 사이에 JOIN 을 넣어주시고, 두 번째 테이블명 뒤에 USING 을 써준다음
조인 기준으로 사용하고 싶은 컬럼명을 괄호 안에 적어주시면 됩니다.
단, 이것도 NATURAL JOIN과 마찬가지로 조인컬럼의 이름이 같아야 합니다.
그리고 또 다른 종류로 JOIN with ON 이 있습니다. 위에서 배운 두 가지 방법들은
조인컬럼의 이름이 같아야 한다는 제약조건이 있습니다.
하지만 설계를 하다 보면 데이터는 같지만 두 테이블의 컬럼 이름이 다를 수도 있는데요,
컬럼의 이름이 다를 경우 개발자가 직접 조인 조건을 기술할 수 있도록 제공해주는 문법입니다.
위의 두가지 방법도 ORACLE SQL 버전으로 바꿀 수 있는데요
위와 같이 바꿀 수 있습니다.
눈치 채셨을지 모르겠지만,
NATURAL JOIN, JOIN with USING, JOIN with ON 모두
ORACLE SQL 버전으로 쓰면 동일하게 쓰여집니다.
위 세가지 쿼리의 결과값 입니다.
SELF JOIN
그렇다면 만약 사원번호, 사원이름, 사원의 상사 사원번호, 사원의 상사 이름을 조회하고 싶으면
어떻게 해야 할까요??
이럴 때 사용하는 것이 SELF-JOIN 입니다.
동일한 테이블끼리 조인 할 때 지칭하는 명칭이며 별도의 키워드는 아닙니다.
위의 요구사항을 쿼리로 작성해보면
이렇게 쓸 수 있습니다.
emp 테이블의 사원을 e 라 칭하고 상사를 m 이라 칭하는 것이죠
이것을 JOIN with ON 을 사용해서 묶어주고 조인할 컬럼에
사원의 상사 사원번호와 상사의 사원번호를 적어주면 됩니다.
결과는 우리가 원하는데로
사원번호, 사원이름, 사원의 상사 사원번호, 사원의 상사 이름이 나오게 됩니다.
근데 여기서 보면 원래 emp 테이블은 14행인데
13행만 출력 된 것을 볼 수 있습니다.
이유는??
KING 은 mgr 값이 null 이라서 나오지 않게 되는 것입니다.
그 외에 NON-EQUI-JOIN 이라고 있는데
이는 아까 제가 잠깐 퀴즈로 냈던 '!=' 를 쓰는 효과와 동일합니다.
조인 조건이 '=' 아닌 조인을 말하는 것이죠.
실습
실습 하나 하고 마무리 하겠습니다.
emp, dept 테이블을 이용하여 아래와 같이 조회하려면 어떻게 해야 할까요?
(부서번호가 10, 30인 데이터만 조회)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
정답은 위와 같습니다.
emp 와 dept 테이블에서 deptno 를 조인 컬럼으로 사용해주고,
추가 조건으로 부서번호가 10, 30인 컬럼만 조회해주려면
AND 와 IN 연산자를 WHERE 에 기술해주시면 됩니다!!
오늘은 그룹함수 복습과 아주아주 중요한 JOIN 함수에 대해서 배워보았습니다.
잘 이해가 되셨을지 모르겠지만
오늘도 끝까지 봐주셔서 감사합니다!
다음에 또 좋은내용 가져오겠습니다~!
'프로그래밍 > 데이터베이스' 카테고리의 다른 글
[SQL 기초 - 9장] 오라클 SQL OUTER JOIN, 서브쿼리 (0) | 2024.12.12 |
---|---|
[SQL 기초 - 8장] 오라클 SQL JOIN 연습!! (feat. xERD) (0) | 2024.12.11 |
[SQL 기초 - 6장] DECODE, 그룹함수(GROUP BY, HAVING 절) (0) | 2024.12.06 |
[SQL 기초 - 5장] 오라클 SQL 날짜(2), 숫자 표기법 / 조건문 (0) | 2024.12.03 |
[SQL 기초 - 4장] 오라클 ROWNUM, 문자열, 숫자 관련 함수(1)를 알아보자! (1) | 2024.11.28 |