[ POSTGRESQL ]
Clause
- SQL 명령문 내에서 특정 기능을 수행하는 키워드 또는 절이다.
- 각 Clause는 데이터베이스 쿼리의 특정한 부분을 정의하며, 목적에 따라서 다양한 Clause를 사용할 수 있다.
- 대표적으로 Select, From, Where등이 있고 Distinct나 Union도 Clause의 종류이다.
DISTINCT
- 쿼리에서 중복된 결과를 제거하고 고유한 값을 반환하는 Clause다.
- 특정 열 또는 열 조합의 중복된 행을 제거하는 데 사용된다.
- Select에서 사용되는 결과에 따라서 중복의 제거가 이루어 지기 때문에 중복을 제거해야 할때 일부 필드의 값이 같고 다른 필드들의 값이 다를경우에는 원하는 결과가 나오지 않을 수 있다.
-- 급여가 5000보다 큰 직원들의 고유한 부서 ID만 반환한다.
SELECT DISTINCT department_id
FROM employees
WHERE salary > 5000;
LIMIT
- 결과로 반환할 행의 수를 제한한다
- 대량의 데이터에서 일부만 조회할 때 유용하다.
- 보통 Order By를 사용하여 반환할 행의 순서를 정해준뒤 일부를 추출하여 사용하는 경우가 많다.
-- 급여가 높은 상위 5명의 직원 정보를 반환한다.
SELECT employee_id, first_name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;
OFFSET
- 쿼리 결과에서 지정한 수만큼의 행을 건너뛰고 데이터를 반환한다.
- 페이징(paging) 기능을 구현할 때 자주 사용된다.
-- 급여가 높은 순서에서 10명을 건너뛰고, 그 이후의 상위 5명의 직원 정보를 반환합니다.
SELECT employee_id, first_name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5 OFFSET 10;
UNION
- 두 개 이상의 SELECT 결과를 결합하여 중복을 제거한 데이터를 반환한다.
- UNION ALL은 중복을 제거하지 않는다.
- 집합의 합집합 개념이라고 생각하면 쉽다.
-- 부서 1과 부서 2에 속한 직원들의 이름을 중복을 제거한 후 결합하여 반환합니다.
SELECT first_name, last_name FROM employees WHERE department_id = 1
UNION
SELECT first_name, last_name FROM employees WHERE department_id = 2;
EXCEPT
- 첫 번째 쿼리 결과에서 두 번째 쿼리 결과를 제외한 데이터를 반환한다.
- 집합의 차집합 개념이라고 생각하면 쉽다.
-- 부서 1에는 속하지만 부서 2에는 속하지 않는 직원들의 이름을 반환합니다.
SELECT first_name, last_name FROM employees WHERE department_id = 1
EXCEPT
SELECT first_name, last_name FROM employees WHERE department_id = 2;
INTERSECT
- 두 개의 SELECT 쿼리에서 공통된 결과를 반환한다.
- 집합의 교집합 개념이라고 생각하면 쉽다.
- Join과는 조금 다른데 Intersect는 두 테이블의 관계는 파악하지 않고 각각의 결과에서 공통된 결과만 반환을 해준다.
-- 부서 1과 부서 2 모두에 속한 직원들의 이름을 반환합니다.
SELECT first_name, last_name FROM employees WHERE department_id = 1
INTERSECT
SELECT first_name, last_name FROM employees WHERE department_id = 2;
WITH (Common Table Expression, CTE)
- 복잡한 쿼리를 쉽게 작성하기 위해 임시 결과 집합을 정의한다.
- 주로 재귀 쿼리 또는 중첩된 쿼리를 단순화할 때 사용된다.
- Procedure를 작성할때 임시테이블등을 만들지 않고 필요할때 WITH문으로 데이터셋을 정의한 다음에 사용이 가능하다.
-- 먼저 department_avg라는 임시 테이블에서 각 부서의 평균 급여를 계산한 후,
-- 그 평균보다 높은 급여를 받는 직원을 조회합니다.
WITH department_avg AS (
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
)
SELECT e.employee_id, e.first_name, e.salary, d.avg_salary
FROM employees e
JOIN department_avg d ON e.department_id = d.department_id
WHERE e.salary > d.avg_salary;
'DB' 카테고리의 다른 글
POSTGRESQL 정리3 (JOIN) (0) | 2024.09.02 |
---|---|
POSTGRESQL 정리2 (SELECT) (0) | 2024.08.28 |
POSTGRESQL 정리1 (DDL, DML, DCL) (0) | 2024.08.28 |