제 1 장 데이터의 검색
SQL 명령어는 다음과 같이 기술한다.
■ SQL 명령어는 한 줄 혹은 여러 줄에 기술한다.
■ 일반적으로 절들은 수정하기 쉽게 다른 줄에 기술한다.
■ TAB 을 사용할 수 있다.
■ SQL 명령어 단어는 생략하거나 분리할 수 없다.
■ SQL 명령어는 대소문자를 구분하지 않는다.
■ SQL 명령어는 ; 으로 종료한다.
■ SQL 명령어는 SQL BUFFER 에 저장된다.
■ SQL BUFFER 에 저장된 SQL 명령어는 / 혹은 RUN 으로 실행할 수 있다.
SQL*PLUS 명령어는 다음과 같이 기술한다.
■ SQL*PLUS 명령어는 기본적으로 한 줄에 기술한다.
■ SQL*PLUS 명령어는 대소문자를 구별하지 않는다.
■ SQL*PLUS 명령어는 SQL BUFFER 에 저장되지 않는다.
■ SQL*PLUS 명령어는 다음과 같다.
• DESCRIBE table명 : TABLE 의 구조를 보여준다.
• SAVE file명 : SQL BUFFER 를 file 로 저장한다.
• START file명 : file 을 수행한다.
• @ file명 : file 을 수행한다.
• EDIT file명 : EDITOR 를 사용하여 file 을 편집한다.
• SPOOL file명 : QUERY 결과를 file 에 저장한다.
• SPOOL OFF : SPOOL FILE 을 닫는다.
• HOST : SQL*PLUS 를 떠나지 않고 HOST 상태로 간다.
• HELP 명령어 : SQL, SQL*PLUS, PL/SQL 에 대한 HELP 를 보내준다.
• EXIT : SQL*PLUS 를 종료한다.

전체 데이타의 검색
가장 간단한 SELECT 문장의 형식은 다음과 같다.
. SELECT 절에는 검색하고 싶은 COLUMN 명들을 기술한다.
. FROM 절에는 SELECT 절에서 기술된 COLUMN 명들이 포함된 TABLE 명을 기술한다.
TABLE 의 모든 ROW 와 모든 COLUMN 을 검색한다.
SELECT *
FROM table명 ;
[ 예제 ]
S_DEPT TABLE 로부터 모든 ROW 와 COLUMN 을 검색하시오.
SELECT *
FROM S_DEPT ;

특정 column의 검색
SELECT 절에서 검색하고자 하는 COLUMN 명을 COMMA 를 사용하여 나열한다.
COLUMN 순서는 검색하고 싶은 순서대로 나열한다.
COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다.
SELECT column명, column명, column명,..
FROM table명 ;
[ 예제 ]
S_EMP TABLE 로부터 ID, LAST_NAME, START_DATE 를 검색하시오.

SELECT ID, LAST_NAME, START_DATE
FROM S_EMP ;

산술식을 사용한 검색
산술 연산자를 사용하여 검색되는 데이타 값을 변경할 수 있다.
산술 연산식은 COLUMN 명, 상수 값, 산술 연산자로 구성된다.
SELECT 산술연산식
FROM table명 ;
[ 예제 ]
S_EMP TABLE 로부터 ID, LAST_NAME, 연봉을 검색하시오.
연봉은 SALARY * 12 로 계산한다. (+,-,*,/,())
SELECT ID, LAST_NAME, SALARY * 12
FROM S_EMP ;

Column alias
기본적으로 COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다.
그러나 많은 경우 COLUMN 명이 이해하기 어렵거나 무의미하기 때문에 COLUMN ALIAS 를 사용하여
COLUMN HEADING 을 변경할 수 있다.
ANSI SQL 92 와 호환을 위해 ALIAS 앞에 AS 를 붙일 수 있다.
ALIAS 에 공백이나 특수문자가 포함되거나 대소문자를 구별하고 싶으면 " " 로 막아준다.
COLUMN ALIAS 를 사용하여 COLUMN HEADING 을 변경할 수 있다.
SELECT column명 alias, column명 "alias", column명 as alias
FROM table명 ;
[ 예제 ]
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 ;

Column의 결합
COLUMN 과 다른 COLUMN, 산술연산식, 상수 값과 결합하여 하나의 COLUMN 으로 결합할 수 있다.
SELECT column명|| column명
FROM table명;
[ 예제 ]
S_EMP TABLE 에서 FIRST_NAME 과 LAST_NAME 을 결합하여 ALIAS EMPLOYEE 로 검색하시오.
SELECT FIRST_NAME || LAST_NAME EMPLOYEE
FROM S_EMP ;

Null값 처리
특정 COLUMN 에 값이 입력되어 있지 않을 때, 그 값을 NULL 이라 부른다.
NULL 값은 0 이나 공백과 같지 않다.
NULL 값이 산술 연산식에 포함되면 그 결과도 NULL 이다.
그러므로 NVL FUNCTION 을 사용하여 NULL 값을 다른 값으로 대체하여야 한다.
NULL 값을 다른 값으로 대체한다.
NVL (number_column, 9)
NVL (date_column, '01-JAN-95')
NVL (character_column, 'ABCDE')
[ 예제 ]
S_EMP TABLE 에서 LAST_NAME, COMMISSION 값을 검색하시오.
COMMISSION 은 SALARY * COMMISSION_PCT /100 으로 계산하시오.
SELECT LAST_NAME, SALARY * NVL(COMMISSION_PCT,0) /100 COMMISSION
FROM S_EMP ;

중복 row의 제거
SELECT 결과 값에 중복된 값이 있을 때 중복을 피하고 UNIQUE 하게 검색한다.
중복된 ROW 를 제거한다.
SELECT DISTINCT column명, column명
FROM table명;
[ 예제 ]
S_DEPT TABLE 에서 NAME 이 중복되지 않게 검색하시오.
SELECT DISTINCT NAME
FROM S_DEPT ;

데이타의 정렬
SELECT 되는 ROW 의 순서는 알 수 없다.
그러므로 ROW 를 SORT 하고 싶으면 ORDER BY 절을 사용하여야 한다.
DATA 의 DEFAULT SORT 순서는 ASCENDING 이며 다음과 같다.
• 숫자 : 1 에서 999 순으로 SORT 한다.
• 날짜 : 01-JAN-92 에서 01-JAN-95 순으로 SORT 한다.
• 문자 : A 에서 Z 순서로 SORT 한다.
• NULL : ASC 순에서는 뒤에, DESC 순에서는 앞에 나온다.
역순으로 SORT 하고 싶으면 COLUMN 명 뒤에 DESC 를 붙인다.
COLUMN 명 대신에 ALIAS 혹은 SELECT 한 COLUMN 의 순서로 지정할 수도 있다.
SELECT expr
FROM table명
ORDER BY {column명, expr} [ASC|DESC] ;
[ 예제 ]
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 ;

특정 row의 검색
WHERE 절에서 조건식을 기술하여 조건을 만족하는 ROW 만 검색할 수 있다.
조건식은 COLUMN 명, COMPARISON OPERATOR, VALUE 로 구성되어 있다.
문자 값은 ' ' 으로 묶어주고 값의 대소문자를 구별하여 적어준다.
날짜 값은 ' ' 으로 묶어주고 지정된 날짜 형태로 적어준다. '01-MAR-97'
숫자값은 값만 적어준다.
특정 ROW 만 검색한다.
SELECT expr
FROM table명
WHERE expr operator value
[ 예제 ]
S_EMP TABLE 에서 LAST_NAME 이 Magee 인 사원의 FIRST_NAME, LAST_NAME,
TITLE 을 검색하시오. (=,>,<,>=,<=,<>)
SELECT FIRST_NAME, LAST_NAME, TITLE
FROM S_EMP
WHERE LAST_NAME = 'Magee' ;

Between...and
BETWEEN OPERATOR 를 사용하여 범위를 지정할 수 있다.
범위를 지정할 때는 작은 값을 먼저 큰 값을 나중에 지정한다.
두 범위의 한계 값을 포함한다.
BETWEEN...AND...
NOT BETWEEN...AND...
[ 예제 ]
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' ;

In[list]
IN OPERATOR 를 사용하여 나열된 값들 중에서 값을 검사한다.
IN(LIST), NOT IN(LIST)
[ 예제 ]
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) ;

like
찾고자 하는 값을 정확히 모를 때, LIKE OPERATOR 를 사용하여 문자형태가 같은 ROW 를 검색한다.
WILDCARD 를 사용하여 문자의 형태를 지정한다.
% : 여러 문자, _ : 한문자
LIKE '형태', NOT LIKE '형태'
[ 예제 ]
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____' ;

is null
IS NULL OPERATOR을 사용하여 값이 NULL 인 것을 찾을 수 있다.
NULL 값은 값이 정의되지 않은 것을 의미하기 때문에 = OPERATOR를 사용하여
어떤 값과 비교할 수 없기 때문에 사용한다.
IS NULL, IS NOT NULL
[ 예제 ]
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;

조건식의 결합
조건식을 기술할 때 AND 와 OR 를 사용하여 여러가지 조건을 결합할 수 있다.
AND 와 OR 가 같이 사용됐을 때 AND 가 먼저 수행되고 OR 가 나중에 수행된다.
그러므로 우선순위를 바꾸고자 하면 ( ) 를 사용한다.
WHERE 조건식 AND | OR 조건식
[ 예제 ]
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
소문자로 변환
모든 문자를 소문자로 변환시킨다.
LOWER(COLUMN명)
[ 예제 ]
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' ;

대문자로 변환
모든 문자를 대문자로 변환시킨다.
UPPER(COLUMN명)
[ 예제 ]
S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 TITLE 을 대문자로 출력하시오.
SELECT UPPER(TITLE)
FROM S_EMP
WHERE UPPER(LAST_NAME) = 'SMITH';

첫글자만 대문자로 변환
단어의 첫글자는 대문자로, 나머지는 소문자로 변환시킨다.
INITCAP(COLUMN명)
[ 예제 ]
S_EMP TABLE 에서 TITLE 을 단어의 첫글자만 대문자로 출력시키시오.
SELECT INITCAP(TITLE)
FROM S_EMP ;

문자의 부분을 자름
문자를 시작위치(M)에서 자리수(N) 만큼 잘라준다.
자리수(N)이 생략되면 시작위치(M)에서 끝까지 잘라준다.
SUBSTR(COLUMN명, M, N)
[ 예제 ]
S_PRODUCT TABLE 에서 NAME COLUMN 의 앞에서 부터 3글자가 Ace 인 제품의
NAME 을 출력하시오.
SELECT NAME
FROM S_PRODUCT
WHERE SUBSTR(NAME, 1, 3) = 'Ace' ;

문자의 길이를 계산
문자의 길이를 RETURN 한다.
LENGTH(COLUMN명)
[ 예제 ]
S_PRODUCT TABLE 에서 NAME, NAME 의 길이를 출력하시오.
SELECT NAME, LENGTH(NAME)
FROM S_PRODUCT;

숫자의 반올림
지정된 자리수(M) 밑에서 반올림한다.
COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)는 다음과 같다.
     M : -3-2-1 0 1 2 3
ROUND(COLUMN명, M)
[ 예제 ]
S_EMP TABLE 에서 LAST_NAME, SALARY/22 의 값을 소수 2째 자리까지 나타내고
소수 3째 자리에서 반올림하시오.
SELECT LAST_NAME, ROUND(SALARY/22, 2)
FROM S_EMP ;

숫자의 절사
지정된 자리수(M) 까지 나타내고 그 밑은 잘라버린다.
COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)은 다음과 같다.
     M : -3-2-1 0 1 2 3
절사 값은 RETURN 한다.
TRUNC(COLUMN명, M)
[ 예제 ]
S_EMP TABLE 에서 LAST_NAME, SALARY / 22 의 값을 십의 자리까지 나타내고
일의 자리는 버림
SELECT LAST_NAME, TRUNC(SALARY/22, -1)
FROM S_EMP ;

나누기의 나머지
M 을 N 으로 나누고 남은 나머지를 RETURN 한다.
MOD(M, N)
[ 예제 ]
10 을 3 으로 나눈 나머지를 구하시오.
SELECT MOD(10, 3)
FROM SYS.DUAL ;

날짜의 연산
DATABASE 안의 DATE 값은 다음과 같은 숫자로 저장되어 있다.
■ CENTURY, YEAR, MONTH, DAY, HOURS, MINUTES, SECONDS
그러므로 산술 연산을 할 수 있다.
● DATE + NUMBER : 숫자만큼 일이 더해진 날짜가 RETURN 된다.
● DATE - NUMBER : 숫자만큼 일이 빼진 날짜가 RETURN 된다.
● DATE1 - DATE2 : 두 날짜 사이의 일수가 계산된다.
날짜 계산을 한다.
DATE + NUMBER
DATE - NUMBER
DATE1 - DATE2
[ 예제 ]
S_EMP TABLE 에서 LAST_NAME, 입사한지 90 일째 되는 날, 입사한지 며칠 됐는 지 검색하시오.
SELECT LAST_NAME, START_DATE + 90, SYSDATE - START_DATE
FROM S_EMP;
( 날짜에는 시간도 포함되어 있으므로 일수 계산의 결과가 소수로 나온다. )

날짜 사이의 개월 수
두 날짜 사이의 개월 수를 RETURN 한다.
MONTHS_BETWEEN(DATE1, DATE2)
[ 예제 ]
S_EMP TABLE 에서 LAST_NAME, 입사한지 몇 달이 됐는지 출력하시오.
SELECT LAST_NAME, MONTHS_BETWEEN(SYSDATE, START_DATE)
FROM S_EMP ;
(일이 포함되어 있어서 소수로 출력된다.)

날짜에 달을 더함
날짜에서 숫자(N) 개월만큼 더해진 날짜를 RETURN 한다.
ADD_MONTHS(DATE, N)
[ 예제 ]
S_EMP TABLE 에서 LAST_NAME, START_DATE, 입사한지 3 개월되는 날짜를 출력하시오.
SELECT LAST_NAME, START_DATE, ADD_MONTHS(START_DATE, 3)
FROM S_EMP ;

지정한 요일 날짜
날짜에서 지정한 요일(CHAR)이 될 날짜를 RETURN 한다.
NEXT_DAY(DATE, 'CHAR')
[ 예제 ]
오늘을 기준으로 돌아오는 금요일이 언제인지 출력하시오.
SELECT SYSDATE, NEXT_DAY(SYSDATE, 'FRIDAY')
FROM SYS.DUAL ;

그 달의 마지막 날
날짜가 포함된 달의 마지막 날을 RETURN 한다.
LAST_DAY(DATE)
[ 예제 ]
이번 달의 마지막 날은 언제인지 출력하시오.
SELECT SYSDATE, LAST_DAY(SYSDATE)
FROM SYS.DUAL ;

날짜의 반올림
형태에 따른 반올림 기준은 다음과 같다.
• YEAR : 6월 이후
• MONTH : 15일 이후
• DAY : 12시 이후
날짜 데이타를 지정된 형태까지 나타내고 그 이하에서 반올림한다.
ROUND(COLUMN명, '형태')
[ 예제 ]
S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오.
단, 15일 이후는 다음달로 올리시오.
SELECT ID, LAST_NAME, ROUND(START_DATE, 'MONTH')
FROM S_EMP ;

날짜의 절사
날짜 데이타를 지정된 형태까지 나타내고 그 밑은 잘라낸다.
TRUNC(COLUMN명, '형태')
[ 예제 ]
S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오.
단, 일자는 잘라버리시오.
SELECT ID, LAST_NAME, TRUNC(START_DATE, 'MONTH')
FROM S_EMP ;

문자를 날짜로 변환
CHARACTER TYPE 을 지정된 형태의 DATE TYPE 으로 변환한다.
TO_DATE(character_column명, '형태')
[ 예제 ]
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') ;

날짜를 문자로 변환
DATE 값은 기본적으로 DD-MON-YY 형태로 출력된다.
이것을 TO_CHAR FUNCTION 을 사용하면 원하는 다른 형태로 변환할 수 있다.
■ 형태를 지정할 때 사용된 대소문자로 출력된다.
■ DAY 와 MONTH 형태는 공백을 포함한 9 자리로 출력된다.
■ TO_CHAR 의 결과는 80 자리로 출력된다.
DATE TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.
TO_CHAR(date_column, '형태')
[ 예제 ]
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 ;

숫자를 문자로 변환
NUMBER TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.
TO_CHAR(number_column명, '형태')
[ 예제 ]
S_EMP TABLE 에서 LAST_NAME, SALARY 를 검색하시오.
단 SALARY 를 $1,450 와 같은 형태로 출력시키시오.
SELECT LAST_NAME, TO_CHAR(SALARY, '$999,999')
FROM S_EMP ;


제 3 장. 여러Table로부터 Data검색
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 들을 연결하여 검색한다.
SELECT table명.column명, table명.column명...
FROM table1명, table2명
WHERE table1명.column1명 = table2명.column명 ;
[ 예제 ]
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 ;

특정 row의 join
JOIN 문장을 기술할 때 JOIN 조건식 이외에 다른 조건식을 AND 로 연결할 수 있다.
SELECT table명.column명, table명.column명...
FROM table1명, table2명
WHERE table1명.column1명 = table2명.column2명 AND condition ;
[ 예제 ]
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' ;

Table alias
JOIN 문장에서 TABLE명이 긴 경우 TABLE명.COLUMN명 으로 적는 것이 매우 불편하다.
그런데 TABLE명 대신 ALIAS 를 사용하면 편하게 사용할 수 있다.
(SELECT 문장에서 TABLE명 대신 ALIAS 를 지정했다면 그 문장에서는 계속해서
ALIAS 로 사용하여야 한다.)
TABLE ALIAS를 사용하여 JOIN 문장을 간단하게 기술한다.
SELECT alias명.column명, alias명.column명
FROM table1명 alias1명, table2명 alias2명
WHERE alias1명.column1명 = alias2명.column2명 ;
[ 예제 ]
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 ;

Non-Equijoin
NON-EQUIJOIN
JOIN 문장에서 두 TABLE 을 JOIN 하는 조건식에 = OPERATOR 가 사용되지 않고
다른 OPERATOR 가 사용되는 것을 말한다.
SELECT table명.column명, table명.column명...
FROM table1명, table2명
WHERE 조인조건식 ;
[ 예제 ]
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 이 간편하다.)

Outer Join
두 TABLE 을 JOIN 할 때 JOIN 조건식을 만족시키지 못하는 ROW 는 검색에서 빠지게 된다.
그런데 이러한 ROW 들이 검색되도록 하는 것이 OUTER JOIN 이다.
(+) OUTER JOIN OPERATOR 를 데이타가 없는 어느 한쪽의 COLUMN 쪽에 붙인다.
JOIN 결과, 데이타가 없는 쪽의 COLUMN 값은 NULL로 검색된다.
조건식을 만족시키지 못하는 데이타도 검색한다.
SELECT table명.column명, table명.column명
FROM table1명, table2명
WHERE table1명.column1명 = table2명.column2명(+)
[ 예제 ]
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 ;

Self Join
TABLE 의 ALIAS 를 사용하여, 마치 2 개의 TABLE 처럼 생각하여 자신의 TABLE 과 자신의 TABLE 을 JOIN 한다.
SELECT alias명.column명, alias명.column명...
FROM table명 alias1명, table명 alias2명
WHERE alias1명.column1명 = alias2명.column2명 ;
[ 예제 ]
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
Group Function
각각의 FUNCTION 은 ARGUMENT 를 받는데 기능은 다음과 같다.
■ DISTINCT : 중복된 값은 제외한다.
■ ALL : DEFAULT 로써 모든 값을 포함한다.
■ COLUMN명 : NULL 값은 제외한다.
■ * : NULL 값도 포함한다.
TABLE 전체를 하나의 GROUP 으로 보고 GROUP FUNCTION 값을 RETURN 한다.
SELECT group_function(column명), group_function(column명)...
FROM table명 ;
[ 예제 ]
S_EMP TABLE 에서 회사 전체의 급여합계, 최고급여, 최소급여, 인원수를 검색하시오.
SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), COUNT(SALARY)
FROM S_EMP ;
( COUNT(SALARY) 는 급여를 받는 사원의 총 인원수고 COUNT(*) 는 급여를 받지 않는 사원의 인원수도 포함된다.)

소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 값을 구한다.
SELECT column1명[, column2명], group_function(column명)
FROM table명
GROUP BY column1명[, column2명] ;
[ 예제 ]
S_EMP TABLE 에서 DEPT_ID, TITLE 별로, 최고급여, 최소급여, 인원수를 검색하시오.
SELECT DEPT_ID, TITLE,
MAX(SALARY), MIN(SALARY),
COUNT(SALARY)
FROM S_EMP
GROUP BY DEPT_ID, TITLE;

특정 group의 선택
HAVING 절이 기술됐을 때 처리되는 순서는 다음과 같다.
① ROW 들이 GROUPing 된다.
② GROUP 에 대해 GROUP FUNCTION 이 적용된다.
③ HAVING 절을 만족하는 GROUP 을 선택한다.
그러므로 GROUP BY 절과 HAVING 절의 순서는 바뀌어도 되지만 의미상 GROUP BY
절 다음에 HAVING 절을 기술하는 것이 좋다.
HAVING 절에서는 GROUP FUNCTION 을 사용하여 GROUP 에 대한 조건식을 기술한다.
SELECT column1명[, column2명], group_function(column명)
FROM table명
GROUP BY column1명[, column2명]
HAVING 그룹조건식 ;
[ 예제 ]
S_EMP TABLE 에서 TITLE 별로 급여합계를 검색하시오.
단, 급여합계가 5000 이상인 GROUP 만 출력하시오.
SELECT TITLE, SUM(SALARY) PAYROLL
FROM S_EMP
GROUP BY TITLE
HAVING SUM(SALARY) >= 5000 ;

Group의 정렬
기본적으로 GROUP BY 절에 기술된 COLUMN 값으로 SORT 된다.
이 순서를 바꾸고자 하면 ORDER BY 절을 기술하면 된다.
DATA 의 SORT 순서를 정한다.
SELECT column1명[, column2명], group_function(column명)
FROM table명
GROUP BY column1명[, column2명]
ORDER BY column명| group_function(column명) ;
[ 예제 ]
S_EMP TABLE에서 DEPT_ID 별로 인원수를 검색하시오.
단, 인원수가 많은 부서부터 출력하시오.
SELECT DEPT_ID, COUNT(*)
FROM S_EMP
GROUP BY DEPT_ID
ORDER BY COUNT(*) DESC ;

제 5 장. Subquery
Single Row Subquery
SUBQUERY 의 결과가 1 개의 ROW 로 나오는 것을 SINGLE ROW SUBQUERY 라 하며
다음과 같은 OPERATOR 를 사용할 수 있다.
=, >, >=, <, <=
VALUE 값을 구하기 위해 SELECT 문장을 사용한다.
SELECT column명, column명...
FROM table명
WHERE column명 operator (SELECT column명
FROM table명
WHERE 조건식 );
[ 예제 ]
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') ;

From절의 Subquery
FROM 절에 기술된 SUBQUERY 문은 VIEW 처럼 사용된다.
SELECT alias명.column명, alias명,column명...
FROM table1명 alias1명, (SELECT column2명
FROM table2명
WHERE 조건식) alias2명
WHERE alias1명.column1명 OPERATOR alias2명.column2명 ;
[ 예제 ]
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 ;

Multi Row Subquery
SUBQUERY 의 결과가 여러 ROW 일 때는 반드시 IN OPERATOR 를 사용하여야 한다.
SELECT column명, column명...
FROM table명
WHERE column명 IN ( SELECT column명
FROM table명
WHERE 조건식);
[ 예제 ]
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') ;

Multi Column Subquery
SELECT 문장의 WHERE 절에서 여러개의 COLUMN 값을 비교하려면 LOGICAL
OPERATOR 를 사용하여 여러개의 조건식을 기술하여야 한다.
그런데 MULTI COLUMN SUBQUERY 를 사용하면 이를 해결할 수 있다.
SELECT column명, column명,,,
FROM table명
WHERE (column명, column명...) IN (SELECT column명, column명...
FROM table명
WHERE 조건식);
[ 예제 ]
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, TITLE
FROM S_EMP
WHERE 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 생성
이름 붙이는 법
이름은 다음의 규칙을 따라서 지정한다.
■ TABLE 명이나 COLUMN 명은 문자로 시작하고 30 자 이내로 지정한다.
■ A ~ Z, a ~ z, 0 ~ 9, _ , $ , # 을 사용할 수 있다.
■ 한 USER 내에서는 다른 OBJECT 의 이름과 동일하게 지정할 수 없다.
■ ORACLE7 SERVER 예약어를 사용할 수 없다.
■ 대소문자를 구별하지 않는다.

Oracle 7 datatype
COLUMN 의 DATATYPE 은 다음과 같다.
■ CHAR(size) : 고정된 size 의 문자 값, 최대 255 자까지 지정할 수 있다.
■ VARCHAR2(size) : size내에서의 가변길이 문자 값,최대 2000자까지 지정할 수 있다.
■ LONG : 가변길이 문자 값, 최대 2 기가 바이트까지 사용할 수 있다. TABLE 당 한 개의 COLUMN 에만 지정 가능하다.
■ NUMBER(p,s) : 정수, 소수 자리수의 합이 P, 소수 자리수가 s 인 숫자값, 최대 38 자리수까지 지정할 수 있다.
■ DATE : 날짜와 시간 값, B.C. 4712년 1월 1일부터 A.D. 4712년 12월 31일까지 입력할 수 있다.
■ RAW(size) : size 내에서의 가변길이 BINARY DATA
■ LONGRAW : 가변길이 BINARY DATA

다른 table로부터 table생성
기존하는 TABLE 로 부터 데이타와 구조를 복사하여 TABLE 을 생성한다.
CREATE TABLE table명 [(column명, column명...)]
AS subquery ;
[ 예제 ]
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 만 복사된다.)

Constraint
CONSTRAINT 의 종류는 다음과 같다.
■ NOT NULL
COLUMN 에 NULL 값이 입력되는 것을 허용하지 않는다.
COLUMN-CONSTRAINT 로만 기술해야 한다.
■ 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 이 자동 생성된다.
■ 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 이 자동 생성된다.
■ 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 로 기술할 수 있다.
CONSTRAINT 명은 다음과 같이 지정한다.
• CONSTRAINT 는 DICTIONARY 에 저장되므로 참조하기 쉽게 의미있게 붙여준다.
• 일반적으로 TABLE명_COLUMN명_CONSTRAINT종류와 같은 형태로 지정한다.
• 사용자가 CONSTRAINT 명을 지정하지 않으면 ORACLE7이 SYS_Cn의 형태로 붙인다.
• 동일한 USER 내에서 CONSTRAINT명은 UNIQUE해야 한다.
CONSTRAINT 는 다음과 같이 기술할 수 있다.
COLUMN-CONSTRAINT : column명 [CONSTRAINT constraint명] constraint종류
TABLE-CONSTRAINT : [CONSTRAINT constraint명] constraint종류
(column명, column명..)

Table 생성
CREATE TABLE table명
(column명 type(size) [DEFAULT VALUE] [column constraint],
column명 type(size) [DEFAULT VALUE] [column constraint],
.... ,
[table constraint] ,
[table constraint] ,
.... ) ;
[ 예제 ]
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
DICTIONARY
• DATABASE 가 만들어 졌을때 DICTIONARY TABLE 도 만들어 진다.
• DATABASE 가 사용중일때 DICTIONARY TABLE 은 ORACLE7 SERVER 에 의해 UPDATE 된다.
• 사용자들은 DICTIONARY TABLE 을 SELECT 할 수 있다.
• DICTIONARY TABLE 은 SYS USER 의 소유다.
• DICTIONARY TABLE 의 값은 대문자로 들어있다.
• DICTIONARY TABLE 의 종류는 다음과 같은 방법으로 알 수 있다.
SELECT   *
FROM    DICTIONARY ;
DICTIONARY TABLE 의 종류는 다음과 같다.
• USER : USER 가 소유하고 있는 OBJECT 의 정보를 보여준다.
• ALL : USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다.
• DBA : DBA USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다.

활용예
DICTIONARY TABLE 의 검색예는 다음과 같다.
■ 자신이 갖고 있는 TABLE 의 이름을 검색한다.
SELECT   OBJECT_NAME
FROM    USER_OBJECTS
WHERE   OBJECT_TYPE = 'TABLE';
■ 자신이 갖고 있는 OBJECT 의 종류를 검색한다.
SELECT   DISTINCT OBJECT_TYPE
FROM   USER_OBJECTS;
■ GRANT 와 관련된 DICTIONARY TABLE 의 이름을 검색한다.
SELECT   TABLE_NAME
FROM   DICTIONARY
WHERE   UPPER(COMMENTS) LIKE '%GRANT%';
■ S_EMP TABLE 의 CONSTRAINT 종류를 검색한다.
SELECT   CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION,
R_CONSTRAINT_NAME
FROM   USER_CONSTRAINTS
WHERE   TABLE_NAME = 'S_EMP';
■ S_EMP TABLE 의 COLUMN CONSTRAINT 를 검색한다.
SELECT   CONSTRAINT_NAME, COLUMN_NAME
FROM   USER_CONS_COLUMNS
WHERE   TABLE_NAME = 'S_EMP';

제 8 장. Data 조작
데이타 입력
TABLE 전체 COLUMN 에 값을 입력한다.
INSERT INTO table명
VALUES (value, value...);
[ 예제 ]
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명을 기술하여 입력하는 방법이 더 좋다.)

특정 column에 데이타입력
데이타를 입력하고자 하는 COLUMN을 선택하여 입력한다.
INSERT INTO table명(column명, column명....)
VALUES (value, value....);
[ 예제 ]
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') ;

Null, 특수 value 입력
COLUMN 값에 NULL 값을 지정하는 방법은 3 가지가 있다.
• INSERT 문장의 COLUMN LIST 에서 생략한다.
• INSERT 문장의 VALUE 절에서 NULL 로 지정한다.
• INSERT 문장의 VALUE 절에서 '' 로 지정한다.
COLUMN 값에 특수한 값을 입력할 수 있다.
SYSDATE : 현재날짜와 시간
USER : 현재 USERID
[ 예제 ]
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);

특수형태의 날짜/시간입력
DATE 값을 입력할 때는 지정된 DATE 형태로 입력하여야 한다.
일반적으로 DD-MON-YY 형태를 사용하며, 이 형태로 데이타를 입력하면 세기는 현재의 세기로, 시간은 자정으로 입력된다.
다른 세기의 날짜나 시간을 입력하고 싶으면 TO_DATE FUNCTION 을 사용한다.
지정된 형태가 아닌 다른 형태의 날짜 값을 입력한다.
TO_DATE('날짜값','날짜형태')
[ 예제 ]
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'));

다른table로부터 데이타입력
INSERT 문장을 사용하여 기존하는 TABLE 의 데이타를 다른 TABLE 로 COPY 할 수 있다.
INSERT INTO table명[(column명, column명...)]
SUBQUERY;
[ 예제 ]
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 수는 같아야 한다.)

데이타 수정
UPDATE 문장을 사용하여 이미 존재하는 COLUMN 값을 수정한다.
UPDATE table명
SET column명 = value, [column명 = value]
[WHERE 조건식] ;
[ 예제 ]
S_EMP TABLE 에서 ID 가 1 인 사원의 데이타를 다음과 같이 수정하시오.
DEPT_ID : 32, SALARY : 2550
UPDATE S_EMP
SET DEPT_ID = 32, SALARY = 2550
WHERE ID = 2 ;

데이타 삭제
DELETE 문장을 사용하여 데이타를 삭제한다.
DELETE FROM table명
[WHERE 조건식] ;
[ 예제 ]
S_EMP TABLE에서 ID 가 20 보다 큰 사원을 삭제하시오.
DELETE FROM S_EMP
WHERE ID > 20 ;

저장
COMMIT 문장(COMMIT;)에 의해 변경된 모든 내용이 DATABASE 에 저장된다.
변경된 모든 데이타는 DATABASE 에 저장된다.
그 전의 데이타는 완전히 없어진다.
모든 사용자가 변경한 내용을 볼 수 있다.
변경된 ROW 에 걸려있던 LOCK 이 해제된다.
그러므로 다른 사용자가 수정할 수 있다.
모든 SAVEPOINT 가 없어진다.
TRANSACTION 을 종료하고 TRANSACTION 안의 모든 변경된 작업을 저장한다.

취소
ROLLBACK 문장(ROLLBACK)을 사용하여 모든 변경된 내용을 취소한다.
모든 변경이 취소되며 수정하기 전의 데이타가 복구된다.
변경된 ROW 에 걸려있던 LOCK 이 해제된다.
다른 사용자들이 그 ROW 에 대해서 변경을 할 수 있다.
TRANSACTION 을 종료하고 TRANSACTION 안의 모든 변경된 작업을 취소한다.

Savepoint지정~취소
TRANSACTION 안에서 ROLLBACK 할 수 있는 POINT 를 지정한다.
지정된 POINT 까지만 ROLLBACK 한다.
SAVEPOINT savepoint명 ;
ROLLBACK TO savepoint명 ;
[ 예제 ]
S_EMP TABLE 에서 TITLE 이 Stock Clerk 인 사원의 SALARY 를 10% 인상하시오.
SAVEPOINT 를 지정하시오.
S_REGION TABLE 에 다음과 같은 데이타를 입력하시오.
ID : 8, NAME : Central
SAVEPOINT 까지 ROLLBACK 하시오.
UPDATE 결과를 저장하시오.
UPDATE S_EMP
SET SALARY = SALARY * 1.1
WHERE TITLE = 'Stock Clerk' ;
SAVEPOINT S1;
INSERT INTO S_REGION(ID, NAME)
VALUES (8, 'Central') ;
ROLLBACK TO S1;
COMMIT;


제 9 장. Table변경/삭제
Column 추가
TABLE 에 새로운 COLUMN 을 추가한다.
ALTER TABLE table명
ADD (column명 type(size) [DEFAULT value] [column_constraint],
...........) ;
[ 예제 ]
S_REGION TABLE 에 다음과 같은 COLUMN 을 추가하시오.
COMMENTS VARCHAR2(25)
ALTER TABLE S_REGION
ADD (COMMENTS VARCHAR2(25))
(추가될 COLUMN 의 위치는 지정할 수 없다. 새로운 COLUMN 은 마지막 위치에 생성된다.)

Column 변경
ALTER TABLE 문장의 MODIFY 절을 사용하여 다음과 같은 변경을 할 수 있다.
COLUMN 의 크기를 확장할 수 있다.
데이타가 들어있지 않으면 COLUMN 의 크기를 줄일 수 있다.
데이타가 들어있지 않다면 COLUMN 의 타입을 수정할 수 있다.
COLUMN 에 NULL 값이 없다면 NOT NULL CONSTRAINT 를 지정할 수 있다.
DEFAULT VALUE 를 변경할 수 있다.
이미 생성되어 있는 COLUMN 을 변경한다.
ALTER TABLE table명
MODIFY (column명 type(size) [DEFAULT value] [NOT NULL],
.............) ;

Constraint 추가
이미 생성되어 있는 TABLE 에 CONSTRAINT 를 추가한다.
ALTER TABLE table명
ADD (table_constraint) ;
[ 예제 ]
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)) ;

Constraint 삭제
이미 생성되어 있는 TABLE 의 CONSTRAINT 를 삭제한다.
ALTER TABLE table명
DROP PRIMARY KEY |
UNIQUE(column명) |
CONSTRAINT constraint명 [CASCADE] ;
[ 예제 ]
S_EMP TABLE 의 다음과 같은 CONSTRAINT 를 삭제하시오.
MANAGER_ID COLUMN 의 FOREIGN KEY CONSTRAINT
ALTER TABLE S_EMP
DROP CONSTRAINT S_EMP_MANAGER_ID_FK ;

전체 데이타의 삭제
TRUNCATE 문장은 DDL 이다.
ROLLBACK SEGMENT 를 만들지 않고 모든 데이타를 삭제한다.
데이타가 삭제된 FREE 영역은 환원된다.
TABLE 로부터 모든 데이타를 삭제한다.
TRUNCATE TABLE table명 ;
[ 예제 ]
S_ITEM TABLE 의 모든 데이타를 삭제하시오.
TRUNCATE TABLE S_ITEM ;

Constraint disable/enable
TABLE 에 있는 모든 데이타가 CONSTRAINT 를 만족시켜야 ENABLE 할 수 있다.
PRIMARY KEY, UNIQUE CONSTRAINT 를 ENABLE 하면 그에 따른 INDEX FILE 이 자동적으로 생성된다.
CASCADE OPTION 은 FOREIGN KEY CONSTRAINT 를 DISABLE 할 때 사용한다.
CONSTRAINT 를 삭제하고 새로 만들지 않고 DISABLE, ENABLE 한다.
ALTER TABLE table명
DISABLE | ENABLE PRIMARY KEY |
UNIQUE(column명) |
CONSTRAINT constraint명 [CASCADE] ;
[ 예제 ]
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 된다.

Table 삭제
TABLE 을 삭제하면 그 TABLE 에 딸린 INDEX FILE 도 삭제된다.
VIEW, SYNONYM, STORED PROCEDURE, FUNCTION, TRIGGER 등은 삭제되지 않는다.
CASCADE CONSTRAINTS 는 모 TABLE 을 삭제하고 자 TABLE 의 FOREIGN KEY CONSTRAINT 도 삭제한다.
DROP TABLE table명 [CASCADE CONSTRAINTS] ;
[ 예제 ]
S_DEPT TABLE 을 삭제하시오.
DROP TABLE S_DEPT CASCADE CONSTRAINTS ;

이름의 변경
TABLE, VIEW, SEQUENCE, SYNONYM 의 이름을 변경한다.
RENAME old명 TO new명 ;
[ 예제 ]
S_ORD TABLE 의 이름을 S_ORDER 로 변경하시오.
RENAME S_ORD TO S_ORDER ;

제 10 장. Sequence
Sequence 생성
SEQUENCE 는 여러 사용자에게 UNIQUE 한 값을 생성해 주는 OBJECT 이다.
SEQUENCE 를 사용하여 PRIMARY KEY 값을 자동적으로 생성한다.
CREATE SEQUENCE sequence명
INCREMENT BY n
START WITH n
MAXVALUE n | NOMAXVALUE
MINVALUE n | NOMINVALUE
CYCLE | NOCYCLE
CACHE n | NOCACHE ;
[ 예제 ]
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 ;

Sequence 변경
SEQUENCE 에 정의된 값을 변경한다.
ALTER SEQUENCE sequence명
INCREMENT BY n
MAXVALUE n | NOMAXVALUE
MINVALUE n | NOMINVALUE
CYCLE | NOCYCLE
CACHE n | NOCACHE ;
[ 예제 ]
S_DEPT_ID SEQUENCE 를 다음과 같이 수정하시오.
CACHE : 10
ALTER SEQUENCE S_DEPT_ID
CACHE 10 ;

Sequence 삭제
SEQUENCE 를 삭제한다.
DROP SEQUENCE sequence명 ;
[ 예제 ]
S_DEPT_ID SEQUENCE 를 삭제하시오.
DROP SEQUENCE S_DEPT_ID ;

제 11 장. VIEW

Simple view
SUBQUERY 문장이 간단한 경우 VIEW 를 통해 SELECT,INSERT,UPDATE,DELETE 를 할 수 있다.
■ SELECT : SUBQUERY 의 조건식을 만족하는 데이타만 검색된다.
■ INSERT : NOT NULL COLUMN 을 다 포함하고 있는 경우 INSERT 를 할 수 있다.
SUBQUERY 의 조건식을 만족하지 않는 데이타도 입력이 가능하다.
■ UPDATE : VIEW 를 통해 SELECT 할 수 있는 데이타만 수정할 수 있다.
SUBQUERY 의 조건식을 만족하지 않는 데이타도 수정이 가능하다.
■ DELETE : VIEW 를 통해 SELECT 할 수 있는 데이타만 삭제할 수 있다.
CREATE VIEW view명 [(alias명, alias명....)]
AS SUBQUERY ;
[ 예제 ]
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 ;

With check option
VIEW 를 정의할때 지정한 조건식을 만족하는 데이타만 INSERT, 또는 조건식을 만족하는 데이터로만 UPDATE 가 가능하다.
데이타가 VIEW 의 조건식을 만족하는지 CHECK 한다.
CREATE VIEW view명 [ (alias명, alias명...)]
AS SUBQUERY
WITH CHECK OPTION ;
[ 예제 ]
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 ;

With read only
SELECT만 가능한 VIEW 를 생성한다.
CREATE VIEW view명 [(alias명, alias명...)]
AS SUBQUERY
WITH READ ONLY ;
[ 예제 ]
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 ;

Force
기준 TABLE 이 존재하지 않아도 VIEW 를 생성한다.
CREATE FORCE VIEW view명 [(alias명, alias명...)]
AS SUBQUERY ;
[ 예제 ]
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 ;

complex view
SUBQUERY 문장에 JOIN, FUNCTION, DISTINCT 또는 연산이 포함된 경우를 말하며 이 경우 VIEW 를 통한 DML 은 수행할 수 없다.
COMPLEX VIEW 를 생성한다.
CREATE VIEW view명 (alias명, alias명...)
AS SUBQUERY ;
[ 예제 ]
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 ;

View 삭제
VIEW 를 삭제하면 DATABASE 로부터 VIEW 의 정의가 삭제된다.
VIEW 가 기초로 한 TABLE 은 삭제되지 않는다.
DROP VIEW view명 ;
[ 예제 ]
EMPDEPT VIEW 를 삭제하시오.
DROP VIEW EMPDEPT ;

제 12 장. Index

Index 생성
TABLE 생성시 PRIMARY KEY 나 UNIQUE CONSTRAINT 를 지정하면 UNIQUE INDEX 가 자동적으로 만들어 진다.
이 외의 COLUMN 으로 QUERY 를 할 때 속도를 향상시키기 위해서 INDEX 를 생성한다.
INDEX 를 생성하면 QUERY 속도는 빨라질 수 있으나 DML 속도는 늦어질 수 있다.
일반적으로 다음과 같은 경우에 INDEX 를 생성한다.
■ COLUMN 이 WHERE 절이나 JOIN 조건식에 빈번하게 사용될 때
■ COLUMN 값이 넓게 분포되어 있을 때
■ COLUMN 값에 NULL 값이 많이 포함되어 있을 때
■ TABLE 이 크고 QUERY 하는 데이터 양이 10 % 이하일 때
CREATE [UNIQUE] INDEX index명
ON table명(column명[, column명...]) ;
[ 예제 ]
S_EMP TABLE 에서 LAST_NAME 의 QUERY 속도를 향상하기 위하여 INDEX 를 생성하시오.
CREATE INDEX S_EMP_LAST_NAME_IDX
ON S_EMP(LAST_NAME) ;

Index 삭제
INDEX 는 수정할 수 없다. 수정하고 싶은 경우 삭제하고 다시 생성한다.
DROP INDEX index명 ;
[ 예제 ]
S_EMP_LAST_NAME_IDX INDEX 를 삭제하시오.
DROP INDEX S_EMP_LAST_NAME_IDX ;

 

출처 : 지식검색 


======================================================================
유닉스 명령어 정리
======================================================================

---------------------------
1.DOS와 비슷한 명령어
---------------------------

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

(1). cat

기능 : 파일의 내용을 화면에 출력. DOS의 'type' 명령과 유사.
사용법 : cat [options] <file1> <file2> … <fileN>

옵션
-n : 행번호를 붙여서 출력.

예제 :
# cat /etc/fstab
: /etc/fstab의 내용을 화면에 출력
사용팁 : 리눅스에서 두개이상의 옵션을 붙힐때는 앞의
'-'는 한번만 사용하고 영문자만 붙혀서 사용.

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

(2). cd

기능 : 디렉토리 변경.
그냥 'cd'만 입력하고 엔터키를 누르면 자기 자신의 홈디렉토리로 이동.
사용법 : cd <디렉토리>

예제
# cd ~dalma
: dalma 라는 유저의 홈디렉토리로 이동

# cd
: 자기자신의 홈디렉토리로 이동

# cd ..
: 현재 디렉토리에서 부모디렉토리로 이동

# cd /usr/bin
: /usr/bin 디렉토리로 이동

주의점 : cd 명령 후 반드시 한칸 띄우도록 하자.

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

(3). cp

기능 : 파일 복사
사용법 : cp [options] <file1> <file2> … <fileN> <destination>

옵션
-b : 덮어쓰거나 지울 때 백업본의 파일을 만든다.
-d : symbolic link 파일을 그대로 복사한다.
-f : 같은 파일의 이름을 가지는 파일이 있는 경우 이 파일을 지운 후 복사한다.
-i : 같은 파일 이름을 가지는 파일이 있는 경우 사용자에게 확인 후 복사한다.
-R : 서브디렉토리를 포함하여 복사한다.

예제
# cp .bash_profile temp.bash_profile
: .bash_profile 파일을 temp.bash_profile로 복사

# cp -R ../home/tmp/* .
: 현재 디렉토리의 부모 디렉토리에 있는 '/home/tmp' 디렉토리 밑의 서브디렉토리를
포함한 모든 디렉토리를 현재의 디렉토리로 복사.

주의점 : DOS와는 달리 현재 디렉토리로 복사할 때 <DESTINATION>을 생략해서는 안된다.
현재 디렉토리를 뜻하는 '.'을 두번째 예제와 같이 꼭 붙혀주도록 하자.

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

(4). date

기능 : 시스템의 날짜와 시간을 표시하고 이를 수정
사용법 : date

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

(5). ls

기능 : 파일과 디렉토리를 출력
사용법 : ls [option] <file1> <file2> … <fileN>

옵션
-a : 디렉토리내의 숨김 파일까지 모두 표시
-l : 파일의 사용허가, 소유자, 그룹, 파일의 크기, 날짜 등을 출력
-F : 파일의 형태와 함께 출력되는데 출력되는 파일의 형태는 '*', '@', '|', '=' 등이며,
이것은 각각 실행 파일, 심볼릭 링크, FIFO 소켓을 나타낸다.
-m : 쉼표를 구분하여 파일을 가로로 출력한다.
-R : 서브디렉토리의 내용을 포함하여 파일을 출력한다.

예제 :
# ls -alF /home/dalma
: /home/dalma 디렉토리에 있는 모든 파일을 파일의
사용허가, 소유자, 그룹, 파일의 크기, 날짜등을 포함하여
파일의 형태와 함께 출력

사용팁 : 리눅스를 비롯한 유닉스에서는 파일의 처음이 '.'로 시작하면
숨겨진 파일로 인식.
즉, '.bash_profile' 같은 파일은 '-a' 옵션을 붙히지 않으면 'ls'명령으로 확인을 할 수가 없다.

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

(5). man

기능 : 도움말을 출력
사용법 : man [option] <COMMAND>

예제 : 'man ls' (ls 명령어의 도움말을 출력한다.)

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

(6). mkdir

기능 : 새로운 디렉토리를 만드는 데 사용한다. DOS의 'md' 명령과 유사하다.
사용법 : mkdir [option] <directory1> <directory2> … <directoryN>
옵션
-p : 지정된 모든 서브디렉토리까지 함께 생성한다.
-m mode : mode에 해당하는 사용 허가로 디렉토리를 생성한다. Mode에 대한 설명은 뒤에서 설명할 'chmod' 명령에서 함께 설명한다.
예제 : 'mkdir /home/dalma/tmp' (/home/dalma 디렉토리 밑에 tmp 디렉토리를 만든다.)

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

(7). more

기능 : 주어진 파일의 내용을 한 화면씩 출력한다. DOS의 'more' 명령과 유사하다.
사용법 : more <file1> <file2> … <fileN>
옵션 : 리눅스에서의 more 명령은 DOS에서와는 다르게 실행중 화면이 정지해 있을 때 명령어가 제공되는데 이 명령어를 이용하여 파일의 내용을 편리하게 볼 수 있다.
h : 도움말
[space], z : 다음 페이지를 출력
[Return] : 한 라인씩 스크롤시킴
d, <Ctrl+D> : 반 페이지씩 스크롤시킴
q, Q : 종료
f : 다음 페이지를 출력
b, : 앞 페이지를 다시 출력
/<검색어> : <검색어>에 해당되는 단어를 검색
= : 현재라인을 출력
:!<COMMAND> : <COMMAND>에 의해 주어진 명령어를 실행
<Ctrl+L> : 화면을 다시 리프레쉬 시킴
:f : 현재 파일 이름과 라인을 출력
사용팁 : 유닉스와 파이프 명령 '|'을 이용해서 다른 명령과 함께 조합하여 사용할 수 있다. 예를 들어 'cat /home/dalma/readme | more' 를 입력하면 /home/dalma/readme 파일을 화면에 출력하는데 한화면씩 끊어서 출력을 하고, 'ls /home/dalma |more' 명령을 입력하면 /home/dalma 디렉토리 안의 내용을 한화면씩 출력한다.

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

(8). mv

기능 : 파일을 다른 파일이나 디렉토리로 이동시키거나 파일의 이름을 바꾼다. DOS에서는 'ren' 명령이나 'move' 명령과 유사하다.
사용법 : mv [option] <file1> <file2> … <fileN> <destination>
옵션
-b : 파일을 지우기 전에 백업본을 만든다.
-f : 옮겨질 디렉토리에 같은 파일이 있으면 덮어쓴다.
-i : 옮겨질 디렉토리에 같은 파일이 있는지 확인한다.
-u : 옮겨질 디렉토리에 구버전의 파일이 있는 경우에만 옮긴다.
예제
'mv /home/dalma /home/bar' (/home/dalma 디렉토리를 /home/bar 디록토리로 이름을 바꾼다)
'mv /home/dalma/readme /home/foo/README' (/home/dalma/readme 파일을 /home/foo/README 파일로 이동한다.)
사용팁 : 리눅스에서는 파일명에 대소문자를 철저히 구분한다. 즉 'readme'파일과 'README' 파일은 엄현히 다른 파일이다.

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

(9). pwd

기능 : 현재 작업하고 있는 디렉토리의 절대경로명을 보여준다. DOS의 'cd' 명령어와 유사하다.
사용법 : pwd
주의점 : 도스에서 'cd' 명령을 입력하면 현재 디렉토리의 절대경로를 보여주지만 리눅스에서 'cd' 명령을 입력하면 자신의 홈디렉토리로 이동해 버린다. 절대경로를 알기 위해서는 'pwd' 명령을 써야 한다.

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

(10). rm

기능 : 파일을 지우는 명령으로 DOS의 'del', 'deltree' 명령과 유사하다.
사용법 : rm [option] <file1> <file2> … <fileN>
옵션
-f : 삭제중 오류가 발생하더라도 에러 메시지를 출력하지 않는다.
-i : 삭제하기 전에 확인을 한다.
-r : 서브디렉토리를 포함하여 지운다.
-v : 지워지는 파일 이름을 출력한다.
예제
'rm -rf /home/dalma/tmp' (/home/dalma/tmp 디렉토리를 서브디렉토리를 포함해서 모두 지운다.)
'rm .history' (.history 파일을 지운다.)
주의점 : 슈퍼유저 계정인 'root'로 이 명령을 쓸때는 아주 신중을 가해야 한다. 특히 '-r' 옵션을 쓰면 실수로 리눅스 전체를 날릴 수 있기 때문에 가급적 '-i' 옵션과 함께 사용하도록 한다. 'alias rm rm -i' 명령을 내리면 rm 명령을 쓸 때 마다 -i 옵션이 자동으로 추가된다.

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

(11). rmdir

기능 : 빈 디렉토리를 지우는 명령으로 DOS의 'rm' 명령과 유사하다. 그러나 'rm -r' 명령으로 대처할 수 있기 때문에 그렇게 많이 쓰이지는 않는 명령이다.
사용법 : rmdir [option] <directory1> <directory2> … <directoryN>
옵션
-p : 지우고자 하는 디렉토리의 부모디렉토리까지 지운다.
예제 : 'rmdir -p /home/dalma' (/home 디렉토리에 파일이 존재하지 않을 경우라면 /home 디렉토리까지 지운다.)

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

--------------------
2.User에 관한 명령어
--------------------

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

(1). chgrp

기능 : 파일의 그룹소유권을 바꾼다.
사용법 : chgrp [option] <newgroup> <files>
옵션
-R : 한 디렉토리내의 모든 파일이나 하위 디렉토리의 그룹소유권을 바꾼다.
예제
'chgrp admin /home/dalma/readme' (/home/dalma/readme 파일의 그룹소유권을 admin으로 바꾼다.)
'chgrp -R admin /home/dalma (/home/dalma 디렉토리아래의 모든 파일의 그룹 소유권을 admin으로 바꾼다.)


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

(2). chmod

기능 : 파일에 대한 개인, 그룹, 타인에 대한 접근 권한을 변경.
사용법 : chmod [options] <mode> <files>

옵션
r : 읽기 권한 설정
w : 쓰기 권한 설정
x : 실행 권한 설정 (디렉토리의 경우는 접근 권한)

u : 파일의 소유자(user)
g : 그룹(group)
o : 기타(other)

a : 전체사용자(all)
+ : 권한 추가
- : 권한 삭제
= : 권한 지정

예제
# chmod a+r * (현재 디렉토리의 모든 파일을 모든 사용자가 읽을 수 있도록 설정)
# chmod +r * (위예제와 상동)
# chmod o-r, o-w * (현재 디렉토리의 모든 파일을 기타사용자에게 읽기, 쓰기 권한을 없앰)
# chmod og-x stuff (stuff 파일에서 그룹과 기타사용자에게 실행권한을 없앰)
#chmod u+rwx stuff (stuff 파일에서 파일 소유자가 읽기, 쓰기, 실행권한을 추가)
#chmod a=r *.txt (.txt로 끝나는 모든 파일을 전체 사용자가 읽을 수만 있도록 지정)

사용팁 : 숫자를 이용하여 특정권한을 지정

'4'는 읽기 권한
'2'는 쓰기 권한
'1'은 실행 권한

즉, 읽기, 쓰기권한 지정 => 4+2 = 6 로 표시
예를 들면
stuff라는 파일에 소유자에게는 모든권한을 그룹과 다른 사용자에게는 읽기, 실행권한을 주려면
# chmod 755 stuff

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

(3). chown

기능 : 파일의 소유권을 바꾼다.
사용법 : chown [option] <newuser> <file>
옵션 :
-R : 한 디렉토리내의 모든 파일이나 하위 디렉토리의 그룹소유권을 바꾼다.
예제 :
'chown igi /home/dalma/readme' (/home/dalma/readme 파일의 소유권을 igi으로 바꾼다.)
'chown -R igi /home/dalma (/home/dalma 디렉토리아래의 모든 파일의 소유권을 igi으로 바꾼다.)
사용팁 : 리눅스에서는 chown 명령을 통해서 파일의 소유권과 그룹의 소유권을 한번에 바꿀 수 있다. 이를 위해서는 chown의 <NEWUSER>란에 'igi.admin'이라고 입력하면 파일의 소유권은 'igi' 파일의 그룹소유권은 'admin'으로 바뀌어진다.

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

(4). su

기능 : 시스템에 접속한 상태에서 재로그인없이 다른 사람 ID로 접속한다.
사용법 : su [option] [user ID]
옵션
- : 이 옵션이 없으면 자신의 환경변수의 값을 가지고 다른 사람 ID의 권한만 갖지만 이 옵션을 붙히면 그 사용자의 환경변수의 내용까지 완벽하게 복사를 한다.
예제
'su' (사용자 ID없이 명령을 내리면 자동으로 root로 접속을 시도한다.)
'su - dalma' (dalma ID로 접속을 하는데 dalma의 환경변수의 내용까지 맞춘다.)
사용팁 : 리눅스에서는 외부에서 접속을 할 때 root로의 접속을 금지하고 있다. 이유는 보안상의 문제인데 가급적(가능한) root에서의 작업은 피하고 root의 권한이 필요하면 일반 사용자 ID로 작업을 하다가 su 명령을 이용하여 root로 접속하는 습관을 들이는게 좋다.

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

(5). who

기능 : 시스템에 어떤 사람이 로그인하고 있는가를 보여준다.
사용법 : who
write
기능 : 특정사용자와 대화를 시작한다.
사용법 : write [ttyname]
예제
'write dalma' (dalma에게 표준입력을 이용하여 대화하기 시작한다.)
'write dalma /dev/tty21' (/dev/tty21에 있는 dalma와 대화를 시작한다.)
사용팁 : 마지막의 [ttyname]은 한사용자가 동시에 두번이상 접속을 하였을경우 대화할 터미널을 결정하는 부분이다. 그리고 어떤 사용자와 대화를 마쳤을 경우 [CTRL+D]를 눌러주면 대화를 종료한다.

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

(6). find

기능 : 디스크에서 특정 파일을 찾아낸다.
사용법 : find <경로명> [expression]
옵션
-name filename : 찾을 filename을 입력한다.
-perm octperm : 특정 권한을 가진 파일을 검색한다. 이때 권한은 숫자형태로 입력한다.
-type t : 특정 종류의 파일을 (디렉토리, 일반파일 등등) 검색한다.
-size n : 크기가 n인 파일을 검색한다.
-mtime n : n일동안 변경된 파일을 검색한다.
-print : 파일 이름을 출력한다.
-maxdepth levels : 검색 시 서브디렉토리를 levels만큼만 진입을 해서 검색한다..
-mindepth levels : maxdepth와 반대의 명령어로 검색 시 서브디렉토리의 깊이가 level 이상부터 검사를 한다.
예제
'find ~ -name '*.doc' -print (접속한 사용자의 홈디렉토리에 있는 파일 중에서 .doc로 끝나는 모든 파일을 화면에 보여준다.)
'find ~ -type d -print' (접속한 사용자의 홈디렉토리에 있는 파일 중 디렉토리만 출력한다.)

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

(7). ln

기능 : 특정파일의 링크파일을 만든다.
사용법 : ln [option] <file1> <file2>, ln [option] <file1> <file2> … <fileN> <directory>
file1의 링크를 file2에 만든다. file2가 명시되어 있지 않으면 현재 디렉토리에 링크를 만든다.
옵션
-s : 심볼릭 링크를 만든다. 이 옵션을 넣고 링크를 만들면 파일의 형태가 'l'로 표기가 된다.
예제
'ln /usr/base /usr/lock' (/usr/base에 /usr/lock라는 링크를 만든다.)
'ln com1 com2 com3 /bin' (/bin에 com1, com2, com3의 링크를 만든다.)

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

(8). grep

기능 : 주어진 패턴을 포함하는 파일의 라인을 출력시킨다.
사용법 : grep [option] <pattern> <file1> <file2> … <fileN>
옵션
-C : 패턴이 일치하는 문장의 아래 위 두 라인까지 포함하여 출력한다.
-c : 패턴이 일치하는 라인의 개수를 출력한다.
-i : 대소문자를 구분하지 않고 패턴과 일치하는 것을 찾는다.
-v : 패턴과 일치하지 않는 내용을 출력한다.
-w : 패턴과 한단어로 일치해야 출력한다.
-x : 패턴과 전체 라인이 일치해야 출력한다.
예제
'grep linux /home/dalma/readme' (readme 파일 중에서 linux라는 패턴을 포함하는 모든 라인을 출력한다.)
'grep -c /bin/bash /etc/passwd (/etc/passwd 파일에서 /bin/bash의 개수 -로그인셀이 본셀인 사용자의 수를 출력한다.)
'grep -v '^[0-9]' readme' (readme 파일에서 숫자로 시작하지 않는 모든 라인을 보여준다.
사용팁 : 마지막 예제에서 '^[0-9]'의 표현은 좀 생소한 표현일것이다. 이것은 정규식이라고 해서 어떤 문자패턴을 표현하는 하나의 표현식이다. 간단히 설명을 하면 '[0-9]'는 0에서 9까지를 의미하고 '^'는 반대의 의미를 나타낸다. 즉 '^[0-9]'는 0-9로 시작하지 않는 표현이라는 뜻을 가지게 된다.

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

(9). wc

기능 : 그렇게 많이 쓰이는 명령은 아니지만, 리눅스 프로그래머가 자신이 짠 소스의 총라인이 얼마인지 아님 특정 단어의 개수를 조사할 때 쓰이는 명령으로 특정 단어나 문자 또는 행의 수를 세는 명령이다.
사용법 : wc [option] <file1> <file2> … <fileN>
옵션
-c : 문자의 수만 센다.
-l : 행의 수만을 센다.
-w : 단어의 수만을 센다.
사용예
'wc /home/dalma/readme' (readme 파일의 행, 단어, 문자의 수를 출력한다.)
'who | wc -l' (현재 접속한 사람의 수를 표시한다.)
사용팁 : 리눅스는 혼자서 쓰는 운영체제가 아니라 여러 사람이 동시에 사용을 하는 운영체제이다. who는 리눅스에 접속한 모든 사용자의 목록을 보여주는 명령이고 '|'는 파이프 기호라고 해서 여러 개의 명령어를 조합할 때 쓰이는 기호이다. 즉, 파이프 앞의 출력의 내용을 파이프 뒤의 명령의 입력으로 넣어주는 기능을 한다. 위의 예제에서 'who | wc -l' 명령은 'who' 명령의 결과를 'wc -l'의 입력으로 넣어준다. 그래서 현재 접속한 사용자의 개수를 알수 있는것이다.

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

----------------
3.시스템 명령어
----------------

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

(1). df (disk free)

기능 : 디스크의 남은 공간을 보여준다.
사용법 : df [option] [FileSystem | File]

옵션
-k : kilobyte 단위로 보여준다.
-m : megabyte 단위로 보여준다.

예제
# df -k
(kilobyte단위로 남은 공간을 보여준다. -기본값)
# df .
(현재 디렉토리가 포함되어 있는 파티션의 남은공간을 보여준다.)

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

(2). du

기능 : 특정 디렉토리에서 하부디렉토리까지 포함한 디스크의 사용량을 보여주는 명령이다.
사용법 : du [option] [files]
옵션
-a : 디렉토리에 있는 파일 하나하나의 크기를 출력한다.
-s : 총 사용량만 표시해 준다.
-k : 사용량을 kilobyte 단위로 출력해준다.
-h : 용량을 보기 좋게 표시해준다.
예제
'du -a' (현재 디렉토리의 디스크 사용량을 파일단위로 모두 출력한다.)
'du -s *' (현재 디렉토리의 첫번째 단계까지만 디스크의 사용량을 출력한다.)

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

(3). env

기능 : 현재 시스템 사용자들의 환경 변수를 보여준다.
사용법 : env

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

(4). free

기능 : 가상메모리를 포함한 메모리의 사용현황을 보여준다.
사용법 : free

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

(5). id

기능 : 자신의 ID번호와 자신이 속한 그룹의 ID를 보여준다.
사용법 : id

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

(6). kill

기능 : 특정 프로세서에게 특정 시그널을 보낸다.
사용법 : kill [-signal_number] [process id]
예제 u 'kill -HUP 549' (549번 프로세서에 HUP신호를 보낸다.)

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

(7). ps

기능 : 사용자나 시스템 프로세서의 상태에 관한 정보 출력
사용법 : ps [option]

옵션
-a : 전체 사용자의 모든 프로세서를 출력
-l : 결과를 상세하게 출력
-u : 사용자 이름과 프로세서 시작 시간을 출력
-x : 제어터미널을 갖고 있지 않은 프로세서를 출력

예제
# ps -aux
: 전체 사용자의 제어터미널을 갖고 있는 프로세서를 포함하여
사용자 이름과 프로세서 시작시간을 포함하여 출력. 일반적으로 많이 쓰이는 형태
 

출처 : Tong - taesantaesan님의 IT 운영체제통


 

# find 검색할폴더명 -name "*.jpg" > file_list.txt

하면 file_list.txt에 쫙~ 리스트업 됨

 

그러고 나서

wc -l file_list.txt

하면
jpg 파일만 검색해서 리스트 만든 것의 개수를 wc 명령어로 확인 할수 있음~ ^^


Cron & Crontab

 


cron 디먼

목적

명령을 자동으로 수행합니다.

구문

cron

 

설명

cron 디먼은 지정된 날짜와 시간에 쉘 명령을 수행합니다. 다음 이벤트 유형들이 cron 디먼으로 계획됩니다.

  • crontab 명령 이벤트
  • at 명령 이벤트
  • batch 명령 이벤트
  • sync 서브루틴 이벤트
  • ksh 명령 이벤트
  • csh 명령 이벤트

이들 이벤트가 처리되는 방법은 /var/adm/cron/queuedefs 파일에 의해 지정됩니다.

정기적으로 계획된 명령은 crontab 파일에 있는 지침에 따라 지정될 수 있습니다. crontab 명령을 사용하여 crontab 파일을 제출할 수 있습니다. at 명령을 사용하여 한번만 수행될 명령을 제출하십시오. cron 디먼은 절대로 종료하지 않으므로, 한번만 수행되어야 합니다.

cron 디먼은 cron 디먼이 초기설정될 때만 crontab 파일과 at 명령 파일을 시험합니다. crontab 명령을 사용하여 crontab 파일에 변경을 수행할 때, 변경을 나타내는 메세지가 cron 디먼으로 전송됩니다. 이것으로 새로운 또는 변경된 파일에 대해 정기적으로 계획된 간격으로 오버헤드를 점검하지 않아도 됩니다.

chtz 명령, 웹 기반 시스템 관리 응용프로그램으로 또는 SMIT를 통해 TZ 환경 변수를 변경할 때, cron 디먼을 재시작해야 합니다. 이로써 cron 디먼이 새 TZ 환경 변수에 대한 올바른 시간대 및 일광절약시간 변경 정보를 사용할 수 있게 됩니다.

cron 디먼은 /var/adm/cron/log 파일에 활동 로그를 작성합니다.

보안

감사(audit) 이벤트: 감사(auditing) 서브시스템이 적절하게 구성설정되었고 사용 가능한 경우, cron 명령은 실행될 때마다 다음 감사 레코드(이벤트)를 생성합니다.

이벤트 정보
CRON_Start 각 작업의 이름, 작업이 at 또는 cron 명령에 의해 개시되었는지 여부 및 작업을 시작한 시간을 나열합니다.
CRON_Finish 사용자의 이름, 작업의 프로세스 ID 및 처리가 완료된 시간을 나열합니다.

감사 이벤트 선택 및 그룹화하는 방법과 감사 이벤트 데이타 수집 구성설정 방법에 대한 자세한 내용은 AIX Version 4.3 System Management Guide: Operating System and Devices에 있는 "감사 기능 설정"을 참조하십시오.

파일

/var/adm/cron/FIFO crontab 또는 at 명령으로 새 작업이 제출될 때 cron 디먼으로 메세지를 전송하는 명명된 파이프.
/var/adm/cron cron 디먼 디렉토리를 지정합니다.
/var/adm/cron/log 사용통계 정보를 지정합니다.
/var/adm/cron/queuedefs
                          cron 디먼 이벤트 파일을 지정합니다.
/var/spool/cron 스풀 영역을 지정합니다.
/usr cron 디먼에 의해 계속 열려 있는 디렉토리를 나타냅니다.
/usr/bin cron 디먼에 의해 계속 열려 있는 디렉토리를 나타냅니다.
/usr/lib cron 디먼에 의해 계속 열려 있는 디렉토리를 나타냅니다.
/etc cron 디먼에 의해 계속 열려 있는 디렉토리를 나타냅니다.
/tmp cron 디먼에 의해 계속 열려 있는 디렉토리를 나타냅니다.

 


crontab 명령

목적

cron 작업을 제출, 편집, 나열 또는 제거합니다.

구문

crontab -e | -l | -r | -v | File ]

 

설명

crontab 명령은 cron 작업을 제출, 편집, 나열 또는 제거합니다. cron 작업은 cron 디먼이 정기적으로 계획된 간격으로 수행하는 명령입니다. cron 작업을 제출하려면, crontab 명령을 -e 플래그와 함께 지정하십시오. crontab 명령은 편집 세션을 호출하여 crontab 파일을 작성할 수 있게 합니다. 이 파일에 각 cron 작업에 대한 항목을 작성합니다. 각 항목은 cron 디먼에 맞는 양식이어야 합니다. 항목 작성에 대한 내용은 crontab 파일 항목 형식을 .

사용자가 항목 작성을 마치고 파일을 종료할 때, crontab 명령이 그것을 /var/spool/cron/crontabs 디렉토리에 복사한 후, 사용자의 현재 사용자 이름에 대해 명명된 파일에 배치합니다. 사용자 이름을 갖는 파일이 crontabs 디렉토리에 이미 존재하는 경우, crontab 명령은 기존 파일위에 겹쳐씁니다.

다른 방법으로, File 매개변수를 지정하여 crontab 파일을 작성할 수 있습니다. 파일이 존재할 경우, 그 파일은 cron 디먼이 예상하는 형식이어야 합니다. 파일이 없을 경우, crontab 명령이 편집기를 호출합니다. EDITOR 환경 변수가 있을 경우, 명령은 지정하는 편집기를 호출합니다. 그 외에는 crontab 명령이 vi 편집기를 사용합니다.

crontab 파일의 내용을 나열하려면, crontab 명령에 -l 명령을 지정하십시오. 기존 파일을 제거하려면, -r 플래그를 사용하십시오.

cron 디먼

cron 디먼은 crontab 파일 항목에 따라 명령을 수행합니다. 사용자가 cron 작업의 출력을 표준 출력 또는 오류로 재지정하지 않는 한, cron 디먼은 사용자에게 모든 명령 출력 또는 오류를 메일로 전송합니다. crontab 파일에서 cron 작업을 잘못 지정하면, cron 디먼은 작업을 수행하지 않습니다.

cron 디먼은 cron 디먼이 초기설정될 때만 crontab 파일을 시험합니다. crontab 명령을 사용하여 crontab 파일에 변경을 수행할 때, 변경을 나타내는 메세지가 cron 디먼으로 전송됩니다. 이것으로 새로운 또는 변경된 파일에 대해 정기적으로 계획된 간격으로 오버헤드를 점검하지 않아도 됩니다.

crontab 명령 사용에 대한 제어

/var/adm/cron/cron.allow/var/adm/cron/cron.deny 파일은 crontab 명령을 사용할 수 있는 사용자를 제어합니다. 루트 사용자는 이 파일을 작성, 편집 또는 삭제할 수 있습니다. 이 파일의 항목은 한 행에 이름이 한 개 있는 사용자 로그인 이름입니다. 사용자의 로그인 ID가 둘 이상의 로그인 이름과 연관되는 경우, crontab 명령은 사용자가 실제로 사용 중인 로그인 이름과 상관없이 /etc/passwd 파일에 있는 첫번째 로그인 이름을 사용합니다.

다음은 cron.allow 파일의 한 예입니다.

root
nick
dee
sarah

cron.allow 파일이 있을 경우, 로그인 이름이 여기에 나타나는 사용자들만이 crontab 명령을 사용할 수 있습니다. 루트 사용자의 로그 이름이 cron.allow 파일에 반드시 나타나야 합니다. 시스템 관리자는 사용자의 로그인 이름을 cron.deny 파일에 나열하여 그 사용자가 crontab 명령을 사용할 수 없게 할 수 있습니다. cron.deny 파일만이 존재하는 경우, 파일에 나타나지 않는 모든 사용자가 crontab 명령을 사용할 수 있습니다.

다음 중 하나에 해당되는 경우, crontab 명령을 사용할 수 없습니다.

  • cron.allow 파일과 cron.deny 파일이 존재하지 않습니다(루트 사용자만 허용).
  • cron.allow 파일이 존재하지만 사용자의 로그인 이름이 나열되어 있지 않습니다.
  • cron.deny 파일이 존재하고 사용자의 로그인 이름이 나열되어 있습니다.

cron.allowcron.deny 파일이 둘다 존재하지 않는 경우, 루트 사용자 권한을 갖는 사람만이 crontab 명령으로 작업을 제출할 수 있습니다.

crontab 파일 항목 형식

crontab 파일은 각 cron에 대한 항목을 포함합니다. 항목들은 개행 문자로 분리됩니다. 각 crontab 파일 항목은 다음 형태로 공백이나 탭으로 분리된 6개 필드를 포함하고 있습니다.

 
minute(분)  hour(시)  day_of_month(일)  month(월)  weekday(요일)  command(명령)

이들 필드는 다음 값을 승인합니다.

minute(분) 0 - 59
hour(시) 0 - 23
day_of_month(일) 1 - 31
month(월) 1 - 12
weekday(요일) 일요일부터 금요일까지를 나타내는 0 - 6
command(명령) 쉘 명령

각 필드에 대해 반드시 값을 지정해야 합니다. command 필드를 제외하고, 필드 다음에 들어갈 수 있습니다.

  • 지정된 범위에 있는 숫자. 5월에 명령을 수행하려면, 필드에 5를 지정하십시오.
  • 두 수를 대시로 분리하여 두 수 자체도 포함하는 범위를 나타내는 범위 지정. 화요일부터 금요일까지 cron 작업을 수행하려면, weekday 필드에 2-5를 입력하십시오.
  • 숫자들을 쉼표로 분리하여 나열한 숫자 리스트. 1월의 첫날과 마지막 날에 명령을 수행하려면, 필드에 1,31을 입력합니다.
  • *(별표)는 모든 허용되는 값을 의미합니다. 매 시간마다 작업을 수행하려면, hour(시) 필드에 별표를 지정하십시오.
주: 앞에 역슬래시(% 포함)가 오는 모든 문자는 문자 그대로 처리됩니다. 날짜의 지정은 두 필드(날짜와 요일)에 의해 이루어질 수 있습니다. 둘다를 요소로 지정할 경우, 둘다 고수하십시오. 예를 들어 다음과 같이 입력합니다.
0 0 1,15 * 1 command

이 명령은 모든 월요일뿐만 아니라 각 달의 1일과 15일에 command를 수행합니다. 단 하나의 필드로 날짜를 지정하려면, 다른 필드는 *를 포함해야 합니다.

명령 지정

cron 디먼은 선택된 날짜와 시간의 여섯 번째 필드에 지정된 명령을 수행합니다. 여섯 번째 필드에 %(퍼센트 기호)를 포함하면, cron 디먼은 그 앞에 오는 모든 것을 명령 호출로서 취급하고, 퍼센트 기호(\%)를 탈출하지 않는 한 그 뒤에 오는 모든 것을 표준 입력에 사용 가능하게 만듭니다. 공백 행과 첫번째 비공백 문자가 번호 기호(#)인 행을 무시됩니다.

주: 쉘은 명령 필드의 첫번째 행만을 수행합니다. 모든 다른 행은 명령에 표준 입력으로 사용 가능하게 됩니다.

cron 디먼은 사용자의 HOME 디렉토리에서 서브쉘을 시작합니다. 사용자가 로그인되지 않았을 때 수행하도록 명령을 계획하고 사용자의 .profile 파일에 있는 명령을 수행하려면, 명령은 반드시 명시적으로 사용자의 .profile 파일을 읽어야 합니다.

cron 디먼은 모든 쉘에 대해 HOME, LOGNAME, SHELL(=/usr/bin/sh) 및 PATH(=/usr/bin)를 정의하는 디폴트 환경을 제공합니다.

플래그

-e 사용자의 crontab 파일의 사본을 편집하거나 또는 아직 crontab 파일이 없으면 편집 세션을 시작합니다. 편집이 완료될 때, 항목이 사용자의 crontab 파일로서 설치됩니다. 편집 세션은 EDITOR 환경 변수에 의해 지정되는 편집기를 사용하여 시작됩니다. 디폴트 편집기는 vi입니다.
-l crontab 파일을 나열합니다.
-r crontab 디렉토리에서 사용자 crontab 파일을 제거합니다.
-v cron 작업의 상태를 나열합니다.

보안

감사(audit) 이벤트: 감사(auditing) 서브시스템이 적절하게 구성설정되고 사용 가능한 경우, crontab 명령은 명령이 실행될 때마다 다음 감사 레코드(이벤트)를 생성합니다.

이벤트 정보
CRON_JobRemove cron 작업을 제거한 사용자와 시기를 나열합니다.
CRON_JobAdd cron 작업을 추가한 사용자와 시기를 나열합니다.

감사 이벤트 선택 및 그룹화하는 방법과 감사 이벤트 데이타 수집 구성설정 방법에 대한 자세한 내용은 AIX Version 4.3 System Management Guide: Operating System and Devices에 있는 "감사 기능 설정"을 참조하십시오.

종료 상태

이 명령은 다음과 같은 종료값으로 복귀합니다.

0 성공적으로 완료되었습니다.
>0 오류가 발생하였습니다.

예제

  1. mycronjobs이라는 파일을 /var/admn/cron/crontabs 디렉토리에 복사하려면, 다음과 같이 입력하십시오.
    crontab mycronjobs
  2. 매 시간마다 콘솔에 시간을 기록하려면, 다음과 같이 입력하십시오.
    0 * * * * echo The hour is `date` .
    >/dev/console
  3. 모든 월요일, 수요일 및 금요일 오전 6시 30분에 calendar 명령을 수행하려면, 다음과 같이 입력하십시오.
    30 6 * * 1,3,5 /usr/bin/calendar
  4. 일년 내내 매일 6시 30분에 calendar 명령을 수행하려면, 다음과 같이 입력하십시오.
    30 6 * * * /usr/bin/calendar
  5. 8월 동안 매일 자정에 maintenance라는 스크립트를 수행하려면, 다음과 같이 입력하십시오.
    0 0 * 8 * /u/harry/bin/maintenance
  6. 명령에 대한 표준 입력에 대해 텍스트를 정의하려면, 다음과 같이 입력하십시오.
    0 16 * 12 5 /usr/sbin/wall%HAPPY HOLIDAY!%Remember to 
    turn in your time card.
    %(퍼센트 기호) 뒤에 오는 텍스트가 다음과 같이 wall 명령에 대한 표준 입력을 정의합니다.
    HAPPY HOLIDAY!
     
    Remember to turn in your time card.

파일

/var/adm/cron/FIFO crontab 또는 at 명령으로 새 작업이 제출될 때 cron 디먼으로 메세지를 전송하는 명명된 파이프.
/var/spool/cron/crontabs crontab 스풀 영역을 지정합니다.
/var/adm/cron/cron.allow crontab 명령에 대한 액세스가 허용되는 사용자 리스트를 지정합니다.
/var/adm/cron/cron.deny crontab 명령에 대한 액세스가 거부되는 사용자 리스트를 지정합니다.

 


리눅스에서는 매일 혹은 매주, 아니면 한달에 한번 등등 주기적으로 해야 하는 작업을 편리하게 지원해주는 cron이라는 도구가 있습니다.
cron을 이용하면 이러한 단순 반복 작업을 쉽게 서버에서 자동으로 실행되도록 할 수 있습니다.

그러면 간단한 사용방법과 응용법에 대해 살펴보도록 하죠.

cron을 이용한 작업 자동화 스케줄링은 크게 두가지 단계로 생각해 볼 수 있습니다.
첫번째는 작업 내용을 위한 간단한 쉘 실행 스크립트를 만드는 것이고,
두번째는 그 실행 스크립트를 crontab을 이용해 cron에서 자동실행 할 수 있도록 등록하는 것이죠.

cron 을 사용하기 위해서는 crontab 이란 명령을 이용합니다.

[root@linux /root]# crontab
usage:  crontab [-u user] file
        crontab [-u user] { -e | -l | -r }
                (default operation is replace, per 1003.2)
        -e      (edit user's crontab)
        -l      (list user's crontab)
        -r      (delete user's crontab)
[root@linux /root]#

주로 사용하는 옵션은 -l 옵션과 -e 옵션입니다.
-l은 cron에 스케쥴링 되어 있는 작업 리스트를 보여주며, -e는 작업 내용을 편집할 수 있도록 해줍니다.(기본적으로 편집기로 VI 에디터를 사용하므로 VI 에디터의 기본적인 사용이 가능해야 합니다.)

crontab을 이용해 스케줄링을 편집할 경우의 형식은 다음과 같습니다.

0 3 * * * /home/www/cron/daily_backup > /dev/null 2>&1

0, 3, 그리고 *로 이루어진 맨 앞의 5개의 필드는 각각 분, 시, 일, 월, 요일을 나타냅니다.

  • 분 : 0부터 59
  • 시 : 0부터 23
  • 일 : 1부터 31
  • 월 : 1부터 12, 또는 jan, feb 등의로 정의
  • 요일 : 0부터 6(0이 일요일), 또는 sun, mon 등으로 정의

그리고 다음의 /home/www/cron/daily_backup은 실행 명령 또는 실행 파일을 나타내며, cron의 출력 결과와 에러내용은 메일을 통해 root에게 보내지는데 메일을 통해 통보받기를 원하지 않고 어떠한 기록을 남길 필요가 없을때는 > /dev/null 2>&1 으로 각각 표준 출력과 표준에러 처리에 대해 정의하면 됩니다.
만약 로그파일을 이용해 결과를 남기고 싶다면
> /dev/null 대신 >> /home/www/cron/cron_log 등으로 정의하면 차곡차곡 출력 결과가 쌓이겠죠.

오늘 설명드릴 내용은 홈페이지의 내용을 하루에 한번씩 백업하는 내용이므로, 백업파일이 정상적으로 생성되었는지 확인하는 것이 cron이 제대로 작동했는지 확인하는 것이 됩니다. 그래서 위와 같이 메일이나 로그등이 남지 않도록 하였습니다.

그럼 지정된 명령이나 실행 스크립트를 어떻게 구성할 것인가 살펴봐야겠죠?

[root@linux /root]# cat /home/www/cron/daily_backup
#!/bin/sh
## WWW Daily Backup
cd /home/www/backup
dir='date +%y%m%d'
mkdir $dir
cd $dir
cp -r /home/www/public_html/* .
[root@linux /root]#

간단하죠? 첫째 줄에서는 쉘을 정의하고…그다음 명령들은 날짜에 해당하는 백업 디렉토리를 만들어 이동한다음, 홈페이지 내용을 복사해오는 명령들의 나열입니다.

그러면 다시 cron에 설정되어있는 내용을 살펴보면…

0 3 * * * /home/www/cron/daily_backup > /dev/null 2>&1

앞의 필드를 살펴본다면 매일 새벽 3시 정각에 daily_backup 쉘 스크립트를 실행하고, 표준 출력 결과는 모두 버리라는 뜻으로 해석하면 되겠군요.

이러한 방법으로 DB나 기타 백업 처리의 자동화가 가능합니다.
물론 기타 작업또한 자동화 시킬 수 있겠죠.

 

출처 : Cron & Crontab 2006.07.26 | 카페명 : Super UNIX(IBM HP SUN SCO)


'개발 세발 창고' 카테고리의 다른 글

JFrame 에서 윈도우 닫기 버튼 비활성화  (0) 2009.03.10
이클립스와 CVS를 이용한 팀 작업  (0) 2009.03.10
리눅스/유닉스 명령어 모음  (0) 2009.03.10
Introducing JMS  (0) 2009.03.10
프로그램은..  (0) 2009.03.10

목차
  1. 리눅스/유닉스 명령어 모음
  2. BASH 일반
  3. 파일과 디렉토리
  4. 압축과 아카이브
  5. 디스크와 파일 시스템
  6. 프로세스 관리
  7. 사용자와 그룹
  8. 시스템 관리
  9. 네트워크/인터넷
  10. 텍스트 처리
  11. 기타
  12. MS-윈도우에서 유닉스/리눅스 명령어의 사용
  13. 잡담

리눅스/유닉스 명령어 모음

리눅스와 유닉스에서 쓰이는 일반적인 명령어들을 나열하고 실제 활용 방법을 기록합니다.

BASH 일반

파일과 디렉토리

  • ls: 파일 목록 보기
  • cp: 파일의 복사
  • mv: 파일의 이동과 이름 바꾸기
  • rm: 파일의 삭제
  • ln: 파일과 디렉토리에 대한 링크 생성
  • mkdir: 디렉토리의 생성
  • rmdir: 디렉토리의 삭제
  • touch: 빈파일을 생성하거나 파일의 수정된 날짜를 현재 시각으로 변경
  • chown: 파일의 소유자 바꾸기
  • chgrp: 파일의 그룹 바꾸기
  • chmod: 파일의 허가권 설정
  • du: 현재 디렉토리가 차지하고 있는 용량보기
  • cat:
  • find: 파일 검색
  • locate :
  • which: 실행파일의 경로 표시
  • whereis:

압축과 아카이브

디스크와 파일 시스템

  • fstab: 파일 시스템 마운트 정보를 저장한 /etc/fstab 파일의 작성법
  • mount: 디스크와 파일 시스템의 마운트
  • umount: 마운트된 파일 시스템 언마운트(마운트 해제)
  • df: 마운트된 각 파티션의 용량과 사용량, 남은 용량 보기

프로세스 관리

  • top: 현재 메모리 및 프로세스별 자원 사용률 표시
  • ps:
  • kill:
  • killall:

사용자와 그룹

시스템 관리

  • shutdown: 시스템의 종료와 재부팅
  • free: 메모리와 스왑 이용량 출력
  • uname: 시스템 정보 표시(커널 종류/버전 등)

네트워크/인터넷

텍스트 처리

  • sed: 텍스트 프로세싱 툴(스트림 에디터)
  • awk(gawk): 패턴 스캔 & 프로세싱을 위한 랭귀지 툴
  • grep: 텍스트 파일 내용 검색
  • more:
  • less:

기타

  • man: Manual 페이지 보기

MS-윈도우에서 유닉스/리눅스 명령어의 사용

MS-윈도우에서도 저 훌륭한 유닉스/리눅스 명령어/툴들을 사용할 수 있다.
  • [WWW]GnuWin32: 윈도우로 포팅된 GNU 명령어들
  • [WWW]Cygwin: 윈도우로 Bash 부터 시작하여 GCC, VI 등 X 윈도우까지 포팅하는 프로젝트

잡담

  • 리눅스 명령어 활용 사전제작에 들어갑니다. 많은 분들의 참여로 진정한 "리눅서들"의 위키가 되었으면 좋겠습니다. -- 권남
  • 링크가 생성 안된 것들을 이제 함께 채워나가요..
  • Basic Command - 이 페이지를 잠시 유지함. Command 페이지가 완성되면 삭제 

'개발 세발 창고' 카테고리의 다른 글

JFrame 에서 윈도우 닫기 버튼 비활성화  (0) 2009.03.10
이클립스와 CVS를 이용한 팀 작업  (0) 2009.03.10
Cron & Crontab  (0) 2009.03.10
Introducing JMS  (0) 2009.03.10
프로그램은..  (0) 2009.03.10

+ Recent posts