dev/DB

[DB/Oracle] JOIN

dev_Step 2022. 2. 19. 15:48

join : 두개 이상의 테이블이나 결과를 서로 연결하여 데이터를 검색하고자 할 때 사용하는 방법이다..

from절에 조인할 테이블을 기술하고, 조건절에서 테이블간의 연결이 이루어질 조건을 기술한다.

join의 종류를 보면 CARTESLAN PRODUCT, EQUI JOIN, NON-EQUI JOIN, OUTER JOIN, SELF JOIN 등으로 나뉜다,

 

CARTESLAN PRODUCT : 조인절에 조인을 위한 조건을기술하지 않을경우 테이블의 RECORD 곱으로 결과가 생성된다.

 

EQUAL JOIN : 조건절에 기술된 조인 조건을 EQUAL('=') 연산자로 연결하는 경우가 이에 해당한다.

- temp, tdept 두 테이블에서 dept_code가 서로 동일한 값만 리턴되어 나오게된다.

 

NON EQUAL JOIN : 조건절에 기술된 조인 조건이 EQAUL('=')이 아닌 다른 연산기호로 주어지는 경우

OUTER JOIN : 두개 이상의 테이블 조인시 한쪽 테이블의 행에 대해서 다른 테이블에 일치하는 행이 없더라도 NULL로 하여 행을 return 할때 사용하는게 OUTER JOIN 이다.

select 컬럼, 컬럼2, 컬럼3 from 테이블1, 테이블2 where 테이블1.컬럼 = 테이블2.컬럼(+)

결합된 컬럼 값이 테이블2에 없더라도 테이블1에 있다면, 테이블2의 값들중 테이블1과 일치되는 값이 없는 행은 모두 NULL로 RETURN 된다.

양쪽에 모두 존재하는 값은 모두 나오나, 테이블1에 없고 테이블2에만 있는 값은 리턴되지 않는다.

(+)를 지정한 테이블에 대해서는 일시적으로 특별한 NULL열이 작성된다.

EQAUL JOIN 
EQAUL JOIN RESULT

 

EQUAL JOIN 시에는 테이블 a,b 모두 가지고 있는 값들이 RETURN 되어 나오는 것이고,

OUTER JOIN
OUTER JOIN RESULT

OUTER JOIN의 경우는 (+)된 컬럼의 테이블에 값이 없을경우는 NULL을 리턴해준다.

위에서 보면 b.work_year(+) = '2001' and b.emp_id(+) = a.emp_id 의 조건에서

b.work_year(+) 되어 있으므로 b.work_year 값이 2001이 아닌 값에 대해서는 tcom테이블에서 emp_id 값은 NULL이 리턴되어 나온다.

 

두개 테이블의 조인되는 컬럼이 두개 이상일 때는 반드시 조건절의 모든 컬럼(이경우는 TCOM의 모든 컬럼)에 (+)가 붙어야 한다.

//각 사번의 성명, 이름, salary, 연봉하한금액, 연봉상한금액을 보고자 한다. TEMP, EMP_LEVEL을 조인하여 결과를 보여주되, 연봉의 상하한이 등록되어 있찌 않은 '수습'사원은 성명, 이름, SALARY까지만이라도 나올 수 있도록 Query를 구성해 보라

수습사원의 from_sal, to_sal 값이 존재하지 않을경우 NULL로 출력되어 나와야 한다. 그럴경우 없는 값은 NULL로 나타낼 것이므로 NULL로 나타낼 조건절 (테이블의)  컬럼에 (+)을 붙여준다.

A는있는데 B에 없다. 근데 NULL로 나타낼거다 그럼 없는 B에 (+)을 붙야준다. 

 

SELF JOIN : 같은 테이블을 마치 다른테이블처럼 인식시켜 JOIN하는 것으로 SELF JOIN 시에는 반드시 ALIAS를 사용해야 한다. 보통 순환 참조가 필요한 경우에 많이 사용한다. 또는 한 ROW에 두개의 RECORD를 보여주고자 할때 유용하다.

해당 쿼리문을 보면

 

where 문, group by, [having], order by문이 보이는데

select 에서 현재 총 4개의 열을 선택하고 있는데 여기서 선택된 열들은 group by에 사용되거나 그룹 함수로 사용되어야 한다.

b.birth_date 는 그룹 함수로 사용되었고, a.emp_id, a.emp_name, a.birth_date 는 group by 에 사용되었다.

만약 사용되지 않을경우 에러 메시지가 발생하게 됩니다. 

"만약에 집계 함수를 사용하지 않거나, group by 절에 사용되지 않은 열이 있다면 [GROUP BY 표현식이 아닙니다(NOT a GROUP BY expression)" 이라는 에러가 발생합니다.

[이럴경우 해결방법으론 group by 에 해당 열을 사용하거나, select 에서 해당 열을 제거하거나, 집계 합수를 사용하는

방법이 있습니다.]

 

[참고 : https://kimsyoung.tistory.com/m/entry/GROUP-BY%E4%B8%8B-%EC%98%A4%EB%A5%98%EB%AC%B8-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0]

 

GROUP BY (下) : 오류문 해결하기

여러분이 숙련된 SQL 사용자이든 이제 갓 SQL을 배우기 시작한 초보자이든 상관없이 쿼리를 실행하다 보면 각종 오류와 마주하게 됩니다. 오류 메시지를 읽으면 그걸 읽고 해결할 수 있어야 하는

kimsyoung.tistory.com

 

 

where 조건절은 group화 되기 전의 데이터에 대해서 분류작업이 이루어 진 후에 group by 에 의해 데이터들이 그룹이 생성됩니다. 또한 그룹이 지어진 후에 having 을 통해서 그룹데이터에 대한 조건을 붙일 수 있습니다.

 

 

 

//상위부서가 CA0001인 부서에 소속된 직원을 

사번, 성명, 부서코드, 부서명, 상위부서코드, 상위부서명, 상위부서장코드, 상위부서장성명을 출력해라