2. SQL 기초 (SELECT문)
SELECT문
SELECT문은 SQL문의 가장 기본이 되는 구문입니다.
구문 형식을 살펴본다면,
SELECT select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
------------------------------------------------------------------------------------------------------------------------------
- WHERE 조건절 : 대상이 되는 데이터를 한번 조건에 맞추어 필터링합니다.
- GROUP BY : 조건에 맞지 않는 row는 빼버린, 필터링된 대상들을 특정 컬럼을 기준으로 그룹핑합니다.
- HAVING : 그룹에 대한 조건절. 그룹 중 조건에 맞는 그룹만 남깁니다.
- ORDER BY : 마지막으로, 적절한 컬럼 또는 집계함수 결과값을 기준으로 정렬합니다.
(보통 GROUP BY 기준이 되는 컬럼을 기준으로 정렬하는 경우가 많습니다)
SELECT [컬럼] FROM [테이블] WHERE [조건] 은 주로 테이블 조회 시에 사용됩니다.
전체 컬럼을 보고 싶다면, select * from 테이블 처럼 * 을 사용하여 전체 컬럼을 확인합니다.
SELECT ~ INTO
조건에 맞는 기존 테이블의 열 내용을 새 테이블로 가져와 테이블을 만듭니다.
SELECT * INTO [새테이블] FROM [복사할테이블]
GROUP BY
GROUP BY는 각종 집계함수, 그룹함수와 함께 쓰이며 그룹화된 정보를 제공합니다.
'OO별 정보'처럼 데이터를 그룹으로 나누어, 그룹별로 집계된 정보를 출력하고 비교할 때 GROUP BY가 사용됩니다.
select 집계함수A (컬럼이름1), 집계함수B (컬럼이름2), ...
from 테이블이름
group by 컬럼이름Z
집계함수
|
용도
|
max(컬럼이름)
|
최대값
|
min(컬럼이름)
|
최소값
|
median(컬럼이름)
|
중앙값
|
sum(컬럼이름)
|
합계
|
avg(컬럼이름)
|
평균
|
variance(컬럼이름)
|
분산
|
stddev(컬럼이름)
|
표준편차
|
count(컬럼이름)
|
관측값(row) 수
|
employees 테이블에서 부서별 최고 급여, 최저 급여, 평균 급여을 검색한다면,
부서(department_id)별 최고/최저/평균 급여(salary)를 검색하려면 GROUP BY를 사용해야 합니다.
- 조회하려는 데이터 : max(salary), min(salary), avg(salary)
- 그룹핑 기준: department_id
- 데이터가 속한 테이블 : employees
select department_id, max(salary), min(salary), avg(salary)
from employees
group by department_id;
-하지만 컬럼 이름이 집계함수와 변수 이름 그대로 집계되어 한눈에 보기가 어렵고, 특히 급여평균(avg(salary))의 경우에는 소숫점 아래 수십자리까지 출력되어 있으며, 데이터가 어느 컬럼을 기준으로 하든 정렬이 되어 있지 않습니다.
따라서,
- Alias를 이용해 컬럼 이름에 별칭을 달아주고,
- ROUND함수를 이용해 avg(salary)를 소수점 1째짜리까지 반올림한 결과로 나타내고
- ORDER BY를 이용해 부서번호 기준으로 데이터를 정렬해줄 필요가 있습니다.
수정된 코드입니다.
select department_id as 부서번호,
max(salary) as 최대급여,
min(salary) as 최소급여,
round(avg(salary), 1) as 평균급여
from employees
group by department_id
order by department_id;
- 각 컬럼이 별칭으로 나타나 있고,
- 평균급여는 소수점 아래 1째 자리까지만 반올림되어 표기되었으며,
- 부서번호를 기준으로 오름차순 정렬되었습니다.
ORDER BY
집계함수를 기준으로 결과값을 정렬하는 것도 가능합니다.
또한, 별칭을 사용할 수 있습니다. (WHERE, HAVING, GROUP BY에는 별칭을 사용할 수 없습니다.)
아래 코드는 평균급여를 기준으로 오름차순 정렬합니다.
select department_id as 부서번호,
max(salary) as 최대급여,
min(salary) as 최소급여,
round(avg(salary), 1) as 평균급여
from employees
group by department_id
order by 평균급여;
평균급여를 기준으로 내림차순 정렬한다면,
order by 최대급여 desc;
로 order by문을 수정합니다.