영보의 SystemOut.log

[Oracle] Sub Query(서브쿼리) 종류와 예제(2) 본문

Database/Oracle

[Oracle] Sub Query(서브쿼리) 종류와 예제(2)

영보로그 2020. 11. 10. 13:57
반응형

 개념 정리

 

# 다중행 서브쿼리

    : 데이터가 여러개인 경우 → 다중행 서브쿼리

     - 데이터 전체를 처리 : IN

     - 최대값 : ALL, MAX

     - 최소값 : ANY, MIN(), SOME()

이름
설명

예제

>ANY()  수행된 결과중에 최소값 = MIN 값


  >ANY(SELECT deptno FROM dept) ANY(10,20,30,40,50) => 10

                   (SELECT MIN(deptno)_FROM dept)

                   (SELECT MAX(deptno)_FROM dept)

<ANY()
수행된 결과중에 최대값 = MAX 값

  <ANY(SELECT deptno FROM dept) ANY(10,20,30,40,50) => 50

>ALL()
수행된 결과중에 최대값

  <ANY(SELECT deptno FROM dept) ANY(10,20,30,40,50) => 50
<ALL()
수행된 결과중에 최소값

  >ANY(SELECT deptno FROM dept) ANY(10,20,30,40,50) => 10

 

 

 

#변수 선언

이름
설명

예제
스칼라변수

  - 일반 변수
   : NUMBER, VARCHAR2, CLOB, DATE 

  id VARCHAR2(10)  
%TYPE    - 원형 ( 다른 테이블의 원형)
  emp.ename%TYPE
   → ename이 가지고 있는 데이터형을 가지고 온다

 %ROWTYPE   - 하나 이상의 데이터값을 갖는 데이터 타입
  - 배열과 비슷한 역할을 하고 재사용이 가능

  emp%ROWTYPE  
   → emp테이블이 가지고 있는 모든 컬럼의 데이터형을 읽어 온다.

RECODE 
  - JOIN, SUBQUERY 
  - 여러개의 테이블의 컬럼을 받아서 처리 
  - 1ROW만 처리

 
CURSOR
  - ArrayList 
  - 여러개의 ROW 처리가 가능하다

 

 

 

# 출력 함수

 - DBMS_OUTPUT.PUTDBMS_OUTPUT.PUT_LINE()  ==  System.out.println()

 - DBMS_OUTPUT.PUT()  ==  System.out.print()

 

 

 

 

 예제

 

#스칼라 변수 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SET serveroutput on;
DECLARE 
    vempno NUMBER(4);
    vename VARCHAR2(20);
    vjob VARCHAR2(20);
    vhiredate DATE;
    vsal NUMBER(7,2);
BEGIN
    SELECT empno,ename,job,hiredate,sal INTO vempno,vename,vjob,vhiredate,vsal
    FROM emp
    WHERE empno=7788;
    --출력
    DBMS_OUTPUT.PUT_LINE('=====결과=====');
    DBMS_OUTPUT.PUT_LINE('사번'||vempno);
    DBMS_OUTPUT.PUT_LINE('이름'||vename);
    DBMS_OUTPUT.PUT_LINE('직위'||vjob);
    DBMS_OUTPUT.PUT_LINE('입사일'||vhiredate);
    DBMS_OUTPUT.PUT_LINE('급여'||vsal);
END;
cs

 

 

# %TYPE  예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DECLARE 
    vempno emp.empno%TYPE;
    vename emp.ename%TYPE;
    vjob emp.job%TYPE;
    vhiredate emp.hiredate%TYPE;
    vsal emp.sal%TYPE;
BEGIN
    SELECT empno,ename,job,hiredate,sal INTO vempno,vename,vjob,vhiredate,vsal
    FROM emp
    WHERE empno=7788;
    --출력
    DBMS_OUTPUT.PUT_LINE('=====결과=====');
    DBMS_OUTPUT.PUT_LINE('사번'||vempno);
    DBMS_OUTPUT.PUT_LINE('이름'||vename);
    DBMS_OUTPUT.PUT_LINE('직위'||vjob);
    DBMS_OUTPUT.PUT_LINE('입사일'||vhiredate);
    DBMS_OUTPUT.PUT_LINE('급여'||vsal);
END;
cs

 

 

 

# %ROWTYPE 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DECLARE 
    vemp emp%ROWTYPE;
BEGIN
    SELECT * INTO vemp
    FROM emp
    WHERE empno=7788;
    --출력
    DBMS_OUTPUT.PUT_LINE('=====결과=====');
    DBMS_OUTPUT.PUT_LINE('사번'||vemp.empno);
    DBMS_OUTPUT.PUT_LINE('이름'||vemp.ename);
    DBMS_OUTPUT.PUT_LINE('직위'||vemp.job);
    DBMS_OUTPUT.PUT_LINE('입사일'||vemp.hiredate);
    DBMS_OUTPUT.PUT_LINE('급여'||vemp.sal);
END;
cs

- %ROWTYPE 은 DESC emp; 를 수행했을 때 안의 값이 다 들어가있는게 %ROWTYPE의 특징이다.

 

 

# RECORD 예제 : 사용자 정의

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DECLARE
 TYPE empdept IS RECORD(
    empno emp.empno%TYPE,
    ename emp.ename%TYPE,
    dname dept.dname%TYPE,
    loc dept.loc%TYPE
 );
  ed empdept;
 BEGIN
    SELECT empno,ename,dname,loc INTO ed
    FROM emp, dept
    WHERE emp.deptno=dept.deptno
    AND empno=7788;
    DBMS_OUTPUT.PUT_LINE('====결과====');
    DBMS_OUTPUT.PUT_LINE('사번:'||ed.empno);
    DBMS_OUTPUT.PUT_LINE('이름:'||ed.ename);
    DBMS_OUTPUT.PUT_LINE('부서명:'||ed.dname);
    DBMS_OUTPUT.PUT_LINE('근무지:'||ed.loc);
 END;
cs
반응형