< 조인(Join)에 대해 알아보자 >
DBMS의 중요한 목적 중 하나는 데이터를 효율적으로 관리하는 것이다. 그래서 개별 테이블을 만들어 가급적 중복성을 피해서 꼭 필요한 데이터를 저장하게 된다. 하지만 각각의 테이블 하나만 놓고 본다면 그안에 들어있는 데이터는 정보로서의 가치가 많이 떨어진다. 하지만 각각의 테이블에 분리되어 있는 연관성 있는 데이터들을 연결하거나 조합하여 데이터를 사용할 수 있다면 중요한 정보로서 가공될수 있다.
이런 작업들을 조인(Join)이라고 한다.
1. WHERE 절
2. 조인(Join)
추천한번씩 누르고 내려가는 느긋함을~^^
1. WHERE 절
조인에 대해 알아보기 전에 먼저 WHERE 절 에 대해 살펴 봐야 한다.
WHERE 절은 SELECT, UPDATE, DELETE 등 여러 DML 문장에서 사용되어 특정 조건을 처리하는 필터 역할을 수행한다. 그리고 조인에 사용되는 조건들 역시 WHERE 절에 기술한다. SQL 문장을 얼마나 잘 작성하느냐의 척도는 WHERE 절을 얼마만큼 잘 사용하느냐에 달려 있다.
연산자
종류 | 연산자 | 예 |
문자 연산자 | || | SELECT * FROM employees WHERE first_name || last_name ='스티븐킹' |
수식 연산자 | +, -, *, / | SELECT * FROM employees WHERE salary * 12 = 45000000; |
비교 연산자 | >, <, =, >=, <= | SELECT * FROM employees WHERE salary >= 3000; |
여기서 보는 연산자들은 일반 프로그래밍 언어에서 보는것과 같다. 주의할 것은 '||' 연산자 인데 문자나 문자열을 서로 붙이는데 사용된다.
AND와 OR
AND는 모든 조건이 TRUE일 경우에만 TRUE이며, OR은 모든 조건이 FALSE일 경우만 FALSE가 된다.
아래는 AND 조건을 사용한 WHERE 절이다. 30이라는 부서에 속한 사람들 중에 월급여가 10,000 이하인 사람들을 찾아내는 조건이다. 위 두가지 조건에 모두 해당하는 사람을 뽑아내야 할때 AND를 사용한다.
OR 조건을 사용하였다. EMPLOYEES 테이블에서 부서 ID가 30 이거나 60인 둘중 하나에라도 속한 사원을 조회하도록 할때 OR 조건을 사용한다.
범위 조건
조건절에서 컬럼값이 어느 범위에 걸쳐 있는지를 검사할 경우 BETWEEN ...AND 구문을 사용할 수 있다.
예를 들어 사원번호가 110번에서 120번 까지의 사원명단을 구한다라고 할때 사용 하면 된다.
다음은 NOT 조건이다. 110번에서 120번까지의 사원을 조회했지만 여기서 NOT을 붙이면 110번 미만이면서 120초과인 사원번호를 추출하게 된다.
IN
BETWEEN ..AND 조건과는 다르게 여러 개의 값을 동시에 비교해야 할 경우에는 IN 을 사용한다.
IN연산자는 OR 연산자와 동일한 기능을 수행하며 비교할 값들이 많을때 IN 을 사용하면 문장이 짧아진다.
부서 ID가 30 OR 60 OR 90 인 사원들만 구하겠다 할때 사용할 수 있다.
EXISTS
IN과 비슷한 용도로 EXISTS 조건이 있다 어떤 값에 포함되는지 여부를 체크하는 것이 IN 이라면 EXISTS는 특정 컬럼값이 존재하는지 여부를 체크한다. IN은 괄호 안에 비교할 값이 올 수도 있고 서브쿼리가 올 수도 있는 반면에 EXISTS는 오직 서브쿼리만 올 수 있다.
테이블 부서ID가 30, 60, 90인 사원을 구하고 싶을때 EXISTS를 사용했다.
결과는 IN을 사용했을때와 동일하면서 SQL 문장은 더 길어졌다 왜 사용할까?
EXISTS는 IN보다 탁월한 성능을 발휘한다 그만큼 쿼리결과가 빨리나온다. 문장은 길어졌지만 오라클 SQL 엔진 입장에서는 EXISTS가 더빨리 처리 되는 것이다. 이것에 대해서는 SQL튜닝과 관련된 곳에서 공부를 더 해야 한다.
LIKE
LIKE는 사람의 이름으로 김씨 성을 가진 사람을 전부 찾고싶거나 이름의 끝이 '동'으로 끝나는 사람을 찾고싶을때 또는 사원번호 3자릿수중 앞자리가 11로 시작하는 사람만 찾고자 할때 등등의 경우에 사용할 수 있다. 단. NULL은 검색대상에 포함되지 않는다.
아래 쿼리는 사원번호 3자리중 앞자리가 11로 시작하는 사원들만 찾고자 할때 like를 사용하였다.
NULL 처리
데이터를 보면 NULL 데이터를 가지고 있는 컬럼들이 있다. NULL 컬럼만을 검색하기 위한 구문으로 'IS NULL' 이 있다.
반대로 NULL이 아닌 데이터를 조회할 때는 NOT을 추가해서 'IS NOT NULL' 조건을 준다.
locations테이블에는 state_province컬럼에 null데이터가 들어가있는 row들이 있다. null이 들어간 데이터만 구하기 위해 is null 을 사용했다.
2. 조인(Join)
각각의 테이블에 분리되어 있는 연관성 있는 데이터들을 연결하거나 조합하여 데이터를 사용할 수 있다면 중요한 정보로서 가공될수 있으며 이런 작업들을 조인(Join)이라고 한다.
테이블과 테이블을 연결하기 위해선 테이블간에 사용되는 공통 컬럼으로 where 절에서 연결 할 수 있다.
조인은 두 개 이상의 테이블들이 대상이 되므로 FROM 절에 기술을 해주며 조인시에는 조회 대상 테이블이 두개 이상이므로 컬럼을 명시할 때 항상 '테이블명.컬럼명' 형식을 따라야 한다. 컬럼을 구분하기 위해서이다.
테이블에는 별명(Alias)을 사용하면 가독성이 향상된다.
내부조인
가장 일반적인 형태의 조인을 내부조인(Inner Join)이라고 한다. 테이블 간의 공통 컬럼을 사용하여 컬럼값이 같은 데이터들을 연결한 조인 방법을 말한다.
사원의 직책명과 부서명을 알아내야 한다면 employees 테이블만 가지고는 직책명과 부서명을 알수 없다. 이럴때 조인을 사용하여 각각의 사원들의 직책과 부서명을 알아낼수 있다.
조인에는 안티조인,세미조인,동등조인 등이 있지만 실제로는 굳이 그 명칭을 사용한다기 보다는 이 모든 조인들을 통틀어서 내부조인 혹은 조인이라고 부른다.
외부조인
외부조인(Outer Join)은 일반적인 조인인 내부조인을 확장한 개념의 조인이라고 볼 수 있다. 내부조인은 공통 컬럼을 통해 같은 값을 가진 로우(row)들만 결과로 추출한다. 같은 값만 추출을 하기에 공통컬럼값이 NULL인 경우에는 조회결과에 포함되지 않지만 외부조인을 사용하면 공통컬럼값이 NULL이더라도 조회결과에 포함된다.
아래는 일반 내부조인을 통해 조회를 해보았다 총 데이터는 107건인데 106건이 조회되었다.
그 이유는 킴벌리라는 사람의 department_id 값이 null 이기 때문에 내부조인을 통해서 제외된 것이다.
이제 외부조인을 (+)를 사용하여 조회를 했더니 이제 총 107건이 조회되었다. 킴벌리도 조회에 포함된 것이다.
외부조인은 (+) 기호를 사용한 조인을 말하는 것이다. 즉 해당 데이터가 존재하지 않더라도(null 일때) 이를 무시하고 조인에 참여하라는 역할을 하는 것이 바로 (+) 이다.
(+) 기호는 조인하는 테이블과 테이블 에서 데이터가 존재하지 않는(null을 가지고 있는) 테이블의 조인조건에 (+)를 붙여야 한다.
-뇌를 자극하는 오라클 프로그래밍 책을 참고하였습니다.
[출처] http://dkatlf900.tistory.com/87
'데이터베이스 > Oracle' 카테고리의 다른 글
Oracle SQL 쿼리문 정리 (0) | 2015.12.22 |
---|---|
left join과 left outer join SQL문의 차이점 (0) | 2015.12.22 |
오라클 rownum 쿼리 (0) | 2015.11.20 |
CASE ~ WHEN ~ THEN ~ ELSE ~ END (0) | 2015.11.20 |
[Oracle 관리] 오라클 EM(Enterprise Manager) 사용법 (0) | 2015.11.06 |