Oracle/SQL2021. 6. 15. 09:45

DML : Data Manipulation Language

데이터를 다루는 언어로 아래의 4가지 종류로 나눌 수 있다.

1) INSERT 
   : 자료의 입력을 목적으로 한 문장

2) SELECT
   : 자료의 조회를 목적으로 한 문장

3) UPDATE
   : 자료의 수정을 목적으로 한 문장

4) DELETE
   : 자료의 삭제를 목적으로 한 문장

'Oracle > SQL' 카테고리의 다른 글

NULL 에 대하여  (0) 2021.06.15
SELECT의 구조  (0) 2021.06.15
SQL 교육 커리큘럼  (0) 2018.03.27
테이블 및 컬럼의 COMMENT 확인  (0) 2016.11.18
RANK() VS. DENSE_RANK()  (0) 2012.01.16
Posted by 자수성가한 부자
Oracle/SQL2018. 3. 27. 06:19



SQL 교육 - 1


 0. 사전 준비사항

     - 실습환경 :  Oracle 11g XE

     - 샘플스키마 : XXXX.sql

     - Oracle  설치 및 데이터베이스 생성


 1. 관계형 데이터베이스(RDBMS란?)

     - RDBMS의 아키텍쳐 그림(단순)

     - 상용 RDBMS의 종류


 2. SQL이란?

     - SQL의 정의 

     - SQL의 종류


 3. 단일행 함수(Single Row Function)

     - 문자열 함수

     - 숫자형 함수


 4. 여러행 함수(Multi Row Function)

     - SUM

     - AVG

 

 5. 집합 연산자(Set Operator)

     - UNION 

     - UNION ALL

     - MINUS

     - INTERSECT


 6. 서브 쿼리(Sub Query)


 7. 조인(Join)



'Oracle > SQL' 카테고리의 다른 글

SELECT의 구조  (0) 2021.06.15
DML의 종류  (0) 2021.06.15
테이블 및 컬럼의 COMMENT 확인  (0) 2016.11.18
RANK() VS. DENSE_RANK()  (0) 2012.01.16
view에 dml이 될까?  (0) 2011.07.11
Posted by 자수성가한 부자
Oracle/SQL2016. 11. 18. 10:12

 

 

#######################
# 테이블 COMMENTS 확인
######################

SELECT
FROM DBA_TAB_COMMENTS
WHERE OWNER = 'TEST_USER';

#####################
# 컬럼 COMMENTS 확인
#####################

SELECT *
FROM DBA_COL_COMMENTS
WHERE OWNER='TEST_USER';
AND COMMENTS IS NULL;

'Oracle > SQL' 카테고리의 다른 글

DML의 종류  (0) 2021.06.15
SQL 교육 커리큘럼  (0) 2018.03.27
RANK() VS. DENSE_RANK()  (0) 2012.01.16
view에 dml이 될까?  (0) 2011.07.11
현재 SCN 구하기  (0) 2010.10.01
Posted by 자수성가한 부자
Oracle/SQL2012. 1. 16. 21:18






예제로 풀어보는 오라클 분석용 함수

●RANK(), DENSE_RANK()의 사용법

RANK()는 데이터의 순위를 나타내는 함수로, 동률일 경우 그 다음에 순위가 누락된다.
DENSE_RANK()도 마찬가지로 데이터의 순위를 나타내는 함수지만, 동률일 경우가 있더라도 바로 다음 숫자가 나온다.
예를 들어, 다음과 같은 점수분포라면,
--------------
이름     점수
--------------
홍길동    10
장기현    50
장동건    30
조인성    20
고길동    20
--------------
의 데이터를 RANK() 함수로 점수가 높은 순서대로 나열한다면, 다음과 같다.
--------------
이름     등수
--------------
장기현    1
장동건    2
조인성    3
고길동    3
홍길동    5
--------------

반면에 DENSE_RANK() 함수로 점수가 높은 순서대로 나열한다면, 다음과 같다.
--------------
이름     등수
--------------
장기현    1
장동건    2
조인성    3
고길동    3
홍길동    4
--------------

다음의 예문을 보면 잘 이해될 것이다.

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

우선 테이블의 구조를 보자

SQL> set lines 80
SQL> desc temp
 이름        널?     유형
 ----------------------------------------- -------- ----------------------------
 EMP_ID        NOT NULL NUMBER
 EMP_NAME       NOT NULL VARCHAR2(10)
 BIRTH_DATE         DATE
 DEPT_CODE       NOT NULL VARCHAR2(6)
 EMP_TYPE         VARCHAR2(4)
 USE_YN        NOT NULL VARCHAR2(1)
 TEL          VARCHAR2(15)
 HOBBY          VARCHAR2(30)
 SALARY          NUMBER
 LEV          VARCHAR2(4)
 
데이터는 어떤지 보자.

SQL> set lines 200
SQL> select * from temp;

    EMP_ID EMP_NAME   BIRTH_DA DEPT_C EMP_ U TEL      HOBBY    SALARY LEV
---------- ---------- -------- ------ ---- - --------------- ------------------------------ ---------- ----
  19970101 김길동     74/01/25 AA0001 정규 Y       등산        100000000 부장
  19960101 홍길동     73/03/22 AB0001 정규 Y       낚시         72000000 과장
  19970201 박문수     75/04/15 AC0001 정규 Y       바둑         50000000 과장
  19930331 정도령     76/05/25 BA0001 정규 Y       노래         70000000 차장
  19950303 이순신     73/06/15 BB0001 정규 Y            56000000 대리
  19966102 지문덕     72/07/05 BC0001 정규 Y            45000000 과장
  19930402 강감찬     72/08/15 CA0001 정규 Y            64000000 차장
  19960303 설까치     71/09/25 CB0001 정규 Y            35000000 사원
  19970112 연흥부     76/11/05 CC0001 정규 Y            45000000 대리
  19960212 배뱅이     72/12/15 CD0001 정규 Y            39000000 과장

10 개의 행이 선택되었습니다.


Q : 위의 TEMP 테이블의 SALARY 가 높은 순서대로 순위를 부여하는 SQL을 만드시오.
출력은 EMP_ID, EMP_NAME, SALARY, 등수의 순서대로 나오도록 하고, rank()와 dense_rank()를 비교할 수 있도록
한 SQL로 작성하시오.

SQL> select emp_id, emp_name, salary,
       rank() over (order by salary desc) as c1,
       dense_rank() over (order by salary desc) as c2
from temp;

  2    3    4 
    EMP_ID EMP_NAME   SALARY  C1     C2
---------- ---------- ---------- ---------- ----------
  19970101 김길동      100000000   1      1
  19960101 홍길동 72000000   2      2
  19930331 정도령 70000000   3      3
  19930402 강감찬 64000000   4      4
  19950303 이순신 56000000   5      5
  19970201 박문수 50000000   6      6
  19966102 지문덕 45000000   7      7
  19970112 연흥부 45000000   7      7
  19960212 배뱅이 39000000   9      8
  19960303 설까치 35000000  10      9

10 개의 행이 선택되었습니다.


※ 출처 : 전문가로 가는 지름 길 오라클 실습(이채남 저)

'Oracle > SQL' 카테고리의 다른 글

SQL 교육 커리큘럼  (0) 2018.03.27
테이블 및 컬럼의 COMMENT 확인  (0) 2016.11.18
view에 dml이 될까?  (0) 2011.07.11
현재 SCN 구하기  (0) 2010.10.01
히든 파라미터 확인 SQL  (0) 2010.09.01
Posted by 자수성가한 부자
Oracle/SQL2011. 7. 11. 23:21





Q :  

view는 dml이 수행될까?

A :

simple view 일 경우는 dml이 수행되지만, table을 가공한 virtual column일 경우에는 dml 수행이 되지 않는다.




테스트를 해보자.

테이블을 생성하고, 데이터를 넣는다.


SQL> create table t1 (col1 number, col2 varchar2(100));

insert into t1
select level, 'A'
from dual
connect by level <= 10
union all
select level+12 , 'B'
from dual
connect by level <= 10
union all
select level+30, 'C'
from dual
connect by level <= 10;


commit;



뷰를 생성하고 데이터를 넣는다.

SQL> create view m_t1
         as
         select * from t1

SQL> insert into m_t1 values (20, 'D');



뷰를 확인했을 때도 데이터가 나오고, 테이블을 확인했을 때도 데이터가 나온다.


SQL> select * from m_t1 where col2 = 'D';

      COL1 COL2
---------- --------------------
 20 D

SQL> select * from t1 where col2 ='D';

      COL1 COL2
---------- --------------------
 20 D



그러면 뷰의 정의를 조금 다르게 하고, 뷰에 데이터를 입력해보자.

create view m_t1_2
as
select sum(col1) as col1, col2
from t1
group by col2;

SQL> insert into m_t1_2 values (32, 'E');
insert into m_t1_2 values (32, 'E')
*
ERROR at line 1:
ORA-01733: virtual column not allowed here



에러가 발생한다. 가상 컬럼은 여기에 들어갈 수 없다. 라고 나온다.


'Oracle > SQL' 카테고리의 다른 글

테이블 및 컬럼의 COMMENT 확인  (0) 2016.11.18
RANK() VS. DENSE_RANK()  (0) 2012.01.16
현재 SCN 구하기  (0) 2010.10.01
히든 파라미터 확인 SQL  (0) 2010.09.01
Correlated Sub Query(상호관련 서브 쿼리)  (1) 2009.12.15
Posted by 자수성가한 부자
Oracle/SQL2010. 10. 1. 14:47

9i 이전 버전

SQL> select dbms_flashback.get_system_change_number
         from dual;



10g 이후 버전

SQL> select current_scn
         from v$database;

'Oracle > SQL' 카테고리의 다른 글

RANK() VS. DENSE_RANK()  (0) 2012.01.16
view에 dml이 될까?  (0) 2011.07.11
히든 파라미터 확인 SQL  (0) 2010.09.01
Correlated Sub Query(상호관련 서브 쿼리)  (1) 2009.12.15
timezone  (0) 2009.12.15
Posted by 자수성가한 부자
Oracle/SQL2010. 9. 1. 12:02





select ksppinm name,
      ksppstvl value,
      decode(bitand(ksppiflg/256,1),1,'true','false') ses_modifiable,
      decode(bitand(ksppiflg/65536,3),1,'immediate',2,'deferred',3,'immediate','false') sys_modifiable,
      ksppdesc description
from sys.x$ksppi i, sys.x$ksppcv v
where i.indx = v.indx
and i.ksppinm like '%히든파라미터명%';

'Oracle > SQL' 카테고리의 다른 글

view에 dml이 될까?  (0) 2011.07.11
현재 SCN 구하기  (0) 2010.10.01
Correlated Sub Query(상호관련 서브 쿼리)  (1) 2009.12.15
timezone  (0) 2009.12.15
rollup, cube, grouping sets 연산자  (1) 2009.12.14
Posted by 자수성가한 부자
Oracle/SQL2009. 12. 15. 13:05
상호관련 서브 쿼리(Correlated Sub Query)란?
서브쿼리가 메인쿼리의 컬럼을 참조하면 상호관련 서브 쿼리이다.
소속 부서의 평균 급여보다 많은 급여를 받는 사원

SQL> select * from emp e
     where sal > (select avg(sal) 
                  from emp
                  where deptno = e.deptno);


메인 쿼리의 ROW의 수만큼 서브 쿼리가 실행된다.

상호 관련이 있는 테이블의 update에 사용시 유용하다.

SQL> create table n_dept
     as
     select * from dept;
SQL> create table n_emp
     as 
     select * from emp;
SQL> alter table n_emp add (dname varchar2(10));
SQL> select * from n_dept;
SQL> update n_emp
     set dname = 'ACCOUNTING'
     where deptno = 10;

-- 한번에 부모 테이블의 값이 업데이트 됨
SQL> update n_emp e  
     set dname = (select dname
                  from n_dept

                  where deptno = e.deptno);



SQL> update n_dept
     set sum_sal = (select sum(sal)
                    from n_emp
                    where deptno = d.deptno);

'Oracle > SQL' 카테고리의 다른 글

현재 SCN 구하기  (0) 2010.10.01
히든 파라미터 확인 SQL  (0) 2010.09.01
timezone  (0) 2009.12.15
rollup, cube, grouping sets 연산자  (1) 2009.12.14
multi table insert  (0) 2009.12.14
Posted by 자수성가한 부자
Oracle/SQL2009. 12. 15. 11:16
현재 내가 접속하고 있는 세션과 db의 timezone을 확인할 수 있다.

SQL> select sessiontimezone, dbtimezone
         from dual;

현재 시각을 구하는 함수

SQL> select current_date, current_timestamp, localtimestamp
         from dual;

현재 세션의 시간 표시를 바꾸는 SQL

SQL> alter session set nls_date_format = 'DD-MON-RR HH24.MI.SS';


extract함수
: 날짜에서 특정 부분을 추출. to_char와는 반환하는 타입이 다름

SQL> select to_char(sysdate, 'YYYY')||'         ', extract(year from sysdate)
         from dual;


'Oracle > SQL' 카테고리의 다른 글

히든 파라미터 확인 SQL  (0) 2010.09.01
Correlated Sub Query(상호관련 서브 쿼리)  (1) 2009.12.15
rollup, cube, grouping sets 연산자  (1) 2009.12.14
multi table insert  (0) 2009.12.14
index를 사용하여 쿼리를 튜닝해보자  (0) 2009.11.16
Posted by 자수성가한 부자
Oracle/SQL2009. 12. 14. 12:02
rollup 
  : 컬럼 갯수가 n개  =>  결과 집합 갯수가 n+1개
    컬럼의 나열 순서가 중요 (결과에 차이가 있으므로)
    8i부터 사용가능
    아래의 예는 3가지 (deptno, job), (deptno), () 아래의 grouping sets와 같다.

SQL> select deptno, job, sum(sal)
         from emp
         group by rollup(deptno, job);


SQL> select deptno, job, sum(sal)
         from t1
         group by grouping sets ((deptno, job),(dept),());


cube
 : 컬럼 갯수가 n개 => 결과 집합 갯수 2^n개
   8i부터 사용가능
   위의 예와 아래의 예는 같은 결과를 나타냄

SQL> select deptno, job, sum(sal)
         from emp
         group by cube (deptno, job);

SQL> select deptno, job, sum(sal)
         from emp
         group by grouping sets ((deptno, job),(deptno),(job),());


cf) grouping 함수
     : 0과 1의 값만 반환하는 함수로 rollup과 cube와 같이 사용함.
       특정 컬럼을 이용한 그룹핑 결과인지 판단할 때 쓰인다.
       0일 경우 그 컬럼의 그룹핑 결과, 1일 경우 그룹핑 결과가 아님..
 

SQL>select *
        from (select deptno, job, sum(sal) as sum_sal, grouping(deptno), grouping (job)
                from t1
        group by rollup(deptno, job));


grouping sets
 : 지정한 컬럼으로 그룹을 짓는 함수. 원하는 그룹핑 결과만 도출할 수 있다.
   rollup과 cube의 단점을 보완하기 위해서 9i부터 나온 기술
   사용예는 위의 rollup과 cube의 예제를 참고할 것.


기타 참고사항

- rollup과 cube의 단점
   : 너무 많은 결과를 나오게 한다.

- excel과 비교시 dbms의 장점과 단점
   장점 : 여러 사람이 사용할 수 있도록 제공
            복원과 복구가 쉬움.
   단점 : 사용하기 어려움으로 교육이 필요. 
            통합 관리로 중앙 부분에 문제가 생기면 전체적으로 사용이 불가능

'Oracle > SQL' 카테고리의 다른 글

Correlated Sub Query(상호관련 서브 쿼리)  (1) 2009.12.15
timezone  (0) 2009.12.15
multi table insert  (0) 2009.12.14
index를 사용하여 쿼리를 튜닝해보자  (0) 2009.11.16
WITH .. AS  (0) 2009.11.15
Posted by 자수성가한 부자