2018년 6월 23일 토요일

오라클 SQL문법

group by 
특정 컬럼을 기준으로 그룹화하는 것
ex)
1
2
3
  SELECT department_id, SUM(salary)
      FROM employees
     GROUP BY department_id
cs
>>department_id을 기준으로 empolyees 테이블에서의 부서id 별 급여 합계 구하기

**select 와 group by에 기준으로 삼고자하는 컬럼넣으면 됨 


having
having절은 group by 절에 다음에 위치하여 group by한  결과를 대상으로 다시 필터를 거는 역할 
ex)
1
2
3
4
5
SELECT dept.deptname, COUNT(emp.empno) "사원수"
  FROM employees emp, department dept
 WHERE emp.deptno = dept.deptno
 GROUP BY dept.deptname
HAVING COUNT(emp.empno) > 5;
cs
>>부서테이블의 부서 이름을 기준으로하여 사원테이블의 사원번호를 카운트하여 
사원수가 5명이 넘는 부서별 사원수 보여주기 


case when ~ then ~ (else ~) 
조건에 따라 여러 경우 중 하나를 선택
case 컬럼 when 조건1 then 값1 when 조건2 then 값2 .... end) 
1
2
3
4
5
6
7
8
SELECT deptno, 
       CASE deptno
         WHEN 10 THEN 'ACCOUNTING'
         WHEN 20 THEN 'RESEARCH'
         WHEN 30 THEN 'SALES'
         ELSE 'OPERATIONS'
       END as "Dept Name"
  FROM dept;
cs
>>dept테이블에서 deptno가 10이면 'ACCOUNTING' , 20이면 'RESEARCH' ,30이면 'SALES' 나머지는 'OPERATIONS' 출력 

**when 뒤에 sal > 100 와 같이 비교하는 연산 넣어도 됨 



decode
값 비교 연산 (오라클에서만 지원하는듯?)
DECODE(비교 값 , 조건1, 조건1일때 값, 조건2, 조건2일때 값, ...)
1
2
3
4
SELECT deptno, DECODE(deptno, 10 , 'ACCOUNTING' ,
                              20 , 'RESEARCH' ,
                              30 , 'SALES''OPERATIONS') name
  FROM dept;
cs
>>dept테이블에서 deptno가 10이면 'ACCOUNTING' , 20이면 'RESEARCH' ,30이면 'SALES' 나머지는 'OPERATIONS' 출력 

**GREATEST, LEAST 함수를 사용해서 비교처리도 가능한듯(제한적??)


바인드 변수      
bind 변수란?
Bind변수는 실행계획이 세워진 후 그 값이 결정되는 변수이며 값이 바뀌더라도 실행계획에는 영향을 주지 않는다. 콜론 :  을 사용

1
SELECT * FROM emp WHERE empno = :var ;
cs
>>쿼리가 실행될 때 마다 원하는 사원번호를 입력해서 emp에서 사원 검색

**효율문제 좀 더 찾아보기 


concat
두 문자열을 결합 할 때 사용하는 함수
|| 연산자와 같은 역할
1
SELECT CONCAT('December 25, ''2008');
cs
>>두 문자열 합치기

 두 문자열의 타입이 동일할 경우에는 문제가 없지만, 두 문자열의 타입이 다를경우에는 데이터 손실이 생길 수 있기때문에 두 문자열 타입 중 문자 결합 후 손실이 없는 쪽으로 리턴됩니다.


substr
원하는 길이 만큰 문자(String)를 자를 때 사용하는 함수
1
SELECT SUBSTR('abcdefg' , 15) res FROM DUAL; 
cs

>>'' 문자를 1번부터 5번까지출력 ==> abcde
>> 숫자가 하나만 있으면 => 숫자 부터 끝까지
>> -숫자 => 뒤에서부터 


WITH 구문
with 구문이란?
서브쿼리 블럭에 이름을 지정할 수있게 해주고, with구문내의 쿼리의 결과가(서브쿼리)가 여러번 사용될 때 유용하다. 오라클 9이상에서 지원한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
WITH AA AS
 (SELECT ROWNUM AS SEQ, 'TEST1' AS NAME, SYSDATE
    FROM DUAL
  UNION ALL
  SELECT ROWNUM AS SEQ, 'TEST2' AS NAME, SYSDATE
    FROM DUAL
  UNION ALL
  SELECT ROWNUM AS SEQ, 'TEST3' AS NAME, SYSDATE FROM DUAL),
 
 BB AS
 (SELECT ROWNUM AS SEQ, 'TEST1' AS NAME, SYSDATE
    FROM DUAL
  UNION ALL
  SELECT ROWNUM AS SEQ, 'TEST2' AS NAME, SYSDATE
    FROM DUAL
  UNION ALL
  SELECT ROWNUM AS SEQ, 'TEST3' AS NAME, SYSDATE FROM DUAL)
  
SELECT * FROM AA, BB WHERE AA.NAME=BB.NAME
 
 
cs
출처:


NVL 함수
NVL(컬럼, 치환할 값) 으로 쓰며 
컬럼값이 null 이면 치환할 값으로 바꾸어주는 함수이다. 

NVL2(컬럼, e1, e2) 
컬럼값이 null 이 아니면 e1 값,  null 이면  e2 값으로 바꿔주는 함수이다. 
1
2
SELECT empno, NVL2(deptid, 10) dept
  FROM emp;
cs
>>테이블에서 deptid가 null값이아니면 1, null이면 0으로 변환




TRUNC 함수
trunc함수는 원하는 소숫점 자리수 만큼만 자를 수 있다.
1
select trunc( 1.234562 ) from dual;
cs
>> 1.23 만 나옴

이를 날짜에도 사용할 수 있다.

댓글 없음:

댓글 쓰기