[4] 형변환 함수
▷ to_date
- 문자를 날짜로 변환
- 날짜사이의 간격을 구할때 '문자 - 날짜' 가 불가하니, 문자를 날짜로 형변환 한 후 계산해주어야한다
- 내가 정한 형식대로 문자 -> 날짜로 형변환하여 출력한다. 27일차 강의에도 설명있음.
to_date(문자, 패턴)
select '2022-05-07', to_date('2022-05-07') from dual;
★ ex ) 특정 컬럼에서 특정 날짜사이의 데이터를 조회하고싶다 !
select * from pd
where regdate>='2022-03-13' and regdate< to_date('2022-03-16')+1
order by regdate desc;
= 2022.3.13 보다 크고, 2022-03-16 보다 작은 ( = 해당 날짜 사이의 ) regdate 데이터를 출력해라
Q. to_date 로 형변환 한 후 +1 , < 로 변경했는데 그 이유는 ?
A. to_date('2022-03-16') 는
2022-03-16 00:00:00 기준이므로 3/16 날짜의 데이터가 조회되지 않음
응용 : 등록한지 몇시간이 지났는지 조회
select no, pdname, regdate,
sysdate-regdate"경과된 일수",(sysdate - regdate)*24"경과된 시간"
from pd;
▷ to_number()
- 문자를 숫자로 변환
to_number(문자)
select to_number('10') from dual;
[5] 일반 함수
▷ ★nvl(컬럼, 치환할 값)
- 해당 컬럼이 null이면 치환할 값으로 바꾸는 함수
- null + null = null ( 널끼리 연산하면 결과도 널인데 ) nvl 을 사용 => null 값을 치환해서 계산이 될 수 있게 만듦
elect nvl(bonus,0) from dual;
select nvl(pay*12+bonus,pay*12) from professor;
= > bonus 가 null 이면 0 으로 치환하여 출력
= > pay*12+bonus 가 0 이면 pay*12 로 출력 // null값이 있으면 전자로, 없으면 후자로 출력됨
▷ nvl2(col1, col2, col3)
- col1 is null ( 아니면 col2를 or 맞으면 col3를 출력 )
nvl2(bonus,bonus,0)
=> bonus 값이 정상일때는 bonus값, null 이면 0
▷ decode()
if문을 대신하는 함수
- A가 B와 같으면 참을 처리하고, 그렇지 않으면 거짓을 처리한다.
같다비교 ( 범위값비교 불가 )
decode(A, B, 참, 거짓)
select name decode(grade,1,'1학년',
2, '2학년',
3, '3학년', //else if
'4학년') //else
from student;
▷ case 함수
if문을 대신하는 함수
같다비교는 물론 , 조건이 범위값을 가질때도 사용 가능
[1] 동일값 비교시 (=로 비교되는 경우)
case 조건 when 결과1 then 출력1
when 결과2 then 출력2
else 출력3
end "별칭"
[2] 범위값 비교시
case when 조건1 then 출력1
when 조건2 then 출력2
else 출력3
end "별칭"
select name, pay,
case when pay> 400 then '400초과'
when pay between 300 and 400 then '300~400사이'
when pay< 300 then '300미만'
end 급여범위
from professor;
※ 복수행 함수(그룹함수)
- 집계함수 = 복수함수 = 그룹함수
- 그룹함수는 그룹함수끼리만 사용해야한다.
▷ count()
- 입력되는 데이터의 건수를 리턴하는 함수
- 대부분의 그룹함수는 null을 제외하고 계산함
count(*) : null 포함. 그냥 select * 사용하면 null을 뺀 컬럼의 개수임
▷ sum()
- 합계 구하는 함수
- 문자, 날짜 사용불가 (연산이 불가하기 때문)
▷ avg(nvl())
- 평균을 구하는 함수
★ 반드시 평균은 nvl 을 사용해서 계산해야함
why ? 그룹함수는 null을 제외하고 연산하므로 avg()는 정상적인 결과값이 나오지 않음
=> nvl() 함수를 이용하여 처리해야 함
=> avg(nvl(컬럼, 0))
select avg(nvl(pay,0)) from professor;
▷ max() - 최대값을 구하는 함수
▷ min() - 최소값을 구하는 함수
- 대소비교는 연산이 아니므로 문자,날짜형도 위 함수사용이 가능하다
위 함수들에 distinct 를 붙이면 [ 중복값을 제외한 00 값 ]이 된다
count(distinct 컬럼명) - 중복값을 제외한 건수
sum(distinct 컬럼명) - 중복값을 제외한 합계
avg(distinct 컬럼명) - 중복값을 제외한 평균
min(distinct 컬럼명) - 중복값을 제외한 최소값
max(distinct 컬럼명) - 중복값을 제외한 최대값
▶ group by
- 컬럼별로 묶어서~해라 라는 의미 ex ) 학과별로 교수들의 평균 급여를 출력하시오.
- 테이블 전체에 대한 집계를 구하는 것이 아니라, 특정 범위에서의 집계 데이터를 구함
- group by는 별칭 불가 !!!! ( order by는 별칭 가능 )
- 본디 복수행함수에서 select 절에는 컬럼이 올 수 없으나, ( 그룹함수만가능 )
[group by절에 있는컬럼] 은 select절에 올 수 있다.
- where 절에는 group 함수가 올 수 없다 따라서 having 절을 사용함
- group by 에서 조건을 주려면 where having 을 사용하면 됨 !
ex ) 부서별 평균급여를 구한 후, 평균 급여가 450 초과인 부서의 부서번호와 평균 급여를 구하시오.
select deptno, avg(nvl(pay,0))
from professor
group by deptno
having avg(nvl(pay,0))>450;
having 과 where 을 같이 사용할수도있음
select grade, avg(nvl(height,0))
from student
where weight >= 55
group by grade
having avg(nvl(height,0))>=177;
= > 몸무게가 55이상인 학생들에 대해서 where 학년별 키의 평균 구하고
그 결과에서 키의 평균이 177 이상인 경우 구하기 having
▶ having
- group by의 결과내에서 특정 조건을 만족하는 것을 구하려면 having을 이용한다
- group by절에 의해 출력된 결과에 대한 조건을 정의한다.
- group by된 결과를 제한하고자할 때 사용
group by 컬럼
having 조건
'SQL' 카테고리의 다른 글
[ORACLE] scalar subquery / inline view (0) | 2022.03.23 |
---|---|
[ORACLE] SUBQUERY/ 단일행 , 다중행, 상호연관 서브쿼리 / exists 연산자 (0) | 2022.03.23 |
[ORACLE] roll up / cube / grouping / join (0) | 2022.03.22 |
[ORACLE] 집합연산자 / 단일행함수 / 문자함수 / 숫자 함수 / 날짜 함수 / 형변환 함수 (0) | 2022.03.19 |
[ORACLE] 데이터베이스의 구조 / SQL / 데이터 조회 명령어 (0) | 2022.03.16 |