728x90
반응형
[조인과 서브쿼리의 차이점 및 특징]
Join | Subquery |
원하는 data가 여러 테이블에 분산되어 있을 때 | 원하는 data가 한번의 select만으로는 불가능할 때 여러번의 select문을 사용해야 할 때 컬럼을 사용할 수 있는 위치면 모두 사용가능 (select-from-where-group by-having-order by, insert문,delete,update문 등) 괄호가 반드시 들어감 (select~~~) |
Subquery select문 실행의 결과는 단일행(레코드 1개) 혹은 복수행 (레코드 여러개) 2가지로 분류됨
단일행 : 비교연산자 사용 (>, <, = 등)
SELECT last_name, department_id, salary #메인쿼리
FROM employees
WHERE department_id IN ( SELECT department_id #괄호 내부의 쿼리는 서브쿼리
FROM employees
WHERE salary > 13000 );
주의) 결과값이 복수행이 반환되는데 비교 연산자를 사용하면 에러 발생하므로 반환 값에 주의 할 것!
복수행: in/any/all/exists 연산자 사용
1) IN 연산자
SELECT last_name, department_id, salary
FROM employees
WHERE department_id IN ( SELECT department_id FROM employees WHERE salary > 13000 );
2) ANY/ALL 연산자
- ANY/ALL연산자는 복수행을 반환함에도 '<' 와 '>'를 함께 사용할 수 있음
SELECT last_name, department_id, salary
FROM employees
WHERE salary < ALL (SELECT salary FROM employees WHERE job_id = 'IT_PROG');
> ALL : 서브쿼리 실행 결과 중에서 최대값보다 큰 값을 찾음
< ALL : 서브쿼리 실행 결과 중에서 최소값보다 작은 값을 찾음
SELECT last_name, department_id, salary
FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE job_id = 'IT_PROG');
ANY 연산자는 해당 값들 중 하나만 만족하면 반환됨
> ANY : 최소값보다 큰 값
< ANY : 최대값보다 작은 값
3) EXISTS 연산자
실행 결과가 하나라도 존재하는지 여부를 확인할 때 사용
TRUE ---> 메인쿼리 실행
FALSE ---> 메인쿼리가 실행되지 않음
SELECT last_name, department_id, salary
FROM employees
WHERE EXISTS (SELECT employee_id FROM employees WHERE commission_pct IS NOT NULL);
4) 다중 서브쿼리
- Pair 비교 방법
예시) 부서별로 가장 많은 월급을 받는 사원id를 구하는 경우
SELECT last_name, department_id, salary
FROM employees
WHERE (department_id, salary) IN ( SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id )
ORDER BY 2;
5) In-line view 인라인뷰 (From 절에 사용하는 서브쿼리)
별칭을 준 서브쿼리의 행 수가 기존 테이블의 행 수보다는 적으므로, 연산 시 성능이 좋음
SELECT select_list
FROM ( 서브쿼리 ) alias
WHERE 조건식;
예시)
SELECT e.department_id, 합계, 평균, 인원수
FROM ( SELECT department_id, SUM(salary) 합계, AVG(salary) 평균 FROM employee) e, departments d
WHERE e.department_id = d.department_id;
728x90
반응형
'SQL' 카테고리의 다른 글
SQL DDL 데이터 정의어 총 정리 (0) | 2022.09.14 |
---|---|
SQL DML(데이터 조작어) (0) | 2022.09.13 |
[Oracle] Join (Inner, Outer, ANSI Join) (1) | 2022.09.13 |
[Oracle] SQL 주민등록번호로 나이 계산하기 (0) | 2022.09.08 |
[Oracle] SQL 그룹 함수 (Group By, Having) (0) | 2022.09.08 |
댓글