* 집계함수
개수 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 시퀀스명