sql #6

MSSQL 2019. 12. 8. 23:49

* 집계함수

개수 count

합계 sum

평균 avg

최대값 max

최소값 min

 

* 합계 구하기

select sum(salary) from table

salary 칼럼에는 숫자만 있다.

 

* 집계함수의 레코드 중간에 null이 껴있는 경우

만약 null이 껴있어도 집계함수는 null로 표현이 아니라 빼고 계산한다.

 

* 평균 구하기

select avg(salary) from table

 

* 최대값, 최소값 구하기

select max(salary), min(salary) from table

집계함수의 혼합이 가능하다.

 

* 집계함수의 에러

select name, max(salary) from table 이 안되는 이유는?

name은 table 안에 있는 이름 전체이고 집계함수 max는 1개의 로우만 산출해야함.

단순 칼럼과 집계함수는 같이 쓸 수 없고 서브 쿼리문을 써야한다.

 

* 행(row) 개수 구하기

select count(salary) from table

칼럼에 null이 있다면 null을 제외한 행의 개수를 구한다.

그냥 행의 전체 개수를 구하려면 count(*)을 쓰자

 

* 중복되지 않은 개수 구하기

select count(distinct salary) from table

distinct로 salary의 같은 숫자를 거르고 개수를 구함

 

* group by

그룹바이 절은 데이터를 그룹화한다.

집계함수는 행이 많아도 1개만 출력한다.

그룹바이 절은 칼럼의 별칭을 사용할 수 없고 칼럼명만 쓸 수 있다.

 

select depart from table group by depart

그룹바이는 depart란 칼럼을 distinct한 느낌이다.

 

select depart, avg(salary) from table group by depart

부서별로 distict한 값 + 부서별 월급의 평균을 구할 수 있다.

결국 group by로 묶은 단순 칼럼만 select 문에 사용할 수 있다.

 

* having

해빙절은 그룹별로 조건을 지정한다.

select 절에 조건으로 결과를 제한: where 절

그룹의 결과를 제한: having 절

 

select depart, avg(salary) 

from table 

group by depart

having avg(salary) >= 500

 

group by 까진 나온 값에서 500이 넘는 값만을 출력하는 것임.

having 절에 나온 문구가 select 쪽에 그대로 나옴.

 

* 다차원 집계함수

 

* with rollup

group by로 구한 값의 중간 합계와 전체 합계를 구하는데 사용함

 

select depart, job, sum(salary)

from table

group by depart, job with rollup

 

선행 칼럼이 기준이 됨.

depart는 부서니까 부서가 기준이 된다.

앞이 job이었으면 직급이 기준이 됨.

 

부서별 각 직급의 중간 합계가 나온다. 

사원의 합, 대리의 합.. 부서의 합

그리고 총 합계가 나타남

 

// 부서별 직급의 중간 합계 + 총 합계

 

* with cube

with rollup과 다 똑같다.

다만 맨 밑에 직급별 합계가 나타남

그거밖에 다른 거 없음.

 

select depart, job, sum(salary)

from table

group by depart, job with cube

order by depart desc, job desc

 

// 부서별 직급의 중간 합계 + 직급별 합계 + 총 합계

 

* case when then문

 

case 

when ~ then ~ 

when ~ then ~

when ~ then ~

end

 

case ~ end 사이에서

when 조건이 참이라면 then

 

select name, depart,

case 

when depart = 10 then 'A부서'

when depart = 20 then 'B부서'

when depart = 30 then 'C부서'

end as 부서명

from EMPLOYEE

 

* pivot

행을 열로 변환시켜서 결과 값을 보여줌

 

select year, [1], [2], [3] , [4]

from test

pivot

(

sum(amount)

for quater

in([1], [2], [3], [4])

)

as test

 

그닥 안쓸꺼 같다.

amount 레코드 안에 들어갈 값.

quater는 칼럼

 

* unpivot

열을 행으로 변환시켜서 결과 값을 보여줌

 

select year, quater, amount

from test2

unpivot

(

amount

for quater

in([1], [2], [3], [4])

)

as test2

 

* ranks 함수들

데이터값을 이용해서 순위를 매긴다.

 

* rank over

같은 값이 있을 경우는 1,1,3위처럼 2위가 사라짐

 

select *, 

rank() over(order by amount desc)

from test

amount 값을 내림차순으로 순위를 매김.

 

* rank over + partition by

지정한 칼럼을 기준으로 달라질 때마다 새롭게 순위를 매김.

 

select *, rank() over(partition by year order by amount desc)

from test

 

year 값이 바뀔 때마다 1위부터 다시 순위를 매김.

 

* dense_rank over

결과 값이 같으면 순위를 건너뛰지 않고 1,1,2위처럼 그대로 감.

 

* row_number over

결과 값이 같아도 임의적으로 1,2,3위처럼 매김.

 

* ntile over

지정한 숫자에 맞게 순위를 매겨줌.

select *, ntile(6) over(order by amount desc)

from test

 

* iif

case와 동일한 역할이다. 근데 더 단순한 표현이 가능함.

case가 한 칼럼에 여러 조건 때려박을 수 있지만

iif는 한 칼럼에 true, false만으로 구분할 수 있다.

 

select 

case

when quater = 1 then '일'

when quater = 2 then '이'

when quater = 3 then '삼'

when quater = 4 then '사'

end

from test

 

select 

iif(quater =1 ,'일','')

from test

 

* choose

index값 지정해서 숫자 입력으로 그 값을 돌려주는 단순한 것임.

select choose(1, 'a','b','c') => a가 나온다.

 

* 시퀀스

중복되지 않는 기본키 얻기위해 identity를 사용했다.

sql 2012부터 시퀀스 개체가 있어 일련번호 생성할 수 있다.

 

select * into department2

from department where 1=0

// select into는 동일한 테이블을 만들기에 좋다.

// where 1=0은 같지 않으므로 데이터가 아무것도 없는 것는 테이블을 만들게 된다.

 

프로그래밍 - 기능에 시퀀스에 있다.

 

create sequence deptsequence

start with 1  // 첫 시작 1

increment by 10; // 증가값 10

// 시작값이 1이고 증가값이 10인 시퀀스를 만든다.

 

insert into department2 values (next value for deptsequence, 'a부서', 'aaa');

insert into department2 values (next value for deptsequence, 'b부서', 'bbb');

insert into department2 values (next value for deptsequence, 'c부서', 'ccc');

// 이걸 명령어를 통해 부서2에 적용해준다.

// next value for deptsequence 적어주면 알아서 늘어남

 

select * from sys.sequences

where name = 'deptsequence'

// 여기서 curent_value 칼럼으로 현재 시퀀스 값을 알 수 있다.

 

identity는 명령어 없이도 자동으로 늘어나서 훨씬 편한데 

굳이 시퀀스를 쓸 필요가 있을까 싶다..

* 핵심: 시퀀스를 만듦 + insert 칠 때 next value for 시퀀스명 

'MSSQL' 카테고리의 다른 글

sql #7  (0) 2019.12.08
sql #5  (0) 2019.12.08
sql #4  (0) 2019.12.08
sql #3  (0) 2019.12.08
sql #2  (0) 2019.12.08
블로그 이미지

ryancha9

https://blog.naver.com/7246lsy

,