반응형
SuBQuery
- 쿼리구문을 보조하는 목적의 쿼리구문
- 결과값을 별도로 구해서 입력하거나 다른 수단으로 입력하면 출력값의 일관성을 만족하지 않을 수 있다.
- 이런 경우 원하는 값을 구할 수 있는 쿼리구문을 값이 들어갈 위치에 넣어 실행하는 것도 가능하다.
- Subquery 기본 문법
- 명칭 바깥 쿼리문 ⇒ 메인쿼리(Outer query), 안쪽 쿼리문 ⇒ 서브쿼리(Inner query)
- 서브쿼리가 우선 실행됨.
- 주의사항- 서브쿼리는 위치에 따라 적절한 데이터 타입, 출력 행의 수, 출력 컬럼의 수를 출력할 수 있도록 구성해야 한다.
- 조건만 맞다면 서브쿼리 내의 함수 사용 제한같은건 없음
SELECT last_name, job_id, salary
FROM employees
WHERE salary = //2100
(SELECT MIN(salary)
FROM employees);
SELECT DEPARTMENT_ID, MIN(SALARY)
FROM EMPLOYEES e
GROUP BY DEPARTMENT_ID
HAVING MIN(SALARY) >
(SELECT MIN(SALARY)
FROM EMPLOYEES e2
WHERE DEPARTMENT_ID = 50)
ORDER BY MIN(SALARY);
SELECT EMPLOYEE_ID , LAST_NAME , SALARY
FROM EMPLOYEES e
WHERE SALARY >= (
SELECT (SUM(SALARY)/COUNT(SALARY)) // 평균구하는 식 AVG(salary)와 동일
FROM EMPLOYEES e2)
ORDER BY SALARY;
// employees 테이블로부터 평균 이상의 급여를 받는 모든 사원의
// employee_id, last_name, salary를 salary를 기준으로 오름차순 정렬하여 출력하는 예제
INLINE VIEW
- 데이터베이스의 오브젝트 중 논리적인 테이블인 뷰를 서브쿼리의 형태로 구현하는 방법
- 서브쿼리의 SELECT 절의 목록이 테이블의 컬럼으로 취급되며, 서브쿼리의 출력 행들이 테이블의 행 데이터로 취급이 된다.
- 서브쿼리의 출력 결과에서 함수나 표현식의 형태는 컬럼명이 될 수 없기 때문에 꼭 컬럼 엘리어스를 사용해야 하며, 데이터 활용시 테이블명이 필요한 경우 테이블 엘리어스를 활용하여 사용할 수 있다
사원이 속한 부서의 평균 급여보다 더 많은 급여를 받는 사원의 성, 급여, 소속 부서, 평균 급여를 출력하는 구문
- 테이블 : employees,
- SELECT department_id, AVG(salary) salary
- FROM employees
- GROUP BY department_id) b
- 연결 조건 : employees.department_id = b.department_id
SELECT last_name, salary, e.department_id, salavg
FROM employees e JOIN (SELECT department_id, AVG(salary) salavg
FROM employees //AVG(salary) salavg => 컬럼 엘리어스 필수
GROUP BY department_id) b
ON e.department_id = b.department_id
WHERE salary > salavg;