본문 바로가기
IT창고

SQL 정리 Part1.

by 창구창고 2009. 2. 26.

📑 목차

    반응형

    *Insert******************************************************************************

    insert into dept (deptno, dname, loc)

    values(50, 'SYSTEM', 'SEOUL')

     

    insert into dept (deptno, dname, loc)

    values(60, 'SYSTEM2', null) => 빼도 상관 없음 NULL 로 채워 진다.

     

    insert into dept

    values(80, 'SYSTEM2', null)

     

    alter table mydb

    add USER_RE varchar2(10)

     

    /***********************************************************************************

     

    1.

    select owner, table_name, tablespace_name

    from user_tables;

     

    2.

    select owner, table_name, tablespace_name

    from all_tables;

     

     

    3.

    select owner, table_name, tablespace_name

    from dba_tables;

     

    // dba view는 dba권한을 가지고 있는, 스키마에서만 보는것이 가능하다.

     

    ================================================================

     

    //테이블당 제약조건등을 뽑아내보자!

     

    select constraint_name, constraint_type, table_name, r_constraint_name

    from user_Constraints

    where table_name in ('EMP', 'DEPT')

     

    // 이건....뭐더라?

     

    select c1.constraint_name, c1.constraint_type, c1.table_name, c1.r_constraint_name, c2.column_name

    from user_Constraints c1, user_Cons_columns c2

    where c1.table_name in('EMP', 'DEPT') and c1.constrain_name = c2.constrain_name

     

    ================================================================

     

     

    1.

    insert into dept(deptno, dname, loc)  <-- 테이블 명과 컬럼순서

    values(50, 'SYSTEM', 'SEOUL')         <-- 컬럼순서에 맞춘 데이터내용

     

    // 기본형

     

    2.

    insert into dept(deptno, dname, loc)

    values(50, 'SYSTEM', null)            <-- 마지막 컬럼에 데이터를 넣지 않을 경우

     

    ↓↓↓↓ 아래것도 똑같다. ↓↓↓↓

     

    insert into dept(deptno, dname)              <-- 데이터를 넣지 않을 컬럼명을 생략

    values(50, 'SYSTEM')

     

     

    3.

    insert into dept                        <-- 테이블의 컬럼의 기본순서대로 넣을땐, 컬럼순서 생략가능

    values(50, 'SYSTEM', 'SEOUL')

     

     

    4.

    insert into emp10

    select empno, ename, job, sal, deptno

    from emp

    where deptno = 10

     

     

    ================================================================

     

     

    1.

    update dept

    set loc = 'DAEGU', dname = 'BIT

    where deptno = 90

     

     

    2.

    update emp

    set sal = sal*0.8

    where ename = 'KING'

     

     

    3.

    update emp

    set sal = sal*1.2

    where sal = (select max(sal) from emp)     <-- 서브쿼리도 사용 가능

     

     

    4.

    update (select * from emp)

    set sal = (select avg(sal) from emp)

    where sal = (select max(sal) from emp)

     

    // 이런것도 가능 >_<

     

     

    =================================================================

     

    //MERGE는 A<=B... 한쪽에서 흡수하는 느낌?

     

    =================================================================

     

     

    1.

    delete from dept

     

     

    2.

    delete from dept

    where dept = 90

     

    3.

    delete from (select * from dept)

    where dname in (select max(dname) from dept)

     

    =================================================================

     

    /*Oracle Main DB Objects***************************************************************

    VIEW :: Logical Table :: Table 처럼 사용한다. :: Base Table 은 중요해서 보여지지 않고.. VIEW 사용

    => 보안의 목적으로 사용, 간단하게 사용

    /-사용예-----------------------------------------------------------------------------------------------

    1. 간단하게 사용

    create view v_emp_info

    as

    select e.empno, e.ename, e.sal, e.deptno, d.dname

    from emp e, dept d

    where e.deptno = d.deptno

     

    select * from v_emp_infor;

     

    자주 실행되는 쿼리 => View로 만들어 놓는다. => View에서 나오는 Data 는 최신의 Data 이다.

     

     

    2. 보안의 목적으로 사용

    create view v_emp10

    as

    select *

    from emp

    where deptno = 10

    /------------------------------------------------------------------------------------------------------

    or REPLACE :: 기존에 있던 View 에 내용 덮어 쓰기

    FORCE | NO FORCE :: Base Table 이 없어도 View 를 만드는 옵션 NO FORCE 가 기본예

    aliase :: View Table 의 column 이름을 재정의 해준다.

    /---사용예---------------------------------------------------------------------

    create or replace view v_emp10(eno, ename, newsal, job,deptno)

    as

    select empno, ename, sal*12, job, deptno

    from emp

    where deptno = 10

     

    View에서 DML 은 가능 하다.

    Simple View에서 DML 은 가능 하지만 Complex View 는 DML 이 가능하지 않다.(부분적으로 가능)

    /----사용예------------------------------------

    => DML 이 가능한 Column 을 보여주는 쿼리

    select column_name, updatable, insertable, deletable

    from user_updatable_columns

    where lower(table_name) = 'v_emp_info'

    /----------------------------------------------

    select *

    from(select * from emp) -> inline View 라 한다. 재사용 하지 않는다.

     

    with read only => View에서 읽기만 가능하도록 설정한다.

    with check option => where 절에 벗어나는 범위의 작업을 하지 못하게 한다.

    drop View => View Table 삭제 (Data는 삭제 되지 않는다.)

     

    INDEX :: 훨씬 적은 횟수의 비교로 정확한 자리를 찾기 때문에 index 를 사용한다. (트리구조)

            : 별도의 저장공간을 차지해서 저장 된다.

            : 인덱스를 지워도 테이블 data 가 변환되지 않지만 table 을 지웠을때 index 는 변한다.

            : table data 와 index 를 같이 변환해야 하기 때문에 DML 작업속도는 저하 된다.

            : 값을 쌍으로도 만들 수 있다. (Single Column) <=> (Composite)

            : 인덱스에서 중복값을 받아 들일 지 설정. ( Unique Index) <-> NonUnique Index

            : Index 값을 만들때 함수와 같이 만들거나, 컬럼을 같이 만든다.

            :   - 비교가 자주 이루어지는 방법으로 Index 를 만든다. Column data <=> Function-Based

            : Primary Key 를만들면 Index 가 자동생성 ( Automatic created)

            : 사용자가 Index를 만듦 (User Create)

     

    /---사용예------------------------------------------------------------------------------------------

    create [unique] index ndx_emp_ename  // emp table 에 ename 을 index로 만들어 준다.

    on emp (ename)

    /----------------------------------------------------------------------------------------------------

    /-Index 가 생성되어있는지 확인 하는 쿼리-------------------------------------

    select index_name, table_name

    from user_indexes

    where table_name = 'EMP'

    /--------------------------------------------------------------------------------

    Index 삭제

            = drop index index_name;

     

    USER_INDEXES

    USER_IND_COLUMNS :: INDEX 가 어느 COLUMN 에 걸려 있는지 알고 싶을 때 사용

     

    INDEX 를 모든 COLUMN 에 만드는 것은 좋지 않고 where 절에 자주 나오는 COLUMN 에 대해서 INDEX를 만드는 것이 좋다. 또 넓은 범위에 대해 조건을 찾는 쿼리에는 INDEX 를 만드는 것은 좋지 않다. 반대로 적은 범위에, 한행을 찾아 오는 쿼리는 INDEX 를 만드는 것이 좋다.

     

    BIG MAP INDEX :: 성별 같은 범위가 크지만 자주 쓰이는 쿼리에 만드는 INDEX

     

     

    SEQUENCE :: 어떤 고유한 NUMBER 을 넘겨주는 객체

            : 한번 만들어 주면 규칙에 맞게 값을 증가 한다.

    /----------사용예----------------------------------------------------------------

    create sequence ord_no_seq

            start with 10// sequence 를 통해 나오는 첫 번째 숫자가 뭐가 될지 결정 default 1

            increment by 2 // 숫자를 하나 더 줄때 얼마나 더해서 줄까 결정

            maxvalue      // 얼마 까지 증가 하는지 결정

            minvalue      // 얼마 까지 줄어 들지 결정

            cycle          // 상한선 까지 갔을 때 그 다음 사이클을 결정할

            cache          // 미리 계산해서 cache 에 저장해 놓는다.

     

    select ord_no_seq.nextval (증가되는 숫자가 나오는 스톡홀럼)

    from dual

     

    select ord_no_seq.currval (증가되는 숫자가 나온 마지막이 나오는 스톡홀럼)

    from dual

     

    insert into order(ordeno, ........)

    values(ord_no_seq.nextval, .....)

    /---------------------------------------------------------------------------------

     

    SYNONYM :: 객체에 별명을 붙여 주는데 객체처럼 저장 시켜 준다.

    /--------사용예------------------------------------------------------------

    create [public] synonym employee for emp;

     - public 는 전체 사용자가 이름을 쓸 수 있게 해준다.

     - Coding 의 편의 를 위해서 많이 사용한다.

    /***********************************************************************************

     

     

    /*Data Control************************************************************************

    Database User

    cretate user bit identified by bitbit

     

    grant 권한이름 to 사용자

    grant create sseion to bit => system 이 줄 수 있음

    alter user bit identified by bit12; // 암호 변경

     

    System Privileges :: 이미 만들어진 객체와 연결된 권한 : 객체권한

                       :: 객체와 관계 되지 않는 권한 : system 권한

            - CREATE SESSION   // system 권한

            - CREATE TABLE      // system 권한

            - SELECT ANY TABLE  // system 권한

            - EXECUTE ANY PROCEDURE

            - DROP ANY TABLE

     

    /--------사용예-------------------------------------

    grant create session, select any table, crate table

    to bit, …

     

    부여했던 권한 제거

    revoke create session from bit;

    ----------------------------------------------------

     

    Object Privileges

    grant select ON emp to bit

     

    grant all on emp to bit

    rovoke all on emp from bit

     

    Role :: 권한의 묶음.

            -사용자를 그룹으로 묶어서 관리 한다.

             

    select * from user_role_privs // 사용자가 가지고 있는 권한 보기

     

    /*********************************************************************************** 


    *정리 #1 **************************************************************************

    select empno, ename

    from emp

    where deptno = 10

    order by => 순서만 다시 지정

    /**********************************************************************************

     

    /*스키마 안에 있는 테이블이 뭐가 있는지 찾는 방법********************************************

    select *

    from tab => (tap) 테이블 구조 목록을 가지고 옮(sys 의 정보)

    oracle 모든 구조적 정보를 가지고 있는 계정 sys

    /**********************************************************************************

     

    /* Functions (단위 프로그램) = 빠르고 편리하게 사용******************************************

    built-in functions - oracle 에서 미리 정의한 함수

            - 실행방식에 따라 분류

            + single-row functions - 한 행당 한번씩 실행되는 함수

                    - 파라미터에 따라서 분류(데이터 타입, 리턴 타입)

                    - number functions

                    - character functions

                    - date functions

                    - conversion functions - 데이터 변환 함수 ( num -> char , char -> num)

                    - etc functions

     

            - group functions - 한 그룹당 한번이 적용 되는 함수(한 그룹은 여러개의 행으로 구성) - 통계정보

     

    user-defined function

    /**********************************************************************************

     

    /* Data Type 사용 예******************************************************************

    SQL> desc emp;

     이름                널?          유형

     ------------------- ------------ ------------

     EMPNO           NOT NULL  NUMBER(4)

     ENAME                        VARCHAR2(10)

     JOB                           VARCHAR2(9)

     MGR                          NUMBER(4)

     HIREDATE                    DATE

     SAL                           NUMBER(7,2)

     COMM                        NUMBER(7,2) =>99999.99

     DEPTNO                      NUMBER(2)

    /**********************************************************************************

     

    /char 와 varchar2의 차이***************************************************************

    char(8) => 고정 길이 자릿수 (fixed length character)

     'aaa' => 파일에 적을 때 Space 로 채워서 최대 자릿수 까지 data file 에 저장

     

    varchar2(8) 변형 길이 자릿수(variable length)

     'aaa' => 파일에 적을 때에도 자릿수 만큼만 저장공간을 사용해여 저장

     >> varchar2 가 문제를 일으킬 수 있는 환경

         data 를 수정 할 때 저장공간에 있는 data 보다 큰값이 수정 되는 경우 다른 공간에 기록 되는 데 다른

        블록에 저장 해야 하는 경우 select 시 수정되기 전에 있는 블록의 data 를 찾아 가서 수정 값이 저장 되어

        있는 블록으로 이동 한다.

    /**********************************************************************************

     

     

    /*날짜와 관계된 데이터 타입*************************************************************

      1  select hiredate

      2* from emp

      3  /

     

    HIREDATE

    -----------

    80/12/17 => default 날짜 표시

    81/02/20     (날짜와 관계된 모든 data 를 가지고 있지만 default 만 표시 되고 필요시 더 보여준다.)

    81/02/22

    81/04/02

    /**********************************************************************************

     

    /*Number Functions******************************************************************

    abs(n)          => 절대값

    ceil(n)         => 올림 / 내림

    floor(n)         => 버림 / 소수점 여부

    mod(m, n)    => 나머지

    power(m,n)    => 승수

    round(m,n)    => 반올림

    trunc(m,n)     => 버림(자리수 지정 버림)

    sign(n)         => 주어진 숫자가 음수 인지 양수 인지 0 인지 판별

     

    select round(42.195, 1)

    from dual =>(함수를 쓸 수 있는 table = 누구나가 접근 가능한 특별 table)

    /**********************************************************************************

     

    /*Character Functions*****************************************************************

    concat(s1, s2)         => 연결 연산자 (s1, s2) 문자열을 연결 시켜 준다.

    initcap(s)              => 첫 번째 글자만 대문자로 바꾸어 준다.

    lower(s)               => 문자열 소문자로 바꿈

    /사용예-----------------------------

    select *

    from emp

    where lower(job) = 'analyst'

    /-----------------------------------

    upper(s)               => 문자열 대문자로 바꿈

    lpad(s1, n, s2)         => 문자열을 특별한 문자로 자릿수 만큼 왼쪽으로 채워줌

    rpad(s1, n, s2)         => 문자열을 특별한 문자로 자릿수 만큼 오른쪽으로 채워줌

    ltrim(s, c)             => 특별한 쓰레기 문자를 왼쪽부터 검색 해서 지워줌(처음으로 아닌 문자 이후 멈춤)

    rtrim(s, c)             => 특별한 쓰레기 문자를 오른쪽부터 검색해서 지움

    chr(n)                 => 아스키 값이라 생각 하고 문자로 바꿔줌

    replace(s, p, r)         => s에서 p를 찾아서 r로 바꾸어 준다.

    substr(s,m,n)          => s 문자열에서 m 번째에서 n 개의 문자를 가져와라

    translte(s,from,to)     => s 문자열에서 from 에 있는 캐릭터를 to 에 있는 캐릭터로 바꾸어 준다.

    ascii(s)                 => 문자열을 아스키 코드값으로 변환해줌

    instr(s1,s2,m,n)       => s1에서 s2 문자열을 찾아서 몇 번째 있는지 포지션 넘버 리턴

                            => 부분 문자열이 여러개 있을 경우 n 값에 있는 문자열 리턴

    length(s)              => 길이를 나타내 주는 함수

    /**********************************************************************************

     

     

     

     

     

     

    /*Date Functions ********************************************************************

    sysdate         => 현재 시스템의 날짜와 시간을 알려줌

    /---사용예-------------------------------------------------

    select to_char(sysdate, 'YYY-MM-DD day HH:MI:SS')

    from dual

    /-----------------------------------------------------------

    add_month(d,n)       => 어떤 날짜에 달(month) 로 환산 해서 n만큼 더해 준다.

    /-사용예--------------------------

    select add_months(sysdate, 5)

    from dual

    /---------------------------------

    last_day(d)            => 오늘 날짜의 마지막 일을 알려준다.

    month_betwen(d1, d2) => 두 날짜의 차이를 알려준다. (단위는 월(month) 이다.)

    new_time(d, z1, z2)  => 날짜를 주면서 z1에 소속된 날자를 z2의 날짜로 환산해서 알려줌

    next_day(d, day)      => 오늘이 지나고 나서 처음으로 똑같은 요일이 오는 day 를 알려준다.(요일 정보로)

    round(d, fmt)         => 날짜를 버림( 1일이 된다.)

    trunc(d, fmt)          => 날짜를 반올림

    /**********************************************************************************

     

    /*Conversion Functions ***************************************************************

    to_char(d, fmt)                        fmt = format model

    /---사용예------------------------

    select to_char(sal,  '9,999') => 9는 숫자가 들어가는 자리(다른 문자는 들어오지 못한다.) or 0(앞자리채움)

    from emp

    /---------------------------------

    to_char(n, fmt)

    to_date(s, fmt)

    to_number(s,  fmt)

    /--사용예-------------------------------------

    select sal, to_number('1,234', '9,999')

    from emp

    /----------------------------------------------

    /**********************************************************************************

     

    /*Format Elements for Date************************************************************

    /----------사용예--------------------------------------------------

      1  select to_char(hiredate, 'YYYY-MM-DD'), hiredate

      2* from emp

    SQL> /

     

    TO_CHAR(HI HIREDATE

    ---------- ---------------

    1980-12-17 80/12/17

    1981-02-20 81/02/20

    1981-02-22 81/02/22

    1981-04-02 81/04/02

     

      1  select to_char(hiredate, 'day'), hiredate

      2* from emp

    SQL> /

    TO_CHA HIREDATE

    ------ --------

    수요일 80/12/17

    금요일 81/02/20

    /--------------------------------------------------------------------

    /**********************************************************************************

    /*RR Format ***********************************************************************

     

    RR => 현실에 가까운 날짜로 해석하기 위해서 생겨남 (기본으로 RR 을 사용하는 것이 나음)

     

    /**********************************************************************************

     

    /*Miscellaneous Functions**************************************************************

    /---DECODE 사용예-------------------------------------------

    select ename, sal, deptno,

            decode(deptno, 10, sal*1.1, 20, sal*1.2, sal)

    from emp

    =>>조건 하나, 활용 범위 적음 case 가 사용범위는 많음

    /---------------------------------------------------------------

    /**********************************************************************************

     

    /*JOIN *****************************************************************************

    select empno,  ename,  job,  emp.deptno, dname

    from emp, dept

    where emp.deptno = dept.deptno (JOIN 조건) => 없으면 Cartesian Product 발생

    order by 1

     

    //소속을 밝힘

    select emp.empno,  emp.ename,  emp.job,  emp.deptno, dept.dname

    from emp, dept

    where emp.deptno = dept.deptno

    order by 1

     

    //별칭을 줌

    select e.empno,  e.ename,  e.job,  e.deptno, d.dname

    from emp e, dept d

    where e.deptno = d.deptno

    order by 1

     

    //Equijoin

    select e.empno,  e.ename,  e.job,  e.deptno, d.dname

    from emp e, dept d

    where e.deptno = d.deptno // Equijoin

    order by 1

     

    //ANSI 용법 - natural join

    select *

    from emp e natural join dept d => natural :: 두 table 에 공통된 컬럼이 있다고 가정한다.

     

    select *

    from emp e join dept d using(deptno) => using 에 있는 table 의 똑같은 칼럼이 있다고 가정.

    /--같은 이름의 컬럼이 있어야만 가능---------------------------------------------------------------------

     

     

    /--같은 이름이 없어도 가능 :: 모든 종류의 것을 다 표현 할 수 있다.---

    select *

    from emp join dept d on(e.deptno = d.deptno)

     

    /**********************************************************************************

     

     

     

    /*Non-equijoin***********************************************************************

    select  empno, ename, sal, grade

    from emp, salgrade

    where sal between losal and hisa

     

    /---ANSI 용법----------------------------------------------------------------

    select  empno, ename, sal, grade

    from emp join salgrade on(where sal >= losal and  sal <= hisal )

    /------------------------------------------------------------------------------

     

    모든 부서의 부서번호, 이름, 위치 그리고 혹시 해당 부서에 소속된 사원이 있다면 사원의 이름까지 보여주기

     

    select d.deptno, d.dname, d.loc, e.ename

    from dept d, emp e

    where d.deptno = e.deptno(+) => Outer Join - left Outer Join = 비중을 두어 비중을 둔 쪽 data 출력

    order by 1

     

    /--ANSI 용법---------------------------------------------------------

    select d.deptno, d.dname, d.loc, e.ename

    from dept d left outer join emp e on(d.deptno = e.deptno)

    order by 1

    /----------------------------------------------------------------------

     

    /**********************************************************************************

     

    /*Self Join***************************************************************************

    select e.empno 사원번호, e.ename 사원이름,  m.empno 매니저번호, m.ename 매니저이름

    from emp e, emp m

    where e.mgr = m.empno(+)

     

    사원번호, 사원이름, 급여, 급여등급, 부서번호, 부서이름 보여주기

     

    select e.empno, e.ename, e.sal, s.grade, e.deptno, d.dname

    from emp e, salgrade s, dept d

    where e.sal between s.losal and s.hisal and e.deptno = d.deptno

     

    /--ANSI---------------------------------------------------------------------------

    select e.empno, e.ename, e.sal, s.grade, e.deptno, d.dname

    from emp e join salgrade s on(e.sal between s.losal and s.hisal)

    join dept d on(e.deptno = d.deptno)

    /-----------------------------------------------------------------------------------

     

    /**********************************************************************************

     

    /*Aggregate Function******************************************************************

    count()        => 각 그룹에 속하는 행의 개수, 값의 개수를 찾을 때 사용

    sum()         => 숫자 값을 합할 때 사용 (합계)

    avg            => 평균값을 구할 때 사용 (평균)

    max()         => 특정 컬럼의 큰값을 찾음

    min()          => 특정 컬럼의 작은 값을 찾음

    stddev()       => 표준편차에 해당함

    variance()     => 분산에 해당함

     

     

     

     

    /--사용예-----------------------------------------------------------------

      1  select min(ename), max(ename), sum(sal), avg(sal)

      2* from emp

    SQL> /

     

    MIN(ENAME) MAX(ENAME)   SUM(SAL)   AVG(SAL)

    ----------     ----------        ----------    ----------

    ADAMS         WARD         29025      2073.21429

     

     

    1  select sum(sal), avg(sal), sum(distinct sal), avg(distinct sal)

    2* from emp

    3  /

     

    SUM(SAL)   AVG(SAL) SUM(DISTINCTSAL) AVG(DISTINCTSAL)

    --------      ----------  ---------------------- ----------------------

       29025 2073.21429            24775       2064.58333

     

    /-------------------------------------------------------------------------

    /**********************************************************************************

     

    /*GROUP BY Clause*******************************************************************

    /--------사용예---------------

      1  select deptno, sum(sal), avg(sal)

      2  from emp

      3* group by deptno                         => 그룹 생성

    SQL> /

     

      DEPTNO   SUM(SAL)   AVG(SAL)

    -------- ---------- ----------

          10       8750 2916.66667

          20      10875       2175

          30       9400 1566.66667

    /---------------------------------

     

    /**********************************************************************************

     

    /*Incorrect Example for GROUP BY******************************************************

     

    select jop, ename, sum(sal)

    from emp

    group by jop;

     

    => 대표값을 찾을 수 없기 때문에 Error Message

    /**********************************************************************************

     

    /*HAVING Clause********************************************************************

      1  select deptno, job, sum(sal), avg(sal)

      2  from emp

      3  group by deptno, job

      4* having sum(sal) > 5000 => where 절에서는 arregate function 을 사용할 수 없다.

        DEPTNO JOB         SUM(SAL)   AVG(SAL)

      --------- ---------        ---------- ----------

            20 ANALYST          6000       3000

            30 SALESMAN        5600       1400

    /**********************************************************************************

    /*ROLLUP, CUBE Operators*************************************************************

    /-----사용예-------------------------------------------

     1  select deptno, job, sum(sal), avg(sal)

     2  from emp

     3* group by rollup (deptno, job)

     4  /

     

       DEPTNO JOB         SUM(SAL)   AVG(SAL)

      --------- ---------      ----------    ----------

           10 CLERK           1300       1300

           10 MANAGER       2450       2450

           10 PRESIDENT      5000       5000

           10                  8750 2916.66667

           20 CLERK           1900        950

           20 ANALYST        6000        3000

           20 MANAGER       2975        2975

           20                  10875       2175

           30 CLERK            950        950

           30 MANAGER        2850       2850

           30 SALESMAN       5600       1400

           30                   9400 1566.66667

                               29025 2073.21429

     

     1  select deptno, job, sum(sal), avg(sal)

     2  from emp

     3* group by cube (deptno, job)

    QL> /

     

       DEPTNO JOB         SUM(SAL)   AVG(SAL)

    --------- --------- ---------- ----------

                             29025 2073.21429

              CLERK           4150     1037.5

              ANALYST         6000       3000

              MANAGER         8275 2758.33333

              SALESMAN        5600       1400

              PRESIDENT       5000       5000

           10                 8750 2916.66667

           10 CLERK           1300       1300

           10 MANAGER         2450       2450

           10 PRESIDENT       5000       5000

           20                10875       2175

           20 CLERK           1900        950

           20 ANALYST        6000       3000

           20 MANAGER       2975       2975

           30                 9400 1566.66667

           30 CLERK            950        950

           30 MANAGER        2850       2850

           30 SALESMAN       5600       1400

    /--------------------------------------------------------

     

    /**********************************************************************************

    /*Subquery**************************************************************************

    select *

    from emp

    where deptno=(select deptno from emp where ENAME = 'SMITH') => Subquery, innerquery

                    Select 문장만 Subquery 가 될 수 있다.

     

    /***********************************************************************************

     

    /*Single Row Subquery*****************************************************************

    Subquery 문장을 실행 시켜서 결과가 하나 일 때

    /***********************************************************************************

     

    /*Multiple Row Subquery***************************************************************

    Subquery 문장의 실행 결과가 둘 이상일 때

     

    select *

    from emp

    where deptno in (10, 20)

     

    select *

    from emp

    where sal >all(any) (select avg(sal) from emp group by deptno)

    /***********************************************************************************

     

    /*Subquery in the From Clause**********************************************************

    select *

    from (select * from emp)

    where  sal >all(any) (select avg(sal) from emp group by deptno)

     

    select *

    from (select * from emp where deptno = 10)

     

    select *

    from (select * from emp where deptno = 10)

    /***********************************************************************************

     

    /*Subquery in the Having Clause*********************************************************

    select deptno, avg(sal)

    from emp

    group by deptno

    having avg(sal) > (select avg(sal) from emp where deptno  =20)

     

    select empno, ename, sal - (select avg(sal) from emp)

    from emp

     

    /-----부서별 최고 금액 출력------------------------------------------------------------

     select e.deptno,d.dname, e.ename, e.sal

     from emp e, (select deptno,  max(sal) msal

                from emp

                group by deptno) s, dept d

     where e.sal = s.msal and e.deptno = s.deptno and e.deptno=d.deptno

     /

     

    DEPTNO DNAME          ENAME          SAL

      ------ --------------     ----------      ----------

        10 ACCOUNTING     KING            5000

        20 RESEARCH       SCOTT           3000

        20 RESEARCH       FORD            3000

        30 SALES          BLAKE             2850

    /-----------------------------------------------------------------------------------------

     

    /***********************************************************************************

     

    /*Set Operator***********************************************************************

    select ename form emp

    union

    select dname from detp

     

    select ename, sal from emp

    union

    select dname, null from dept

     

      select deptno, job, avg(sal), sum(sal)

      from emp

      group by deptno, job

      union

      select deptno,null, avg(sal), sum(sal)

      from emp

      group by deptno

    * order by 1

    > /

     

     DEPTNO JOB         AVG(SAL)   SUM(SAL)

    ------- --------- ---------- ----------

         10 CLERK           1300       1300

         10 MANAGER         2450       2450

         10 PRESIDENT       5000       5000

         10           2916.66667       8750

         20 ANALYST         3000       6000

         20 CLERK            950       1900

         20 MANAGER         2975       2975

         20                 2175      10875

         30 CLERK            950        950

         30 MANAGER         2850       2850

         30 SALESMAN        1400       5600

         30           1566.66667       9400

     

    /***********************************************************************************

     

    /*Hierarchical Query*******************************************************************

    조직도를 쿼리로 그리는 방식

     

     select level, ename => 모든 table 이 접근 가능한 Recode

     from emp

    start with mgr is null =>root 를 찾을 조건

    connect by prior empno = mgr => level 연결 조건

     order by level

    LEVEL ENAME

    ------ ----------

         1 KING

         2 JONES

         2 CLARK

         2 BLAKE

         3 SCOTT

         3 ALLEN

         3 MARTIN

         3 MILLER

         3 JAMES

         3 TURNER

         3 WARD

         3 FORD

         4 ADAMS

         4 SMITH

     

     

      1  select rpad(' ',level*3, ' ') || ename

      2  from emp

      3  start with mgr is null

      4* connect by prior empno = mgr

      5  /

     

    RPAD('',LEVEL*3,'')||ENAME

    -------------------------------------------

       KING

          JONES

             SCOTT

                ADAMS

             FORD

                SMITH

          BLAKE

             ALLEN

             WARD

             MARTIN

             TURNER

             JAMES

          CLARK

             MILLER

    /***********************************************************************************

     

    /*Substitution Variables****************************************************************

    select *

    from emp

    where upper(job) = upper('&job')

     

    select &select

    from emp

     

    select *

    from emp

    where deptno = &&deptno // 어딘가에 기억을 했다가 다시 실행 시 물어 보지 않음

     

    &deptno, &&deptno

    1. deptno 라는 치환 변수 값이 저장 되어 있는지 확인

    2. 있다면, 물어보지 않고 그냥 사용한다.

    3. 없다면 물어본다.

    4. & : 사용자가 입력한 값을 사용하고 그냥 버린다.

       &&: 사용자가 입력한 값을 사용하고 값을 저장한다.

     

    define deptno => 치환변수를 보여준다.

    /***********************************************************************************

     

    /*Create Table************************************************************************

       DB 관리 단위

    Table Space

       Block :: I/O 단위 (데이터를 읽어 올 수 있는 단위)

       Extent :: 저장 공간 할당의 단위(table 같은 곳으로 저장 공간을 줄때 사용하는 단위)

       Segment :: object => talble = segment  :: 저장 공간이 필요한 객체

                    ex) emp segment, dept segment (View 는 객체지만 Segment 는 아님)

                    반드시 하나의 table은 하나의 segment 에 소속 되어 있어야 한다.

     

    Table Space : 테이블이 만들어 지는 공간 => file 의 모임

       기본적으로 만들어 지는 Table Space => System TS (모든 구조적인 정보, DB Server 정보 가지고 있음)

                                                            (Data Dictionary + User Data)

                                                            User Data 는 새로운 Table 을 만들어서 활용

                                                Undo   TS

                                                Temporary TS

         

    /***********************************************************************************

    /*Create Table************************************************************************

    create table myemp

    (       empno number(4),

            ename varchar2(12)

    )

    or

    create table scott.myemp

     

    create table bit.myemp(특정 스키마에 객체를 만들 경우 소속을 명시적으로 표시 한다.)

     

    rowid : 행의 주소 값  ( 객체번호:6, 상대 파일번호:3, 블록넘버:6 행의주소:3)

    rownum : 행의 개수

    select rownum, empno, ename

    from emp

    where rownum < 6

     

     

    create table myemp

    (

    empno number(4) constraint myemp_name_nn not_null,

    no number(4) constraint myemp_name_nk unique

     

    SSN1  char(6),

    SSN2  char(7),

    deptno number(2) constraint myemp_deptno_fk

                         references dept(deptno),  //dept = referenced table, parent table

     

     

    constraint myemp_SSN1_SSN2_uk unique(SSN1, SSN2)

    constraint myemp_empno_pk primarykey(empno)

    constraint myemp_deptno_fk

            foreign key(deptno)

            references dept(deptno)

            on delete set null

     

    comm number(4,2) constraint myemp_comm_ck

                         check(comm in ( 10, 12.5, 15, 17.5, 20)) // 비교식

     

    or

     

    comm number(4,2) constraint myemp_comm_ck

                         check(comm between 10.25 and 30.00)) // 비교식

    )

     

    create table emp10

    as

    select empno, ename, job, sal, deptno

    from emp

    where deptno = 10

     

     

    create table emp10

    as

    select empno, ename, job, sal*12 newsal, deptno

    from emp

    where deptno = 10

     

    create table emp10 ( empno, empname, job, sal, deptno)

    as

    select empno, ename, job, sal*12, deptno

    from emp

    where 0 = 10 //컬럼 구조만 복사 data 는 복사 하지 않음

    /***********************************************************************************


     

    반응형

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."