SET 연산자 (집합연산자) : SELECT문들의 결과를 처리하는 방법으로 합집합, 교집합, 차집합 연산자가 있다.

  • UNION ALL을 제외하고 모두 SORD가 발생하므로, 메모리 소모가 적다.
  • 두 SELECT문은 컬럼의 개수, 위치 유형이 동일해야 한다.
  • 별칭(ALIAS)는 첫번째 SELECT문에 기술하면 된다.
  • 3개 이상의 SELECT문도 사용 가능하다. (위에서 아래로 처리된다.)
  • ORDER BY절은 맨 마지막에 기술한다.
  • SET연산자의 위치는 두 SELECT문 사이에 기술한다.

 

▶ 실습을 위한 테이블 2개를 생성

--EMP01테이블 : 부서번호 10, 30
CREATE TABLE EMP01 :  AS
    SELECT * FROM EMP WHERE DEPTNO IN (10,30);
--EMP02테이블 : 부서번호 30
CREATE TABLE EMP02 AS
    SELECT * FROM EMP WHERE DEPTNO = 30;
COMMIT;

 

1. UNION(합집합)  : SELECT1의 결과를 구하고 SELECT2를 처리해서 두결과를 하나로 합친다. (중복값 제거)
    UNOIN ALL  : UNOIN과 달리 중복값을 제거하지 않고 출력된다.

SELECT EMPNO, JOB, DEPTNO
FROM EMP01
UNION
SELECT EMPNO, JOB, DEPTNO
FROM EMP02;

SELECT EMPNO, JOB, DEPTNO
FROM EMP01
UNION ALL --중복제거 안함
SELECT EMPNO, JOB, DEPTNO
FROM EMP02;

 

2. INTERSECT(교집합)  : SELECT1문을 처리할때, 첫번째 필드를 기준으로 정렬시키면서 결과-레코드 집합을 구하고, 
                                          SELECT2문을 처리하고, 첫번째 필드를 기준으로 정렬시키면서 결과-레코드 집합을 구한후,
                                          두 SELECT문의 정렬된 결과-레코드 집합으로부터 공통된 결과-레코드만 추출하여 표시한다.

SELECT EMPNO, JOB, DEPTNO
FROM EMP01
INTERSECT
SELECT EMPNO, JOB, DEPTNO
FROM EMP02;

 

3. MINUS(차집합)  : SELECT1문의 내용에서 SELECT2문의 내용 중 공통된 부분을 제거한 나머지가 출력된다.

SELECT EMPNO, JOB, DEPTNO
FROM EMP01
MINUS
SELECT EMPNO, JOB, DEPTNO
FROM EMP02;

 

서브쿼리 : 메인 SQL문에 포함되어 있는 또 다른 SQL문을 말한다.

  • 반드시 괄호( )로 감싸서 사용한다.
  • 메인SQL문보다 서브쿼리가 먼저 실행된다.
  • 서브쿼리만 가지고도 실행되어야 한다.
  • 서브쿼리의 결과가 바깥쿼리의 인자(매개변수)로 사용된다.
  • 서브쿼리의 대부분을 조인으로 만들 수 있다.
  • 서브쿼리와 조인(JOIN)문은 병행되어 사용이 가능하다.
  • 서브쿼리 안에서 ORDER BY절은 사용할 수 없다.
  • 서브쿼리는 위치에 따라 명칭이 다르다.
    • FROM절에 사용시 인라인 뷰 (Inline view)
    • SELECT문에 사용시 스칼라 서브쿼리 (Scala Subquery)
    • WHERE절에 사용시 서브쿼리(Subquery) - 일반적

 


 

  • JONES의 부서명을 구해서 JONES와 같은부서의 부서명과 사원명 출력하기
SELECT E.ENAME, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND D.DEPTNO =
    (SELECT DEPTNO FROM EMP WHERE ENAME = 'JONES');

 

  • 10번 부서에서 근무하는 사원의 이름과 부서명을 출력하기
--JOIN 사용
SELECT E.ENAME, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E. DEPTNO = 10;

--서브쿼리 사용
SELECT E.ENAME, D.DNAME
FROM EMP E, (SELECT DEPTNO, DNAME FROM DEPT WHERE DEPTNO = 10) D
WHERE E.DEPTNO = D.DEPTNO;

 

  • 평균보다 더 많은 급여를 받는 사원들을 검색해 출력하기
SELECT EMPNO, ENMAE, SAL
FROM EMP
WHERE SAL > (SELECT AVG(SAL) FROM EMP);

 

  • 'BLAKE'가 속한 부서의 사원 이름과 고용일자 출력하기
SELECT ENAME, HIREDATE
FROM EMP
WHERE DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME = 'BLAKE');

 

  • 급여가 3000 이상인 사원이 소속된 부서의 사원명, 급여, 부서번호 출력하기 (다중행 처리 -리턴값이 여러개 IN연산자 활용)
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO FROM EMP WHERE SAL >= 3000)
ORDER BY DEPTNO;

 

  • 30번 부서원들 중 제일 많이 급여를 받는 사람보다, 더 많이 받는 사람들의 이름과 급여를 출력하기 (ALL)
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO=30);
--컬럼 > (전체만족)ALL : 가장 큰 값보다 큰 값/ 위와 같은 결과
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ALL(SELECT SAL FROM EMP WHERE DEPTNO=30);
--컬럼 < (전체만족)ALL : 가장 작은 값보다 작은 값
SELECT ENAME, SAL
FROM EMP
WHERE SAL < ALL(SELECT SAL FROM EMP WHERE DEPTNO=30);

 

  • 20번 부서원들 중 가장 낮은 급여를 받는 사람보다, 더 많은 급여를 받는 사람의 이름과 급여를 출력 (ANY)
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT MIN(SAL) FROM EMP WHERE DEPTNO=20);
--컬럼 > (부분만족)ANY : 가장 작은 값보다 큰값/ 위와 같은 결과
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ANY(SELECT SAL FROM EMP WHERE DEPTNO=20);
--컬럼 < (부분만족)ANY : 가장 큰 값보다 작은값
SELECT ENAME, SAL
FROM EMP
WHERE SAL < ANY(SELECT SAL FROM EMP WHERE DEPTNO=20);

 

  • 급여가 평균 급여보다 많고, 이름에 S가 들어가는 사원과 동일한 부서에서 근무하는 사원의 사번, 이름, 급여 출력하기

- 이중 서브쿼리

SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO FROM EMP WHERE SAL >
    (SELECT AVG(SAL) FROM EMP) AND ENAME LIKE '%S%');

JOIN(조인) : 조건을 기준으로 테이블들의 각 행들을 합친후, 원하는 데이터 레코드를 가져오는 방법이다.

  • 검색하고 싶은 컬럼이 다른 테이블에 있을 경우 주요 사용하며, 테이블들을 마치 하나의 테이블인 것처럼 활용한다.
  • 보통 기본키(PK) 또는 외래키(FK)로 두 테이블을 연결한다.

 

1. INNER JOIN  : 기준테이블과 조인한 테이블의 중복값을 보여준다. 조건에 맞는 항목만 출력

   (1) EQUI-JOIN : 조건식에 '='을 사용한다. 교집합

--EQUI조인 표현식
SELECT T1.COL1, T1.COL2, T2.COL3, T2.COL4....
FROM TABLE T1, TABLE T2
WHERE T1.PRIMARYKEY = T2.FOREIGNKEY;

--EMP테이블의 사번, 이름, DEPT테이블의 부서명, 부서번호 출력
SELECT EMPNO, ENAME, DNAME, DEPTNO
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

--EMP테이블을 E로, DEPT테이블을 D로 줄여 약칭으로 표기가 가능하다.
SELECT E.EMPNO, E.ENAME, D.DNAME, E.DEPTNO
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
--△똑같음▽ / 아래는 FM표현식
SELECT E.EMPNO, E.ENAME, D.DNAME, D.DEPTNO
FROM EMP E INNER JOIN DEPT D
WHERE (E.DEPTNO = D.DEPTNO);

--부서번호 30인 사원의 사번, 이름, 급여, 부서번호, 부서명을 출력
SELECT E.EMPNO, E.ENAME, D.DNAME, D.DEPTNO
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 30;

 

   (2) NON-EQUI-JOIN : 조건식에 '='연산자 이외의 비교연산자를 사용한다. 조인절이 일치하지 않는 조건을 명시한다.

--EMP테이블의 이름, 급여, SALGRADE테이블의 급여등급을 출력
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, SALGRADE S;

--EMP테이블의 이름, 급여, SALGRADE테이블의 급여등급을 출력
--NON EQUI INNER JOIN
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
--WHERE E.SAL >= S.LOSAL AND E.SAL <= S.HISAL;

 

2. OUTER JOIN  : 조건에 맞지 않은 항목도 출력

   (1) OUTER LEFT JOIN : 왼쪽 테이블을 기준으로 조인해 왼쪽테이블 데이터 + 오른쪽테이블과 중복된 데이터를 출력

--EMP테이블(LEFT TABLE)과 DEPT테이블(RIGHT TABLE)의 OUTER LEFT JOIN
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
ORDER BY DEPTNO;

   (2) OUTER RIGHT JOIN : 오른쪽 테이블을 기준으로 조인해 오른쪽테이블 데이터 + 왼쪽테이블과 중복된 데이터를 출력

--EMP테이블(LEFT TABLE)과 DEPT테이블(RIGHT TABLE)의 OUTER RIGHT JOIN
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO(+)
ORDER BY DEPTNO;

 

3. SELF JOIN  : 자기자신과 조인하여 가지고 있는 데이터를 다양하게 변형시켜 활용할 경우에 자주 사용된다.

                              하나의 테이블을 여러번 복사해서 조인한다고 생각하면 된다.

--"SMITH의 매니저(MGR) 는 FORD입니다." 처럼 출력하기 / SMITH, FORD 둘다 ENAME
SELECT E.ENAME ||'의 매니저는' ||MG.ENAME|| '입니다.' AS RESULT
FROM EMP E, EMP MG
WHERE E.MGR = MG.EMPNO; --MGR코드는 사번, EMPNO 사번

--사원이름, 부서번호, 해당사원과 같은 부서에서 근무하는 사원을 출력
SELECT A.ENAME, A.DEPTNO, B.ENAME, B.DEPTNO
FROM EMP A, EMP B
WHERE A.DEPTNO = B.DEPTNO AND A.ENAME != B.ENAME
ORDER BY A.ENAME;

 

4. 3중 JOIN(MULTIPLE JOIN) : 테이블 여러개를 조인

--사원번호, 이름, 부서번호, 부서명, 급여, 급여등급을 출력
--E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME, E.SAL, S.GRADE
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME, E.SAL, S.GRADE
FROM EMP E, DEPT D, SALGRADE S
WHERE E.DEPTNO = D.DEPTNO 
      AND E.SAL BETWEEN S.LOSAL AND S.HISAL;

 

오라클 데이터베이스는 관계형 데이터베이스(RDBMS : Relation Database Management System)으로 3세대 데이터베이스이다.

RDBMS는 다수의 테이블이 연결되어 있고 각 테이블에는 기본키(PK), 외래키(FK), 슈퍼키(SK) 와 같이 UNIQUE한 KEY를 설정할 수 있다.

키(KEY)는 데이터베이스에서 조건에 만족하는 튜플(행)을 찾거나 정렬할때 서로 구분할 수 있는 기준이 되는 속성(열)이다.

 

1. 기본키 PRIMARY KEY : 테이블을 대표하는 키

  • 다른 항목과 중복되어 나타날 수 없는 Unique속성을 가진다.
  • null 값을 가질 수 없다.
  • 하나의 테이블에서 기본키를 하나만 지정할 수 있다.
  • 관계형 DB에서 이론상 모든 테이블은 반드시 하나의 기본키를 가져야 한다.

 

 

2. 외래키 FOREIGN KEY : 다른 테이블의 PRIMARY KEY

  • 외부 식별자키로 테이블간의 관계를 나타낸다.
  • 한 테이블에서 참조하고 있는 테이블의 기본키를 참조하는 테이블에서 외래키라 부른다.
  • 하나의 테이블이 여러 개의 외래 키를 포함할 수 있다. 이러한 외래 키들은 각각 서로 다른 테이블을 참조할 수 있다.
  • 테이블간의 잘못된 매핑을 방지하는 역할도 한다.
  • FK를 선언한 테이블이 하위 테이블이 되고, 참조하는 테이블은 상위(부모) 테이블이 된다.

 

 

3. 슈퍼키 SUPER KEY : UNIQUE한 성질을 가진 PRIMARY KEY 후보

  • 각 행을 유일하게 식별할 수 있는 속성들의 집합이다.
  • 서로 구분만 할수 있다면 '슈퍼키'라고 할 수 있다.
  • 관계를 구성하는 모든 튜플에 유일성을 보장하지만 최소성은 보장하지 않는다.

 

GROUP BY절

  • 데이터들을 원하는 그룹으로 묶어 그룹함수와 처리할 수 있다. (ex. 부서별 사원수 구하기, 직급별 평균연봉 구하기)
  • GROUP BY절은 반드시 그룹함수와 함께 쓰이며 결과값은 GROUP BY절에 기술된 컬럼항목들의 행의 개수에 의해 결정된다.
  • SELECT절에 명시된 모든 컬럼은 GROUP BY절에서도 명시되어야 한다.
  • 그룹함수의 중첩은 2번까지만 가능하다.

HAVING절

  • GROUP BY에 의해 그룹화된 데이터를 그룹함수를 사용하여 조건비교를 할때 사용한다.
  • WHERE절은 그룹함수를 사용할수 없어 HAVING절에 그룹함수를 포함한 조건을 기술한다.

▶ 기본문법

SELECT 컬럼1, 컬럼2, ..., 컬럼n (와일드문자 * : 전부 선택)

FROM 테이블명

WHERE 조건

[GROUP BY 그룹대상 컬럼]

[HAVING 그룹함수 포함 조건]

[ORDER BY 정렬대상 컬럼 [ASC/DESC]];

 

  • 부서번호가 10, 20 부서에 근무하는 직원의 부서별 평균 급여 구하기 (GROUP BY 사용X)

- UNION  : 각 쿼리의 결과 합을 반환하는 합집합(중복제거)

- UNION ALL : 각 쿼리의 모든 결과를 포함한 합집합(중복허용)

SELECT 10 AS DEPTNO, AVG(SAL) AS 평균급여
FROM EMP
WHERE DEPTNO =10

UNION ALL --두개의 SELECT 문을 처리한 결과를 합쳐서 표현

SELECT 20, AVG(SAL)
FROM EMP
WHERE DEPTNO= 20;
  • 부서번호가 10, 20 부서에 근무하는 직원의 부서별 평균 급여 구하기 (GROUP BY 사용)
SELECT DEPTNO, ROUND(AVG(SAL)) AS 평균급여, COUNT(*)
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO;
  • 'SA'가 포함된 직책에 대해서 부서별 급여의 합계, 평균급여, 근무인원수 구하기
SELECT DEPTNO, SUM(SAL), ROUND(AVG(SAL)), COUNT(*)
FROM EMP
WHERE JOB LIKE '%SA%'
GROUP BY DEPTNO;
  • 부서별 급여의 합계가 7000보다 큰 부서에 대해서만 급여합계, 평균급여, 근무인원수 구하기
SELECT DEPTNO, SUM(SAL), ROUND(AVG(SAL)), COUNT(*)
FROM EMP
GROUP BY DEPTNO
HAVING SUM(SAL) > 7000
ORDER BY DEPTNO;
  • EMP테이블에서 부서별 임금합계중, 가장 큰 부서 구하기
SELECT MAX(SUM(SAL)) AS 총급여가장높은부서
FROM EMP
GROUP BY DEPTNO;

6. 다중행 함수

- COUNT() : 행의 수를 카운트

 

- AVG() : 평균값

 

- SUM() : 컬럼의 합계

 

- MAX() : 최대값

 

- MIN() : 최소값

 

- VARIANCE() : 분산

 

- STDDEV() : 표준편차

5. 일반 함수

- NVL (컬럼명, 대체값) : 컬럼의 데이터가 null이면 대체값을 반환하는 함수

 

- NVL2 (컬럼명, 대체값1, 대체값2) : 컬럼의 데이터가 존재하면 대체값1을, 컬럼이 null이면 대체값2를 반환하는 함수

 

컬럼 데이터의 값이 값n이면 표현식n을 처리하는 함수 (DECODE, CASE)

- DECODE (컬럼명, 값1, 표현식1, 값2, 표현식2, ..., 값n, 표현식n)

 

- CASE 컬럼명 WHEN 값1 THEN 표현식1

                           WHEN 값2 THEN 표현식2

                           ...

                           WHEN 값n THEN 표현식n

                         ELSE 표현식e END

 

- NULLIF (컬럼1, 컬럼2) : 컬럼1와 컬럼2의 값이 다르면 무조건 컬럼1을 표시하고, 두값이 같으면 NULL을 반환하는 함수

 

- COALESE (컬럼값1, 컬럼값2, ..., 컬럼값n) : 함수내에 명시된 컬럼값을 확인해서 최초로 NULL이 아닌 컬럼n의 값을 표시하는 함수

 

4. 데이터 변환 함수 

- TO_DATE ('날짜', '날짜 형식모델', ['NLS_PARAM']) 

  : 날짜처럼 표시된 문자 값에 해당하는 형식 모델을 명시하여 문자값을 날짜데이터 유형으로 반환하는 함수

 

--'01-SEP-95' 날짜와 '1994/01/11'날짜 사이의 달수 구하기
* 날짜-시간 상수를 명시하는 경우 TO_DATE()처리를 해야 세션의 표시형식에 관계없이 정상적인 결과를 얻을수 있다.
TRUNC(MONTHS_BETWEEN(
        TO_DATE('1995/09/01', 'YYYY/MM/DD'),
        TO_DATE('1994/01/11', 'YYYY/MM/DD')),0) 

- TO_CHAR ('날짜 또는 숫자', '날짜 또는 숫자 형식모델', ['NLS_PARAM'])

 

- TO_NUMBER ('숫자문자열', '숫자형식모델') 

  : 명시된 숫자 문자열을 숫자 데이터형으로 변환하는 함수

 

--'$12,000'문자열 값에 0.1을 곱한 값 구하기

TO_NUMBER('$12,000', '$999,999') * 0.1 

날짜 포멧

  • YYYY : 4자리 숫자 연도
  • YY : 2자리 연도
  • RR : 2자리 연도(1950~1999사이의 데이터를 처리할때 사용)
  • YEAR : 영어로 표시한 연도
  • MM : 숫자로 된 월
  • MONTH : 달 이름(영어 : JUNE, 한국어 : 6월)
  • MON : 3자리 약어(영어 : JUN, 한국어 : 6월)
  • DD : 숫자로 된 달의 일
  • DAY : 요일(영어 : MONDAY, 한국어 : 월요일)
  • DY : 3자리 약어(영어 : MON, 한국어 : 월)
  • HH24 : 숫자로 된 시간(24시간 표기법)
  • HH, HH12 : 숫자로 된 시간(12시간 표기법)
  • MI : 숫자로 된 분
  • SS : 숫자로 된 초
  • AM : 오전/오후(영어 : AM/PM, 한국어 : 오전/오후)

--첫번째 글자가 소문자 : 전체가 소문자로 출력됨
--첫번째 글자가 대문자, 두번째 글자도 대문자 : 전부 대문자 출력
--첫번째 글자가 대문자, 두번째 글자는 소문자 : 첫글자만 대문자, 나머지 소문자 출력

 

--TO_CHAR('날짜 또는 숫자형식', '날짜 또는 숫자형식 모델', ['NLS_PARAM'])
 : SYSDATE 함수 처리 결과를 세션의 표시 형식이 아닌 사용자가 원하는 형식으로 표시


--숫자로 표시되는 년, 월, 일, 시간, 분, 초에서 한자리만 사용하고 남은 자리는 0으로 채운다.(예 2021/06/08...)
--fm을 명시하면 0으로 채우지 않는다.
TO_CHAR(SYSDATE, 'fmYYYY-MM-DD fmHH:MI:fmSS')

--SP옵션(숫자를 영문으로 표시), TH옵션(숫자를 영어의 TH 형태)
TO_CHAR(SYSDATE, 'yYyySP-Mmspth-DDspth')

3. 날짜 함수 

- SYSDATE : 오라클 서버가 운영되는 OS의 날짜와 시간을 DATE타입으로 반환하는 함수

 

- MONTHS_BETWEEN ('날짜1', '날짜2') : 두 날짜 사이의 달 수 계산하여 반환하는 함수

 

- NEXT_DAY ('날짜', '요일') : 날짜기준으로 다음에 오는 요일의 날짜를 반환하는 함수

 

- ADD_MONTHS ('날짜', '숫자') : 주어진 날짜에 숫자만큼 달수를 더한 날짜를 반환하는 함수

 

- LAST_DAY ('날짜') : 날짜가 포함된 달의 맨 마지막 날짜를 반환하는 함수

 

- 날짜 ROUND () 반올림, TRUNC () 버림

2. 숫자 함수 

- MOD (숫자1, 숫자2) : 숫자1을 숫자2로 나누고 남은 나머지를 반환하는 함수

  • MOD(10, 3) → 1

- ROUND (숫자, [자리수]) : 특정 자리수를 반올림하는 함수

  • ROUND(1745.9260, 1)
  • ROUND(1745.9260, 0) --소수점 첫자리 반올림
  • ROUND(1745.9260) --소수점 없음
  • ROUND(1745.9260,-1) --1의 자리 반올림
  • ROUND(1745.9260,-4) --1000의 자리

- TRUNC (숫자, [자리수]) : 특정 자리수를 절삭하는 함수

  • TRUNC(1745.9260, 4) --소수점 4자리 무조건 절삭(버림)
  • TRUNC(1745.9260, 2) --소수점 2자리 무조건 절삭(버림)
  • TRUNC(1745.9260, 0) --소수점 없음
  • TRUNC(1745.9260) --소수점 없음.
  • TRUNC(1745.9260, -3)

- CEIL (숫자N) : N보다 큰 가장 작은 정수를 구하는 함수, 음수는 절대값이 작을수록 작은수를 반환

  • CEIL(23.223) → 
  • CEIL(-45.923) → 

- FLOOR (숫자N) : N보다 작은 가장 큰 정수를 구하는 함수

  • FLOOR(23.223) → 
  • FLOOR(-45.923) → 

- POWER (숫자M, 숫자N) : M의 N제곱을 구하는 함수

  • POWER(3, 3) → 27

- SQRT (숫자N) : N의 제곱근(루트)을 구하는 함수

  • SQRT(9) → 3

- ABS (숫자N) : N의 절대값을 구하는 함수

  • ABS(3) → 3
  • ABS(-3) → 3

- SIGN (숫자N) : N이 음수면 -1, 양수면 1, 0이면 0을 반환하는 함수

  • SIGN(3) → 1
  • SIGN(-3) → -1
  • SIGN(0) → 0

 

숫자 형식 표현

  • 9(또는 0) 자리수 : 999,999 숫자를 최대 만 단위 까지 표현
  • 0 자리수 : 099.999 사용되지 않는 자리를 0으로 채워라.
  • $ 달러 : $99,999 숫자앞에 $표시
  • L 지역화폐 : L99,999 해당 지역 통화단위를 앞에 표시 (LOCAL)
  • . 소수점 : 999.99 소수점을 의미 (우리나라는 사용X)
  • , 천단위 구분자 : 99,999 숫자에 천 단위 구분자 표시

SQL 함수는 크게 단일행 함수와 다중행 함수로 나뉘어 진다.

- 단일행 함수 : 입력값이 단일행이며 결과값 하나를 반환한다.

- 다중행 함수 : 입력값이 다중행이며 결과값 하나를 반환한다.

 

1. 문자 함수 

- UPPER ('문자열') : 문자열을 대문자로 반환하는 함수

  • UPPER('abcd') → ABCD

- LOWER ('문자열') : 문자열을 소문자로 반환하는 함수

  • LOWER('ABCD') → abcd

- INITCAP ('문자열') : 문자열의 첫글자는 대문자로, 나머지는 소문자로 반환하는 함수

  • INITCAP('aBCD') → Abcd

- CONCAT ('문자열', '문자열') : 두 문자열을 붙여서 반환하는 함수

  •  CONCAT('HELLO', ' WORLD') → HELLO WORLD

- SUBSTR ('문자열', 시작위치, [추출할 문자 수]) : 데이터로부터 원하는 문자열을 추출하는 함수

  • SUBSTR('20080815', 1, 4) --1번째부터 4글자
  • SUBSTR('20080815', 6) --6번째부터 마지막글자까지
  • SUBSTR('20080815', -3) -- 뒤에서부터 2자리

- INSTR ('문자열', '찾을문자(열)', [검색 시작 자리수, 존재회수]) : 찾을 문자(열)이 시작된 자리수를 반환하는 함수, 없으면 0을 반환

  • INSTR('HELLO WORLD', 'L') → 3
  • INSTR('HELLO WORLD', 'L', 5, 1) → 10
  • INSTR('HELLO WORLD', 'Y') → 0

- LENGTH ('문자열') : 문자열의 길이를 글자수로 반환하는 함수

  • LENGTH('홍길동') → 3

- LENGTHB ('문자열') : 문자열의 길이를 바이트수로 반환하는 함수

  • LENGTHB('홍길동') → 6

- REPLACE ('문자열', '찾을문자', '대체문자') : 문자열에서  문자(열)을 찾아서 문자(열)로 교체하는 함수

  • REPLACE('JACK AND JUE', 'J', 'BL') → BLACK AND BLUE

- TRIM ('문자' FROM '문자열') : 문자열의 좌우 공백 또는 좌우 연속되는 문자를 제거하는 함수

  • TRIM('   SSMISTHSS   ') → 'SSMISTHSS' : 좌우 공백 제거
  • TRIM(BOTH FROM '   SSMISTHSS   ') → 'SSMISTHSS' : 좌우 공백 제거 / 위와 같음
  • LTRIM('   SSMISTHSS   ') → 'SSMISTHSS   ' : 좌측 공백 제거
  • RTRIM('   SSMISTHSS   ') → '   SSMISTHSS' : 우측 공백 제거
  • TRIM('S' FROM 'SSMISTHSS') → MISTH (양끝 'S' 삭제)
  • TRIM(BOTH 'S' FROM 'SSMISTHSS') → MISTH (양끝 'S' 삭제 / 위와 같음)
  • TRIM(LEADING 'S' FROM 'SSMISTHSS') → MISTHSS (좌측 'S' 삭제)
  • TRIM(TRAILING 'S' FROM 'SSMISTHSS') → SSMISTH (우측 'S' 삭제)

- LPAD ('문자열', 총 문자 길이, '채울 문자') : 지정한 길이만큼 왼쪽부터 특정문자로 채워주는 함수

- RPAD ('문자열', 총 문자 길이, '채울 문자') : 지정한 길이만큼 오른쪽부터 특정문자로 채워주는 함수

  • LPAD('SMITH', 10, '*') → *****SMITH
  • RPAD(DEPTNO, 5, ' ') → '   30' 

ORDER BY절 : SELECT문의 제일 마지막에 기술되며, 결과 레코드를 정렬해서 표시하고자 할 때 사용한다.

 

▶ 기본문법

SELECT 컬럼1, 컬럼2, ..., 컬럼n (와일드문자 * : 전부 선택)

FROM 테이블명

WHERE 조건

[ORDER BY 정렬대상 컬럼 [ASC/DESC]];

 

- 오름차순 ASC(default값, 생략가능) : 작은거 → 큰거

- 내림차순 DESC : 큰거 → 작은거

 

  • EMP테이블에서 부서번호로 정렬하기
SELECT *
FROM EMP
ORDER BY DEPTNO;
  • EMP 테이블에서 부서번호 30번인 사원을 연봉순으로 내림차순 정렬하기(alias) 
SELECT EMPNO, ENAME, SAL*12 + NVL(COMM,0) 연봉, DEPTNO
FROM EMP
WHERE DEPTNO = 30
ORDER BY 연봉 DESC;
  • 2번째 컬럼으로 정렬하기 (숫자로 정렬, 컬럼의 위치기준)
SELECT EMPNO, DEPTNO
FROM EMP
ORDER BY 2;
  • NULL값이 있는 컬럼의 정렬
SELECT EMPNO, ENAME, COMM, DEPTNO
FROM EMP
ORDER BY 3 ASC NULLS FIRST; --NULL값을 먼저 출력

SELECT EMPNO, ENAME, COMM, DEPTNO
FROM EMP
ORDER BY 3 ASC NULLS LAST; --NULL값을 마지막에 출력

 

+ Recent posts