sql

MYSQL - UNION/GROUP BY/HAVING/DISTINCT

yun.seul 2023. 1. 12. 17:47
UNION
SELECT department_id, count(*) FROM employees WHERE department_id = 90
UNION
SELECT department_id, count(*) FROM employees WHERE department_id = 60
UNION
SELECT department_id, count(*) FROM employees WHERE department_id = 70;

UNION연산자는 여러 테이블에 존재하는 같은 성격의 값을 한번의 쿼리로 추출할 수 있도록 도와줘서 한번에 값을 같이 보고싶을 때 사용한다. 주의 할 점은 대응하는 필드의 이름과 타입이 같아야 하기 때문에 필드의 이름은 AS를 사용해서 같은 값을 갖게 만든다.

 

위의 예시는 UNION 동작하는 것을 보기위해 만든 간단한 예시로 임의로 같은 테이블에서 값을 꺼내왔으니 이 점 유의 바란다. 만약 세개의 문장이 다 다른 테이블에서 값을 갖고온다면 DEPARTMENT_ID가 90, 60, 70인 레코드를 한 눈에 볼 수 있는 것이다.

 

 

GROUP BY
-- Job_id로 분류(그룹) 지어 개수 세기
SELECT job_id,count(*) FROM employees GROUP BY job_id;

-- 직책별 평균 연봉, 최대연봉, 최소연봉 구하기
SELECT job_id,avg(salary),max(salary),min(salary) FROM employees WHERE job_id = 'IT_PROG' GROUP BY JOB_ID;

유형별로 갯수나 값을 구하고 싶을 때는 GROUP BY를 이용하여 특정 컬럼을 그룹화할 수 있다.

 

첫번째 예제는 JOB_ID로 그룹화하여 아이디와 그 갯수를 조회하는 조회문으로써 특정 컬럼의 갯수를 구할 수 있다.

두번째 예제는 JOB_ID가 "IT_PROG"인 컬럼을 그룹화하여 그 직책별 평균 연봉, 최대연봉, 최소연봉을 구할 수 있는 조회문이다. 

 

이처럼 GROUP BY를 이용하면 특정 컬럼의 그룹화를 통해 그 그룹의 특정 값을 쉽게 구할 수 있다.

 

HAVING
-- LAST _NAME별로 그룹지어 2명 이상인 LAST_NAME 조회
SELECT LAST_NAME, COUNT(*) FROM EMPLOYEES GROUP BY last_name HAVING count(*) > 1;

GROUP BY로 그룹화를 하고 그룹화한 결과에 조건을 줄 때는 WHERE절이 아닌 HAVING절을 사용해야 한다.

사용법은 WHERE절과 같이 작성해준 뒤 WHERE 대신 HAVING을 작성해 주면 된다.

 

중복제거
-- 같은 last_name 행의 경우(중복) 제거
SELECT distinct last_name FROM employees;

-- 위의 중복을 제거한 조회결과를 직책명 오름차순으로 조회하기.
SELECT distinct job_id FROM employees ORDER BY JOB_ID;
-- 직책 개수
SELECT count(distinct job_id) FROM employees;

중복제거를 위해선 DISTINCT를 사용해 주면 되는데 사용법은 필드 값 앞에 작성해 주기만 하면 된다.

~ DISTINCT 필드값 ~;

DISTINCT를 사용한다면 작성한 필드값의 중복값을 제거한 조회결과를 조회할 수 있다.

 

COUNT(DISTINCT 필드값) 을 이용하면 중복되지 않은 유형의 갯수를 얻을 수 있는데, 이는 GROUP BY로 필드를 그룹화한 다음 유형 갯수를 구해주는 것과 같은 결과를 얻을 수 있다.