Programming/Database

2. SQL 기초 (SELECT문)

오숭이 2021. 12. 26. 19:12

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문을 수정합니다.