반응형

쿼리조회 결과가 너무 많아서 확인이 안될때 파일로 저장 해서 확인!

 

"SPOOL Command" 사용

 

spool 저장할파일명

sql문

spool off

 

간단하게 sql스크립트 만들어서 사용하면 편함

 

ex) vi a.sql

 

spool $PWD/a.out

select * from all_tab_columns;

spool off

 

현재 디렉토리에 a.out 파일로 저장하는 a.sql 스크립트

반응형

'오라클 > SQL' 카테고리의 다른 글

DML  (0) 2014.10.12
DDL  (0) 2014.10.12
JOIN 함수  (0) 2014.10.10
그룹함수 (연습문제)  (1) 2014.10.08
복수행 함수 (그룹 함수)  (1) 2014.10.08
sql 단일행 함수 - 정규식  (2) 2014.10.01
sql 단일행 함수 - 일반 함수  (0) 2014.09.30
반응형

DML (Data Manipulation Language) : INSERT (입력) , UPDATE (변경) , DELETE (삭제) , MERGE(병합)


1. INSERT

테이블에 새로운 데이터를 입력할 때 사용, 데이터 입력시 숫자 값 이외에는 데이터를 '(홀따옴표)로 감싸야 함


1) INSERT 를 사용하여 단일 행 입력

문법 :

INSERT INTO table(column1, column2, ....)

VALUES (value 1, value 2, ....) ;


사용 예 1. dept2 테이블에 아래와 같은 내용으로 새로운 부서정보 입력

* 부서번호 : 9000

* 부서명 : 특판1팀

* 상위부서 : 영업부

* 지역 : 임시지역

SCOTT>INSERT INTO dept2 (dcode, dname, pdept, area)

2    VALUES (9000, '특판1팀', '영업부', '임시지역') ;


※ 모든 컬럼에 데이터를 넣을 경우에는 테이블 이름 뒤 컬럼이름을 생략 가능

SCOTT>INSERT INTO dept2

2    VALUES (9001, '특판2팀', '영업부', '임시지역') ;


사용 예2. 날짜 데이터 입력

* 교수번호 : 5001 

* 교수이름 : 박동주

* ID : Love_me

* POSITION : 정교수

* PAY : 510

* 입사일  2014년 5월 14일

SCOTT>INSERT INTO professor (profno, name, id, position, pay, hiredate)

2    VALUES (5001, '박동주', 'Love_me', '정교수', 510, '2014-05-14')

-> 위와 같이 입력할 경우 날짜 형태가 맞지않아 에러가 날 것이다

리눅스용 날짜 방식은 (dd-mon-yy) 이고 윈도우용 날짜 방식은 (yyyy-mm-dd)이기 때문에

미리 날짜형식을 yyyy-mm-dd 로 바꾸고 입력

SQL>ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD:HH24:MI:SS' ;


사용 예3. Null 값 입력

* 자동 NULL 값 입력하기

데이터를 입력할 때 컬럼에 값을 안 주면 자동으로 NULL 값이 들어감


* 수동 NULL 값 입력하기

데이터부분에 NULL 값을 적어주면 됨


2) INSERT 를 사용하여 여러 행 입력

SCOTT>INSERT INTO professor2

2    SELECT * FROM professor ;

-> professor 테이블에 있는 데이터를 professor2 테이블로 입력, 

위와 같이 입력할 때 professor2 테이블과 professor 테이블의 컬럼의 개수와 데이터 형이 동일해야 한다.


3) INSERT ALL 을 이용한 여러 테이블에 여러 행 입력


사용 예 1.) 다른 테이블에 한꺼번에 데이터 입력하기

SCOTT>INSERT ALL

2    INTO p_01 (no , name)

3    VALUES (1, 'AAA')

4    INTO p_02 (no , name)

5    VALUES (2, 'BBB')

6    SELECT * FROM dual ;


사용 예2.) 다른 테이블의 데이터를 가져와서 입력하기

professor 테이블에서 교수번호가 1000 번에서 1999 번까지 인 교수의 번호와 교수이름은 p_01 테이블에 입력

교수번호가 2000 번에서 2999 번까지 인 교수의 번호와 이름은 p_02 테이블에 입력

SCOTT>INSERT ALL

2    WHEN profno BETWEEN 1000 AND 1999 THEN

3    INTO p_01 VALUES(profno, name)

4    WHEN profno BETWEEN 2000 AND 2999 THEN

5    INTO p_02 VALUES(profno, name)

6    SELECT profno, name

7    FROM professor ;


사용 예3.) 다른 테이블에 동시에 같은 데이터 입력하기

professor 테이블에서 교수번호가 3000 번에서 3999 번인 교수들의 교수 번호와 이름을 p_01 테이블과 p_02 테이블에 동시에 입력

SCOTT>INSERT ALL

2    INTO p_01 VALUES (profno, name)

3    INTO p_02 VALUES (profno, name)

4    SELECT profno, name

5    FROM professor

6    WHERE profno BETWEEN 3000 AND 3999 ;


2. UPDATE

기존 데이터를 다른 데이터로 변경할때 사용


문법 :

UPDATE table

SET column = value

WHERE 조건 ;


사용 예 1.

professor 테이블에서 직급이 조교수 인 교수들의 BONUS 를 100 만원으로 인상하세요

SCOTT>UPDATE professor

2    SET bonus = 100

3    WHERE position = '조교수' ;


사용 예 2.

professor 테이블에서 차범철 교수의 직급과 동일한 직급을 가진 교수들 중 현재 급여가 250만원이 안 되는 교수들의 급여를 15% 인상하세요.

SCOTT>UPDATE professor

2    SET pay = pay * 1.15

3    WHERE position = (SELECT position   

4                               FROM professor

5                               WHERE name = '차범철' )

6    AND pay < 250 ;


3. DELETE

데이터를 삭제하는 구문

문법 :

DELETE FROM table

WHERE 조건 ;


사용 예 1.

dept2 테이블에서 부서번호(DCODE)가 9000 번에서 9100 번 사이인 매장들을 삭제

SCOTT>DELETE FROM dept2

2    WHERE dcode BETWEEN 9000 AND 9100 ;



4. MERGE

여러 테이블의 데이터를 합치는 병합을 의미

문법 :

1 MERGE INTO Table1

2   USING Table2

3   ON (병합 조건절)

4   WHEN MATCHED THEN

5     UPDATE SET 업데이트 내용

6     DELETE WHERE 조건

7   WHEN NOT MATCHED THEN

8     INSERT VALUES (컬럼이름) ;

문법 설명 :

Table1 과 Table2 의 내용을 합쳐서 Table1 에 모으는 것.

이때 기준은 3행의 조건, 3행의 조건이 만족한다면(4행) 기존 Table1 에 있던 해당 내용은 Table2 의 내용으로 UPDATE 또는 DELETE 가 수행되며 조건이 만족하지 않은다면 (7행) Table2 의 내용이 Table1에 신규로 INSERT 된다.


MERGE 작업을 조금이라도 빨리 수행하기 위해서는 위 문법에서 3행의 조건절에 인덱스가 잘 만들어져 있어야 한다.



5. TRANSACTION 관리

논리적인 작업 단위, 여러가지 DML 작업들을 하나의 단위로 묶어 둔 것을 의미

트랜잭션의 시작은 DML 이고, 완료하려면 TCL, DCL, DDL이 입력되면 된다.


COMMIT - 트랜잭션 내의 작업의 결과를 확정하는 명령어

ROLLBACK - 트랜잭션 내의 모든 명령어들을 취소하는 명령어


DML 작업을 한 후에는 반드시 COMMIT 이나 ROLLBACK 명령을 수행해야 작업이 마무리 된다.


반응형

'오라클 > SQL' 카테고리의 다른 글

sql 쿼리결과를 파일로 저장  (0) 2015.07.03
DDL  (0) 2014.10.12
JOIN 함수  (0) 2014.10.10
그룹함수 (연습문제)  (1) 2014.10.08
복수행 함수 (그룹 함수)  (1) 2014.10.08
sql 단일행 함수 - 정규식  (2) 2014.10.01
sql 단일행 함수 - 일반 함수  (0) 2014.09.30
반응형

DDL (Data Definition Language) - CREAT (생성) , ALTER (수정) , TRUNCATE (잘라내기) , DROP (삭제)


1.CREATE


※ 테이블 생성시 제한 사항

1. 테이블 이름은 반드시 문자로 시작해야 한다. 숫자로 시작은 불가능하고 포함되는것은 가능


2. 테이블 이름이라 컬럼 이름은 최대 30 bytes 까지 가능, 한글로 테이블 이름을 생성할 경우 최대 15글자까지


3. 테이블 이름은 한 명의 사용자가 다른 오브젝트들의 이름과 중복으로 사용할 수 없다.

ex) scott 사용자가 테이블명을 test로 생성한 후 인덱스 이름을 test로 동일하게 사용하는게 불가능

scott 사용자가 test 테이블을 생성하고 다른 사용자인 hr 사용자도 test 테이블을 사용가능

4. 테이블 이름이나 오브젝트 이름을 오라클이 사용하는 키워드를 사용하지 않기를 권장

오라클 키워드라 함은 오라클에서 사용하는 미리 정해진 SELECT , FROM 들과 같은 단어를 말함


1) 일반 테이블 생성하기

SCOTT>CREATE TABLE ddl_test

2    ( no       NUMBER(3) ,

3      name   VARCHAR(10) ,

4      birth     DATE               DEFAULT SYSDATE ) ;

 

ddl_test 명의 테이블생성, no라는 컬럼은 숫자 데이터만 들어갈 수 있으며 최대길이는 3자리

name 컬럼은 가변형 문자가 들어갈 수 있으며 최대길이는 10bytes

birth 컬럼은 날짜 데이터만 들어갈 수 있으며 아무 값도 안들어올 경우 기본값 으로 현재 날짜 자동입력


2) 기본 입력값을 설정하면서 생성하기 

SCOTT>CREATE TABLE ddl_test2

2    ( no           NUMBER(3,1)     DEFAULT 0 ,

3      name       VARCHAR2(10)   DEFAULT 'NO' ,

4      hiredate    DATE                DEFAULT SYSDATE ) ;  


1) 에서 생성한 테이블은 사용자가 값을 입력하지 않을 경우 기본적으로 NULL값이 자동입력된다.

그러나 DEFAULT 적고 뒤에 값을 적어놓으면 사용자가 값을 입력하지 않을 경우 DEFAULT 뒤에 적힌 값을 자동으로 넣으라는 의미



3) Global Temporary Table (임시 테이블) 생성하기

데이터베이스에 저장할 목적이 아닌 임시 작업용 데이터를 저장하기 위해 만들어짐

트랜잭션이 끝나거나 세션이 종료되면 테이블의 데이터는 사라짐


문법 : 

CREATE GLOBAL TEMPORARY TABLE 테이블명

( 컬럼1 데이터타입 ,

   컬럼2 데이터타입 ,

   ON COMMIT [delete|preserve]ROWS ;

위 문법에서 ON COMMIT delete ROWS 를 사용하면 COMMIT 시 데이터를 삭제

ON COMMIT preserve ROWS 를 사용하면 세션이 종료되야 데이터가 사라짐

기본값은 ON COMMIT delete ROWS


특징 :

1. Redo Log 를 생성하지 않습니다.

2. Index , View , Trigger 를 생성할 수 있으나 이 오브젝트 들의 타입도 전부 Temporary 입니다.

3. 이 테이블에 들어 있는 데이터는 이전이나 백업을 할 수 없습니다.


4) 테이블 복사하기 (CTAS)

새로운 테이블을 생성 할 때 기존에 만들어져 있던 테이블을 복사


1) 모든 컬럼 다 복사하기

SCOTT>CREATE TABLE dept3

2    AS

3    SELECT * FROM dept2 ;

-> dept2 테이블과 똑같은 컬럼과 데이터를 가진 dept3 테이블 생성


2) 특정 컬럼만 복사하기

SCOTT>CREATE TABLE dept4

2    AS

3    SELECT dcode, dname

4    FROM dept2 ;

-> dept2 테이블의 dcode, dname 컬럼만 복사해서 dept4 테이블 생성


3) 테이블의 구조(컬럼) 만 복사하고 데이터는 안 가져오기

SCOTT>CREATE TABLE dept5

2    AS

3    SELECT * FROM dept2

4    WHERE 1=2 ;       (틀린 조건만 적어주면 됨)

-> dept2 테이블의 데이터는 제외하고 컬럼만 복사해서 dept5 테이블 생성


5) 가상컬럼 테이블 생성하기 (11g 부터 추가됨)

step1. 가상 컬럼을 가지는 vt001 테이블 생성

- SCOTT>CREATE TABLE vt001

2    ( no1 number ,

3      no2 number , 

4      no3 number GENERATED ALWAYS AS (no1 + no2) VIRTUAL ) ;

-> no3 = no1 + no2 값을 가지는 가상컬럼


step2. vt001 테이블에 데이터 입력

- SCOTT>INSERT INTO vt001 VALUES (1,2,3) ;        -> no3 은 가상컬럼이기에 값을 INSERT 할수 없다.


- SCOTT>INSERT INTO vt001(no1,no2) 

2       VALUES (1,2) ;

-> no1 컬럼에 1 을 넣고 no2 컬럼에 2 를 넣으면 가상컬럼 no3 은 자동으로 no1 + no2 값이 입력된다.



2. ALTER

만들어져 있는 오브젝트를 변경하는 명령어

테이블 같은 경우 컬럼을 추가하거나 삭제하거나, 컬럼 이름이나 테이블 이름을 바꾸는 등의 작업


※ ALTER 명령어 사용시 사용량이 많을 때, 절대 사용하면 안됨. 디비가 죽을 수 도 있음

1) 새로운 컬럼 추가하기 

SCOTT>ALTER TABLE dept6

2    ADD (LOC VARCHAR2(10) ;

-> dept6 테이블에 LOC라는 컬럼을 추가


2) 테이블의 컬럼 이름 변경하기

SCOTT>ALTER TABLE dept6 RENAME COLUMN LOC TO AREA ;

-> dept6 테이블의 LOC 컬럼명을 AREA 로 변경


테이블명 변경은 그냥 RENAME 명령어로 변경하면됨

SCOTT>RENAME dept6 TO dept7 ;

-> dept6 테이블명을 dept7 로 변경


3) 컬럼의 데이터 크기를 변경하기

SCOTT>ALTER TABLE dept7

2    MODIFY(dcoe, VARCHAR2(10)) ;

-> 기존에 dcode 데이터 크기 6bytes 에서 10bytes 로 변경


4) 컬럼 삭제하기

SCOTT>ALTER TABLE dept7 DROP COLUMN loc ;

-> dept7 테이블의 loc 라는 컬럼 삭제


만약 참조키로 설정되어 있는 부모 테이블의 컬럼을 삭제하려 할 경우 에러가 발생하는데 이땐 아래와 같은 방법사용

SCOTT>ALTER TABLE dept7 DROP COLUMN loc CASCADE CONSTRAINTS ;


5) 읽기 전용 테이블로 변경 -11g 에서 생김

테이블의 내용을 모두 변경은 할 수 없게 하고 조회만 가능하게 설정

SCOTT>ALTER TABLE t_read read only ;

-> t_read 테이블을 읽기 전용으로 변경  (read only 부분을 read write 로 바꾸면 읽고 쓰기 가능)



3. TRUNCATE 명령

테이블의 데이터를 전부 삭제하고 사용하고 있던 공간을 반납하는 명령어, 테이블 자체가 삭제되지는 않음

또한 테이블에 생성되어 있던 인덱스의 내용도 함께 Truncate 됨


SCOTT>TRUNCATE TABLE dept7 ;


4. DROP 명령

테이블 자체를 삭제하는 명령어


SCOTT>DROP TABLE dept7 ;


5. DELETE , TRUNCATE, DROP 명령어의 차이점

DELETE - 데이터는만 지워지고 디스크 상의 공간은 그대로 남아있음

TRUNCATE - 최초에 테이블이 만들어졌던 상태, 데이터가 하나도 없는 상태로 모든 데이터를 삭제하고 컬럼값만 남김

DROPt - 데이터와 테이블 전체를 삭제


6. 데이터 딕셔너리 (Dictionary)

오라클 데이터베이스를 운영하기 위한 정보들을 모두 특정한 곳에 모아두고 관리하는 것


딕셔너리에 저장되는 정보

- 오라클 데이터베이스의 메모리 구조와 파일에 대한 구조 정보들

- 각 오브젝트들이 사용하고 있는 공간들의 정보들

- 제약 조건 정보들

- 사용자에 대한 정보들

- 권한이나 프로파일 , 롤에 대한 정보들

- 감사(Audit) 에 대한 정보들


- 이러한 정보들은 중요한 정보이기에 오라클은 이 딕셔너리를  Base table 과 Data Dictionary View 로 나누어 두고, 

base table 은 DBA라 할 지 라도 접근을 못하게 막아놓음.

- 사용자(DBA포함)들은 Data Dictionary View 를 통해서만 딕셔너리를 select 할 수 있게 허락함

- base table 은 database를 생성하는 시점에 자동으로 만들어짐

- data dictionary view 는 catalog.sql 이란 파일이 수행되어야 만들어짐

- catalog.sql 이란 파일은 DBCA로 database를 생성 할 때는 자동으로 수행되지만 create database 라는 명령어로 수동으로 database를 생성할 때는 수행되지 않으므로 DBA가 수동으로 생성해야함


Data Dictionary View 의 종류

1. Static Data Dictionary View

- 접두어가 DBA_ , ALL_ ,USER_ 로 시작되는 3가지

USER_ = 해당 사용자가 생성한 오브젝트들만 조회 할 수 있다

ALL_ = 해당 사용자가 생성한 오브젝트를 포함하여 해당 사용자가 접근 가능한 모든 오브젝트를 조회 할 수 있다

DBA_ = 데이터베이스 내의 거의 모든 오브젝트들을 다 볼수 있지만 DBA권한을 가진 사람만이 이 딕셔너리를 조회             할 수 있다


2. Dynamic Performance View

- 접두어가 V$ 로 시작하는 것




반응형

'오라클 > SQL' 카테고리의 다른 글

sql 쿼리결과를 파일로 저장  (0) 2015.07.03
DML  (0) 2014.10.12
JOIN 함수  (0) 2014.10.10
그룹함수 (연습문제)  (1) 2014.10.08
복수행 함수 (그룹 함수)  (1) 2014.10.08
sql 단일행 함수 - 정규식  (2) 2014.10.01
sql 단일행 함수 - 일반 함수  (0) 2014.09.30
반응형

JOIN 함수

여러 곳의 테이블에 흩어져 있는 정보중 사용자가 필요한 정보만 가져와서 가상의 테이블처럼 만들어서 결과를 볼 수 있게끔 하는 방법


INNER JOIN (이너조인) - 테이블에 데이터가 존재하는 경우에만 값을 출력

OUTER JOIN (아우터조인) - 한쪽 테이블에는 데이터가 있고 다른 한쪽에는 데이터가 없을 경우 데이터가 있는 쪽 테이블의                                          내용을 전부 출력하게 하는 방법


Oracle 제품에서만 사용되는 Oracle 용 Join 과 모든 제품들에서 공통적으로 사용 가능한 ANSI Join 방법 두가지가 있다.


- Oracle Join 구문 :

SQL> SELECT e.ename , d.dname

      2  FROM EMP e , dept d ;


- ANSI Join 구문 :

SQL> SELECT e.ename , d.dname

     2  FROM emp e CROSS JOIN dept d




1. EQUI Join (등가 Join)

양쪽 테이블에 같은 조건이 존재할 경우의 값만을 가져오는 Join


- Oracle Join 구문 :

SCOTT>SELECT s.name "학생이름" , s.deptno1 "학과번호", d.dname "학과이름"

2    FROM student s , department d

3    WHERE s.deptno1 = d.deptno ;


- ANSI Join 구문 :

SCOTT>SELECT s.name "학생이름" , s.deptno1 "학과번호", d.dname "학과이름"

2    FROM student s JOIN department d

3    ON s.deptno1 = d.deptno ;


- Oracle Join 구문 :

SCOTT>SELECT s.name "학생이름" , d.dname "학과이름" , p.name "교수이름"

2    FROM student s , department d , professor p

3    WHERE s.deptno1 = d.deptno

4    AND s.profno = p.profno ;


- ANSI Join 구문 :

SCOTT>SELECT s.name "학생이름" , d.dname "학과이름" , p.name "교수이름"

2    FROM student s JOIN department d

3    ON s.deptno1 = d.deptno

4    JOIN professor p

5    ON s.profno = p.profno ;



- Oracle Join 구문 :

SCOTT>SELECT s.name "학생이름" , p.name "지도교수명"

2    FROM student s , professor p

3    WHERE s.profno = p.profno

4    AND s.deptno1 = 101 ;


- ANSI Join 구문 :

SCOTT>SELECT s.name "학생이름" , p.name "지도교수명"

2    FROM student s JOIN professor p

3    ON s.profno = p.profno

4    AND s.deptno1 = 101 ;



2. NON-Equit Join (비 등가 Join)

양쪽 테이블에 있는 데이터가 서로 같은 조건이 아닌 크거나 작어나 하는 경우의 JOIN


- Oracle Join 구문 :

SCOTT>SELECT go.gname "고객명" , go.point "POINT" , gi,gname "상품명"

2    FROM gogak go , gift gi

3    WHERE go.point BETWEEN gi.g_start AND gi.g_end ;


- ANSI Join 구문 :

SCOTT>SELECT go.gname "고객명" , go.point "POINT" , gi,gname "상품명"

2    FROM gogak go JOIN gift gi

3    ON go.point BETWEEN gi.g_start AND gi.g_end ;


- Oracle Join 구문 :

SCOTT>SELECT gI.gname "상품명" , COUNT(*) "필요수량"

2    FROM gogak go , gift gi

3    WHERE go.point BETWEEN gi.g_start AND gi.g_end ;

4    GROUP BY gi.gname ;


- ANSI Join 구문 :

SCOTT>SELECT gI.gname "상품명" , COUNT(*) "필요수량"

2    FROM gogak go JOIN gift gi

3    ON go.point BETWEEN gi.g_start AND gi.g_end ;

4    GROUP BY gi.gname ;


- Oracle Join 구문 :

SCOTT>SELECT go.gname "고객명" , go.point "POINT" , gi.gname "상품명"

2    FROM gogak go , gift gi

3    WHERE gi.g_start <= go.point

4    AND gi.gname = '산악용자전거' ;


- ANSI Join 구문 :

SCOTT>SELECT go.gname "고객명" , go.point "POINT" , gi.gname "상품명"

2    FROM gogak go JOIN gift gi

3    ON gi.g_start <= go.point

4    AND gi.gname = '산악용자전거' ;


- Oracle Join 구문 :

SCOTT>SELECT e.name "이름" , trunc((sysdate-e.birthday)/365,0) "현재나이" , e.position "현재직급", 

g.position "예상직급"

2    FROM emp2 e , p_grade g

3    WHERE trunc((sysdate-e.birthday)/365,0) BETWEEN g.s_age AND g.e_age ;


- ANSI Join 구문 :

SCOTT>SELECT e.name "이름" , trunc((sysdate-e.birthday)/365,0) "현재나이" , e.position "현재직급", 

g.position "예상직급"

2    FROM emp2 e JOIN p_grade g

3    ON trunc((sysdate-e.birthday)/365,0) BETWEEN g.s_age AND g.e_age ;



3. OUTER Join



오라클 아우터 조인은 Where 조건절에서 데이터가 없는 쪽에 (+) 표시를 추가

ANSI 아우터 조인구문에서 2번째 행을 보면 LEFT OUTER JOIN 이라는 구문이 있는데

ANSI 아우터 조인에서는 데이터가 존재하는 쪽에 표시를 하기 때문에 이런 구문을 사용  



Outer Join 예제 2 :

Student 테이블과 Professor 테이블을 Join 하여 학생이름과 지도교수 이름을 출력하세요.

단 지도학생이 결정 안 된 교수 명단과 지도 교수가 결정 안된 학생 명단을 한꺼번에 출력하세요.


- Oracle Outer Join 구문 :

SCOTT>SELECT s.name "학생이름" , p.name "교수이름"

2    FROM student s , professor p

3    WHERE s.profno(+) = p.profno

4    UNION

5    SELECT s.name "학생이름" , p.name "교수이름"

6    FROM student s , professor p

7    WHERE s.profno = p.profno(+) ;


- ANSI Full Outer Join 구문 :

SCOTT>SELECT s.name "학생이름" , p.name "교수이름"

2    FROM student s FULL OUTER JOIN professor p

3    ON s.profno = p.profno ;



4. SELF Join

하나의 테이블에 있는 데이터를 JOIN 하는 방법


SELF Join 예 )  dept2 테이블에서 DNAME 은 부서명 , PDEPT는 상위부서 입니다.

출력 하고자 하는 형태가 "경영지원부의 상위부서는 사장실이다" 라는 형태일 경우 원하는 데이터가 모두 dept2 

테이블에 있기 때문에 SELF 조인을 사용


왼쪽 테이블의 PDEPT 번호와 오른쪽 테이블의 DCODE 번호가 같은 부서가 상위부서 명입니다.

- Oracle Join 구문 :

SCOTT>SELECT a.dname "부서명" , b.dname "상위부서명"

2    FROM dept2 a , dept2 b

3    WHERE a.pdept = b.dcode ;


- ANSI Join 구문 :

SCOTT>SELECT a.dname "부서명" , b.dname "상위부서명"

2    FROM dept2 a JOIN dept2 b

3    ON a.pdept = b.dcode ;





- Oracle Join 구문 :

SCOTT>SELECT p.profno "교수번호" , p.name "교수명" , p.hiredate "입사일" , count(b.hiredate) "빠른사람"

2    FROM professor p , professor b

3    WHERE p.hiredate > b.hiredate (+)

4    GROUP BY p.profno , p.name, p.hiredate

5    ORDER BY 4 ;


- ANSI Join 구문 :

SCOTT>SELECT p.profno "교수번호" , p.name "교수명" , p.hiredate "입사일" , count(b.hiredate) "빠른사람"

2    FROM professor p LEFT OUTER JOIN professor b

3    ON p.hiredate > b.hiredate 

4    GROUP BY p.profno , p.name, p.hiredate

5    ORDER BY 4 ;

- Oracle Join 구문 :

SCOTT>SELECT a.empno "사원번호" , a.name "사원명" , a.hiredate "입사일" , count(b.hiredate) "먼저입사한사람수"

2    FROM emp a , emp b

3    WHERE a.hiredate > b.hiredate (+) 

4    GROUP BY a.empno , a.name, a.hiredate

5    ORDER BY 4 ;


- ANSI Join 구문 :

SCOTT>SELECT a.empno "사원번호" , a.name "사원명" , a.hiredate "입사일" , count(b.hiredate) "먼저입사한사람수"

2    FROM emp a LEFT OUTER JOIN emp b

3    ON a.hiredate > b.hiredate (+) 

4    GROUP BY a.empno , a.name, a.hiredate

5    ORDER BY 4 ;


반응형

'오라클 > SQL' 카테고리의 다른 글

sql 쿼리결과를 파일로 저장  (0) 2015.07.03
DML  (0) 2014.10.12
DDL  (0) 2014.10.12
그룹함수 (연습문제)  (1) 2014.10.08
복수행 함수 (그룹 함수)  (1) 2014.10.08
sql 단일행 함수 - 정규식  (2) 2014.10.01
sql 단일행 함수 - 일반 함수  (0) 2014.09.30
반응형

1. Professor 테이블을 사용하여 교수 중에서 급여(Pay) 와 보너스(bonus)를 합친 금액이 가장 많은 경우와 가장 적은 경우, 

평균 금액을 구하세요. 단 보너스가 없을 경우는 보너스를 0 으로 계산하고 출력 금액은 모두 소수점 첫째 자리까지만 출력


2. Professor 테이블을 사용하여 교수 중에서 급여(Pay) 와 보너스(bonus)를 합친 금액이 가장 많은 경우와 가장 적은 경우, 

평균 금액을 구하세요. 단 보너스가 없을 경우는 급여를 0 으로 계산하고 출력 금액은 모두 소수점 첫째 자리까지만 출력


3. student 테이블의 birthday 컬럼을 사용하여 아래와 같이 월별로 태어난 인원수를 출력

4. emp 테이블의 hiredate 컬럼을 참조해서 아래와 같이 월별로 입사인원수를 출력


5. student 테이블의 tel 컬럼을 참고하여 아래와 같이 지역별 인원수를 출력 

 단 02-서울, 031-경기, 051-부산 , 052-울산, 053-대구, 055-경남으로 출력


6. 먼저 emp 테이블에 아래의 두 건의 데이터를 입력 하신 후 작업하세요.

emp테이블을 사용하여 아래의 화면과 같이 부서별로 직급별로 급여 합계 결과를 출력

SQL>insert into emp(empno,deptno,ename,sal)

 2 values (1000,10,'홍길동',3600);


SQL>insert into emp(empno,deptno,ename,sal)

 2 values (2000,30,'일지매',3000);


SQL>commit;


7. emp 테이블을 사용하여 직업들의 급여와 누적급여 금액이 아래와 같도록 출력

 단 급여를 오름차순으로 정렬해서 출력


8. fruit테이블을 아래와 같은 형태로 출력


9. student 테이블의 tel컬럼을 사용하여 아래와 같이 지역별 인원수와 전체대비 차지하는 비율을 출력

(단 ,02-서울, 031-경기, 051-부산 , 052-울산, 053-대구, 055-경남으로 출력)


10. emp 테이블을 사용하여 아래와 같이 부서별로 급여 누적 합계가 나오도록 출력

 단 부서번호로 오름차순 출력


11. emp 테이블을 사용하여 아래와 같이 각 사원의 급여액이 전체 직원 급여총액에서 몇%의 비율을 차지하는지 출력 

 단 급여 비중이 높은 사람이 먼저 출력되도록 하시오


12. emp 테이블을 조회하여 아래와 같이 각 직원들의 급여가 해당 부서 합계금액에서 몇 %의 비중을 차지하는지를 출력

 단 부서번호를 기준으로 오름차순으로 출력



반응형

'오라클 > SQL' 카테고리의 다른 글

DML  (0) 2014.10.12
DDL  (0) 2014.10.12
JOIN 함수  (0) 2014.10.10
복수행 함수 (그룹 함수)  (1) 2014.10.08
sql 단일행 함수 - 정규식  (2) 2014.10.01
sql 단일행 함수 - 일반 함수  (0) 2014.09.30
sql 단일행 함수 - 형 변환 함수  (1) 2014.09.30
반응형

1. COUNT 함수

입력되는 데이터의 총 건수를 반환

SELECT COUNT (*) , COUNT(hpage)

FROM professor ;

COUNT(*) = NULL값 포함 결과

COUNT(hpage) = NULL값 제외한 결과 


2. SUM 함수

입력된 데이터들의 합계값을 구하는 함수



3. AVG 함수

입력된 데이터들의 평균값을 구하는 함수

※ 전체 평균을 구할 때 NULL 값이 있을 수도 있기에 NVL함수를 응용해서 구해줌


예) 전체 인원 16명, 보너스 받는인원 10명, 그대로 평균을 구해주면 보너스 총합에서 보너스 받는 인원만 나눠주기에

정확한 결과가 나오지 않는다. 그래서 NVL을 이용해서 보너스 받지않는 인원0 으로 해서 평균을 구해준다.



4. MAX / MIN 함수

MAX 함수 = 주어진 데이터 중에서 가장 큰 값을 돌려줌

MIN 함수 = 주어진 데이터 중에서 가장 작은 값을 돌려줌


SELECT MAX(SAL), MIN(SAL)                            SELECT MAX(hiredater), MIN(hiredate)

FROM emp;                                                     FROM emp;


MAX(SAL)   MIN(SAL)                                        MAX(HIREDATE)    MIN(HIREDATE)

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

       5000          800                                            23-MAY-87         17-DEC-80


날짜의 경우 최근 날짜가 크고 이전 날짜가 작다.



5. STDDEV 함수 / VARIANCE 함수

STDDEV 함수 = 표준편차 구하는 함수

VARIANCE 함수 = 분산 구하는 함수



특정 조건으로 세부적인 그룹화 하기 (GROUP BY 절 사용)

GROUP BY 절 사용시 주의사항

1. SELECT 절에 사용된 그룹함수 이외의 컬럼이나 표현식은 반드시 GROUP BY 절에 사용되어야 한다.

2. GROUP BY 절에 사용된 컬럼은 SELECT 절에 사용되지 않아도 된다.

3. GROUP BY 절에는 반드시 컬럼명이 사용되어야 하며 컬럼 Alias 는 사용하면 안된다.


조건을 주고 검색하기 (HAVING 절 사용)

그룹 함수를 비교 조건으로 사용하고 싶은 경우에 WHERE 절 대신 HAVING 절을 사용



자동으로 소계 / 합계를 구해주는 함수

1. ROLLUP 함수

ROLLUP 함수는 주어진 데이터들의 소계를 구해줌

       deptno ,position 컬럼으로 ROLLUP 한 경우


       deptno 컬럼으로 ROLLUP 한 경우                          position 컬럼으로 ROLLUP 한 경우



2. CUBE 함수

ROLLUP 함수와 같이 각 소계도 출력하고 전체 총계까지 출력

     deptno,position 컬럼으로 ROLLUP 한 경우



실전 그룹핑 관련 함수

1. GROUPING SETS 

그룹핑 조건이 여러 개 일 경우 유용하게 사용됨


  기존 방법은 따로 구한뒤 UNION 으로 묶었지만 GROUPING SETS 함수를 사용한 경우 간결하게 쿼리를 작성가능


2. LISTAGG 함수

출력 결과를 가로로 나열


LISTAGG(나열하고싶은 컬럼명,'데이터 구분할 문자') WITHIN GROUP(ORDER BY 가로로나열하고싶은 규칙)

LISTAGG(name,'**') WITHIN GROUP(ORDER BY hiredate) 

3.LAG 함수

이전 행 값을 가져 올 때 사용하는 함수

-문법:

LAG(출력할 컬럼명 , OFFSET , 기본 출력값)

 OVER(Query_partition구문 , ORDER BY 정렬할 컬럼)



4. LEAD함수

LAG 함수와 반대로 이후의 값을 가져오는 함수. LAG 함수와 방법은 동일하나 OFFSET 값이 마지막에 보인다.


5. RANK 함수 - 순위 출력 함수

집계용 - 단일조건 순위 출력

분석용 - 전체조건에서 순위 출력

집계용 문법 

-RANK(조건값) WITHIN GROUP(ORDER BY 조건값 컬럼명 [ASC|DESC])

예 ) 이름이 '송도권' 인 교수의 순위를 조회


분석용 문법 : RANK() 뒤가 WITHIN GROUP 에서 OVER 로 바뀜

-RANK() OVER(ORDER BY 조건컬럼명 [ASC|DESC]




6. SUM( ) OVER 를 활용한 누계 구하기










7. 판매 비율 구하기

RATIO_TO_REPORT 라는 함수를 사용하여 비율을 구할 수 있다.


예 ) panmae 테이블에서 100번 제품의 판매 내역과 각 판매점 별로 판매 비중을 구해보자




8. LAG 함수를 활용한 차이 구하기




반응형

'오라클 > SQL' 카테고리의 다른 글

DDL  (0) 2014.10.12
JOIN 함수  (0) 2014.10.10
그룹함수 (연습문제)  (1) 2014.10.08
sql 단일행 함수 - 정규식  (2) 2014.10.01
sql 단일행 함수 - 일반 함수  (0) 2014.09.30
sql 단일행 함수 - 형 변환 함수  (1) 2014.09.30
sql 단일행 함수 - 날짜 함수  (0) 2014.09.30
반응형

정규식 


정규 표현식



1. REGEXP_LIKE

like 함수처럼 특정 패턴과 매칭되는 결과를 검색하는 함수


사용 예 1.)

소문자 영문자가 들어있는 행 출력  - SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[a-z]') ;

대문자 영문자가 들어있는 행 출력  - SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[A-Z]') ;

대소문자 영문자가 들어있는 행 출력 - SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[a-zA-Z]') ; 


사용 예 2.)

소문자로 시작하고 뒤에 공백이 있는 모든 행 출력 

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[a-z]  ') ;


소문자로 시작하고 공백이 1칸 있고 숫자로 끝나는 행 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[a-z] [0-9]') ;


공백이 있는 모든 데이터를 찾고 싶은 경우

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[[:SPACE:]]') ;


사용 예 3.)

대문자가 연속적으로 2글자 이상오는 경우 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[A-Z]{2}') ;


대문자가 연속적으로 3글자 이상오는 경우 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[A-Z]{3}') ;


사용 예 4.)

시작 문자 지정 ^(캐럿) , 끝나는 문자 지정 $(달러)


시작을 대문자나 소문자로 하는 행 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'^[a-zA-Z]') ;


시작을 숫자나 대문자로 시작하는 행 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'^[0-9A-Z]') ;


여러가지 조건을 줄 경우 바 기호(|)  를 사용하여 연결 할 수도 있음

소문자로 시작하거나, 숫자로 시작하는 경우

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'^[a-z] | ^[0-9]') ; 


STUDENT 테이블에서 학생의 ID중 첫 글자가 s(소문자) 로 시작하고 두번째 글자가 a 나 t가 나오는 id 출력

SELECT name, id FROM STUDENT WHERE REGEXP_LIKE( id,'^s(a|t).') ;


소문자로 끝나는 모든 행 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[a-z]$') ;


^(캐럿)문자가 대괄호 안에 들어갈 경우에는 대괄호 안의 문자가 아닌 다른 것만 출력하라는 의미

소문자로 시작하지 않는 행을 모두 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'^[^a-z]') ;


STUDENT 테이블에서 학생의 id를 조사해 4번째 자리에 v(소문자) 가 있는 행을 출력

SELECT name, id FROM STUDENT WHERE REGEXP_LIKE( id,'^...v.') ;


특정 조건을 제외한 결과 출력  (NOT)

영문자(대소문자)를 포함하지 않는 행을 출력

SELECT * FROM reg_test WHERE NOT REGEXP_LIKE( text,'[A-Za-z]') ;


특수문자 찾기 

( '*' 나 '?' 같은 기호는 SQL에서 '모든것' 이라는 뜻을 가진 메타캐릭터 문자이기 때문에 \붙여줘야 한다.)


?가 들어간 행 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'\?') ;


?가 들어가지 않는 행 출력

- SELECT * FROM reg_test WHERE NOT REGEXP_LIKE( text,'\?') ;


소문자가 들어 있는 모든 행을 출력 (찾고자 하는 쿼리의 앞에 '*' 나 '?' 를 사용 뒤에 쓰면 적용X)

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'*[a-z]') ;

- SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'?[a-z]') ;



2. REGEXP_REPLACE 함수

REPLACE 함수의 확장 개념으로 주어진 문자열에서 특정 패턴을 찾아서 다른 모양으로 치환하는 함수



사용 예1.) 모든 숫자를 특수 기호로 변경

숫자 부분을 '@' 기호로 변경

SELECT text , REGEXP_REPLACE( text,'[[:digit:]]','@')  FROM reg_test ;


사용 예2.) 특정 패턴을 찾아서 패턴을 변경

숫자를 찾아서 숫자 뒤에 '-*' 을 추가

SELECT text , REGEXP_REPLACE( text,'[0-9]','\1-*')  FROM reg_test ;


reg_test2 테이블에서 ip의 .(dot) 부분을 모두 삭제하고 출력

- SELECT no, ip, REGEXP_REPLACE(ip,'\.','') FROM reg_test2 ;


reg_test2 테이블에서 ip의 첫번째 .(dot) 부분을 '/' (슬래쉬) 기호로 변경해서 출력

- SELECT no, ip, REGEXP_REPLACE(ip,'\.','/',1,1) FROM reg_test2 ;



사용 예3.) 사용자에게 입력 받은 문자가운데 공백이 여러 개 들어있을 경우 그 공백을 제거 하는 방법 (중요)

사용자가 ID를 'abc 123' 이렇게 입력했을 경우 'abc' 와 '123' 사이의 공백을 없애고 싶은 경우

- SELECT REGEXP_REPLACE('abc  123','( ){1,}','') FROM dual ;


위 예제에서 {1,} 부분을 {1}로 해도 무방

{} 내의 숫자는 앞문자가 나타나는 횟수 또는 범위를 의미

예를 들어 a{5} 'a' 의 5번 반복인 aaaaa

              a{3,} 는 'a'가 3번 이상 반복인 aaa , aaaa , aaaaa ... 등을 의미

              a{3,5} 는 aaa , aaaa , aaaaa 를 의미

              ab{2,3} 은 뒤의 b가 2번, 3번 반복된 형태로 abb , abbb 를 의미

              {,}를 붙이면 이상을 의미

               


사용 예4.) 사용자가 검색어를 입력할 때 공백 문자를 가장 먼저 입력하고 아이디 중간에도 공백이 있어서 모든 공백을 제거하는 예

아이디 입력시 : (공백)  75   true 를 입력하였을때 중간 중간 공백을 모두 제거하는 방법

- SELECT studno,name,id FROM student WHERE id=REGEXP_REPLACE('&id','( ){1,}','') ;

 Enter Value for id :         75       true



3. REGEXP_INSTR 함수

특정 패턴이 출현하는 첫 위치 값을 반환하는 함수


사용 예1.) 특정 문자의 위치를 찾는 방법

text 중에서 '*' 의 위치를 찾는 방법

- SELECT text, REGEXP_INSTR(text,'\*') FROM reg_test ;



4. REGEXP_SUBSTR 함수

SUBSTR 함수의 확장판으로 특정 패턴에서 주어진 문자를 추출해 내는 함수


'abc* *def %ghi,jkl' 이란 문자열에서 첫 글자가 공백이 아니고 ('[^ ]') 그 후에 'def'가 나오는 부분을 추출

- SELECT REGEXP_SUBSTR('abc* *def %ghi,jkl' , '[^ ]+[def]') FROM dual ;



5. REGEXP_COUNT 함수

특정 문자의 개수를 세는 함수


주어진 문자열에서 소문자 'a'가 몇개인지 찾아 주는 예

- SELECT text, REGEXP_COUNT(text,'a') FROM reg_test ;

반응형

'오라클 > SQL' 카테고리의 다른 글

JOIN 함수  (0) 2014.10.10
그룹함수 (연습문제)  (1) 2014.10.08
복수행 함수 (그룹 함수)  (1) 2014.10.08
sql 단일행 함수 - 일반 함수  (0) 2014.09.30
sql 단일행 함수 - 형 변환 함수  (1) 2014.09.30
sql 단일행 함수 - 날짜 함수  (0) 2014.09.30
sql 단일행 함수 - 숫자함수  (0) 2014.09.30
반응형

1. NVL 함수  

NULL 값을 만나면 다른 값으로 치환해서 출력하는 함수

NVL(칼럼, 치환할 값)


※치환 값이  숫자일 경우

NVL(sal, 0) -> sal 칼럼의 값이 null 일 경우 null 대신 0 으로 치환

NVL(sal, 100) -> sal 칼럼의 값이 null 일 경우 null 대신 0 으로 치환


※치환 값이 문자일 경우

NVL(position, '사원') -> position 값이 null 일 경우 '사원'으로 치환


※치환 값이 날짜일 경우

NVL(hiredate, '2014/05/01') -> hiredate 값이 null 일 경우 '2014/05/01' 날짜로 치환



NVL 함수 퀴즈

Professor 테이블에서 201번 학과 교수들의 이름과 급여, bonus, 총연봉을 아래와 같이 출력

단 총연봉은 (pay*12+bonus)로 계산하고 bonus 가 없는 교수는 0으로 계산


SELECT profno, name, pay, bonus, TO_CHAR(pay*12+NVL(bonus,0)) "총연봉" 

2 FROM professor 

3 WHERE deptno=201


NVL2 함수

NVL 함수의 확장판으로 NULL 값이 아닐 경우 출력할 값을 지정할 수 있음

NVL2( COL1, COL2, COL3)

= COL1 의 값이 NULL 이 아니면 COL2를, NULL 이면 COL3 을 출력


NVL2 함수 퀴즈

아래 화면과 같이 emp 테이블에서 deptno 가 30 번인 사원들을 조회하여 comm 값이 있을 경우 '상여금 있음' 을 출력하고 comm 값이 null 일 경우 '상여금 없음' 을 출력


SELECT empno,ename,comm,NVL2(comm,'상여금 있음','상여금 모름') "NVL2"

2 FROM emp

3 WHERE deptno=30

3. DECODE 함수


유형 1. A 가 B 일 경우 '1' 을 출력

-DECODE( A, B, '1', null) (단, 마지막 null은 생략 가능)



유형 2. A 가 B 일 경우 '1' 을 출력하고 아닐 경우 '2' 를 출력

-DECODE( A, B, '1', '2')


유형 3. A 가 B 일 경우 '1' 을 출력하고 A 가 C 일 경우 '2' 를 출력하고 둘 다 아닐 경우 '3' 을 출력

-DECODE ( A, B, '1', C, '2', '3' )


유형 4. A 가 B 일 경우 중에서 C 가 D 를 만족하면 '1' 을 출력하고 C 가 D 가 아닐 경우 NULL 을 출력

-DECODE ( A, B, DECODE( C, D, '1', null) )   null은 생략 가능


유형 5. A 가 B 일 경우 중 C 가 D 를 만족하면 '1'을 출력 C 가 D가 아닐 경우 '2' 를 출력

-DECODE ( A, B, DECODE( C, D, '1', '2,'))




답> SELECT name,jumin,DECODE(substr(jumin,7,1),1,' 남자','여자 ') "성별"

2  FROM student

3  WHERE deptno1=101 ;



답> SELECT name "이름",tel "연락처",DECODE(substr(tel,1,instr(tel,')')-1),02,'서울',031,'경기',051,'부산',052,'울산',055,'경남') "지역"

2 FROM student

3 WHERE deptno1=101


4. CASE 문

CASE 조건 WHEN 결과1 THEN 출력1

                [WHEN 결과2 THEN 출력2]

     ELSE 출력3

END " 칼럼명"

※DECODE 함수의 경우 함수 내부에 , 로 조건들이 구분 되었으니 CASE 표현식 내부는 콤마가 사용되지 않음


답> SELECT empno, ename, sal,

CASE WHEN (sal) between 1 and 1000 then 'level 1'

when (sal) between 1001 and 2000 then 'level 2'

when (sal) between 2001 and 3000 then 'level 3'

when (sal) between 3001 abd 4000 then 'level 4'

else 'level 5'

END "LEVEL"

from emp

order by sal desc;



반응형

'오라클 > SQL' 카테고리의 다른 글

그룹함수 (연습문제)  (1) 2014.10.08
복수행 함수 (그룹 함수)  (1) 2014.10.08
sql 단일행 함수 - 정규식  (2) 2014.10.01
sql 단일행 함수 - 형 변환 함수  (1) 2014.09.30
sql 단일행 함수 - 날짜 함수  (0) 2014.09.30
sql 단일행 함수 - 숫자함수  (0) 2014.09.30
sql 단일행 함수 - 문자함수  (3) 2014.09.29
반응형

char

고정길이

최대 2000byte


varchar2 

가변길이 

      최대 4000byte


number (p,s)

  p는 전체 자리수로 1-38가지 가능

  s는 소수점 이하 자리수로 -84 ~ 127

  123.45 = NUMBER(5,2)

날짜 - date


1. 묵시적(자동) 형 변환과 명시적(수동) 형 변환

묵시적 - 오라클이 자동으로 형 변환을 시킴

SELECT 2+'2' FROM dual ;

 = '2' 문자를 숫자로 자동으로 형 변환해 계산함

명시적 - 사용자가 수동으로 지정해 주어야 함


2. TO_CHAR 함수 (날짜 -> 문자로 형 변환)

년도 

YYYY - 연도를 4자리로 표현

RRRR - 2000년 이후 Y2K 버그로 인해 등장한 날짜 표기법, 4자리 연도 표기

YY - 연도를 끝에 2자리만 표시 예 : 14

RR - 연도를 마지막 2자리만 표시 예 : 14

YEAR - 연도의 영문 이름 전체를 표시


MM - 월을 숫자 2자리로 표현 예 : 10

MON - 유닉스용 오라클에서 월을 뜻하는 영어 3글자로 표시 예 : OCT

MONTH - 월을 뜻하는 이름 전체를 표시


DD - 일을 숫자 2자리로 표시 예 : 26

DAY - 요일에 해당하는 명칭을 표시 유닉스=영문 , 윈도우=한글

DDTH - 몇 번째 날인지 표시


시간 

HH24 - 하루를 24시간으로 표시

HH - 하루를 12시간으로 표시

MI - 분 표시

SS - 초 표시


형 변환 함수 퀴즈 - 날짜 변환하기 1

Student 테이블의 bitrthday 칼럼을 사용하여 생일이 1월인 학생의 이름과 birthday 를 아래 화면과 같이 출력


SELECT studno,name,birthday

2  FROM student

3  WHERE TO_CHAR(birthday,'mm')=1;


형 변환 함수 퀴즈 - 날짜 변환하기 2

emp 테이블의 hiredate 칼럼을 사용하여 입사일이 1,2,3 월인 사람들의 사번과 이름, 입사일을 출력


SELECT empno,ename,hiredate

2  FROM emp

3  where TO_CHAR(hiredate,'mm') IN (1,2,3) ;


3. TO_CHAR 함수 (숫자형 -> 문자형으로 변환하기)


예1. emp 테이블을 조회하여 이름이 'ALLEN' 인 사원의 사번과 이름과 연봉을 출력하세요.

단 연봉은 (sal*12)+comm 로 계산하고 천 단위 구분기호로 표시하세요


예2. professor 테이블을 조회하여 201 번 학과에 근무하는 교수들의 이름과 급여, 보너스, 연봉을 출력

단 연봉은 (pay12)+bonus로 계산


형변환 함수 퀴즈 3

emp 테이블을 조회하여 comm 값을 가지고 있는 사람들의 empno, ename, hiredate, 총연봉, 15% 인상 후 연봉을 아래 화면처럼 출력, 단 총 연봉은 (sal*12)+comm 으로 계산. 15%인상은 총연봉의 15%인상 값 


SELECT empno,ename,to_char(sysdate,'yy-mmdd') "HIREDATE",

2 TO_CHAR((sal*12)+comm,'$999,999') "SAL" ,

3 TO_CHAR(((sal*12)+comm)*0.15+(sal*12)+comm,'$999,999') "15% up"

4 FROM emp

5 WHERE comm is not null ;


4. TO_NUMBER 함수

숫자가 아닌 숫자처럼 생긴 문자를 숫자로 바꾸어 주는 함수

SELECT TO_NUMBER('5') FROM dual; = 5


5. TO_DATE 함수

날짜가 아닌 날짜처럼 생긴 문자를 날짜로 바꾸어 주는 함수

SELECT TO_DATE ('14-MAR-10') FROM dual ; = 14-MAR-10

















반응형

'오라클 > SQL' 카테고리의 다른 글

복수행 함수 (그룹 함수)  (1) 2014.10.08
sql 단일행 함수 - 정규식  (2) 2014.10.01
sql 단일행 함수 - 일반 함수  (0) 2014.09.30
sql 단일행 함수 - 날짜 함수  (0) 2014.09.30
sql 단일행 함수 - 숫자함수  (0) 2014.09.30
sql 단일행 함수 - 문자함수  (3) 2014.09.29
sql select문  (0) 2014.09.29
반응형

1. SYSDATE 함수

현재 시스템의 시간을 출력해 주는 함수

SELECT SYSDATE FROM dual ;      미국 기준으로 시간이 출력됨

alter session set NLS_DATE_FORMAT='YYYY-MM-DD:HH24:MI:SS'; 해주면 한국에서 익숙하게 표기


2. MONTHS_BETWEEN 함수

두 날짜를 입력 받아서 두 날짜 사이의 개월 수를 출력하는 함수

SELECT MONTHS_BETWEEN('14/05/31','14/04/30')

FROM dual;

= 1

1) 두 날짜 중 큰 날짜를 먼저 써야 양수가 나옴

2) 두 날짜가 같은 달에 속해 있으면 특정 규칙으로 계산된 값이 나옴

※ 윤달을 구분하지 못함, 리눅스에서 사용할 때는 NLS_DATE_FORMAT 을 이용해 날짜 형태 변경


3. ADD_MONTHS 함수

주어진 날짜에 숫자만큼의 달을 추가 하는 함수

- SYSDATYE,ADD_MONTHS(SYSDATE,1)

FROM dual ;

SYSDATE   ADD_MONT

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

14/05/26     14/06/26


4. NEXT_DAY  함수

주어진 날짜를 기준으로 돌아오는 가장 최근 요일의 날짜를 반환해주는 함수

SELECT SYSDATE , NEXT_DAY(SYSDATE,'MON') NEXT_DAY

FROM dual ;

SYSDATE           NEXT_DAY

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

28-APR-11        02-MAY-11


5. LAST_DAY 함수

주어진 날짜가 속한 달의 가장 마지막 날을 출력해주는 함수

SELECT SYSDATE , LAST_DAY(SYSDATE) "LAST_DAY"

FROM dual ;

SYSDATE        LAST_DAY

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

28-APR-11     30-APR-11

6. 날짜의 ROUND, TRUNC 함수

ROUND - 하루의 절반에 해당 되는 낮 12:00 를 기준으로 12:00 지나면 다음 날짜로 출력 이 시간이 안될 경우 당일로 출력

TRUNC - 무조건 당일 출력

반응형

'오라클 > SQL' 카테고리의 다른 글

복수행 함수 (그룹 함수)  (1) 2014.10.08
sql 단일행 함수 - 정규식  (2) 2014.10.01
sql 단일행 함수 - 일반 함수  (0) 2014.09.30
sql 단일행 함수 - 형 변환 함수  (1) 2014.09.30
sql 단일행 함수 - 숫자함수  (0) 2014.09.30
sql 단일행 함수 - 문자함수  (3) 2014.09.29
sql select문  (0) 2014.09.29

+ Recent posts