천객만래 [千客萬來] (It has an interminable succession of visitors)

[자기경영] 아는자와 걷는자의 차이를 아는가?









영화 [Matrix] 에서...

네오가 모피어스를 구하고 추락하는 헬기에서 트리니트마저 구해 올리자,
모피어스는 더욱 확신에 찬 어조로 다음과 같이 말한다.

Morpheus
 : (to Trinity) Do you belive it now, Trinity? [이젠 믿겠나 트리니티?]

Neo
 : Morpheus, The Oracle, She told me...[모피어스, 오라클 그녀가 말하길...]

Morpheus
 : She told you exactly what you need to here. That 's all. Neo, it is simulated you're going to be reallized. She has just designed it. It's difference between knowing the path and walking the path.[그녀는 네게 꼭 필요한 것을 말한 것 뿐야. 너는 곧 깨닫게 되어 있어. 길을 아는자와 걷는자의 차이를 말야]

주위를 살펴보면 답을 알고 있거나 아는 척하는 사람은 부지기수다. 하지만 이론을 바탕으로 내면의 깨우침을 통해 직접 실행에 옮기는 사람은 얼마나 될까?

경험도 자신의 자산이라고 본다면, 책을 통한 간접경험이든 몸으로 부딪혀 얻은 직접적인 경험이든, 나이에 상관없이 자신의 꿈을 재설계하고 그 꿈을 쫒아 가는 자가 진정 걷는자가 아닐까? 아니면 이젠 나이값 좀 하라는 주의의 충고를 들어야 하는 철이 덜든 놈 이거나?


걷는자는
진정한 용기를 가진 
꿈에 대한 굳은 신념의 소유자가 아닐까...

아는자는 몽상가,이상주의이고 걷는자는 행동주의 실천가.
아는자는 단면을 알고 걷는자는 내면을 안다



Posted by SB패밀리

SQL EDITOR상에서의 편리한 단축키 

ESC: 열린 윈도우 닫기 
F1: 모든 단축키를 보여준다. 
F2: FULL SCREEN 
F4: Table, View, Proc, Funct, Package를 DESC(테이블명에 커서를 둔 상태에서 해야함) 
F6: SQL Editor와 결과창간의 전환 
F7: 화면을 모두 CLEAR 
F8: 실행했던 SQL들의 HISTORY 
F9: 모든 쿼리 실행(Ctrl+Enter는 현재 쿼리만 실행) 
Ctrl+F9: 실제 쿼리를 실행하지 않고 validate함 
Ctrl+. : table Completion (매칭되는 테이블목록 출력) 
Ctrl+T : Columns Dropdown (해당테이블의 컬럼목록 표시) 
Alt+Up : History Up (리눅스 bash의 UP키와 같다.) 
Alt+Down: History Down (리눅스 bash의 DOWN키와 같다.) 
Ctrl+Tab: MDI Child윈도간 전환 

그냥 'desc 테이블명' 을 치면, 팝업윈도로 해당 테이블의 컬럼목록윈도가 표시된다. 
이때, 해당 컬럼을 double-click하면 SQL Editor로 반영된다. 

"테이블명."까지 입력하고 좀 있으면, 해당 테이블의 컬럼목록이 표시된다. 
마치 프로그래밍툴에서 클래스내 멤버들의 목록을 표시하듯이.. 
Ctrl+T는 출력된 목록을 취소했을 경우, 다시 불러낼때 쓰인다. 

test, member 2개의 테이블이 있다고 하자. 
select * from t까지 입력하고 Ctrl+.를 치면 select * from test로 테이블명을 완성시켜준다. 
system계정에서는 안되더군.. 일반계정만 가능했다. 

SQL문을 실행시 

Ctrl+Enter 
현재 커서의 SQL문 실행 
여러개의 SQL문이 있을때, SQL문들을 개행문자로 분리해주면 된다. 
해당 커서에서 개행문자가 있는 곳까지만 하나의 SQL문으로 간주한다. 

F9 
SQL Editor의 SQL문 실행하여 Grid에 출력. 
여러 SQL문들을 개행문자로 구분하지 않는다는 것을 제외하면, 위의 Ctrl+Enter와 동일하다. 
에디터내의 모든 SQL문은 하나로 취급하므로, 여러 개의 SQL문이 있으면 실행할 SQL문만 Selection하여 실행(F9)해준다. 

F5 
SQL Editor내의 모든 SQL문 실행. 여러개의 SQL문들을 모두 실행하여 SQL*PLUS와 같이 출력해준다. 
이것은 출력이 Grid로 표시되지 않고 Editor윈도에 표시되므로, SQL*PLUS의 출력과 같이, 
다른 편집기로의 복사/붙여넣기 할때 사용하면 유용하다.

Posted by SB패밀리


[PHP/DB] Database, MySQL 이란 무엇인가


http://www.nzeo.com/bbs/zboard.php?id=p_study&page=2&sn1=&divpage=1&category=67&sn=off&ss=on&sc=off&select_arrange=headnum&desc=asc&no=42000-03-06 03:21:32

우선 PHP문법에 들어가기 전에 간단하게 Database에 대해서 이야기하겠습니다.
얼마전까지만 해두 CGI라구 하면 펄을 생각하게 되었구 오라클이나 MySQL같은 DBMS(데이터베이스 관리시스템 : Database Management System)은 최소한 웹상에서는 들리지 않았습니다.
그런데 PHP라는 CGI 프로그래밍 언어가 등장하면서 DB라는 이야기가 많이 들리게 되었습니다.
그럼 왜 PHP는 펄과는 다르게 DB를 이용하는지, 그리고 이 DB가 무엇인지 간단히 이야기하겠습니다.
데이터 베이스는 데이터를 모아둔 것입니다.
예를 들면 학교 도서관의 도서 데이터베이스가 있겠죠.
즉, 도서관에 어떤 책이 들어왔는지, 그 책들의 작가는 누군인지, 누가 대여해갔는지 하는것들이 모두 데이터베이스 안에 들어있겠죠.
이런 데이터들은 가만히 있는 것이 아닙니다.
새로 책들이 들어왔을수도 있고, 폐기되었을수도 있죠. 누가 빌려갈수도, 반납할수도 있는겁니다.
즉, 데이터베이스는 이러한 요인들에 의해서 저장된 데이터를 변경할수 있어야 하죠.
이렇게 데이터베이스를 만들고 관리하는등의 일을 하는 프로그램들을 데이터베이스 관리 시스템 (Database Managemenu System)이라고 합니다.
이 데이터베이스 관리 시스템이 하는일은 데이터를 저장하고 삭제하는 등의 일과 이 데이터들로부터 원하는 정보를 효율적이고 빠른 방법을 제공하는 것이겠죠.
이렇게 데이터베이스에서 데이터를 관리하기 위해서 데이터베이스에 명령을 전달하게 하는 언어를 데이터베이스 관리언어(DBME)라고 합니다.
DBME는 Query라는 데이터베이스 관리 프로그램의 언어를 이용해서 데이터를 관리하게 됩니다.
이런 데이터베이스 관리시스템들은 다양한 종류가 있습니다.
공개되어 있는, 그리고 우수한 성능을 가지고 있어서 널리 알려진 MySQL도 있구, 상용인 오라클도 있고, 그외에 mSQL, PostgreSQL등도 있습니다.
우리가 사용할 MySQL은 무료로 쓸수 있게 공개된 관계형 데이터베이스로서 일반 상용에 비해서 별루 뒤질것이 없는 좋은 프로그램입니다.
안정성 및 무결성의 측면에서 여타 상용 데이터베이스에 비해서 떨어진다고는 한다지만 관리만 잘하면 매우 유용하게 사용할수 있습니다.
MySQL의 주요목표는 속도, 뛰어난 수행능력 그리고 사용의 편리함입니다.
처음에 MySQL은 TcX 내부에서 자체적으로 사용할 목적을 가지고 만들어졌다고 합니다.
TcX는 1996년부터 MySQL을 사용해 왔으며 현재 700만 레코드이상되는 500개 이상의 테이블(100기가 바이트 이상)이 주요업무에 사용되고 있다고 하니 어느정도의 중소업체에서도 충분히 사용할 수가 있습니다.
데이터 베이스 관리 시스템이 어떠한 식으로 데이터를 관리하는지에 대해서는 언급하지 않겠습니다.
물론 저도 잘 모릅니다.
그럼 직접적으로 우리가 알아야 하는 것을 이야기하겠습니다.
보통 MySQL을 지원하는 계정에서는 회원들에게 하나의 DB를 줍니다.
근데 잘 모르는 분덜은 왜 하나만 주나, 나는 게시판 여러개 하구 방명록도 DB를 이용하는 넘으로 할건데~ 하구 의아해하시는 분덜이 계실겁니다.
결과부터 말하자면 하나의 DB안에는 많은 수의 게시판이나 방명록등의 데이터를 저장할수 있습니다.
DB를 이용하는 PHP 게시판들은 데이터를 테이블에 저장합니다.
이 테이블은 하나의 DB안에 무한정은 아니지만 MySQL이 허락하는한 만들수 있습니다.
MySQL과 같은 관계형 데이터베이스는 모든 데이터를 테이블과 같은 형태로 나타내어 저장합니다.
테이블에 대해서 간단히 이야기하겠습니다.
일반적으로 보통 표라는 것을 많이 이용합니다.
시간표 같은것 말입니다.
예를 들문 시간표는 가로줄을 요일, 세로줄을 시간으로 해서 만들면 매우 편하게 만들수가 있습니다.
데이터베이스도 마찬가지입니다. 저장되는 데이터를 테이블(표)와 같은 형식으로 저장하고 관리를 합니다.
여러가지의 속성을 가진 대상들의 데이터를 테이블의 형태로 만드는 것입니다.
시간표를 예를 들면 월, 화, 수요일등과 같은 대상의 속성을 정의하여 만든 틀을 스키마라고 합니다.
만약 학생의 예를 들면 학생=(이름, 학번, 학과, 학점) 등과 같은 스키마를 가지게 만들수 있습니다.
게시판을 예로 들자면 게시판=(번호, 글쓴이, 메일주소, 홈페이지 주소, 제목, 내용, 조회수, 글쓴날자)등과 
같이 스키마를 만들수 있겠죠.
이런 스키마의 틀로 이루어진 테이블을 가지고 php 게시판등에서는 데이터를 저장, 삭제, 수정하는등의 관리를 하게 됩니다.
사실  PHP로 DB를 이용하는 CGI 프로그램을 만들기 위해서는 이 정도의 개념만 잡혀 있으면 충분하다고 봅니다.
그만큼 PHP 자체내에서 DB를 쉽게 이용하게 할수 있는 함수들이 제공되고, 또 MySQL의 Query문도 매우 쉽기 때문입니다.

참고로 PHP를 사용하는데 있어서 아파처서버가 권장됩니다.
A.P.M 이라는 말을 들어보셨는지요.
Apache , PHP, MySQL이라는 말입니다.
원래 PHP가 아파치서버와 MySQL을 배경으로 해서 만들어졌다고 합니다.

Posted by SB패밀리

오라클 테이블 존재여부 확인하기 


오라클 테이블 존재 여부 알아보기
-- table_name은 대문자로만 저장되기 때문에 찾을 문자열을 대문자로 바꿔서 비교해야 한다



SQL>SELECT TABLE_NAME 
        FROM USER_TABLES
        WHERE TABLE_NAME = UPPER('찾을 테이블 이름')

Posted by SB패밀리

오라클 에서 사용되는 sql문 정리



== SQL*Plus 기본 활용 방법 ==


1. SQL 명령어는 다음과 같이 기술한다. 
l        SQL 명령어는 한 줄 혹은 여러 줄에 기술한다.

l        일반적으로 절들은 수정하기 쉽게 다른 줄에 기술한다.

l        TAB 을 사용할 수 있다.

l        SQL 명령어 단어는 생략하거나 분리할 수 없다.

l        SQL 명령어는 대소문자를 구분하지 않는다.

l        SQL 명령어는 ; 으로 종료한다.

l        SQL 명령어는 SQL BUFFER 에 저장된다.

l        SQL BUFFER 에 저장된 SQL 명령어는 / 혹은 RUN 으로 실행할 수 있다.


2. SQL*PLUS 명령어는 다음과 같이 기술한다.

l        SQL*PLUS 명령어는 기본적으로 한 줄에 기술한다.

l        SQL*PLUS 명령어는 대소문자를 구별하지 않는다.

l        SQL*PLUS 명령어는 SQL BUFFER 에 저장되지 않는다.


3. SQL*PLUS 명령어

l        DESCRIBE table명 : TABLE 의 구조를 보여준다.

l        SAVE file명 : SQL BUFFER 를 file 로 저장한다.

l        START file명 : file 을 수행한다.

l        @ file명 : file 을 수행한다.

l        EDIT file명 : EDITOR 를 사용하여 file 을 편집한다.

l        SPOOL file명 : QUERY 결과를 file 에 저장한다.

l        SPOOL OFF : SPOOL FILE 을 닫는다.

l        HOST : SQL*PLUS 를 떠나지 않고 HOST 상태로 간다.

l        HELP 명령어 : SQL, SQL*PLUS, PL/SQL 에 대한 HELP 를 보내준다.

l        EXIT : SQL*PLUS 를 종료한다.

 




 

1. 데이터의 검색


1-1. 전체 데이타의 검색

가장 간단한 SELECT 문장의 형식은 다음과 같다.

SELECT 절에는 검색하고 싶은 COLUMN 명들을 기술한다.

FROM 절에는 SELECT 절에서 기술된 COLUMN 명들이 포함된 TABLE 명을 기술한다.

TABLE 의 모든 ROW 와 모든 COLUMN 을 검색한다.

u         SELECT * - FROM table명 ;


[예제1-1] S_DEPT TABLE 로부터 모든 ROW 와 COLUMN 을 검색하시오.

SELECT * FROM S_DEPT ;

 

1-2. 특정 column의 검색

SELECT 절에서 검색하고자 하는 COLUMN 명을 COMMA 를 사용하여 나열한다.

COLUMN 순서는 검색하고 싶은 순서대로 나열한다.

COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다.

u         SELECT column명, column명, column명,.. - FROM table명 ;


[예제1-2] S_EMP TABLE 로부터 ID, LAST_NAME, START_DATE 를 검색하시오.

SELECT ID, LAST_NAME, START_DATE FROM S_EMP ;

 

1-3. 산술식을 사용한 검색

산술 연산자를 사용하여 검색되는 데이타 값을 변경할 수 있으며 산술 연산식은 COLUMN 명, 상수 값, 산술 연산자로 구성됨.

u         SELECT 산술연산식 - FROM table명 ;


[예제1-3] S_EMP TABLE 로부터 ID, LAST_NAME, 연봉을 검색하시오.

(연봉은 SALARY * 12 로 계산한다. (+,-,*,/,())

SELECT ID, LAST_NAME, SALARY * 12 FROM S_EMP ;

 

1-4. Column alias ( AS )

기본적으로 COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다. 그러나 많은 경우 COLUMN 명이 이해하기 어렵거나 무의미하기 때문에 COLUMN ALIAS 를 사용하여 COLUMN HEADING 을 변경할 수 있다.

ANSI SQL 92 와 호환을 위해 ALIAS 앞에 AS 를 붙일 수 있다.

ALIAS 에 공백이나 특수문자가 포함되거나 대소문자를 구별하고 싶으면 " " 로 막아준다.

COLUMN ALIAS 를 사용하여 COLUMN HEADING 을 변경할 수 있다.

u         SELECT column명 alias, column명 "alias", column명 as alias - FROM table명 ;


[예제1-4] S_EMP TABLE 에서 LAST_NAME, (SALARY + 100) * 12, DEPT_ID 를 검색하시오. (단, COLUMN ALIAS 는 Employee, ANNUAL_SALARY, DEPARTMENT NO 로 정의하시오.)

SELECT LAST_NAME "Employee", (SALARY + 100) * 12 AS ANNUAL_SALARY,

DEPT_ID "DEPARTMENT NO"

FROM S_EMP ;

 

1-5. Column의 결합 ( || )

COLUMN 과 다른 COLUMN, 산술연산식, 상수 값과 결합하여 하나의 COLUMN 으로 결합할 수 있다.

u         SELECT column명|| column명 - FROM table명;


[예제1-5] S_EMP TABLE 에서 FIRST_NAME 과 LAST_NAME 을 결합하여 ALIAS EMPLOYEE 로 검색하시오.

SELECT FIRST_NAME || LAST_NAME EMPLOYEE  FROM S_EMP ;

 

1-6. Null값 처리 ( NVL )

특정 COLUMN 에 값이 입력되어 있지 않을 때, 그 값이 NULL 이며, NULL 값이 산술 연산식에 포함되면 그 결과도 NULL 이다.

NULL 값은 0 이나 공백과 같지 않다. 그러므로 NVL FUNCTION 을 사용하여 NULL 값을 다른 값으로 대체하여야 한다.

NULL 값을 다른 값으로 대체.

u         NVL (number_column, 9),

u         NVL (date_column, '01-JAN-95'),

u         NVL (character_column, 'ABCDE')


[예제1-6] S_EMP TABLE 에서 LAST_NAME, COMMISSION 값을 검색하시오.

(COMMISSION 은 SALARY * COMMISSION_PCT /100 으로 계산하시오.)

SELECT LAST_NAME, SALARY * NVL(COMMISSION_PCT,0) /100 COMMISSION

FROM S_EMP ;

 

1-7. 중복 row의 제거 ( DISTINCT )

SELECT 결과 값에 중복된 값이 있을 때 중복을 피하고 UNIQUE 하게 검색한다. 중복된 ROW 를 제거한다.

u        SELECT DISTINCT column명, column명 - FROM table명;


[예제1-7] S_DEPT TABLE 에서 NAME 이 중복되지 않게 검색하시오.

SELECT DISTINCT NAME  FROM S_DEPT ;

 

1-8. 데이타의 정렬 ( ORDER BY )

SELECT 되는 ROW 의 순서는 알 수 없다. 그러므로 ROW 를 SORT 하고 싶으면 ORDER BY 절을 사용하여야 한다.

DATA 의 DEFAULT SORT 순서는 ASCENDING 이며 다음과 같다.

l        숫자 : 1 에서 999 순으로 SORT 한다. ? 날짜 : 01-JAN-92 에서 01-JAN-95 순으로 SORT 한다.

l        문자 : A 에서 Z 순서로 SORT 한다. ? NULL : ASC 순에서는 뒤에, DESC 순에서는 앞에 나온다.

역순으로 SORT 하고 싶으면 COLUMN 명 뒤에 DESC 를 붙인다.

COLUMN 명 대신에 ALIAS 혹은 SELECT 한 COLUMN 의 순서로 지정할 수도 있다.

u        SELECT expr - FROM table명 - ORDER BY {column명, expr} [ASC|DESC] ;


[예제1-8] S_EMP TABLE 에서 LAST_NAME, DEPT_ID, START_DATE 를 LAST_NAME 순으로 검색하시오.

SELECT LAST_NAME, DEPT_ID, START_DATE

FROM S_EMP ORDER BY LAST_NAME ;

 

 


1-9. 특정 row의 검색 ( WHERE )

WHERE 절에서 조건식을 기술하여 조건을 만족하는 ROW 만 검색할 수 있다.

조건식은 COLUMN 명, COMPARISON OPERATOR, VALUE 로 구성되어 있다.

문자 값은 ' ' 으로 묶어주고 값의 대소문자를 구별하여 적어준다. 날짜 값은 ' ' 으로 묶어주고 지정된 날짜 형태로 적어준다. '01-MAR-97', 숫자값은 값만 적어주며 특정 ROW 만 검색한다.

u        SELECT expr - FROM table명 - WHERE expr operator value


[예제1-9] S_EMP TABLE 에서 LAST_NAME 이 Magee 인 사원의 FIRST_NAME, LAST_NAME, TITLE 을 검색하시오. (=,>,<,>=,<=,<>)

SELECT FIRST_NAME, LAST_NAME, TITLE

FROM S_EMP WHERE LAST_NAME = 'Magee' ;

 

1-10. 범위 지정검색 ( Between...and )

BETWEEN OPERATOR 를 사용하여 범위를 지정할 수 있다. 범위를 지정할 때는 작은 값을 먼저 큰 값을 나중에 지정한다.

두 범위의 한계 값을 포함한다.

u        BETWEEN...AND... - NOT BETWEEN...AND...


[예제1-10] S_EMP TABLE 에서 START_DATE 가 09-MAY-91 에서 17-JUN-91 사이에 입사한 사원의 FIRST_NAME, LAST_NAME, START_DATE 를 검색하시오.


SELECT FIRST_NAME, LAST_NAME, START_DATE

FROM S_EMP WHERE START_DATE BETWEEN '09-MAY-91' AND '17-JUN-91' ;

 

1-11. 나열된 값중 선택 ( In[list] )

IN OPERATOR 를 사용하여 나열된 값들 중에서 값을 검사한다.

u        IN(LIST), NOT IN(LIST)


[예제1-11] S_EMP TABLE에서 DEPT_ID 가 10, 31, 41, 50 인 사원의 FIRST_NAME, LAST_NAME, DEPT_ID 를 검색하시오.

SELECT FIRST_NAME, LAST_NAME, DEPT_ID

FROM S_EMP WHERE DEPT_ID IN (10, 31, 41, 50) ;

 

1-12. 임의의 값찾기 ( LIKE )

찾고자 하는 값을 정확히 모를 때, LIKE OPERATOR 를 사용하여 문자형태가 같은 ROW 를 검색한다.

WILDCARD 를 사용하여 문자의 형태를 지정한다. (% : 여러 문자, _ : 한문자 )

u        LIKE '형태', NOT LIKE '형태'


[예제1-12] S_EMP TABLE에서 LAST_NAME 이 M 으로 시작하는 사원의 LAST_NAME 을 검색하시오.

SELECT LAST_NAME FROM S_EMP WHERE LAST_NAME LIKE 'M%' ;

SELECT LAST_NAME FROM S_EMP WHERE LAST_NAME LIKE '__M____' ;

 

1-13. 정의되지 않은값 찾기( is null )

IS NULL OPERATOR을 사용하여 값이 NULL 인 것을 찾을 수 있다.

NULL 값은 값이 정의되지 않은 것을 의미하기 때문에 = OPERATOR를 사용하여 어떤 값과 비교할 수 없기 때문에 사용한다.

u        IS NULL, IS NOT NULL


[예제1-13] S_EMP TABLE에서 COMMISSION_PCT가 NULL인 사원의 LAST_NAME, SALARY, COMMISSION_PCT를 검색하시오.

SELECT last_name, salary,commission_pct,last_name, salary

FROM s_emp WHERE commission_pct is null;

 

1-14. 조건식의 결합 ( AND | OR )

조건식을 기술할 때 AND 와 OR 를 사용하여 여러가지 조건을 결합할 수 있다.

AND 와 OR 가 같이 사용됐을 때 AND 가 먼저 수행되고 OR 가 나중에 수행된다.

그러므로 우선순위를 바꾸고자 하면 ( ) 를 사용한다.

u        WHERE 조건식 AND | OR 조건식


[예제1-14] S_EMP TABLE에서 DEPT_ID가 41이고 TITLE이 Stock Clerk인 사원의 LAST_NAME, SALARY, DEPT_ID, TITLE을 검색하시오.

SELECT LAST_NAME, SALARY, DEPT_ID, TITLE

FROM S_EMP WHERE DEPT_ID = 41 AND TITLE = 'Stock Clerk' ;

 


***********************************************************************************

2. Single Row Functions


2-1. 소문자로 변환

모든 문자를 소문자로 변환시킨다.

u        LOWER(COLUMN명)


[예제2-1] S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 FIRST_NAME, LAST_NAME 을 소문자로 출력시키시오.

SELECT LOWER(FIRST_NAME), LOWER(LAST_NAME)

FROM S_EMP WHERE LOWER(LAST_NAME) = 'smith' ;

 

2-2. 대문자로 변환

모든 문자를 대문자로 변환시킨다.

u        UPPER(COLUMN명)


[예제2-2] S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 TITLE 을 대문자로 출력하시오.

SELECT UPPER(TITLE) FROM S_EMP WHERE UPPER(LAST_NAME) = 'SMITH';

 

2-3. 첫글자만 대문자로 변환

단어의 첫글자는 대문자로, 나머지는 소문자로 변환시킨다.

u        INITCAP(COLUMN명)


[예제2-3] S_EMP TABLE 에서 TITLE 을 단어의 첫글자만 대문자로 출력시키시오.

SELECT INITCAP(TITLE) FROM S_EMP ;

 

2-4. 문자의 부분을 자름

문자를 시작위치(M)에서 자리수(N) 만큼 잘라준다. 자리수(N)이 생략되면 시작위치(M)에서 끝까지 잘라준다.

u        SUBSTR(COLUMN명, M, N)


[예제2-4] S_PRODUCT TABLE 에서 NAME COLUMN 의 앞에서 부터 3글자가 Ace 인 제품의 NAME 을 출력하시오.

SELECT NAME FROM S_PRODUCT WHERE SUBSTR(NAME, 1, 3) = 'Ace' ;

 

2-5. 문자의 길이를 계산

문자의 길이를 RETURN 한다.

u        LENGTH(COLUMN명)


[예제2-5] S_PRODUCT TABLE 에서 NAME, NAME 의 길이를 출력하시오.

SELECT NAME, LENGTH(NAME) FROM S_PRODUCT;

 

2-6. 숫자의 반올림

지정된 자리수(M) 밑에서 반올림한다.

COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)는 다음과 같다. 

M : -3-2-1 0 1 2 3

u        ROUND(COLUMN명, M)


[예제2-6] S_EMP TABLE 에서 LAST_NAME, SALARY/22 의 값을 소수 2째 자리까지 나타내고 소수 3째 자리에서 반올림하시오.

SELECT LAST_NAME, ROUND(SALARY/22, 2) FROM S_EMP ;

 

2-7 숫자의 절사

지정된 자리수(M) 까지 나타내고 그 밑은 잘라버린다.

COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)은 다음과 같다.

       M : -3-2-1 0 1 2 3 절사 값은 RETURN 한다.

u        TRUNC(COLUMN명, M)


[예제2-7] S_EMP TABLE 에서 LAST_NAME, SALARY / 22 의 값을 십의 자리까지 나타내고 일의 자리는 버림.

SELECT LAST_NAME, TRUNC(SALARY/22, -1) FROM S_EMP ;

 

2-8. 나누기의 나머지

M 을 N 으로 나누고 남은 나머지를 RETURN 한다.

u        MOD(M, N)


[예제2-8] 10 을 3 으로 나눈 나머지를 구하시오.

SELECT MOD(10, 3) FROM SYS.DUAL ;

 

2-9. 날짜의 연산

DATABASE 안의 DATE 값은 다음과 같은 숫자로 저장되어 있다.

CENTURY, YEAR, MONTH, DAY, HOURS, MINUTES, SECONDS 그러므로 산술 연산을 할 수 있다.

u        DATE + NUMBER : 숫자만큼 일이 더해진 날짜가 RETURN 된다.

u        DATE - NUMBER : 숫자만큼 일이 빼진 날짜가 RETURN 된다.

u        DATE1 - DATE2 : 두 날짜 사이의 일수가 계산된다.


[예제2-9] S_EMP TABLE 에서 LAST_NAME, 입사한지 90 일째 되는 날, 입사한지 며칠 됐는 지 검색하시오.

SELECT LAST_NAME, START_DATE + 90, SYSDATE - START_DATE

FROM S_EMP; ( 날짜에는 시간도 포함되어 있으므로 일수 계산의 결과가 소수로 나온다. )

 

2-10. 날짜 사이의 개월 수

두 날짜 사이의 개월 수를 RETURN 한다.

u        MONTHS_BETWEEN(DATE1, DATE2)


[예제2-10] S_EMP TABLE 에서 LAST_NAME, 입사한지 몇 달이 됐는지 출력하시오.

SELECT LAST_NAME, MONTHS_BETWEEN(SYSDATE, START_DATE)

FROM S_EMP ; (일이 포함되어 있어서 소수로 출력된다.)

 

2-11. 날짜에 달을 더함

날짜에서 숫자(N) 개월만큼 더해진 날짜를 RETURN 한다.

u        ADD_MONTHS(DATE, N)


[예제2-11] S_EMP TABLE 에서 LAST_NAME, START_DATE, 입사한지 3 개월되는 날짜를 출력하시오.

SELECT LAST_NAME, START_DATE, ADD_MONTHS(START_DATE, 3) ROM S_EMP ;

 

2-12 지정한 요일 날짜

날짜에서 지정한 요일(CHAR)이 될 날짜를 RETURN 한다.

u        NEXT_DAY(DATE, 'CHAR')


[예제2-12] 오늘을 기준으로 돌아오는 금요일이 언제인지 출력하시오.

SELECT SYSDATE, NEXT_DAY(SYSDATE, 'FRIDAY') FROM SYS.DUAL ;

 

2-13 그 달의 마지막 날

날짜가 포함된 달의 마지막 날을 RETURN 한다.

u        LAST_DAY(DATE)


[예제2-13] 이번 달의 마지막 날은 언제인지 출력하시오.

SELECT SYSDATE, LAST_DAY(SYSDATE) FROM SYS.DUAL ;

 

2-14. 날짜의 반올림

형태에 따른 반올림 기준은 다음과 같다.

YEAR : 6월 이후,  MONTH : 15일 이후, DAY : 12시 이후

날짜 데이타를 지정된 형태까지 나타내고 그 이하에서 반올림한다.

u        ROUND(COLUMN명, '형태')


[예제2-14] S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오. (단, 15일 이후는 다음달로 올리시오.)

SELECT ID, LAST_NAME, ROUND(START_DATE, 'MONTH') FROM S_EMP ;

 

2-15. 날짜의 절사

날짜 데이타를 지정된 형태까지 나타내고 그 밑은 잘라낸다.

u        TRUNC(COLUMN명, '형태')


[예제2-15] S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오. (단, 일자는 잘라버리시오.)

SELECT ID, LAST_NAME, TRUNC(START_DATE, 'MONTH') FROM S_EMP ;

 

2-16 문자를 날짜로 변환

CHARACTER TYPE 을 지정된 형태의 DATE TYPE 으로 변환한다.

u        TO_DATE(character_column명, '형태')


[예제2-16] S_EMP TABLE 에서 LAST_NAME, START_DATE 를 검색하시오.

(단, START_DATE 의 값이 92/02/07 인 사원을 검색하시오.)

SELECT LAST_NAME, START_DATE

FROM S_EMP WHERE START_DATE = TO_DATE('92/02/07', 'YY/MM/DD') ;

 

2-17 날짜를 문자로 변환

DATE 값은 기본적으로 DD-MON-YY 형태로 출력된다.

이것을 TO_CHAR FUNCTION 을 사용하면 원하는 다른 형태로 변환할 수 있다.

l         형태를 지정할 때 사용된 대소문자로 출력된다.

l         DAY 와 MONTH 형태는 공백을 포함한 9 자리로 출력된다.

l         TO_CHAR 의 결과는 80 자리로 출력된다.

DATE TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.

u        TO_CHAR(date_column, '형태')


[예제2-17] S_EMP TABLE 에서 LAST_NAME, START_DATE 를 검색하시오.

(단, START_DATE 의 형태는 1991/06/17 14:20:00 와 같이 출력하시오.)

SELECT LAST_NAME, TO_CHAR(START_DATE, 'YYYY/MM/DD HH24:MI:SS'),

START_DATE FROM S_EMP ;

 

2-18. 숫자를 문자로 변환

NUMBER TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.

u        TO_CHAR(number_column명, '형태')


[예제2-18] S_EMP TABLE 에서 LAST_NAME, SALARY 를 검색하시오.(단 SALARY 를 $1,450 와 같은 형태로 출력시키시오.)

SELECT LAST_NAME, TO_CHAR(SALARY, '$999,999') FROM S_EMP ;

 


***********************************************************************************

3. 여러Table로부터 Data검색

3-1. Equijoin

SIMPLE JOIN (EQUI-JOIN)

여러개의 TABLE 들로부터 정보를 검색하려면, SELECT 문장의 FROM 절에 TABLE명들을 적고 WHERE 절에 각 TABLE의 ROW들을 연결시킬 조건식을 기술한다.

각 TABLE 의 COLUMN명이 중복될 때는 반드시 COLUMN명 앞에 TABLE명을 붙여야 한다. (중복되지 않을 때는 붙이지 않아도 되지만 명확성을 위해서나 ACCESS 를 위해서 붙이는 것이 좋다.)

N 개의 TABLE 을 JOIN 할 때는 최소한 N-1 개의 조건식이 필요하다.

복합 COLUMN 으로 JOIN 할 때는 더 많은 조건식이 필요하다.

2개 이상의 TABLE 에서 = 조건식을 만족시키는 ROW 들을 연결하여 검색한다.

u        SELECT table명.column명, table명.column명...-FROM table1명, table2명-WHERE table1명.column1명 = table2명.column명 ;


[예제3-1] S_EMP TABLE 과 S_DEPT TABLE 을 사용하여 사원들의 LAST_NAME, DEPT_ID, NAME 을 검색하시오.

SELECT S_EMP.LAST_NAME, S_EMP.DEPT_ID, S_DEPT.NAME

FROM S_EMP, S_DEPT WHERE S_EMP.DEPT_ID = S_DEPT.ID ;

 

3-2. 특정 row의 join

JOIN 문장을 기술할 때 JOIN 조건식 이외에 다른 조건식을 AND 로 연결할 수 있다.

u        SELECT table명.column명, table명.column명...

FROM table1명, table2명

WHERE table1명.column1명 = table2명.column2명 AND condition ;


[예제3-2] S_EMP TABLE과 S_DEPT TABLE 을 사용하여 LAST_NAME 이 Menchu 인 사원의 LAST_NAME, DEPT_ID, NAME 을 검색하시오.

SELECT S_EMP.LAST_NAME, S_EMP.DEPT_ID, S_DEPT.NAME

FROM S_EMP, S_DEPT

WHERE S_EMP.DEPT_ID = S_DEPT.ID AND S_EMP.LAST_NAME = 'Smith' ;

 

3-3 Table alias

JOIN 문장에서 TABLE명이 긴 경우 TABLE명.COLUMN명 으로 적는 것이 매우 불편하다.

그런데 TABLE명 대신 ALIAS 를 사용하면 편하게 사용할 수 있다.

(SELECT 문장에서 TABLE명 대신 ALIAS 를 지정했다면 그 문장에서는 계속해서 ALIAS 로 사용하여야 한다.)

TABLE ALIAS를 사용하여 JOIN 문장을 간단하게 기술한다.

u        SELECT alias명.column명, alias명.column명

FROM table1명 alias1명, table2명 alias2명

WHERE alias1명.column1명 = alias2명.column2명 ;


[예제3-3] S_CUSTOMER TABLE과 S_REGION TABLE 을 사용하여 고객 명,지역번호,지역 명을 검색하시오. (단, COLUMN ALIAS 와 TABLE ALIAS 를 사용하시오.)

SELECT C.NAME "Customer Name", C.REGION_ID "Region Id", R.NAME "Region Name"

FROM S_CUSTOMER C, S_REGION R WHERE C.REGION_ID = R.ID ;

 

3-4 Non-Equijoin

NON-EQUIJOIN

JOIN 문장에서 두 TABLE 을 JOIN 하는 조건식에 = OPERATOR 가 사용되지 않고

다른 OPERATOR 가 사용되는 것을 말한다.

u        SELECT table명.column명, table명.column명... - FROM table1명, table2명 - WHERE 조인조건식 ;


[예제3-4] EMP TABLE 과 SALGRADE TABLE 을 사용하여 사원의 ENAME, JOB, SAL,GRADE를 검색하시오.

SELECT E.ENAME, E.JOB, E.SAL, S.GRADE FROM EMP E, SALGRADE S

WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL ;

* (BETWEEN OPERATOR 대신에 <= 와 >= 를 사용해도 되지만 BETWEEN 이 간편하다.)

 

3-5. Outer Join

두 TABLE 을 JOIN 할 때 JOIN 조건식을 만족시키지 못하는 ROW 는 검색에서 빠지게 된다. 그런데 이러한 ROW 들이 검색되도록 하는 것이 OUTER JOIN 이다.

(+) OUTER JOIN OPERATOR 를 데이타가 없는 어느 한쪽의 COLUMN 쪽에 붙인다.

JOIN 결과, 데이타가 없는 쪽의 COLUMN 값은 NULL로 검색된다. 조건식을 만족시키지 못하는 데이타도 검색한다.

u        SELECT table명.column명, table명.column명 - FROM table1명, table2명

WHERE table1명.column1명 = table2명.column2명(+)


[예제3-5] S_EMP TABLE 과 S_CUSTOMER TABLE 을 사용하여 영업사원의 LAST_NAME, SALES_REP_ID, NAME 을 검색하시오.

(단, 영업사원이 정해져 있지 않은 고객의 이름도 검색하시오.)

SELECT E.LAST_NAME, C.SALES_REP_ID, C.NAME

FROM S_EMP E, S_CUSTOMER C

WHERE E.ID(+) = C.SALES_REP_ID ;

 


3-6. Self Join

TABLE 의 ALIAS 를 사용하여, 마치 2 개의 TABLE 처럼 생각하여 자신의 TABLE 과 자신의 TABLE 을 JOIN 한다.

u        SELECT alias명.column명, alias명.column명...

FROM table명 alias1명, table명 alias2명

WHERE alias1명.column1명 = alias2명.column2명 ;


[예제3-6] S_EMP TABLE 에서 사원들의 LAST_NAME 과 그들의 상사 LAST_NAME 을 검색하시오.

SELECT W.LAST_NAME "Woker", M.LAST_NAME "Manager"

FROM S_EMP W, S_EMP M WHERE W.MANAGER_ID = M.ID ;

 

***********************************************************************************

4. Group Functions

4-1. Group Function

각각의 FUNCTION 은 ARGUMENT 를 받는데 기능은 다음과 같다.

l        DISTINCT : 중복된 값은 제외한다.

l        ALL : DEFAULT 로써 모든 값을 포함한다.

l        COLUMN명 : NULL 값은 제외한다.

l        : NULL 값도 포함한다.

TABLE 전체를 하나의 GROUP 으로 보고 GROUP FUNCTION 값을 RETURN 한다.

u         SELECT group_function(column명), group_function(column명)...

FROM table명 ;


[예제4-1] S_EMP TABLE 에서 회사 전체의 급여합계, 최고급여, 최소급여, 인원수를 검색하시오.

SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), COUNT(SALARY) FROM S_EMP ;

(COUNT(SALARY) 는 급여를 받는 사원의 총 인원수고 COUNT(*) 는 급여를 받지 않는 사원의 인원수도 포함된다.)

 

4-2. 소group으로 분리

기본적인 SELECT 절(그룹화 되지 않은 SELECT절)에는 COLUMN 명과 GROUP FUNCTION 이 같이 기술될 수 없다.

SELECT 절에 COLUMN 명이 기술되려면 GROUP BY 절이 반드시 기술되어야 한다.

SELECT 절에 기술된 COLUMN 명들은 전부 GROUP BY 절에 기술되어야 하며

GROUP BY 절에 기술된 COLUMN 명들은 SELECT 절에 기술되지 않아도 된다.

하지만 결과를 파악하기 위해서는 SELECT 절에 기술해주는 것이 좋다.

GROUP BY 절을 기술하면 GROUP BY 절에 기술된 COLUMN 값으로 1 개의 TABLE이 소 GROUP 으로 나눠진다.

결과는 COLUMN 값으로 SORT 되어서 출력된다. 1개의 TABLE 을 소 GROUP 으로 나누어 GROUP FUNCTION 값을 구한다.

u         SELECT column1명[, column2명], group_function(column명) - FROM table명 - GROUP BY column1명[, column2명] ;


[예제4-2] S_EMP TABLE 에서 DEPT_ID, TITLE 별로, 최고급여, 최소급여, 인원수를 검색하시오.

SELECT DEPT_ID, TITLE, MAX(SALARY), MIN(SALARY), COUNT(SALARY)

FROM S_EMP GROUP BY DEPT_ID, TITLE;

 

4-3. 특정 group의 선택

HAVING 절이 기술됐을 때 처리되는 순서는 다음과 같다.

① ROW 들이 GROUPing 된다. ② GROUP 에 대해 GROUP FUNCTION 이 적용된다.

③ HAVING 절을 만족하는 GROUP 을 선택한다.

GROUP BY 절과 HAVING 절의 순서는 바뀌어도 되지만 의미상 GROUP BY 절 다음에 HAVING 절을 기술하는 것이 좋다.

HAVING 절에서는 GROUP FUNCTION 을 사용하여 GROUP 에 대한 조건식을 기술한다.

u         SELECT column1명[, column2명], group_function(column명) - FROM table명 - GROUP BY column1명[, column2명] HAVING 그룹조건식;


[예제4-3] S_EMP TABLE에서 TITLE별로 급여합계를 검색하시오. (단, 급여합계가 5000이상인 GROUP만 출력하시오)

SELECT TITLE, SUM(SALARY) PAYROLL FROM S_EMP

GROUP BY TITLE HAVING SUM(SALARY) >= 5000 ;

 

4-4. Group의 정렬

기본적으로 GROUP BY 절에 기술된 COLUMN 값으로 SORT 된다.

이 순서를 바꾸고자 하면 ORDER BY 절을 기술하면 된다. DATA 의 SORT 순서를 정한다.

u         SELECT column1명[, column2명], group_function(column명) - FROM table명

GROUP BY column1명[, column2명]

ORDER BY column명| group_function(column명) ;


[예제4-4] S_EMP TABLE에서 DEPT_ID 별로 인원수를 검색하시오. (단, 인원수가 많은 부서부터 출력하시오.)

SELECT DEPT_ID, COUNT(*) FROM S_EMP GROUP BY DEPT_ID ORDER BY COUNT(*) DESC ;

 


***********************************************************************************

 

5. Subquery

5-1. Single Row Subquery

SUBQUERY의 결과가 1개의 ROW로 나오는 것을 SINGLE ROW SUBQUERY라 하며 다음과 같은 OPERATOR를 사용할 수 있다.

=, >, >=, <, <= VALUE 값을 구하기 위해 SELECT 문장을 사용한다.

u         SELECT column명, column명... - FROM table명

WHERE column명 operator

(SELECT column명 FROM table명 WHERE 조건식 );


[예제5-1] S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원과 같은 업무(TITLE)를 하고 있는 사원의 LAST_NAME, TITLE 을 검색하시오.

SELECT LAST_NAME, TITLE FROM S_EMP

WHERE TITLE = ( SELECT TITLE FROM S_EMP WHERE LAST_NAME = 'Smith') ;

 

5-2. From절의 Subquery

FROM 절에 기술된 SUBQUERY 문은 VIEW 처럼 사용된다.

u         SELECT alias명.column명, alias명,column명... - FROM table1명 alias1명, (SELECT column2명 FROM table2명 - WHERE 조건식) alias2명

WHERE alias1명.column1명 OPERATOR alias2명.column2명 ;


[예제5-2] S_EMP TABLE에서 SALARY가 회사평균급여 보다 적은 사원의 LAST_NAME, SALARY, 회사평균급여를 검색하시오.

SELECT E.LAST_NAME, E.SALARY, S.AVGSAL

FROM S_EMP E, (SELECT AVG(SALARY) AVGSAL FROM S_EMP) S

WHERE E.SALARY < S.AVGSAL ;

 

5-3. Multi Row Subquery

SUBQUERY 의 결과가 여러 ROW 일 때는 반드시 IN OPERATOR 를 사용하여야 한다.

u         SELECT column명, column명... - FROM table명

WHERE column명 IN ( SELECT column명 FROM table명 WHERE 조건식);


[예제5-3] S_EMP TABLE과 S_DEPT TABLE에서 Operations부서에서 근무하는 사원의 LAST_NAME, TITLE, DEPT_ID 를 검색하시오.

SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP

WHERE DEPT_ID IN (SELECT ID FROM S_DEPT WHERE NAME = 'Operations') ;

 

5-4. Multi Column Subquery

SELECT 문장의 WHERE 절에서 여러개의 COLUMN 값을 비교하려면 LOGICAL OPERATOR 를 사용하여 여러 개의 조건식을 기술하여야 한다. 그런데 MULTI COLUMN SUBQUERY 를 사용하면 이를 해결할 수 있다.

u         SELECT column명, column명,,, - FROM table명

WHERE (column명, column명...) IN

(SELECT column명, column명... FROM table명 WHERE 조건식);


[예제5-4] S_EMP TABLE에서 LAST_NAME Patel인 사원과 같은 부서, 같은 업무를 맡고 있는 사원의 LAST_NAME, TITLE, DEPT_ID 를 검색하시오.

SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP

WHERE (DEPT_ID, TITLE) IN(SELECT DEPT_ID, TITLEFROM S_EMPWHERE LAST_NAME = 'Patel') ;

SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP

WHERE (DEPT_ID) IN (SELECT DEPT_ID FROM S_EMP WHERE LAST_NAME = 'Patel')

OR (TITLE) IN (SELECT TITLE FROM S_EMP WHERE LAST_NAME = 'Patel') ;

 

 

***********************************************************************************

6. Table 생성

6-1. 이름 붙이는 법

이름은 다음의 규칙을 따라서 지정한다.

l        TABLE 명이나 COLUMN 명은 문자로 시작하고 30 자 이내로 지정한다.

l        A~Z, a~z, 0~9, _, $, # 을 사용할 수 있다.

l        한 USER 내에서는 다른 OBJECT 의 이름과 동일하게 지정할 수 없다.

l        ORACLE7 SERVER 예약어를 사용할 수 없다.

l        대소문자를 구별하지 않는다.

 

6-2. Oracle 7 datatype

COLUMN 의 DATATYPE 은 다음과 같다.

l        CHAR(size) : 고정된 size 의 문자 값, 최대 255 자까지 지정할 수 있다.

l        VARCHAR2(size) : size내에서의 가변길이 문자 값,최대 2000자까지 지정할 수 있다.

l        LONG : 가변길이 문자 값, 최대 2 기가 바이트까지 사용할 수 있다. TABLE 당 한 개의 COLUMN 에만 지정 가능하다.

l        NUMBER(p,s) : 정수, 소수 자리수의 합이 P, 소수 자리수가 s 인 숫자값, 최대 38 자리수까지 지정할 수 있다.

l        DATE : 날짜와 시간 값, B.C. 4712년 1월 1일부터 A.D. 4712년 12월 31일까지 입력할 수 있다.

l        RAW(size) : size 내에서의 가변길이 BINARY DATA       ■ LONGRAW : 가변길이 BINARY DATA

 

6-3. 다른 table로부터 table생성

기존하는 TABLE 로 부터 데이타와 구조를 복사하여 TABLE 을 생성한다.

u         CREATE TABLE table명 [(column명, column명...)] - AS subquery ;


[예제6-1] S_EMP TABLE 에서 DEPT_ID 가 41 인 사원들의 ID, LAST_NAME, USERID, START_DATE 만을 복사하여 EMP_41 TABLE 을 생성하시오.

CREATE TABLE EMP_41 AS SELECT ID, LAST_NAME, USERID, START_DATE

FROM S_EMP WHERE DEPT_ID = 41;

(S_EMP TABLE 에서 COLUMN명, TYPE, SIZE, NOT NULL CONSTRAINT 가 복사되어 EMP_41 TABLE 이 생성되며, 데이타는 DEPT_ID = 41 인 ROW 만 복사된다.)

 

6-4. Constraint

6-4-1. CONSTRAINT 의 종류는 다음과 같다.

l        NOT NULL : COLUMN에 NULL값이 입력되는 것을 허용하지 않는다. COLUMN-CONSTRAINT 로만 기술해야 한다.


l       UNIQUE : 한 개의 COLUMN혹은 복합 COLUMN을 UNIQUE KEY로 지정하며 UNIQUE KEY에는 중복된 값을 허용하지 않는다.

한개의 COLUMN 으로 구성된 UNIQUE KEY 는 NULL 값을 허용한다.

COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.

복합 COLUMN 으로 구성된 UNIQUE KEY 는 TABLE-CONSTRAINT 로만

기술해야 한다.

UNIQUE KEY COLUMN 의 UNIQUE INDEX FILE 이 자동 생성된다.


l        PRIMARY KEY

ROW 를 UNIQUE 하게 대표할 수 있는 한개의 COLUMN 혹은 복합 COLUMN

으로 지정한다.

PRIMARY KEY 에는 중복된 값과 NULL 값을 허용하지 않는다.

TABLE 당 한 개의 PRIMARY KEY 만 지정할 수 있다. COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.

복합 COLUMN 으로 구성된 PRIMARY KEY 는 TABLE-CONSTRAINT 로만

기술해야 한다.

PRIMARY KEY COLUMN 의 UNIQUE INDEX FILE 이 자동 생성된다.


l        FOREIGN KEY

한개의 COLUMN 혹은 복합 COLUMN 으로 지정한다.

같은 TABLE 혹은 다른 TABLE의 PRIMARY KEY 나 UNIQUE KEY 를 참조한다.

FOREIGN KEY 값은 모 TABLE에 존재하는 데이타와 같던가 NULL 값을 허용함.

COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.


※ CHECK : 각각의 ROW 가 만족해야할 조건을 지정한다.

조건식은 QUERY 조건식과 동일하게 지정한다. (단, 다음과 같은 것은 사용할 수 없다.)

CURRVAL, NEXTVAL, LEVEL, ROWNUM, SYSDATE, USER COLUMN이나 TABLE-CONSTRAINT로 기술할 수 있다.


6-4-2. CONSTRAINT 명은 다음과 같이 지정한다.

l        CONSTRAINT 는 DICTIONARY 에 저장되므로 참조하기 쉽게 의미있게 붙여준다.

l        일반적으로 TABLE명_COLUMN명_CONSTRAINT종류와 같은 형태로 지정한다.

l        사용자가 CONSTRAINT 명을 지정하지 않으면 ORACLE7이 SYS_Cn의 형태로 붙인다.

l        동일한 USER 내에서 CONSTRAINT명은 UNIQUE해야 한다.

CONSTRAINT 는 다음과 같이 기술할 수 있다.

COLUMN-CONSTRAINT : column명 [CONSTRAINT constraint명] constraint종류

TABLE-CONSTRAINT : [CONSTRAINT constraint명] constraint종류 (column명, column명..)

 

6-5. Table 생성

u         CREATE TABLE table명 - (column명 type(size) [DEFAULT VALUE] [column constraint],

column명 type(size) [DEFAULT VALUE] [column constraint], - .... , - [table constraint], - [table constraint], ....) ;


[예제6-2] S_EMP TABLE CHART를 보고 TABLE 을 생성하시오.

(단, TABLE CONSTRAINT 로 기술할 수 있는 것은 TABLE CONSTRAINT 로 정의하시오.)

CREATE TABLE S_EMP(ID NUMBER(7), LAST_NAME VARCHAR2(25) CONSTRAINT S_EMP_LAST_NAME_NN NOT NULL,

FIRST_NAME VARCHAR2(25), USERID VARCHAR2(8) CONSTRAINT S_EMP_USERID_NN NOT NULL,

START_DATE DATE DEFAULT SYSDATE, COMMENTS VARCHAR2(25), MANAGER_ID NUMBER(7),

TITLE VARCHAR2(25),

DEPT_ID NUMBER(7),

SALARY NUMBER(11,2),

COMMISSION_PCT NUMBER(4,2),

CONSTRAINT S_EMP_ID_PK PRIMARY KEY(ID),

CONSTRAINT S_EMP_USERID_UK UNIQUE,

CONSTRAINT S_EMP_DEPT_ID_FK FOREIGN KEY(DEPT_ID)

REFERENCES S_DEPT(ID),

CONSTRAINT S_EMP_COMMISSION_PCT CHECK

(COMMISSION_PCT IN (10, 12.5, 15, 17.5, 20))) ;

 

 

***********************************************************************************

7. Data DICTIONARY


7-1. DICTIONARY

l        DATABASE 가 만들어 졌을때 DICTIONARY TABLE 도 만들어 진다.

l        DATABASE 가 사용중일때 DICTIONARY TABLE 은 ORACLE7 SERVER 에 의해 UPDATE 된다.

l        사용자들은 DICTIONARY TABLE 을 SELECT 할 수 있다. ? DICTIONARY TABLE 은 SYS USER 의 소유다.

l        DICTIONARY TABLE의 값은 대문자로 들어있다. ? DICTIONARY TABLE 의 종류는 다음과 같은 방법으로 알 수 있다.

SELECT *  FROM DICTIONARY ;

 

7-2. DICTIONARY TABLE 의 종류는 다음과 같다.

l        USER : USER 가 소유하고 있는 OBJECT 의 정보를 보여준다.

l        ALL : USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다.

l        DBA : DBA USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다.

 

7-3. 활용예 - DICTIONARY TABLE 의 검색예는 다음과 같다.

[예제7-1] 자신이 갖고 있는 TABLE 의 이름을 검색한다.

SELECT   OBJECT_NAME - FROM    USER_OBJECTS

WHERE   OBJECT_TYPE = 'TABLE';


[예제7-2]  자신이 갖고 있는 OBJECT 의 종류를 검색한다.

SELECT   DISTINCT OBJECT_TYPE - FROM   USER_OBJECTS;


[예제7-3]  GRANT 와 관련된 DICTIONARY TABLE 의 이름을 검색한다.

SELECT   TABLE_NAME - FROM   DICTIONARY

WHERE   UPPER(COMMENTS) LIKE '%GRANT%';


[예제7-4]  S_EMP TABLE 의 CONSTRAINT 종류를 검색한다.

SELECT   CONSTRAINT_NAME, CONSTRAINT_TYPE,

SEARCH_CONDITION,  R_CONSTRAINT_NAME

FROM   USER_CONSTRAINTS - WHERE   TABLE_NAME = 'S_EMP';


[예제7-5]  S_EMP TABLE 의 COLUMN CONSTRAINT 를 검색한다.

SELECT CONSTRAINT_NAME, COLUMN_NAME

FROM USER_CONS_COLUMNS

WHERE TABLE_NAME = 'S_EMP';

 


***********************************************************************************

8. Data 조작


-1. 데이타 입력

TABLE 전체 COLUMN 에 값을 입력한다.

u         INSERT INTO table명 - VALUES (value, value...);


[예제8-1] S_EMP TABLE에 다음과 같은 데이타를 입력하시오.

[ID : 26, LAST_NAME : Jung Mi, FIRST_NAME : Hong, USERID : Hjungmi,

START_DATE : 05-APR-97, COMMENTS : Teacher, MANAGER_ID : 10,

TITLE : Stock Clerk, DEPT_ID : 45, SALARY : 1200 COMMISSION_PCT : 10]

INSERT INTO S_EMP

VALUES (26, 'Jung Mi', 'Hong', 'Hjungmi', '05-APR-97', Teacher', 10, 'Stock Clerk', 45, 1200, 10) ;

(값을 지정하는 순서는 TABLE 의 COLUMN 순서에 맞춘다. 이 방법보다는 COLUMN명을 기술하여 입력하는 방법이 더 좋다.)

 

8-2. 특정 column에 데이터입력

데이타를 입력하고자 하는 COLUMN을 선택하여 입력한다.

u         INSERT INTO table명(column명, column명....) - VALUES (value, value....);


[예제8-2] S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

[ID : 27, LAST_NAME : Smith, FIRST_NAME : Donna, START_DATE : 05-APR-97]

INSERT INTO S_EMP(ID, LAST_NAME, FIRST_NAME, START_DATE)

VALUES (27, 'Smith', 'Donna', '05-APR-97') ;

 

8-3. Null, 특수 value 입력

COLUMN 값에 NULL 값을 지정하는 방법은 3 가지가 있다. ? INSERT 문장의 COLUMN LIST 에서 생략한다.

l        INSERT 문장의 VALUE 절에서 NULL 로 지정한다.

l        INSERT 문장의 VALUE 절에서 '' 로 지정한다.

COLUMN 값에 특수한 값을 입력할 수 있다. (SYSDATE : 현재날짜와 시간, USER : 현재 USERID)


[예제8-3] S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

[ID : 29, LAST_NAME : Donna, USERID : USER, SALARY : NULL, START_DATE : SYSDATE]

INSERT INTO S_EMP(ID, LAST_NAME, USERID, SALARY, START_DATE)

VALUES (29, 'Donna', USER, NULL, SYSDATE);

 

8-4. 특수형태의 날짜/시간입력

DATE 값을 입력할 때는 지정된 DATE 형태로 입력하여야 한다.

일반적으로 DD-MON-YY 형태를 사용하며, 이 형태로 데이타를 입력하면 세기는 현재의 세기로, 시간은 자정으로 입력된다.

다른 세기의 날짜나 시간을 입력하고 싶으면 TO_DATE FUNCTION 을 사용한다.

지정된 형태가 아닌 다른 형태의 날짜 값을 입력한다. ex>TO_DATE('날짜값','날짜형태')


[예제8-4] S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

[ID : 30, LAST_NAME : Donna, USERID : SQL01, START_DATE : 199704051400]

INSERT INTO S_EMP(ID, LAST_NAME, USERID, START_DATE)

VALUES (30, 'Donna', 'SQL01', TO_DATE('199704051400','YYYYMMDDHH24MI'));

 

8-5. 다른table로부터 데이타입력

INSERT 문장을 사용하여 기존하는 TABLE 의 데이타를 다른 TABLE 로 COPY 할 수 있다.

u         INSERT INTO table명[(column명, column명...)] - SUBQUERY;


[예제8-5] S_EMP TABLE 의 ROW들을 HISTORY TABLE 로 COPY 하시오.

(단, 01-JAN-94 이전에 입사한 사원의 ID,LAST_NAME,SALARY,START_DATE 를 COPY 하시오)

INSERT INTO HISTORY(ID, LAST_NAME, SALARY, START_DATE)

SELECT ID, LAST_NAME, SALARY, START_DATE

FROM S_EMP WHERE START_DATE < '01-JAN-94' ;

(INSERT 절의 COLUMN 수와 SELECT 절의 COLUMN 수는 같아야 한다.)

 

8-6. 데이타 수정

UPDATE 문장을 사용하여 이미 존재하는 COLUMN 값을 수정한다.

u         UPDATE table명 - SET column명 = value, [column명 = value]

[WHERE 조건식] ;


[예제8-6] S_EMP TABLE 에서 ID 가 1 인 사원의 데이타를 다음과 같이 수정하시오. (DEPT_ID : 32, SALARY : 2550)

UPDATE S_EMP SET DEPT_ID = 32, SALARY = 2550 WHERE ID = 2 ;

 

8-7. 데이타 삭제

DELETE 문장을 사용하여 데이타를 삭제한다.

DELETE FROM table명 - [WHERE 조건식] ;


[예제8-7] S_EMP TABLE에서 ID 가 20 보다 큰 사원을 삭제하시오.

DELETE FROM S_EMP WHERE ID > 20 ;

 

8-8. 저장

COMMIT 문장(COMMIT;)에 의해 변경된 모든 내용이 DATABASE에 저장되며 변경된 모든 데이타는 DATABASE에 저장된다.

그 전의 데이타는 완전히 지워지며 모든 사용자가 변경한 내용을 볼 수 있고 변경된 ROW 에 걸려있던 LOCK 이 해제된다.

그러므로 다른 사용자가 수정할 수 있으며 모든 SAVEPOINT 가 없어진다.

TRANSACTION 을 종료하고 TRANSACTION 안의 모든 변경된 작업을 저장한다.

 

8-9. 취소

ROLLBACK 문장(ROLLBACK)은 모든 변경된 내용을 취소하며 수정하기 전의 데이타가 복구된다.

변경된 ROW 에 걸려있던 LOCK 이 해제되고 다른 사용자들이 그 ROW 에 대해서 변경을 할 수 있다.

TRANSACTION 을 종료하고 TRANSACTION 안의 모든 변경된 작업을 취소한다.

 

8-10. Savepoint지정~취소

TRANSACTION 안에서 ROLLBACK 할 수 있는 POINT 를 지정한다. 지정된 POINT 까지만 ROLLBACK 한다.

SAVEPOINT savepoint명 ;     - ROLLBACK TO savepoint명 ;


[예제8-8] S_EMP TABLE에서 TITLE이 Stock Clerk 인 사원의 SALARY 를 10% 인상하시오. SAVEPOINT 를 지정하시오.

UPDATE S_EMP SET SALARY = SALARY * 1.1 WHERE TITLE = 'Stock Clerk' ; SAVEPOINT S1;


[예제8-9] S_REGION TABLE 에 다음과 같은 데이타를 입력하시오.

ID : 8, NAME : Central

INSERT INTO S_REGION(ID, NAME) VALUES (8, 'Central') ;


[예제8-10] SAVEPOINT 까지 ROLLBACK 하시오. UPDATE 결과를 저장하시오.

ROLLBACK TO S1; COMMIT;

 


***********************************************************************************

9. Table변경/삭제

9-1. Column 추가

TABLE 에 새로운 COLUMN 을 추가한다.

u         ALTER TABLE table명 - ADD (column명 type(size) [DEFAULT value] [column_constraint], - ...........) ;


[예제9-1] S_REGION TABLE 에 다음과 같은 COLUMN 을 추가하시오. (COMMENTS VARCHAR2(25))

ALTER TABLE S_REGION ADD (COMMENTS VARCHAR2(25))

(추가될 COLUMN 의 위치는 지정할 수 없다. 새로운 COLUMN 은 마지막 위치에 생성된다.)


9-2. Column 변경

ALTER TABLE 문장의 MODIFY 절을 사용하여 다음과 같은 변경을 할 수 있다. COLUMN 의 크기를 확장할 수 있다. 데이타가 들어있지 않으면 COLUMN 의 크기를 줄일 수 있다. 데이타가 들어있지 않다면 COLUMN 의 타입을 수정할 수 있다.

COLUMN 에 NULL 값이 없다면 NOT NULL CONSTRAINT 를 지정할 수 있다.

DEFAULT VALUE 를 변경할 수 있다. 이미 생성되어 있는 COLUMN 을 변경한다.

u         ALTER TABLE table명 - MODIFY (column명 type(size) [DEFAULT value] [NOT NULL], - .............) ;

 


9-3. Constraint 추가

이미 생성되어 있는 TABLE 에 CONSTRAINT 를 추가한다.

u         ALTER TABLE table명 - ADD (table_constraint) ;


[예제9-2] S_EMP TABLE 에 다음과 같은 CONSTRAINT 를 추가하시오.

[ MANAGER_ID COLUMN 이 S_EMP TABLE 의 ID COLUMN 을 REFERENCE 하는 FOREIGN KEY CONSTRAINT 를 추가하시오. ]

ALTER TABLE S_EMP

ADD ( CONSTRAINT S_EMP_MANAGER_ID_FK FOREIGN KEY(MANAGER_ID)

                                             REFERENCES S_EMP(ID) ) ;

 

9-4. Constraint 삭제

이미 생성되어 있는 TABLE 의 CONSTRAINT 를 삭제한다.

u         ALTER TABLE table명 - DROP PRIMARY KEY | - UNIQUE(column명) | - CONSTRAINT constraint명 [CASCADE] ;


[예제9-3] S_EMP TABLE의 다음과 같은 CONSTRAINT를 삭제하시오. (MANAGER_ID COLUMN의 FOREIGN KEY CONSTRAINT)

ALTER TABLE S_EMP DROP CONSTRAINT S_EMP_MANAGER_ID_FK ;

 


9-5. 전체 데이타의 삭제

TRUNCATE 문장은 DDL 이다. ROLLBACK SEGMENT 를 만들지 않고 모든 데이타를 삭제한다. 데이타가 삭제된 FREE 영역은 환원된다. TABLE 로부터 모든 데이타를 삭제한다.

u         TRUNCATE TABLE table명 ;


[예제9-4] S_ITEM TABLE 의 모든 데이타를 삭제하시오.

TRUNCATE TABLE S_ITEM ;

 

9-6. Constraint disable/enable

TABLE 에 있는 모든 데이타가 CONSTRAINT 를 만족시켜야 ENABLE 할 수 있다.

PRIMARY KEY, UNIQUE CONSTRAINT 를 ENABLE 하면 그에 따른 INDEX FILE 이 자동적으로 생성된다.

CASCADE OPTION 은 FOREIGN KEY CONSTRAINT 를 DISABLE 할 때 사용한다.

CONSTRAINT 를 삭제하고 새로 만들지 않고 DISABLE, ENABLE 한다.

u         ALTER TABLE table명-DISABLE |ENABLE PRIMARY KEY |-UNIQUE(column명) |CONSTRAINT constraint명 [CASCADE] ;


[예제9-5] S_DEPT TABLE 의 PRIMARY KEY CONSTRAINT 를 DISABLE 시키시오.

ALTER TABLE S_DEPT DISABLE CONSTRAINT S_DEPT_ID_PK CASCADE;

(S_EMP TABLE 의 S_EMP_DEPT_ID_FK CONSTRAINT 도 자동적으로 DISABLE 된다.)

 

9-7. Table 삭제

TABLE 을 삭제하면 그 TABLE 에 딸린 INDEX FILE 도 삭제된다.

VIEW, SYNONYM, STORED PROCEDURE, FUNCTION, TRIGGER 등은 삭제되지 않는다.

CASCADE CONSTRAINTS 는 모 TABLE 을 삭제하고 자 TABLE 의 FOREIGN KEY CONSTRAINT 도 삭제한다.

u         DROP TABLE table명 [CASCADE CONSTRAINTS] ;


[예제9-6] S_DEPT TABLE 을 삭제하시오.

DROP TABLE S_DEPT CASCADE CONSTRAINTS ;

9-8. 이름의 변경

TABLE, VIEW, SEQUENCE, SYNONYM 의 이름을 변경한다.

u         RENAME old명 TO new명 ;


[예제9-7] S_ORD TABLE 의 이름을 S_ORDER 로 변경하시오.

RENAME S_ORD TO S_ORDER ;

 


***********************************************************************************

10. Sequence


10-1. Sequence 생성

SEQUENCE 는 여러 사용자에게 UNIQUE 한 값을 생성해 주는 OBJECT 이다.

SEQUENCE 를 사용하여 PRIMARY KEY 값을 자동적으로 생성한다.

u         CREATE SEQUENCE sequence명 - INCREMENT BY n - START WITH n - MAXVALUE n | NOMAXVALUE MINVALUE n | NOMINVALUE - CYCLE | NOCYCLE - CACHE n | NOCACHE ;


[예제10-1] S_DEPT TABLE 의 ID COLUMN 값에 사용할 SEQUENCE 를 다음과 같이 생성하시오.

(START : 51, INCREMENT : 1, MAXVALUE : 9999999, NOCYCLE, NOCACHE)

CREATE SEQUENCE S_DEPT_ID INCREMENY BY 1 START WITH 51

MAXVALUE 9999999 NOCACHE NOCYCLE ;

 

10-2. Sequence 변경

SEQUENCE 에 정의된 값을 변경한다.

u         ALTER SEQUENCE sequence명 - INCREMENT BY n - MAXVALUE n | NOMAXVALUE - MINVALUE n | NOMINVALUE  CYCLE | NOCYCLE - CACHE n | NOCACHE ; -


[예제10-2] S_DEPT_ID SEQUENCE 를 다음과 같이 수정하시오. (CACHE : 10)

ALTER SEQUENCE S_DEPT_ID CACHE 10 ;

 

10-3. Sequence 삭제

SEQUENCE 를 삭제한다.

u         DROP SEQUENCE sequence명 ;


[예제10-3] S_DEPT_ID SEQUENCE 를 삭제하시오.

DROP SEQUENCE S_DEPT_ID ;

 


***********************************************************************************

11. VIEW


11-1. Simple view

SUBQUERY 문장이 간단한 경우 VIEW 를 통해 SELECT,INSERT,UPDATE,DELETE 를 할 수 있다.

l        SELECT : SUBQUERY 의 조건식을 만족하는 데이타만 검색된다.

l        INSERT : NOT NULL COLUMN 을 다 포함하고 있는 경우 INSERT 를 할 수 있다. SUBQUERY 의 조건식을 만족하지 않는 데이타도 입력이 가능하다.

l        UPDATE : VIEW 를 통해 SELECT 할 수 있는 데이타만 수정할 수 있다.

SUBQUERY 의 조건식을 만족하지 않는 데이타도 수정이 가능하다.

l        DELETE : VIEW 를 통해 SELECT 할 수 있는 데이타만 삭제할 수 있다.

u         CREATE VIEW view명 [(alias명, alias명....)] - AS SUBQUERY ;


[예제11-1] S_EMP TABLE에서 DEPT_ID가 45인 사원의 ID, LAST_NAME, DEPT_ID, TITLE을 선택해서 VIEW를 생성하시오.

CREATE VIEW EMP41 AS SELECT ID, LAST_NAME, DEPT_ID, TITLE

FROM S_EMP WHERE DEPT_ID = 45 ;

 

11-2. With check option

VIEW 를 정의할때 지정한 조건식을 만족하는 데이타만 INSERT, 또는 조건식을 만족하는 데이터로만 UPDATE 가 가능하다.  데이타가 VIEW 의 조건식을 만족하는지 CHECK 한다.

u         CREATE VIEW view명 [ (alias명, alias명...)] - AS SUBQUERY - WITH CHECK OPTION ;


[예제11-2] S_EMP TABLE에서 DEPT_ID가 45인 사원의 ID, LAST_NAME, DEPT_ID, TITLE을 선택해서 VIEW를 생성하시오.

(단, DEPT_ID 가 45 가 아닌 사원은 입력되지 못하게 만드시오.)

CREATE VIEW EMP45 AS SELECT ID, LAST_NAME, DEPT_ID, TITLE

FROM S_EMP WHERE DEPT_ID = 45 WITH CHECK OPTION ;

 

11-3. With read only

SELECT만 가능한 VIEW 를 생성한다.

u         CREATE VIEW view명 [(alias명, alias명...)] - AS SUBQUERY - WITH READ ONLY ;


[예제11-3] S_EMP TABLE 에서 ID, LAST_NAME, DEPT_ID, SALARY 가 SELECT 만 되도록 VIEW 를 생성하시오.

CREATE VIEW R_EMP AS SELECT ID, LAST_NAME, SALARY

FROM S_EMP WITH READ ONLY ;

 

11-4. Force

기준 TABLE 이 존재하지 않아도 VIEW 를 생성한다.

u         CREATE FORCE VIEW view명 [(alias명, alias명...)] - AS SUBQUERY ;


[예제11-4] S_EMP TABLE 이 없어도 S_EMP TABLE 에서 ID, LAST_NAME, SALARY 를 선택해서 VIEW 를 생성하시오.

CREATE FORCE VIEW T_EMP AS SELECT ID, LAST_NAME, SALARY FROM S_EMP ;

 

11-5. complex view

SUBQUERY문장에 JOIN, FUNCTION, DISTINCT/연산이 포함된 경우를 말하며 이 경우 VIEW를 통한 DML은 수행할 수 없다.

u         COMPLEX VIEW 를 생성한다. CREATE VIEW view명 (alias명, alias명...) - AS SUBQUERY ;


[예제11-5] S_EMP TABLE과 S_DEPT TABLE에서 ID, LAST_NAME, DEPT_ID, NAME을 선택해서 VIEW를 생성하시오.

CREATE VIEW EMPDEPT AS SELECT E.ID, E.LAST_NAME, E.DEPT_ID, D.NAME

FROM S_EMP E, S_DEPT D WHERE E.DEPT_ID = D.ID ;

 

11-6. View 삭제

VIEW 를 삭제하면 DATABASE 로부터 VIEW 의 정의가 삭제된다. VIEW 가 기초로 한 TABLE 은 삭제되지 않는다.

u         DROP VIEW view명 ;


[예제11-6] EMPDEPT VIEW 를 삭제하시오.

DROP VIEW EMPDEPT ;

 


***********************************************************************************

12. Index


12-1. Index 생성

TABLE 생성시 PRIMARY KEY 나 UNIQUE CONSTRAINT 를 지정하면 UNIQUE INDEX 가 자동적으로 만들어 진다. 이 외의 COLUMN 으로 QUERY 를 할 때 속도를 향상시키기 위해서 INDEX 를 생성한다. INDEX를 생성하면 QUERY 속도는 빨라질 수 있으나 DML속도는 늦어질 수 있다.

일반적으로 다음과 같은 경우에 INDEX 를 생성한다.

l        COLUMN 이 WHERE 절이나 JOIN 조건식에 빈번하게 사용될 때

l        COLUMN 값이 넓게 분포되어 있을 때

l        COLUMN 값에 NULL 값이 많이 포함되어 있을 때

l        TABLE 이 크고 QUERY 하는 데이터 양이 10 % 이하일 때

u         CREATE [UNIQUE] INDEX index명 - ON table명(column명[, column명...]) ;


[예제12-1] S_EMP TABLE 에서 LAST_NAME 의 QUERY 속도를 향상하기 위하여 INDEX 를 생성하시오.

CREATE INDEX S_EMP_LAST_NAME_IDX ON S_EMP(LAST_NAME) ;

 

12-2. Index 삭제

INDEX 는 수정할 수 없다. 수정하고 싶은 경우 삭제하고 다시 생성한다.

u         DROP INDEX index명 ;


[예제12-2] S_EMP_LAST_NAME_IDX INDEX 를 삭제하시오.

DROP INDEX S_EMP_LAST_NAME_IDX ; 

Posted by SB패밀리
[IT/과학] 오라클 Virtual Box 가상 디스크 복제하기 

  가상 시스템 기능을 가진 오라클 virtual box 에서 가상의 디스크를 만들어보자.
하나의 가상머신을 등록하고 거기에 가상디스크를 등록한다. 그리고 OS를 설치하는데
OS 설치하는게 일이다. 윈도우즈를 설치하면 업데이트 까지 어느정도는 해줘야 
기본 세팅이 되었다고 할 수 있다.
그런데 가상디스크를 복제(클론)해서 사용하려니 UUID가 충돌이 발생한다.

그러나 방법이 없는 건 아니다.
VMware 같은 가상화 프로그램은 기본적으로 클론 기능이나, 수동으로 디스크 복사하여 머신을 복제 할 수 있지만 이놈은 다르다. 
GUI도 없고 커멘드에 때려 넣어야 한다.

1.VBOX가 설치 되어있는 경로로 이동 
2.VBoxManage.exe CloneHD <원본 절대경로> <대상절대 경로>

예) d:\HARD DISK\XP.vdi 에 원본 경로가 있을 때

Vboxmanage CloneHD "D:\hard disk\xp.vdi" "d:\hard disk\xp2.vdi" 



가상디스크 클론을 만드는 또 다른 방법이 있다.

VDI 가상 디스크를 복사해서 그걸 다시 하나의 새로운 가상머신으로 만들고자 할때
또는 가상머신을 생성 하기전에 혹시나 해서 백업을 목적으로...

일단 .VirtualBox/VDI
여기서 cp xxxx.vdi xxxxxx.vdi 이렇게 복사를 해놓는다.

VBoxManage internalcommands setvdiuuid xxxxx.vdi

새로운 uuid를 변경 하고
가상 머신을 새로 만들기를 하면서
디스크를 복사한 xxxxx.vdi로 잡아주고
이전 가상머신과 설정을 비슷하게 해주면
복제된 가상 머신을 만들수 있다. 


자 그럼 좀더 편리하게 사용해보자

Posted by SB패밀리
[개발] 주목! 2012년에 뜰 오픈소스 기술 5선 

출처: http://www.ciokorea.com/common/print/news/11231

 대표적인 오픈소스 소프트웨어인 리눅스와 아파치의 성공은 이미 널리 알려져 있다. 최근에는 이 둘 이외에 다른 오픈소스 기술들도 주목받고 있다.

2011년의 상승세가 계속된다면, 레드햇은 2012년 연 10억 달러 이상의 수익을 창출하는 최초의 오픈소스 소프트웨어 업체로 등극할 것이다. 이는 커뮤니티 기반 개발 방법론을 전통적인 소프트웨어 개발 방식에 비견할 수 있거나 심지어 더 뛰어나다고 여겨온 오픈소스 커뮤니티에서 기념비적인 사건으로 기록될 것이다.

>분기 실적 | “팁코•레드햇 맑음, 오라클 흐림”

레드햇의 설립자이자 CEO인 짐 화이트허스트는 “일부 소프트웨어 업체의 연구실에서 혁신적인 프로젝트로 여겨졌던 오픈소스가 이제 대형 프로젝트로 영토를 확장하고 있다. 이는 기업의 소프트웨어 개발이 근본적으로 바뀌고 있음을 의미한다”라고 강조했다.

리눅스, 아파치 웹 서버, 펄(Perl), 아파치, 하둡(Hadoop), 오픈오피스(OpenOffice), GIMP, 그리고 수 십 개의 다른 오픈소스 프로그램들이 상업 제품에 비견되는 인기를 끌면서 지난 몇 년간 오픈소스가 독점 소프트웨어 산업에 커다란 영향을 미친 것은 사실이다. 그렇다면 향후에는 어떤 오픈소스가 커다란 인기를 끌게 될까? 2012년 눈 여겨 볼 만한 5개의 프로젝트에 대해 살펴보도록 하자. 이러한 프로젝트들은 새로운 산업 또는 사업의 근간을 형성할 수도 있을 것이다. 아니면 단지 작업 수행을 위해 좀 더 쉽거나 비용이 적게 드는 개발 방식을 원하는 개발자와 관리자의 주목만을 받을 수도 있을 것이다.

1. 엔진-엑스(Nginx)
지난 십 년간 웹 서버 소프트웨어를 선택하는 것에는 커다란 이견이 없었다. 대부분의 웹 서버에는 아파치가 사용됐고 그렇지 않으면 마이크로소프트의 IIS(Internet Information Services)가 쓰였다. 그러나 대용량 트래픽을 손쉽게 처리할 수 있는 기능 때문에 지난 몇 년 동안 엔진엑스가 새롭게 부상했다.

이미 엔진엑스는 전체 규모의 10%에 해당하는 5,000만 개의 인터넷 도메인에서 사용되는 것으로 추산된다. 특히 엔진엑스는 페이스북, 자포스(Zappos), 그루폰(Groupon), 훌루(Hulu), 드롭박스(Dropbox), 워드프레스(WordPress) 등 트래픽이 큰 웹 사이트에서 널리 사용되고 있다. 엑스엔진의 개발자 이고르 시소이는 지난 2004년 서버당 최대 1만 명의 동시 접속자를 처리하기 위해 엔진엑스를 개발했다. 엔진엑스의 상업용 버전을 퍼블리싱하는 업체의 공동 창업자 앤드류 알렉시브는 “엔진엑스는 매우 유연한 아키텍처를 가지고 있다”라고 설명했다.

엔진엑스에게 2012년은 뜻 깊은 한 해가 될 것으로 보인다. 2010년 엔진엑스는 델의 CEO 마이클 델이 참여하고 있는 업체를 포함하여 여러 벤처캐피탈로부터 300만 달러의 투자를 유치했다. 또한 엔진엑스는 제트-스트림(Jet-Stream)과 제휴를 체결하고 제트-스트림의 CDN(콘텐츠 전송 네트워크, content delivery network) 제품군에 엔진엑스를 제공하기도 했다. 그리고 엔진엑스는 AWS(Amazon Web Service) 클라우드 서비스에 엔진엑스를 적용하기 위해 아마존과 협력하고 있기도 하다.

알렉시스는 “클라우드 컴퓨팅과 공유 서비스는 우리 제품이 가장 커다란 효과를 발휘할 수 있는 분야”라며 기존에 널리 사용되는 웹 운영에서뿐만 아니라 엔진엑스가 새롭게 떠오르고 있는 클라우드 컴퓨팅과 공유 서비스 시장에서도 폭넓게 채택될 것으로 기대하고 있다. 2012년으로 예정돼 있는 대규모 업데이트 버전에서 엔진엑스에는 공유 호스팅 환경이 적용될 예정이다. 알렉시스는 차기 버전에서는 DDoS(분산 서비스 거부 공격)을 좀 더 잘 처리할 수 있을 것이고 몇몇 보안 기능도 추가될 것이라고 덧붙였다.


2. 오픈스택(OpenStack)
클라우드 컴퓨팅의 부상으로 등장한 오픈스택 프로젝트는 상대적으로 시작이 늦었지만 “확장성(scalability)”이라는 매우 중요한 특징을 가지고 있다.

오픈스택 프로젝트 정책 위원회의 회장 조나단 브리스는 “오픈스택은 100대 혹은 1,000대 서버 규모의 클라우드가 아닌 수 만대 서버 규모의 클라우드에서 운영되는 것을 목적으로 한다. 규모 이외의 다른 옵션들은 고려하지 않는다”라고 설명했다.

2010년 7월 발표된 이후 오픈스택은 HP, 인텔, 그리고 델 등 클라우드 컴퓨팅 업체에 관심이 있는 IT 업체들로부터 주목을 받고 있다. 그리고 오픈스택은 144곳의 업체와 2,100명의 참여 개발자 등 가장 빠르게 성장하고 있는 오픈소스 프로젝트로 자리잡고 있다. 델은 델 오픈스택 클라우드 스테이션(Dell OpenStack Cloud Solution)이라는 제품을 출시했고, 본 제품은 델의 자체 서버와 소프트웨어 그리고 오픈스택을 결합한 것이 특징이다. HP도 또한 오픈스택을 활용한 퍼블릭 클라우드 서비스를 베타 형식으로 출시한 바 있다.

오픈스택의 핵심적인 계산 컴포넌트는 대용량 우주 이미지를 내부 클라우드에 저장하기 위해 나사 아메스 연구소(NASA Ames Research Center)에서 개발되었다. 원래 나사의 관리자들은 유칼립투스(Eucalyptus) 소프트웨어 프로젝트 플랫폼을 사용하려 했으나 원하는 수준으로 규모를 확장하는 것이 어렵다는 것을 알게 됐다고 나사 아메스 연구소에서 CIO로 재직할 당시 오픈스택 클라우드 컨트롤러 개발을 관장했던 크리스 켐프는 말했다.

매니지드 호스팅 제공업체 랙스페이스(Rackspace)의 CTO 존 엔게이트는 현재 한창 보급되고 있는 오픈스택은 기업의 입맛에 맞도록 여러 새로운 기능을 제공할 필요가 있다고 지적했다. 키스톤(Keystone)이라는 프로젝트는 기업들이 (마이크로소프트 액티브 디렉토리 혹은 여타의 LDAP로 구현된)계정 관리 시스템과 오픈스택을 통합할 수 있는 기능을 제공한다. 그리고 개발자들은 오픈스택의 프론트 엔드 포털(front-end portal) 개발에 힘쓰고 있다.

오픈스택의 범용적인 사용을 위해 나사와 최초로 제휴를 체결한 액스페이스는 클라우드 제공업체에 널리 사용될 수 있을 것이라는 기대로 독립 법인의 형태로 오픈소프 프로젝트를 분사했다.

“2011년은 제품의 기반을 다지는 한 해였고, 2012년은 여러 프라이빗과 퍼블릭 클라우드에 진정하게 적용되기 시작하는 첫 해가 될 것”이라고 엔게이트는 포부를 밝혔다.

3. 스티그(Stig)
2010년에는 카산드라(Cassandra), 몽고DB(MongoDB), 코치DB(CouchDB) 등 비관계형 데이터베이스의 사용이 극적으로 증가했지만, 2010년 9월 개최 된 NoSQL Now 컨퍼런스에서는 아직까지 출시되지 않은 스티그라는 제품에 커다란 관심이 모아졌다. 스티그는 2012년 출시될 예정이다.

스티그는 소셜 네트워킹 사이트의 작업부하 처리를 위해 개발되었다. 스티그는 소셜 네트워킹 사이트 태그드(Tagged)의 소프트웨어 엔지니어 제이슨 루카스가 개발했고, 그는 스티그를 분산 그래프 데이터베이스로 설명했다.

스티그는 매우 상호작용적이고 사회적인 웹 애플리케이션을 지원하기 위해 개발되었다. 스티그의 아키텍처는 추론 검색으로 사용자와 애플리케이션이 단절된 정보 조각 사이의 관계를 살펴볼 수 있도록 해준다. 그리고 스티그의 일부는 하스켈(Haskell) 함수형 프로그램 개발 언어로 작성되었기 때문에 쉽게 여러 서버로 작업 부하를 분산하는 것이 가능하다.

아직까지 공식 출시 되지 않았기 때문에 스티그에 대해서는 아직 알려지지 않은 것이 많다. 그러나 시장 관계자들은 스티그가 대규모 데이터를 사용하는 소셜 네트워크와 다른 애플리케이션의 틈새 시장에 적합할 것으로 예측하고 있다.

소셜 네트워킹 서비스의 니즈는 다른 것들과 본질적으로 다른 특징이 있고 그러한 니즈를 만족할 수 있도록 데이터베이스를 맞출 필요가 있다고 루카스는 설명했다. 그리고 그는 “막대한 규모로 확장할 수 없다면 소셜 네트워크 분야에서 의미 있는 서비스를 제공할 수 없을 것이다”라고 덧붙였다.


현재 스티그는 태그드의 한 서버에서만 운영 중이지만 태그는 향후 어떤 시점에는 자사의 모든 데이터베이스로 스티그를 확대하여 활용할 예정이다. 원래의 소소 코드 발표 시점은 지난 12월이었지만 2012년으로 그 시기가 연기됐다.

켈리-맥크레이&어소시에이트(Kelly-McCreary & Associates) 컨설팅의 시맨틱 솔루션 설계자 댄 맥크레이는 “스티그는 매우 인상 깊다”며 여러 서버에 데이터베이스를 손쉽게 설치할 수 있는 스티그의 함수형 언어 구조에 대해 높이 평가했다.

4. 리눅스 민트(Linux Mint)
오픈소스 개발자들의 오랜 노력에도 불구하고 데스크톱 시장에서 리눅스는 커다란 입지를 구축하고 있지 못하고 있다. 그러나 마이크로소프트 윈도우의 대안으로써, 사용하기 쉬운 사용자 친화적인 리눅스 배포판은 항상 존재했다. 그리고 최근에는 캐노니컬(Canonical)의 우분투(Ubuntu)가 이러한 역할을 수행해오고 있지만, 손쉬운 사용성으로 리눅스 민트도 커다란 인기를 끌고 있다.

여러 온라인 포럼에서 다른 리눅스 배포판을 살펴본 후 소프트웨어 엔지니어 클레멘트 레페브레는 처음으로 리눅스 민트를 개발하기 시작했다. 그러한 작업을 통해 레페브레는 이상적인 배포판에서 제공돼야 할 기능들을 구상했고, 크게 인기를 끈 우분투에서 캐노니컬이 데비안 리눅스 배포판을 사용한 것과 마찬가지로, 레페브레는 리눅스 민트의 기반으로 우분투를 사용했다. 현재, 리눅스 민트 프로젝트는 기부, 웹 사이트의 광고 수입, 그리고 사용자 검색을 통한 수입으로 자금을 충당하고 있고 가장 최근에는 약간의 논란이 되고 있긴 하지만 덕덕고(DuckDuckGo)와 제휴를 체결했다.

리눅스 민트는 특히 리눅스의 사용방법을 배우고 싶지 않지만 데스크톱 OS를 원하는 사용자(예를 들면, 비-리눅스 취미 생활자)를 위해 개발됐다. 그렇기 때문에 리눅스 민트를 설치하고 실행하는 것은 쉽고 유지보수도 커다란 문제가 되지 않는다. 그리고 리눅스 민트는 신뢰할 수 있을 때가지 새로운 기능에 대한 비용은 지불하지 않으면서 우분투보다 훨씬 더 쉬운 사용성을 강조하고 있다.

예를 들어, 리눅스 민트는 여러 이견이 있는 유니티(Unity) 데스크톱 인터페이스(캐노니컬은 우분투를 모바일 플랫폼에 좀 더 쉽게 포팅하기 위해 유니티를 채택했다)를 채택하지 않았다. 그대신, 리눅스 민트는 좀 더 잘 알려지고 성숙한 지놈(Gnome) 인터페이스를 채택했다.

사용성에 치중하는 것은 리눅스 민트에 많은 도움이 되었고, 사실 우분투에 많은 타격을 주었다. 리눅스 민트 프로젝트에 따르면 리눅스 민트는 윈도우, 애플 맥, 그리고 우분투에 이어 세계에서 네 번째로 많이 사용하는 데스크톱 OS가 되었다. 2010년, 리눅스 민트는 리눅스 배포판의 인기를 반영하는 것으로 알려진 디스트로와치 리눅스(DistroWatch Linux) 뉴스 사이트에서 가장 많은 페이지 뷰를 기록해 우분투를 앞서기도 했다. 2012년 리눅스 민트가 승승장구할 것이라는 것은 확실하다.
 
5. 글러스터(Gluster)
클라우드 레드햇(Could Red Hat)이 유닉스 중심의 OS 시장에 혁명을 몰고 온 것과 마찬가지로 스토리지 소프트웨어 시장에서도 혁명을 일으킬 수 있을까?

2011년 10월, 레드햇은 상업용 SATA 드라이브와 NAS 시스템을 확장 가능한 대규모의 스토리지 풀(pool)로 클러스터링하는 오픈소스 소프트웨어 글러스터FS(GlusterFS) 파일 시스템을 개발한 클러스터를 인수했다. 레드햇은 리눅스 OS 시장을 정복한 것과 같은 방식으로 스토리지 시장도 공략한다는 계획이다.

레드햇의 화이트허스트에 따르면, 스토리지 소프트웨어 시장 규모는 연 40억 달러 규모에 이르고 있지만 이 때문에 레드햇이 스토리지 기술에 관심을 갖는 것은 아니라고 한다. 그 대신, 레드햇은 클라우드로의 전환을 손쉽게 할 수 있는 스토리지 기술에 관심을 보이고 있다. 화이트허스트는 “우리는 혁신을 이룩하기 위한 것에서 오픈소스가 특히 강점을 발휘할 수 있고 수익성까지 겸비한 분야를 찾고 있다”며 “시장에 글러스터를 제외한 다른 솔루션은 없다”라고 말했다.

글러스터는 최소한 관리자들의 다운로드와 테스트에서 많은 관심을 받고 있다. 2011년 글러스터FS의 다운로드 수는 300%나 증가했다. 2011년 11월 글러스터FS의 다운로드 횟수는 3만 7,000회였다. ciokr@idg.co.kr

Posted by SB패밀리

VMWare에서 공유폴더가 전체 네트워크에서 보이지 않을 때

 

내 네트워크 환경에서 마우스 오른쪽 버튼을 클릭하여 팝업메뉴를 띄운다.

탐색 메뉴를 선택한다.

전체 네트워크가 나오는 Explorer 창이 나타난다.

전체 네트워크를 선택한다.

VirtualBox Shared Folders를 선택한다.

\\Vboxsvr을 선택한다.

\\Vboxsvr\공유폴더명에서 마우스 오른쪽 버튼을 클릭하여 네트워크 드라이브 연결을 선택한다.

네트워크 드라이브를 선택하고 마침 버튼을 클릭한다.

내 컴퓨터에 가면 네트워크 드라이브가 보인다.

Posted by SB패밀리

영화 [Matrix] 에서...

네오가 모피어스를 구하고 추락하는 헬기에서 트리니트마저 구해 올리자,
모피어스는 더욱 확신에 찬 어조로 다음과 같이 말한다.

Morpheus
: (to Trinity) Do you belive it now, Trinity? [이젠 믿겠나 트리니티?]

Neo
 : Morpheus, The Oracle, She told me...[모피어스, 오라클 그녀가 말하길...]

Morpheus
 : She told you exactly what you need to here. That 's all. Neo, it is simulated you're going to be reallized. She has just designed it. It's difference between knowing the path and walking the path.[그녀는 네게 꼭 필요한 것을 말한 것 뿐야. 너는 곧 깨닫게 되어 있어. 길을 아는자와 걷는자의 차이를 말야]

주위를 살펴보면 답을 알고 있거나 아는 척하는 사람은 부지기수다. 하지만 이론을 바탕으로 내면의 깨우침을 통해 직접 실행에 옮기는 사람은 얼마나 될까?

경험도 자신의 자산이라고 본다면, 책을 통한 간접경험이든 몸으로 부딪혀 얻은 직접적인 경험이든, 나이에 상관없이 자신의 꿈을 재설계하고 그 꿈을 쫒아 가는 자가 진정 걷는자가 아닐까? 아니면 이젠 나이값 좀 하라는 주의의 충고를 들어야 하는 철이 덜든 놈 이거나?


걷는자는
진정한 용기를 가진
꿈에 대한 굳은 신념의 소유자가 아닐까...

아는자는 몽상가,이상주의이고 걷는자행동주의 실천가.
아는자는 단면을 알고 걷는자는 내면을 안다.

쌈꼬쪼려 소백촌닭

매트릭스
감독 래리 워쇼스키,앤디 워쇼스키 (1999 / 오스트레일리아,미국)
출연 키아누 리브스,로렌스 피쉬번
상세보기


Posted by SB패밀리

기본적으로 정보처리기사와 같이... 하나정도 획득해두면 유용한 자격증이 있다.
그냥 필요없을꺼라 생각하지 말고... 두어개 정도 있으면 유익하게 활용되는거 같다.

전산분야 : 국가기술자격법에 의한 정보통신관련 자격증 또는 한국산업인력공단, 정보기술연구원, 한국정보보호진흥원, 국제정보보호협회, 마이크로소프트, 썬마이크로시스템즈, 오라클, 정보시스템감사통제협회 등 국내외에서 일반적으로 인정된 기관으로부터 발급된 자격증 소지자와 전자상거래상의 네트워크 또는 웹관련 2급이상 자격증 소지자
Posted by SB패밀리

Q: 델파이에 오라클을 사용합니다. 음.. 인서트또는 업데이트 또는 각종 Db오류시 오라클같은 경우 오라클 error번호가 있는걸로 알고 있습니다. 프로그램 실행시 BDerror message와 오라클 error번호를 보는 방법이 궁금합니다. 아시는분 좀 알려주세요. 그럼 좋은 하루 되시구요.. 안녕히...

A: 음 오랜만에 와서 글을 보게 되었습니다.

데이타베이스 제어시에 일어나는 에러는 try... finally ... end.의

예외처리에서 알수 있습니다.

TDBError 에서 ErrorCode를 알수 있는 프로퍼티가 존재하며,

EDBEngineError를 통하여도 알 수 있습니다.

여러 가지 사용해 본 것은 아니지만, TDBError을 사용하시면

어느 정도의 Database액세스에 대한 에러를 알 수 있습니다.

그리고, 오라클의 에러를 감지할 수 있는 방법은 EBDEngineError에서

알 수 있다고 책에서 읽었습니다.

혹, 사용법이   다우기술에서 출판한 델파이 4 시작 그리고 완성인가 그 책에 있을 지도 모릅니다

그럼 많은 도움이 되었기를 바라면서...

날고 싶은(쌈꼬쪼려) 소백촌닭
Posted by SB패밀리

SQL EDITOR상에서의 편리한 단축키

ESC: 열린 윈도우 닫기
F1: 모든 단축키를 보여준다.
F2: FULL SCREEN
F4: Table, View, Proc, Funct, Package를 DESC(테이블명에 커서를 둔 상태에서 해야함)
F6: SQL Editor와 결과창간의 전환
F7: 화면을 모두 CLEAR
F8: 실행했던 SQL들의 HISTORY
F9: 모든 쿼리 실행(Ctrl+Enter는 현재 쿼리만 실행)
Ctrl+F9: 실제 쿼리를 실행하지 않고 validate함
Ctrl+. : table Completion (매칭되는 테이블목록 출력)
Ctrl+T : Columns Dropdown (해당테이블의 컬럼목록 표시)
Alt+Up : History Up (리눅스 bash의 UP키와 같다.)
Alt+Down: History Down (리눅스 bash의 DOWN키와 같다.)
Ctrl+Tab: MDI Child윈도간 전환

그냥 'desc 테이블명' 을 치면, 팝업윈도로 해당 테이블의 컬럼목록윈도가 표시된다.
이때, 해당 컬럼을 double-click하면 SQL Editor로 반영된다.

"테이블명."까지 입력하고 좀 있으면, 해당 테이블의 컬럼목록이 표시된다.
마치 프로그래밍툴에서 클래스내 멤버들의 목록을 표시하듯이..
Ctrl+T는 출력된 목록을 취소했을 경우, 다시 불러낼때 쓰인다.

test, member 2개의 테이블이 있다고 하자.
select * from t까지 입력하고 Ctrl+.를 치면 select * from test로 테이블명을 완성시켜준다.
system계정에서는 안되더군.. 일반계정만 가능했다.

SQL문을 실행시

Ctrl+Enter
현재 커서의 SQL문 실행
여러개의 SQL문이 있을때, SQL문들을 개행문자로 분리해주면 된다.
해당 커서에서 개행문자가 있는 곳까지만 하나의 SQL문으로 간주한다.

F9
SQL Editor의 SQL문 실행하여 Grid에 출력.
여러 SQL문들을 개행문자로 구분하지 않는다는 것을 제외하면, 위의 Ctrl+Enter와 동일하다.
에디터내의 모든 SQL문은 하나로 취급하므로, 여러 개의 SQL문이 있으면 실행할 SQL문만 Selection하여 실행(F9)해준다.

F5
SQL Editor내의 모든 SQL문 실행. 여러개의 SQL문들을 모두 실행하여 SQL*PLUS와 같이 출력해준다.
이것은 출력이 Grid로 표시되지 않고 Editor윈도에 표시되므로, SQL*PLUS의 출력과 같이,
다른 편집기로의 복사/붙여넣기 할때 사용하면 유용하다. 

출처 : http://blog.naver.com/seedkjb/140035578804

Posted by SB패밀리

-- 시작전 serveroutput을 on으로 바꾸어 output메시지를 볼수있도록 한다.

SET serveroutput on;

DECLARE
  psr_return NUMBER;
  psr_msg VARCHAR2(2000);
BEGIN

-- 파라미터 변수에 값 바인딩
  psr_return := 0000;
  psr_msg       := 'TEST';

 -- 프로시저 실행
  SP_APPROVELINE_SAVE ( 0, 'TEST', '20090925063000', '0001', psr_return, psr_msg);

  DBMS_OUTPUT.PUT_LINE('psr_return : '|| psr_return);
  DBMS_OUTPUT.PUT_LINE('psr_msg : '|| psr_msg);
END;

-- DB사용 툴에따라 빼줘야 작동 될 수 도있다.

Posted by SB패밀리

오라클 에서 사용되는 sql문 정리


== SQL*Plus 기본 활용 방법 ==


1. SQL 명령어는 다음과 같이 기술한다.
l        SQL 명령어는 한 줄 혹은 여러 줄에 기술한다.

l        일반적으로 절들은 수정하기 쉽게 다른 줄에 기술한다.

l        TAB 을 사용할 수 있다.

l        SQL 명령어 단어는 생략하거나 분리할 수 없다.

l        SQL 명령어는 대소문자를 구분하지 않는다.

l        SQL 명령어는 ; 으로 종료한다.

l        SQL 명령어는 SQL BUFFER 에 저장된다.

l        SQL BUFFER 에 저장된 SQL 명령어는 / 혹은 RUN 으로 실행할 수 있다.


2. SQL*PLUS 명령어는 다음과 같이 기술한다.

l        SQL*PLUS 명령어는 기본적으로 한 줄에 기술한다.

l        SQL*PLUS 명령어는 대소문자를 구별하지 않는다.

l        SQL*PLUS 명령어는 SQL BUFFER 에 저장되지 않는다.


3. SQL*PLUS 명령어

l        DESCRIBE table명 : TABLE 의 구조를 보여준다.

l        SAVE file명 : SQL BUFFER 를 file 로 저장한다.

l        START file명 : file 을 수행한다.

l        @ file명 : file 을 수행한다.

l        EDIT file명 : EDITOR 를 사용하여 file 을 편집한다.

l        SPOOL file명 : QUERY 결과를 file 에 저장한다.

l        SPOOL OFF : SPOOL FILE 을 닫는다.

l        HOST : SQL*PLUS 를 떠나지 않고 HOST 상태로 간다.

l        HELP 명령어 : SQL, SQL*PLUS, PL/SQL 에 대한 HELP 를 보내준다.

l        EXIT : SQL*PLUS 를 종료한다.

 

 

1. 데이터의 검색


1-1. 전체 데이타의 검색

가장 간단한 SELECT 문장의 형식은 다음과 같다.

SELECT 절에는 검색하고 싶은 COLUMN 명들을 기술한다.

FROM 절에는 SELECT 절에서 기술된 COLUMN 명들이 포함된 TABLE 명을 기술한다.

TABLE 의 모든 ROW 와 모든 COLUMN 을 검색한다.

u         SELECT * - FROM table명 ;


[예제1-1] S_DEPT TABLE 로부터 모든 ROW 와 COLUMN 을 검색하시오.

SELECT * FROM S_DEPT ;

 

1-2. 특정 column의 검색

SELECT 절에서 검색하고자 하는 COLUMN 명을 COMMA 를 사용하여 나열한다.

COLUMN 순서는 검색하고 싶은 순서대로 나열한다.

COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다.

u         SELECT column명, column명, column명,.. - FROM table명 ;


[예제1-2] S_EMP TABLE 로부터 ID, LAST_NAME, START_DATE 를 검색하시오.

SELECT ID, LAST_NAME, START_DATE FROM S_EMP ;

 

1-3. 산술식을 사용한 검색

산술 연산자를 사용하여 검색되는 데이타 값을 변경할 수 있으며 산술 연산식은 COLUMN 명, 상수 값, 산술 연산자로 구성됨.

u         SELECT 산술연산식 - FROM table명 ;


[예제1-3] S_EMP TABLE 로부터 ID, LAST_NAME, 연봉을 검색하시오.

(연봉은 SALARY * 12 로 계산한다. (+,-,*,/,())

SELECT ID, LAST_NAME, SALARY * 12 FROM S_EMP ;

 

1-4. Column alias ( AS )

기본적으로 COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다. 그러나 많은 경우 COLUMN 명이 이해하기 어렵거나 무의미하기 때문에 COLUMN ALIAS 를 사용하여 COLUMN HEADING 을 변경할 수 있다.

ANSI SQL 92 와 호환을 위해 ALIAS 앞에 AS 를 붙일 수 있다.

ALIAS 에 공백이나 특수문자가 포함되거나 대소문자를 구별하고 싶으면 " " 로 막아준다.

COLUMN ALIAS 를 사용하여 COLUMN HEADING 을 변경할 수 있다.

u         SELECT column명 alias, column명 "alias", column명 as alias - FROM table명 ;


[예제1-4] S_EMP TABLE 에서 LAST_NAME, (SALARY + 100) * 12, DEPT_ID 를 검색하시오. (단, COLUMN ALIAS 는 Employee, ANNUAL_SALARY, DEPARTMENT NO 로 정의하시오.)

SELECT LAST_NAME "Employee", (SALARY + 100) * 12 AS ANNUAL_SALARY,

DEPT_ID "DEPARTMENT NO"

FROM S_EMP ;

 

1-5. Column의 결합 ( || )

COLUMN 과 다른 COLUMN, 산술연산식, 상수 값과 결합하여 하나의 COLUMN 으로 결합할 수 있다.

u         SELECT column명|| column명 - FROM table명;


[예제1-5] S_EMP TABLE 에서 FIRST_NAME 과 LAST_NAME 을 결합하여 ALIAS EMPLOYEE 로 검색하시오.

SELECT FIRST_NAME || LAST_NAME EMPLOYEE  FROM S_EMP ;

 

1-6. Null값 처리 ( NVL )

특정 COLUMN 에 값이 입력되어 있지 않을 때, 그 값이 NULL 이며, NULL 값이 산술 연산식에 포함되면 그 결과도 NULL 이다.

NULL 값은 0 이나 공백과 같지 않다. 그러므로 NVL FUNCTION 을 사용하여 NULL 값을 다른 값으로 대체하여야 한다.

NULL 값을 다른 값으로 대체.

u         NVL (number_column, 9),

u         NVL (date_column, '01-JAN-95'),

u         NVL (character_column, 'ABCDE')


[예제1-6] S_EMP TABLE 에서 LAST_NAME, COMMISSION 값을 검색하시오.

(COMMISSION 은 SALARY * COMMISSION_PCT /100 으로 계산하시오.)

SELECT LAST_NAME, SALARY * NVL(COMMISSION_PCT,0) /100 COMMISSION

FROM S_EMP ;

 

1-7. 중복 row의 제거 ( DISTINCT )

SELECT 결과 값에 중복된 값이 있을 때 중복을 피하고 UNIQUE 하게 검색한다. 중복된 ROW 를 제거한다.

u        SELECT DISTINCT column명, column명 - FROM table명;


[예제1-7] S_DEPT TABLE 에서 NAME 이 중복되지 않게 검색하시오.

SELECT DISTINCT NAME  FROM S_DEPT ;

 

1-8. 데이타의 정렬 ( ORDER BY )

SELECT 되는 ROW 의 순서는 알 수 없다. 그러므로 ROW 를 SORT 하고 싶으면 ORDER BY 절을 사용하여야 한다.

DATA 의 DEFAULT SORT 순서는 ASCENDING 이며 다음과 같다.

l        숫자 : 1 에서 999 순으로 SORT 한다. ? 날짜 : 01-JAN-92 에서 01-JAN-95 순으로 SORT 한다.

l        문자 : A 에서 Z 순서로 SORT 한다. ? NULL : ASC 순에서는 뒤에, DESC 순에서는 앞에 나온다.

역순으로 SORT 하고 싶으면 COLUMN 명 뒤에 DESC 를 붙인다.

COLUMN 명 대신에 ALIAS 혹은 SELECT 한 COLUMN 의 순서로 지정할 수도 있다.

u        SELECT expr - FROM table명 - ORDER BY {column명, expr} [ASC|DESC] ;


[예제1-8] S_EMP TABLE 에서 LAST_NAME, DEPT_ID, START_DATE 를 LAST_NAME 순으로 검색하시오.

SELECT LAST_NAME, DEPT_ID, START_DATE

FROM S_EMP ORDER BY LAST_NAME ;

 

 


1-9. 특정 row의 검색 ( WHERE )

WHERE 절에서 조건식을 기술하여 조건을 만족하는 ROW 만 검색할 수 있다.

조건식은 COLUMN 명, COMPARISON OPERATOR, VALUE 로 구성되어 있다.

문자 값은 ' ' 으로 묶어주고 값의 대소문자를 구별하여 적어준다. 날짜 값은 ' ' 으로 묶어주고 지정된 날짜 형태로 적어준다. '01-MAR-97', 숫자값은 값만 적어주며 특정 ROW 만 검색한다.

u        SELECT expr - FROM table명 - WHERE expr operator value


[예제1-9] S_EMP TABLE 에서 LAST_NAME 이 Magee 인 사원의 FIRST_NAME, LAST_NAME, TITLE 을 검색하시오. (=,>,<,>=,<=,<>)

SELECT FIRST_NAME, LAST_NAME, TITLE

FROM S_EMP WHERE LAST_NAME = 'Magee' ;

 

1-10. 범위 지정검색 ( Between...and )

BETWEEN OPERATOR 를 사용하여 범위를 지정할 수 있다. 범위를 지정할 때는 작은 값을 먼저 큰 값을 나중에 지정한다.

두 범위의 한계 값을 포함한다.

u        BETWEEN...AND... - NOT BETWEEN...AND...


[예제1-10] S_EMP TABLE 에서 START_DATE 가 09-MAY-91 에서 17-JUN-91 사이에 입사한 사원의 FIRST_NAME, LAST_NAME, START_DATE 를 검색하시오.


SELECT FIRST_NAME, LAST_NAME, START_DATE

FROM S_EMP WHERE START_DATE BETWEEN '09-MAY-91' AND '17-JUN-91' ;

 

1-11. 나열된 값중 선택 ( In[list] )

IN OPERATOR 를 사용하여 나열된 값들 중에서 값을 검사한다.

u        IN(LIST), NOT IN(LIST)


[예제1-11] S_EMP TABLE에서 DEPT_ID 가 10, 31, 41, 50 인 사원의 FIRST_NAME, LAST_NAME, DEPT_ID 를 검색하시오.

SELECT FIRST_NAME, LAST_NAME, DEPT_ID

FROM S_EMP WHERE DEPT_ID IN (10, 31, 41, 50) ;

 

1-12. 임의의 값찾기 ( LIKE )

찾고자 하는 값을 정확히 모를 때, LIKE OPERATOR 를 사용하여 문자형태가 같은 ROW 를 검색한다.

WILDCARD 를 사용하여 문자의 형태를 지정한다. (% : 여러 문자, _ : 한문자 )

u        LIKE '형태', NOT LIKE '형태'


[예제1-12] S_EMP TABLE에서 LAST_NAME 이 M 으로 시작하는 사원의 LAST_NAME 을 검색하시오.

SELECT LAST_NAME FROM S_EMP WHERE LAST_NAME LIKE 'M%' ;

SELECT LAST_NAME FROM S_EMP WHERE LAST_NAME LIKE '__M____' ;

 

1-13. 정의되지 않은값 찾기( is null )

IS NULL OPERATOR을 사용하여 값이 NULL 인 것을 찾을 수 있다.

NULL 값은 값이 정의되지 않은 것을 의미하기 때문에 = OPERATOR를 사용하여 어떤 값과 비교할 수 없기 때문에 사용한다.

u        IS NULL, IS NOT NULL


[예제1-13] S_EMP TABLE에서 COMMISSION_PCT가 NULL인 사원의 LAST_NAME, SALARY, COMMISSION_PCT를 검색하시오.

SELECT last_name, salary,commission_pct,last_name, salary

FROM s_emp WHERE commission_pct is null;

 

1-14. 조건식의 결합 ( AND | OR )

조건식을 기술할 때 AND 와 OR 를 사용하여 여러가지 조건을 결합할 수 있다.

AND 와 OR 가 같이 사용됐을 때 AND 가 먼저 수행되고 OR 가 나중에 수행된다.

그러므로 우선순위를 바꾸고자 하면 ( ) 를 사용한다.

u        WHERE 조건식 AND | OR 조건식


[예제1-14] S_EMP TABLE에서 DEPT_ID가 41이고 TITLE이 Stock Clerk인 사원의 LAST_NAME, SALARY, DEPT_ID, TITLE을 검색하시오.

SELECT LAST_NAME, SALARY, DEPT_ID, TITLE

FROM S_EMP WHERE DEPT_ID = 41 AND TITLE = 'Stock Clerk' ;

 


***********************************************************************************

2. Single Row Functions


2-1. 소문자로 변환

모든 문자를 소문자로 변환시킨다.

u        LOWER(COLUMN명)


[예제2-1] S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 FIRST_NAME, LAST_NAME 을 소문자로 출력시키시오.

SELECT LOWER(FIRST_NAME), LOWER(LAST_NAME)

FROM S_EMP WHERE LOWER(LAST_NAME) = 'smith' ;

 

2-2. 대문자로 변환

모든 문자를 대문자로 변환시킨다.

u        UPPER(COLUMN명)


[예제2-2] S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 TITLE 을 대문자로 출력하시오.

SELECT UPPER(TITLE) FROM S_EMP WHERE UPPER(LAST_NAME) = 'SMITH';

 

2-3. 첫글자만 대문자로 변환

단어의 첫글자는 대문자로, 나머지는 소문자로 변환시킨다.

u        INITCAP(COLUMN명)


[예제2-3] S_EMP TABLE 에서 TITLE 을 단어의 첫글자만 대문자로 출력시키시오.

SELECT INITCAP(TITLE) FROM S_EMP ;

 

2-4. 문자의 부분을 자름

문자를 시작위치(M)에서 자리수(N) 만큼 잘라준다. 자리수(N)이 생략되면 시작위치(M)에서 끝까지 잘라준다.

u        SUBSTR(COLUMN명, M, N)


[예제2-4] S_PRODUCT TABLE 에서 NAME COLUMN 의 앞에서 부터 3글자가 Ace 인 제품의 NAME 을 출력하시오.

SELECT NAME FROM S_PRODUCT WHERE SUBSTR(NAME, 1, 3) = 'Ace' ;

 

2-5. 문자의 길이를 계산

문자의 길이를 RETURN 한다.

u        LENGTH(COLUMN명)


[예제2-5] S_PRODUCT TABLE 에서 NAME, NAME 의 길이를 출력하시오.

SELECT NAME, LENGTH(NAME) FROM S_PRODUCT;

 

2-6. 숫자의 반올림

지정된 자리수(M) 밑에서 반올림한다.

COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)는 다음과 같다. 

M : -3-2-1 0 1 2 3

u        ROUND(COLUMN명, M)


[예제2-6] S_EMP TABLE 에서 LAST_NAME, SALARY/22 의 값을 소수 2째 자리까지 나타내고 소수 3째 자리에서 반올림하시오.

SELECT LAST_NAME, ROUND(SALARY/22, 2) FROM S_EMP ;

 

2-7 숫자의 절사

지정된 자리수(M) 까지 나타내고 그 밑은 잘라버린다.

COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)은 다음과 같다.

       M : -3-2-1 0 1 2 3 절사 값은 RETURN 한다.

u        TRUNC(COLUMN명, M)


[예제2-7] S_EMP TABLE 에서 LAST_NAME, SALARY / 22 의 값을 십의 자리까지 나타내고 일의 자리는 버림.

SELECT LAST_NAME, TRUNC(SALARY/22, -1) FROM S_EMP ;

 

2-8. 나누기의 나머지

M 을 N 으로 나누고 남은 나머지를 RETURN 한다.

u        MOD(M, N)


[예제2-8] 10 을 3 으로 나눈 나머지를 구하시오.

SELECT MOD(10, 3) FROM SYS.DUAL ;

 

2-9. 날짜의 연산

DATABASE 안의 DATE 값은 다음과 같은 숫자로 저장되어 있다.

CENTURY, YEAR, MONTH, DAY, HOURS, MINUTES, SECONDS 그러므로 산술 연산을 할 수 있다.

u        DATE + NUMBER : 숫자만큼 일이 더해진 날짜가 RETURN 된다.

u        DATE - NUMBER : 숫자만큼 일이 빼진 날짜가 RETURN 된다.

u        DATE1 - DATE2 : 두 날짜 사이의 일수가 계산된다.


[예제2-9] S_EMP TABLE 에서 LAST_NAME, 입사한지 90 일째 되는 날, 입사한지 며칠 됐는 지 검색하시오.

SELECT LAST_NAME, START_DATE + 90, SYSDATE - START_DATE

FROM S_EMP; ( 날짜에는 시간도 포함되어 있으므로 일수 계산의 결과가 소수로 나온다. )

 

2-10. 날짜 사이의 개월 수

두 날짜 사이의 개월 수를 RETURN 한다.

u        MONTHS_BETWEEN(DATE1, DATE2)


[예제2-10] S_EMP TABLE 에서 LAST_NAME, 입사한지 몇 달이 됐는지 출력하시오.

SELECT LAST_NAME, MONTHS_BETWEEN(SYSDATE, START_DATE)

FROM S_EMP ; (일이 포함되어 있어서 소수로 출력된다.)

 

2-11. 날짜에 달을 더함

날짜에서 숫자(N) 개월만큼 더해진 날짜를 RETURN 한다.

u        ADD_MONTHS(DATE, N)


[예제2-11] S_EMP TABLE 에서 LAST_NAME, START_DATE, 입사한지 3 개월되는 날짜를 출력하시오.

SELECT LAST_NAME, START_DATE, ADD_MONTHS(START_DATE, 3) ROM S_EMP ;

 

2-12 지정한 요일 날짜

날짜에서 지정한 요일(CHAR)이 될 날짜를 RETURN 한다.

u        NEXT_DAY(DATE, 'CHAR')


[예제2-12] 오늘을 기준으로 돌아오는 금요일이 언제인지 출력하시오.

SELECT SYSDATE, NEXT_DAY(SYSDATE, 'FRIDAY') FROM SYS.DUAL ;

 

2-13 그 달의 마지막 날

날짜가 포함된 달의 마지막 날을 RETURN 한다.

u        LAST_DAY(DATE)


[예제2-13] 이번 달의 마지막 날은 언제인지 출력하시오.

SELECT SYSDATE, LAST_DAY(SYSDATE) FROM SYS.DUAL ;

 

2-14. 날짜의 반올림

형태에 따른 반올림 기준은 다음과 같다.

YEAR : 6월 이후,  MONTH : 15일 이후, DAY : 12시 이후

날짜 데이타를 지정된 형태까지 나타내고 그 이하에서 반올림한다.

u        ROUND(COLUMN명, '형태')


[예제2-14] S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오. (단, 15일 이후는 다음달로 올리시오.)

SELECT ID, LAST_NAME, ROUND(START_DATE, 'MONTH') FROM S_EMP ;

 

2-15. 날짜의 절사

날짜 데이타를 지정된 형태까지 나타내고 그 밑은 잘라낸다.

u        TRUNC(COLUMN명, '형태')


[예제2-15] S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오. (단, 일자는 잘라버리시오.)

SELECT ID, LAST_NAME, TRUNC(START_DATE, 'MONTH') FROM S_EMP ;

 

2-16 문자를 날짜로 변환

CHARACTER TYPE 을 지정된 형태의 DATE TYPE 으로 변환한다.

u        TO_DATE(character_column명, '형태')


[예제2-16] S_EMP TABLE 에서 LAST_NAME, START_DATE 를 검색하시오.

(단, START_DATE 의 값이 92/02/07 인 사원을 검색하시오.)

SELECT LAST_NAME, START_DATE

FROM S_EMP WHERE START_DATE = TO_DATE('92/02/07', 'YY/MM/DD') ;

 

2-17 날짜를 문자로 변환

DATE 값은 기본적으로 DD-MON-YY 형태로 출력된다.

이것을 TO_CHAR FUNCTION 을 사용하면 원하는 다른 형태로 변환할 수 있다.

l         형태를 지정할 때 사용된 대소문자로 출력된다.

l         DAY 와 MONTH 형태는 공백을 포함한 9 자리로 출력된다.

l         TO_CHAR 의 결과는 80 자리로 출력된다.

DATE TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.

u        TO_CHAR(date_column, '형태')


[예제2-17] S_EMP TABLE 에서 LAST_NAME, START_DATE 를 검색하시오.

(단, START_DATE 의 형태는 1991/06/17 14:20:00 와 같이 출력하시오.)

SELECT LAST_NAME, TO_CHAR(START_DATE, 'YYYY/MM/DD HH24:MI:SS'),

START_DATE FROM S_EMP ;

 

2-18. 숫자를 문자로 변환

NUMBER TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.

u        TO_CHAR(number_column명, '형태')


[예제2-18] S_EMP TABLE 에서 LAST_NAME, SALARY 를 검색하시오.(단 SALARY 를 $1,450 와 같은 형태로 출력시키시오.)

SELECT LAST_NAME, TO_CHAR(SALARY, '$999,999') FROM S_EMP ;

 


***********************************************************************************

3. 여러Table로부터 Data검색

3-1. Equijoin

SIMPLE JOIN (EQUI-JOIN)

여러개의 TABLE 들로부터 정보를 검색하려면, SELECT 문장의 FROM 절에 TABLE명들을 적고 WHERE 절에 각 TABLE의 ROW들을 연결시킬 조건식을 기술한다.

각 TABLE 의 COLUMN명이 중복될 때는 반드시 COLUMN명 앞에 TABLE명을 붙여야 한다. (중복되지 않을 때는 붙이지 않아도 되지만 명확성을 위해서나 ACCESS 를 위해서 붙이는 것이 좋다.)

N 개의 TABLE 을 JOIN 할 때는 최소한 N-1 개의 조건식이 필요하다.

복합 COLUMN 으로 JOIN 할 때는 더 많은 조건식이 필요하다.

2개 이상의 TABLE 에서 = 조건식을 만족시키는 ROW 들을 연결하여 검색한다.

u        SELECT table명.column명, table명.column명...-FROM table1명, table2명-WHERE table1명.column1명 = table2명.column명 ;


[예제3-1] S_EMP TABLE 과 S_DEPT TABLE 을 사용하여 사원들의 LAST_NAME, DEPT_ID, NAME 을 검색하시오.

SELECT S_EMP.LAST_NAME, S_EMP.DEPT_ID, S_DEPT.NAME

FROM S_EMP, S_DEPT WHERE S_EMP.DEPT_ID = S_DEPT.ID ;

 

3-2. 특정 row의 join

JOIN 문장을 기술할 때 JOIN 조건식 이외에 다른 조건식을 AND 로 연결할 수 있다.

u        SELECT table명.column명, table명.column명...

FROM table1명, table2명

WHERE table1명.column1명 = table2명.column2명 AND condition ;


[예제3-2] S_EMP TABLE과 S_DEPT TABLE 을 사용하여 LAST_NAME 이 Menchu 인 사원의 LAST_NAME, DEPT_ID, NAME 을 검색하시오.

SELECT S_EMP.LAST_NAME, S_EMP.DEPT_ID, S_DEPT.NAME

FROM S_EMP, S_DEPT

WHERE S_EMP.DEPT_ID = S_DEPT.ID AND S_EMP.LAST_NAME = 'Smith' ;

 

3-3 Table alias

JOIN 문장에서 TABLE명이 긴 경우 TABLE명.COLUMN명 으로 적는 것이 매우 불편하다.

그런데 TABLE명 대신 ALIAS 를 사용하면 편하게 사용할 수 있다.

(SELECT 문장에서 TABLE명 대신 ALIAS 를 지정했다면 그 문장에서는 계속해서 ALIAS 로 사용하여야 한다.)

TABLE ALIAS를 사용하여 JOIN 문장을 간단하게 기술한다.

u        SELECT alias명.column명, alias명.column명

FROM table1명 alias1명, table2명 alias2명

WHERE alias1명.column1명 = alias2명.column2명 ;


[예제3-3] S_CUSTOMER TABLE과 S_REGION TABLE 을 사용하여 고객 명,지역번호,지역 명을 검색하시오. (단, COLUMN ALIAS 와 TABLE ALIAS 를 사용하시오.)

SELECT C.NAME "Customer Name", C.REGION_ID "Region Id", R.NAME "Region Name"

FROM S_CUSTOMER C, S_REGION R WHERE C.REGION_ID = R.ID ;

 

3-4 Non-Equijoin

NON-EQUIJOIN

JOIN 문장에서 두 TABLE 을 JOIN 하는 조건식에 = OPERATOR 가 사용되지 않고

다른 OPERATOR 가 사용되는 것을 말한다.

u        SELECT table명.column명, table명.column명... - FROM table1명, table2명 - WHERE 조인조건식 ;


[예제3-4] EMP TABLE 과 SALGRADE TABLE 을 사용하여 사원의 ENAME, JOB, SAL,GRADE를 검색하시오.

SELECT E.ENAME, E.JOB, E.SAL, S.GRADE FROM EMP E, SALGRADE S

WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL ;

* (BETWEEN OPERATOR 대신에 <= 와 >= 를 사용해도 되지만 BETWEEN 이 간편하다.)

 

3-5. Outer Join

두 TABLE 을 JOIN 할 때 JOIN 조건식을 만족시키지 못하는 ROW 는 검색에서 빠지게 된다. 그런데 이러한 ROW 들이 검색되도록 하는 것이 OUTER JOIN 이다.

(+) OUTER JOIN OPERATOR 를 데이타가 없는 어느 한쪽의 COLUMN 쪽에 붙인다.

JOIN 결과, 데이타가 없는 쪽의 COLUMN 값은 NULL로 검색된다. 조건식을 만족시키지 못하는 데이타도 검색한다.

u        SELECT table명.column명, table명.column명 - FROM table1명, table2명

WHERE table1명.column1명 = table2명.column2명(+)


[예제3-5] S_EMP TABLE 과 S_CUSTOMER TABLE 을 사용하여 영업사원의 LAST_NAME, SALES_REP_ID, NAME 을 검색하시오.

(단, 영업사원이 정해져 있지 않은 고객의 이름도 검색하시오.)

SELECT E.LAST_NAME, C.SALES_REP_ID, C.NAME

FROM S_EMP E, S_CUSTOMER C

WHERE E.ID(+) = C.SALES_REP_ID ;

 


3-6. Self Join

TABLE 의 ALIAS 를 사용하여, 마치 2 개의 TABLE 처럼 생각하여 자신의 TABLE 과 자신의 TABLE 을 JOIN 한다.

u        SELECT alias명.column명, alias명.column명...

FROM table명 alias1명, table명 alias2명

WHERE alias1명.column1명 = alias2명.column2명 ;


[예제3-6] S_EMP TABLE 에서 사원들의 LAST_NAME 과 그들의 상사 LAST_NAME 을 검색하시오.

SELECT W.LAST_NAME "Woker", M.LAST_NAME "Manager"

FROM S_EMP W, S_EMP M WHERE W.MANAGER_ID = M.ID ;

 

***********************************************************************************

4. Group Functions

4-1. Group Function

각각의 FUNCTION 은 ARGUMENT 를 받는데 기능은 다음과 같다.

l        DISTINCT : 중복된 값은 제외한다.

l        ALL : DEFAULT 로써 모든 값을 포함한다.

l        COLUMN명 : NULL 값은 제외한다.

l        : NULL 값도 포함한다.

TABLE 전체를 하나의 GROUP 으로 보고 GROUP FUNCTION 값을 RETURN 한다.

u         SELECT group_function(column명), group_function(column명)...

FROM table명 ;


[예제4-1] S_EMP TABLE 에서 회사 전체의 급여합계, 최고급여, 최소급여, 인원수를 검색하시오.

SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), COUNT(SALARY) FROM S_EMP ;

(COUNT(SALARY) 는 급여를 받는 사원의 총 인원수고 COUNT(*) 는 급여를 받지 않는 사원의 인원수도 포함된다.)

 

4-2. 소group으로 분리

기본적인 SELECT 절(그룹화 되지 않은 SELECT절)에는 COLUMN 명과 GROUP FUNCTION 이 같이 기술될 수 없다.

SELECT 절에 COLUMN 명이 기술되려면 GROUP BY 절이 반드시 기술되어야 한다.

SELECT 절에 기술된 COLUMN 명들은 전부 GROUP BY 절에 기술되어야 하며

GROUP BY 절에 기술된 COLUMN 명들은 SELECT 절에 기술되지 않아도 된다.

하지만 결과를 파악하기 위해서는 SELECT 절에 기술해주는 것이 좋다.

GROUP BY 절을 기술하면 GROUP BY 절에 기술된 COLUMN 값으로 1 개의 TABLE이 소 GROUP 으로 나눠진다.

결과는 COLUMN 값으로 SORT 되어서 출력된다. 1개의 TABLE 을 소 GROUP 으로 나누어 GROUP FUNCTION 값을 구한다.

u         SELECT column1명[, column2명], group_function(column명) - FROM table명 - GROUP BY column1명[, column2명] ;


[예제4-2] S_EMP TABLE 에서 DEPT_ID, TITLE 별로, 최고급여, 최소급여, 인원수를 검색하시오.

SELECT DEPT_ID, TITLE, MAX(SALARY), MIN(SALARY), COUNT(SALARY)

FROM S_EMP GROUP BY DEPT_ID, TITLE;

 

4-3. 특정 group의 선택

HAVING 절이 기술됐을 때 처리되는 순서는 다음과 같다.

① ROW 들이 GROUPing 된다. ② GROUP 에 대해 GROUP FUNCTION 이 적용된다.

③ HAVING 절을 만족하는 GROUP 을 선택한다.

GROUP BY 절과 HAVING 절의 순서는 바뀌어도 되지만 의미상 GROUP BY 절 다음에 HAVING 절을 기술하는 것이 좋다.

HAVING 절에서는 GROUP FUNCTION 을 사용하여 GROUP 에 대한 조건식을 기술한다.

u         SELECT column1명[, column2명], group_function(column명) - FROM table명 - GROUP BY column1명[, column2명] HAVING 그룹조건식;


[예제4-3] S_EMP TABLE에서 TITLE별로 급여합계를 검색하시오. (단, 급여합계가 5000이상인 GROUP만 출력하시오)

SELECT TITLE, SUM(SALARY) PAYROLL FROM S_EMP

GROUP BY TITLE HAVING SUM(SALARY) >= 5000 ;

 

4-4. Group의 정렬

기본적으로 GROUP BY 절에 기술된 COLUMN 값으로 SORT 된다.

이 순서를 바꾸고자 하면 ORDER BY 절을 기술하면 된다. DATA 의 SORT 순서를 정한다.

u         SELECT column1명[, column2명], group_function(column명) - FROM table명

GROUP BY column1명[, column2명]

ORDER BY column명| group_function(column명) ;


[예제4-4] S_EMP TABLE에서 DEPT_ID 별로 인원수를 검색하시오. (단, 인원수가 많은 부서부터 출력하시오.)

SELECT DEPT_ID, COUNT(*) FROM S_EMP GROUP BY DEPT_ID ORDER BY COUNT(*) DESC ;

 


***********************************************************************************

 

5. Subquery

5-1. Single Row Subquery

SUBQUERY의 결과가 1개의 ROW로 나오는 것을 SINGLE ROW SUBQUERY라 하며 다음과 같은 OPERATOR를 사용할 수 있다.

=, >, >=, <, <= VALUE 값을 구하기 위해 SELECT 문장을 사용한다.

u         SELECT column명, column명... - FROM table명

WHERE column명 operator

(SELECT column명 FROM table명 WHERE 조건식 );


[예제5-1] S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원과 같은 업무(TITLE)를 하고 있는 사원의 LAST_NAME, TITLE 을 검색하시오.

SELECT LAST_NAME, TITLE FROM S_EMP

WHERE TITLE = ( SELECT TITLE FROM S_EMP WHERE LAST_NAME = 'Smith') ;

 

5-2. From절의 Subquery

FROM 절에 기술된 SUBQUERY 문은 VIEW 처럼 사용된다.

u         SELECT alias명.column명, alias명,column명... - FROM table1명 alias1명, (SELECT column2명 FROM table2명 - WHERE 조건식) alias2명

WHERE alias1명.column1명 OPERATOR alias2명.column2명 ;


[예제5-2] S_EMP TABLE에서 SALARY가 회사평균급여 보다 적은 사원의 LAST_NAME, SALARY, 회사평균급여를 검색하시오.

SELECT E.LAST_NAME, E.SALARY, S.AVGSAL

FROM S_EMP E, (SELECT AVG(SALARY) AVGSAL FROM S_EMP) S

WHERE E.SALARY < S.AVGSAL ;

 

5-3. Multi Row Subquery

SUBQUERY 의 결과가 여러 ROW 일 때는 반드시 IN OPERATOR 를 사용하여야 한다.

u         SELECT column명, column명... - FROM table명

WHERE column명 IN ( SELECT column명 FROM table명 WHERE 조건식);


[예제5-3] S_EMP TABLE과 S_DEPT TABLE에서 Operations부서에서 근무하는 사원의 LAST_NAME, TITLE, DEPT_ID 를 검색하시오.

SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP

WHERE DEPT_ID IN (SELECT ID FROM S_DEPT WHERE NAME = 'Operations') ;

 

5-4. Multi Column Subquery

SELECT 문장의 WHERE 절에서 여러개의 COLUMN 값을 비교하려면 LOGICAL OPERATOR 를 사용하여 여러 개의 조건식을 기술하여야 한다. 그런데 MULTI COLUMN SUBQUERY 를 사용하면 이를 해결할 수 있다.

u         SELECT column명, column명,,, - FROM table명

WHERE (column명, column명...) IN

(SELECT column명, column명... FROM table명 WHERE 조건식);


[예제5-4] S_EMP TABLE에서 LAST_NAME Patel인 사원과 같은 부서, 같은 업무를 맡고 있는 사원의 LAST_NAME, TITLE, DEPT_ID 를 검색하시오.

SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP

WHERE (DEPT_ID, TITLE) IN(SELECT DEPT_ID, TITLEFROM S_EMPWHERE LAST_NAME = 'Patel') ;

SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP

WHERE (DEPT_ID) IN (SELECT DEPT_ID FROM S_EMP WHERE LAST_NAME = 'Patel')

OR (TITLE) IN (SELECT TITLE FROM S_EMP WHERE LAST_NAME = 'Patel') ;

 

 

***********************************************************************************

6. Table 생성

6-1. 이름 붙이는 법

이름은 다음의 규칙을 따라서 지정한다.

l        TABLE 명이나 COLUMN 명은 문자로 시작하고 30 자 이내로 지정한다.

l        A~Z, a~z, 0~9, _, $, # 을 사용할 수 있다.

l        한 USER 내에서는 다른 OBJECT 의 이름과 동일하게 지정할 수 없다.

l        ORACLE7 SERVER 예약어를 사용할 수 없다.

l        대소문자를 구별하지 않는다.

 

6-2. Oracle 7 datatype

COLUMN 의 DATATYPE 은 다음과 같다.

l        CHAR(size) : 고정된 size 의 문자 값, 최대 255 자까지 지정할 수 있다.

l        VARCHAR2(size) : size내에서의 가변길이 문자 값,최대 2000자까지 지정할 수 있다.

l        LONG : 가변길이 문자 값, 최대 2 기가 바이트까지 사용할 수 있다. TABLE 당 한 개의 COLUMN 에만 지정 가능하다.

l        NUMBER(p,s) : 정수, 소수 자리수의 합이 P, 소수 자리수가 s 인 숫자값, 최대 38 자리수까지 지정할 수 있다.

l        DATE : 날짜와 시간 값, B.C. 4712년 1월 1일부터 A.D. 4712년 12월 31일까지 입력할 수 있다.

l        RAW(size) : size 내에서의 가변길이 BINARY DATA       ■ LONGRAW : 가변길이 BINARY DATA

 

6-3. 다른 table로부터 table생성

기존하는 TABLE 로 부터 데이타와 구조를 복사하여 TABLE 을 생성한다.

u         CREATE TABLE table명 [(column명, column명...)] - AS subquery ;


[예제6-1] S_EMP TABLE 에서 DEPT_ID 가 41 인 사원들의 ID, LAST_NAME, USERID, START_DATE 만을 복사하여 EMP_41 TABLE 을 생성하시오.

CREATE TABLE EMP_41 AS SELECT ID, LAST_NAME, USERID, START_DATE

FROM S_EMP WHERE DEPT_ID = 41;

(S_EMP TABLE 에서 COLUMN명, TYPE, SIZE, NOT NULL CONSTRAINT 가 복사되어 EMP_41 TABLE 이 생성되며, 데이타는 DEPT_ID = 41 인 ROW 만 복사된다.)

 

6-4. Constraint

6-4-1. CONSTRAINT 의 종류는 다음과 같다.

l        NOT NULL : COLUMN에 NULL값이 입력되는 것을 허용하지 않는다. COLUMN-CONSTRAINT 로만 기술해야 한다.


l       UNIQUE : 한 개의 COLUMN혹은 복합 COLUMN을 UNIQUE KEY로 지정하며 UNIQUE KEY에는 중복된 값을 허용하지 않는다.

한개의 COLUMN 으로 구성된 UNIQUE KEY 는 NULL 값을 허용한다.

COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.

복합 COLUMN 으로 구성된 UNIQUE KEY 는 TABLE-CONSTRAINT 로만

기술해야 한다.

UNIQUE KEY COLUMN 의 UNIQUE INDEX FILE 이 자동 생성된다.


l        PRIMARY KEY

ROW 를 UNIQUE 하게 대표할 수 있는 한개의 COLUMN 혹은 복합 COLUMN

으로 지정한다.

PRIMARY KEY 에는 중복된 값과 NULL 값을 허용하지 않는다.

TABLE 당 한 개의 PRIMARY KEY 만 지정할 수 있다. COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.

복합 COLUMN 으로 구성된 PRIMARY KEY 는 TABLE-CONSTRAINT 로만

기술해야 한다.

PRIMARY KEY COLUMN 의 UNIQUE INDEX FILE 이 자동 생성된다.


l        FOREIGN KEY

한개의 COLUMN 혹은 복합 COLUMN 으로 지정한다.

같은 TABLE 혹은 다른 TABLE의 PRIMARY KEY 나 UNIQUE KEY 를 참조한다.

FOREIGN KEY 값은 모 TABLE에 존재하는 데이타와 같던가 NULL 값을 허용함.

COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.


※ CHECK : 각각의 ROW 가 만족해야할 조건을 지정한다.

조건식은 QUERY 조건식과 동일하게 지정한다. (단, 다음과 같은 것은 사용할 수 없다.)

CURRVAL, NEXTVAL, LEVEL, ROWNUM, SYSDATE, USER COLUMN이나 TABLE-CONSTRAINT로 기술할 수 있다.


6-4-2. CONSTRAINT 명은 다음과 같이 지정한다.

l        CONSTRAINT 는 DICTIONARY 에 저장되므로 참조하기 쉽게 의미있게 붙여준다.

l        일반적으로 TABLE명_COLUMN명_CONSTRAINT종류와 같은 형태로 지정한다.

l        사용자가 CONSTRAINT 명을 지정하지 않으면 ORACLE7이 SYS_Cn의 형태로 붙인다.

l        동일한 USER 내에서 CONSTRAINT명은 UNIQUE해야 한다.

CONSTRAINT 는 다음과 같이 기술할 수 있다.

COLUMN-CONSTRAINT : column명 [CONSTRAINT constraint명] constraint종류

TABLE-CONSTRAINT : [CONSTRAINT constraint명] constraint종류 (column명, column명..)

 

6-5. Table 생성

u         CREATE TABLE table명 - (column명 type(size) [DEFAULT VALUE] [column constraint],

column명 type(size) [DEFAULT VALUE] [column constraint], - .... , - [table constraint], - [table constraint], ....) ;


[예제6-2] S_EMP TABLE CHART를 보고 TABLE 을 생성하시오.

(단, TABLE CONSTRAINT 로 기술할 수 있는 것은 TABLE CONSTRAINT 로 정의하시오.)

CREATE TABLE S_EMP(ID NUMBER(7), LAST_NAME VARCHAR2(25) CONSTRAINT S_EMP_LAST_NAME_NN NOT NULL,

FIRST_NAME VARCHAR2(25), USERID VARCHAR2(8) CONSTRAINT S_EMP_USERID_NN NOT NULL,

START_DATE DATE DEFAULT SYSDATE, COMMENTS VARCHAR2(25), MANAGER_ID NUMBER(7),

TITLE VARCHAR2(25),

DEPT_ID NUMBER(7),

SALARY NUMBER(11,2),

COMMISSION_PCT NUMBER(4,2),

CONSTRAINT S_EMP_ID_PK PRIMARY KEY(ID),

CONSTRAINT S_EMP_USERID_UK UNIQUE,

CONSTRAINT S_EMP_DEPT_ID_FK FOREIGN KEY(DEPT_ID)

REFERENCES S_DEPT(ID),

CONSTRAINT S_EMP_COMMISSION_PCT CHECK

(COMMISSION_PCT IN (10, 12.5, 15, 17.5, 20))) ;

 

 

***********************************************************************************

7. Data DICTIONARY


7-1. DICTIONARY

l        DATABASE 가 만들어 졌을때 DICTIONARY TABLE 도 만들어 진다.

l        DATABASE 가 사용중일때 DICTIONARY TABLE 은 ORACLE7 SERVER 에 의해 UPDATE 된다.

l        사용자들은 DICTIONARY TABLE 을 SELECT 할 수 있다. ? DICTIONARY TABLE 은 SYS USER 의 소유다.

l        DICTIONARY TABLE의 값은 대문자로 들어있다. ? DICTIONARY TABLE 의 종류는 다음과 같은 방법으로 알 수 있다.

SELECT *  FROM DICTIONARY ;

 

7-2. DICTIONARY TABLE 의 종류는 다음과 같다.

l        USER : USER 가 소유하고 있는 OBJECT 의 정보를 보여준다.

l        ALL : USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다.

l        DBA : DBA USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다.

 

7-3. 활용예 - DICTIONARY TABLE 의 검색예는 다음과 같다.

[예제7-1] 자신이 갖고 있는 TABLE 의 이름을 검색한다.

SELECT   OBJECT_NAME - FROM    USER_OBJECTS

WHERE   OBJECT_TYPE = 'TABLE';


[예제7-2]  자신이 갖고 있는 OBJECT 의 종류를 검색한다.

SELECT   DISTINCT OBJECT_TYPE - FROM   USER_OBJECTS;


[예제7-3]  GRANT 와 관련된 DICTIONARY TABLE 의 이름을 검색한다.

SELECT   TABLE_NAME - FROM   DICTIONARY

WHERE   UPPER(COMMENTS) LIKE '%GRANT%';


[예제7-4]  S_EMP TABLE 의 CONSTRAINT 종류를 검색한다.

SELECT   CONSTRAINT_NAME, CONSTRAINT_TYPE,

SEARCH_CONDITION,  R_CONSTRAINT_NAME

FROM   USER_CONSTRAINTS - WHERE   TABLE_NAME = 'S_EMP';


[예제7-5]  S_EMP TABLE 의 COLUMN CONSTRAINT 를 검색한다.

SELECT CONSTRAINT_NAME, COLUMN_NAME

FROM USER_CONS_COLUMNS

WHERE TABLE_NAME = 'S_EMP';

 


***********************************************************************************

8. Data 조작


-1. 데이타 입력

TABLE 전체 COLUMN 에 값을 입력한다.

u         INSERT INTO table명 - VALUES (value, value...);


[예제8-1] S_EMP TABLE에 다음과 같은 데이타를 입력하시오.

[ID : 26, LAST_NAME : Jung Mi, FIRST_NAME : Hong, USERID : Hjungmi,

START_DATE : 05-APR-97, COMMENTS : Teacher, MANAGER_ID : 10,

TITLE : Stock Clerk, DEPT_ID : 45, SALARY : 1200 COMMISSION_PCT : 10]

INSERT INTO S_EMP

VALUES (26, 'Jung Mi', 'Hong', 'Hjungmi', '05-APR-97', Teacher', 10, 'Stock Clerk', 45, 1200, 10) ;

(값을 지정하는 순서는 TABLE 의 COLUMN 순서에 맞춘다. 이 방법보다는 COLUMN명을 기술하여 입력하는 방법이 더 좋다.)

 

8-2. 특정 column에 데이터입력

데이타를 입력하고자 하는 COLUMN을 선택하여 입력한다.

u         INSERT INTO table명(column명, column명....) - VALUES (value, value....);


[예제8-2] S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

[ID : 27, LAST_NAME : Smith, FIRST_NAME : Donna, START_DATE : 05-APR-97]

INSERT INTO S_EMP(ID, LAST_NAME, FIRST_NAME, START_DATE)

VALUES (27, 'Smith', 'Donna', '05-APR-97') ;

 

8-3. Null, 특수 value 입력

COLUMN 값에 NULL 값을 지정하는 방법은 3 가지가 있다. ? INSERT 문장의 COLUMN LIST 에서 생략한다.

l        INSERT 문장의 VALUE 절에서 NULL 로 지정한다.

l        INSERT 문장의 VALUE 절에서 '' 로 지정한다.

COLUMN 값에 특수한 값을 입력할 수 있다. (SYSDATE : 현재날짜와 시간, USER : 현재 USERID)


[예제8-3] S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

[ID : 29, LAST_NAME : Donna, USERID : USER, SALARY : NULL, START_DATE : SYSDATE]

INSERT INTO S_EMP(ID, LAST_NAME, USERID, SALARY, START_DATE)

VALUES (29, 'Donna', USER, NULL, SYSDATE);

 

8-4. 특수형태의 날짜/시간입력

DATE 값을 입력할 때는 지정된 DATE 형태로 입력하여야 한다.

일반적으로 DD-MON-YY 형태를 사용하며, 이 형태로 데이타를 입력하면 세기는 현재의 세기로, 시간은 자정으로 입력된다.

다른 세기의 날짜나 시간을 입력하고 싶으면 TO_DATE FUNCTION 을 사용한다.

지정된 형태가 아닌 다른 형태의 날짜 값을 입력한다. ex>TO_DATE('날짜값','날짜형태')


[예제8-4] S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.

[ID : 30, LAST_NAME : Donna, USERID : SQL01, START_DATE : 199704051400]

INSERT INTO S_EMP(ID, LAST_NAME, USERID, START_DATE)

VALUES (30, 'Donna', 'SQL01', TO_DATE('199704051400','YYYYMMDDHH24MI'));

 

8-5. 다른table로부터 데이타입력

INSERT 문장을 사용하여 기존하는 TABLE 의 데이타를 다른 TABLE 로 COPY 할 수 있다.

u         INSERT INTO table명[(column명, column명...)] - SUBQUERY;


[예제8-5] S_EMP TABLE 의 ROW들을 HISTORY TABLE 로 COPY 하시오.

(단, 01-JAN-94 이전에 입사한 사원의 ID,LAST_NAME,SALARY,START_DATE 를 COPY 하시오)

INSERT INTO HISTORY(ID, LAST_NAME, SALARY, START_DATE)

SELECT ID, LAST_NAME, SALARY, START_DATE

FROM S_EMP WHERE START_DATE < '01-JAN-94' ;

(INSERT 절의 COLUMN 수와 SELECT 절의 COLUMN 수는 같아야 한다.)

 

8-6. 데이타 수정

UPDATE 문장을 사용하여 이미 존재하는 COLUMN 값을 수정한다.

u         UPDATE table명 - SET column명 = value, [column명 = value]

[WHERE 조건식] ;


[예제8-6] S_EMP TABLE 에서 ID 가 1 인 사원의 데이타를 다음과 같이 수정하시오. (DEPT_ID : 32, SALARY : 2550)

UPDATE S_EMP SET DEPT_ID = 32, SALARY = 2550 WHERE ID = 2 ;

 

8-7. 데이타 삭제

DELETE 문장을 사용하여 데이타를 삭제한다.

DELETE FROM table명 - [WHERE 조건식] ;


[예제8-7] S_EMP TABLE에서 ID 가 20 보다 큰 사원을 삭제하시오.

DELETE FROM S_EMP WHERE ID > 20 ;

 

8-8. 저장

COMMIT 문장(COMMIT;)에 의해 변경된 모든 내용이 DATABASE에 저장되며 변경된 모든 데이타는 DATABASE에 저장된다.

그 전의 데이타는 완전히 지워지며 모든 사용자가 변경한 내용을 볼 수 있고 변경된 ROW 에 걸려있던 LOCK 이 해제된다.

그러므로 다른 사용자가 수정할 수 있으며 모든 SAVEPOINT 가 없어진다.

TRANSACTION 을 종료하고 TRANSACTION 안의 모든 변경된 작업을 저장한다.

 

8-9. 취소

ROLLBACK 문장(ROLLBACK)은 모든 변경된 내용을 취소하며 수정하기 전의 데이타가 복구된다.

변경된 ROW 에 걸려있던 LOCK 이 해제되고 다른 사용자들이 그 ROW 에 대해서 변경을 할 수 있다.

TRANSACTION 을 종료하고 TRANSACTION 안의 모든 변경된 작업을 취소한다.

 

8-10. Savepoint지정~취소

TRANSACTION 안에서 ROLLBACK 할 수 있는 POINT 를 지정한다. 지정된 POINT 까지만 ROLLBACK 한다.

SAVEPOINT savepoint명 ;     - ROLLBACK TO savepoint명 ;


[예제8-8] S_EMP TABLE에서 TITLE이 Stock Clerk 인 사원의 SALARY 를 10% 인상하시오. SAVEPOINT 를 지정하시오.

UPDATE S_EMP SET SALARY = SALARY * 1.1 WHERE TITLE = 'Stock Clerk' ; SAVEPOINT S1;


[예제8-9] S_REGION TABLE 에 다음과 같은 데이타를 입력하시오.

ID : 8, NAME : Central

INSERT INTO S_REGION(ID, NAME) VALUES (8, 'Central') ;


[예제8-10] SAVEPOINT 까지 ROLLBACK 하시오. UPDATE 결과를 저장하시오.

ROLLBACK TO S1; COMMIT;

 


***********************************************************************************

9. Table변경/삭제

9-1. Column 추가

TABLE 에 새로운 COLUMN 을 추가한다.

u         ALTER TABLE table명 - ADD (column명 type(size) [DEFAULT value] [column_constraint], - ...........) ;


[예제9-1] S_REGION TABLE 에 다음과 같은 COLUMN 을 추가하시오. (COMMENTS VARCHAR2(25))

ALTER TABLE S_REGION ADD (COMMENTS VARCHAR2(25))

(추가될 COLUMN 의 위치는 지정할 수 없다. 새로운 COLUMN 은 마지막 위치에 생성된다.)


9-2. Column 변경

ALTER TABLE 문장의 MODIFY 절을 사용하여 다음과 같은 변경을 할 수 있다. COLUMN 의 크기를 확장할 수 있다. 데이타가 들어있지 않으면 COLUMN 의 크기를 줄일 수 있다. 데이타가 들어있지 않다면 COLUMN 의 타입을 수정할 수 있다.

COLUMN 에 NULL 값이 없다면 NOT NULL CONSTRAINT 를 지정할 수 있다.

DEFAULT VALUE 를 변경할 수 있다. 이미 생성되어 있는 COLUMN 을 변경한다.

u         ALTER TABLE table명 - MODIFY (column명 type(size) [DEFAULT value] [NOT NULL], - .............) ;

 


9-3. Constraint 추가

이미 생성되어 있는 TABLE 에 CONSTRAINT 를 추가한다.

u         ALTER TABLE table명 - ADD (table_constraint) ;


[예제9-2] S_EMP TABLE 에 다음과 같은 CONSTRAINT 를 추가하시오.

[ MANAGER_ID COLUMN 이 S_EMP TABLE 의 ID COLUMN 을 REFERENCE 하는 FOREIGN KEY CONSTRAINT 를 추가하시오. ]

ALTER TABLE S_EMP

ADD ( CONSTRAINT S_EMP_MANAGER_ID_FK FOREIGN KEY(MANAGER_ID)

                                             REFERENCES S_EMP(ID) ) ;

 

9-4. Constraint 삭제

이미 생성되어 있는 TABLE 의 CONSTRAINT 를 삭제한다.

u         ALTER TABLE table명 - DROP PRIMARY KEY | - UNIQUE(column명) | - CONSTRAINT constraint명 [CASCADE] ;


[예제9-3] S_EMP TABLE의 다음과 같은 CONSTRAINT를 삭제하시오. (MANAGER_ID COLUMN의 FOREIGN KEY CONSTRAINT)

ALTER TABLE S_EMP DROP CONSTRAINT S_EMP_MANAGER_ID_FK ;

 


9-5. 전체 데이타의 삭제

TRUNCATE 문장은 DDL 이다. ROLLBACK SEGMENT 를 만들지 않고 모든 데이타를 삭제한다. 데이타가 삭제된 FREE 영역은 환원된다. TABLE 로부터 모든 데이타를 삭제한다.

u         TRUNCATE TABLE table명 ;


[예제9-4] S_ITEM TABLE 의 모든 데이타를 삭제하시오.

TRUNCATE TABLE S_ITEM ;

 

9-6. Constraint disable/enable

TABLE 에 있는 모든 데이타가 CONSTRAINT 를 만족시켜야 ENABLE 할 수 있다.

PRIMARY KEY, UNIQUE CONSTRAINT 를 ENABLE 하면 그에 따른 INDEX FILE 이 자동적으로 생성된다.

CASCADE OPTION 은 FOREIGN KEY CONSTRAINT 를 DISABLE 할 때 사용한다.

CONSTRAINT 를 삭제하고 새로 만들지 않고 DISABLE, ENABLE 한다.

u         ALTER TABLE table명-DISABLE |ENABLE PRIMARY KEY |-UNIQUE(column명) |CONSTRAINT constraint명 [CASCADE] ;


[예제9-5] S_DEPT TABLE 의 PRIMARY KEY CONSTRAINT 를 DISABLE 시키시오.

ALTER TABLE S_DEPT DISABLE CONSTRAINT S_DEPT_ID_PK CASCADE;

(S_EMP TABLE 의 S_EMP_DEPT_ID_FK CONSTRAINT 도 자동적으로 DISABLE 된다.)

 

9-7. Table 삭제

TABLE 을 삭제하면 그 TABLE 에 딸린 INDEX FILE 도 삭제된다.

VIEW, SYNONYM, STORED PROCEDURE, FUNCTION, TRIGGER 등은 삭제되지 않는다.

CASCADE CONSTRAINTS 는 모 TABLE 을 삭제하고 자 TABLE 의 FOREIGN KEY CONSTRAINT 도 삭제한다.

u         DROP TABLE table명 [CASCADE CONSTRAINTS] ;


[예제9-6] S_DEPT TABLE 을 삭제하시오.

DROP TABLE S_DEPT CASCADE CONSTRAINTS ;

9-8. 이름의 변경

TABLE, VIEW, SEQUENCE, SYNONYM 의 이름을 변경한다.

u         RENAME old명 TO new명 ;


[예제9-7] S_ORD TABLE 의 이름을 S_ORDER 로 변경하시오.

RENAME S_ORD TO S_ORDER ;

 


***********************************************************************************

10. Sequence


10-1. Sequence 생성

SEQUENCE 는 여러 사용자에게 UNIQUE 한 값을 생성해 주는 OBJECT 이다.

SEQUENCE 를 사용하여 PRIMARY KEY 값을 자동적으로 생성한다.

u         CREATE SEQUENCE sequence명 - INCREMENT BY n - START WITH n - MAXVALUE n | NOMAXVALUE MINVALUE n | NOMINVALUE - CYCLE | NOCYCLE - CACHE n | NOCACHE ;


[예제10-1] S_DEPT TABLE 의 ID COLUMN 값에 사용할 SEQUENCE 를 다음과 같이 생성하시오.

(START : 51, INCREMENT : 1, MAXVALUE : 9999999, NOCYCLE, NOCACHE)

CREATE SEQUENCE S_DEPT_ID INCREMENY BY 1 START WITH 51

MAXVALUE 9999999 NOCACHE NOCYCLE ;

 

10-2. Sequence 변경

SEQUENCE 에 정의된 값을 변경한다.

u         ALTER SEQUENCE sequence명 - INCREMENT BY n - MAXVALUE n | NOMAXVALUE - MINVALUE n | NOMINVALUE  CYCLE | NOCYCLE - CACHE n | NOCACHE ; -


[예제10-2] S_DEPT_ID SEQUENCE 를 다음과 같이 수정하시오. (CACHE : 10)

ALTER SEQUENCE S_DEPT_ID CACHE 10 ;

 

10-3. Sequence 삭제

SEQUENCE 를 삭제한다.

u         DROP SEQUENCE sequence명 ;


[예제10-3] S_DEPT_ID SEQUENCE 를 삭제하시오.

DROP SEQUENCE S_DEPT_ID ;

 


***********************************************************************************

11. VIEW


11-1. Simple view

SUBQUERY 문장이 간단한 경우 VIEW 를 통해 SELECT,INSERT,UPDATE,DELETE 를 할 수 있다.

l        SELECT : SUBQUERY 의 조건식을 만족하는 데이타만 검색된다.

l        INSERT : NOT NULL COLUMN 을 다 포함하고 있는 경우 INSERT 를 할 수 있다. SUBQUERY 의 조건식을 만족하지 않는 데이타도 입력이 가능하다.

l        UPDATE : VIEW 를 통해 SELECT 할 수 있는 데이타만 수정할 수 있다.

SUBQUERY 의 조건식을 만족하지 않는 데이타도 수정이 가능하다.

l        DELETE : VIEW 를 통해 SELECT 할 수 있는 데이타만 삭제할 수 있다.

u         CREATE VIEW view명 [(alias명, alias명....)] - AS SUBQUERY ;


[예제11-1] S_EMP TABLE에서 DEPT_ID가 45인 사원의 ID, LAST_NAME, DEPT_ID, TITLE을 선택해서 VIEW를 생성하시오.

CREATE VIEW EMP41 AS SELECT ID, LAST_NAME, DEPT_ID, TITLE

FROM S_EMP WHERE DEPT_ID = 45 ;

 

11-2. With check option

VIEW 를 정의할때 지정한 조건식을 만족하는 데이타만 INSERT, 또는 조건식을 만족하는 데이터로만 UPDATE 가 가능하다.  데이타가 VIEW 의 조건식을 만족하는지 CHECK 한다.

u         CREATE VIEW view명 [ (alias명, alias명...)] - AS SUBQUERY - WITH CHECK OPTION ;


[예제11-2] S_EMP TABLE에서 DEPT_ID가 45인 사원의 ID, LAST_NAME, DEPT_ID, TITLE을 선택해서 VIEW를 생성하시오.

(단, DEPT_ID 가 45 가 아닌 사원은 입력되지 못하게 만드시오.)

CREATE VIEW EMP45 AS SELECT ID, LAST_NAME, DEPT_ID, TITLE

FROM S_EMP WHERE DEPT_ID = 45 WITH CHECK OPTION ;

 

11-3. With read only

SELECT만 가능한 VIEW 를 생성한다.

u         CREATE VIEW view명 [(alias명, alias명...)] - AS SUBQUERY - WITH READ ONLY ;


[예제11-3] S_EMP TABLE 에서 ID, LAST_NAME, DEPT_ID, SALARY 가 SELECT 만 되도록 VIEW 를 생성하시오.

CREATE VIEW R_EMP AS SELECT ID, LAST_NAME, SALARY

FROM S_EMP WITH READ ONLY ;

 

11-4. Force

기준 TABLE 이 존재하지 않아도 VIEW 를 생성한다.

u         CREATE FORCE VIEW view명 [(alias명, alias명...)] - AS SUBQUERY ;


[예제11-4] S_EMP TABLE 이 없어도 S_EMP TABLE 에서 ID, LAST_NAME, SALARY 를 선택해서 VIEW 를 생성하시오.

CREATE FORCE VIEW T_EMP AS SELECT ID, LAST_NAME, SALARY FROM S_EMP ;

 

11-5. complex view

SUBQUERY문장에 JOIN, FUNCTION, DISTINCT/연산이 포함된 경우를 말하며 이 경우 VIEW를 통한 DML은 수행할 수 없다.

u         COMPLEX VIEW 를 생성한다. CREATE VIEW view명 (alias명, alias명...) - AS SUBQUERY ;


[예제11-5] S_EMP TABLE과 S_DEPT TABLE에서 ID, LAST_NAME, DEPT_ID, NAME을 선택해서 VIEW를 생성하시오.

CREATE VIEW EMPDEPT AS SELECT E.ID, E.LAST_NAME, E.DEPT_ID, D.NAME

FROM S_EMP E, S_DEPT D WHERE E.DEPT_ID = D.ID ;

 

11-6. View 삭제

VIEW 를 삭제하면 DATABASE 로부터 VIEW 의 정의가 삭제된다. VIEW 가 기초로 한 TABLE 은 삭제되지 않는다.

u         DROP VIEW view명 ;


[예제11-6] EMPDEPT VIEW 를 삭제하시오.

DROP VIEW EMPDEPT ;

 


***********************************************************************************

12. Index


12-1. Index 생성

TABLE 생성시 PRIMARY KEY 나 UNIQUE CONSTRAINT 를 지정하면 UNIQUE INDEX 가 자동적으로 만들어 진다. 이 외의 COLUMN 으로 QUERY 를 할 때 속도를 향상시키기 위해서 INDEX 를 생성한다. INDEX를 생성하면 QUERY 속도는 빨라질 수 있으나 DML속도는 늦어질 수 있다.

일반적으로 다음과 같은 경우에 INDEX 를 생성한다.

l        COLUMN 이 WHERE 절이나 JOIN 조건식에 빈번하게 사용될 때

l        COLUMN 값이 넓게 분포되어 있을 때

l        COLUMN 값에 NULL 값이 많이 포함되어 있을 때

l        TABLE 이 크고 QUERY 하는 데이터 양이 10 % 이하일 때

u         CREATE [UNIQUE] INDEX index명 - ON table명(column명[, column명...]) ;


[예제12-1] S_EMP TABLE 에서 LAST_NAME 의 QUERY 속도를 향상하기 위하여 INDEX 를 생성하시오.

CREATE INDEX S_EMP_LAST_NAME_IDX ON S_EMP(LAST_NAME) ;

 

12-2. Index 삭제

INDEX 는 수정할 수 없다. 수정하고 싶은 경우 삭제하고 다시 생성한다.

u         DROP INDEX index명 ;


[예제12-2] S_EMP_LAST_NAME_IDX INDEX 를 삭제하시오.

DROP INDEX S_EMP_LAST_NAME_IDX ;

Posted by SB패밀리