클러스터링은 가변적인 업무부하를 처리하거나, 또는 그 중 한 대가 고장이 났을 경우에도 운영이 계속되도록 여러 대의 컴퓨터 시스템을 서로 연결하는 것을 지칭한다. 두 개 이상의 컴퓨터를 마치 하나의 컴퓨터처럼 행동하도록 서로 연결함으로써, 병렬 처리나, 부하 배분 및 고장 대비 등의 목적에 사용할 수 있다.
클러스터링은 기업이 PC와 워크스테이션 등에 이미 집행한 투자 효과를 볼 수 있게 하기 때문에 병렬 처리 프로그램을 구현하기 위한 보편적인 전략이다. 그 밖에도, 새로운 PC를 네트웍에 추가하기만 하면 되므로, 새로운 CPU를 추가하기가 비교적 쉽다는 장점이 있다.
서브쿼리(Subquery)란 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL문을 말한다. 서브쿼리는 메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.
#메인쿼리
SELECT *
FROM db_table
WHERE table_fk IN (
#서브쿼리
SELECT table_fk FROM db_table_other WHERE ..
)
조인(Join)은 조인에 참여하는 모든 테이블이 대등한 관계에 있기 때문에 조인에 참여하는 모든 테이블의 칼럼을 어느 위치에서라도 자유롭게 사용할 수 있다. 그러나 서브쿼리는 메인쿼리의 컬럼을 모두 사용할 수 있지만, 메인쿼리는 서브쿼리의 칼럼을 사용할 수 없다.
조인은 집한간의 곱의 관계이다. 따라서, 1:1 관계 테이블이 조인하면 1(= 1*1) 레벨의 집합이 생성되고, 1:M 관계가 조인하면 M(=1*M) 레벨의 집합이 된다. 그리고 M:N 관계의 테이블이 조인하면 MN 레벨의 집합이 된다. 그러나,서브쿼리는 서브쿼리 레벨과는 상관없이 항상 메인쿼리 레벨로 결과 집합이 생성된다.
조인쿼리와 서브쿼리 방식을 상황에 맞게 사용하는 것이 중요하다.
서브쿼리를 사용할 때 주의할 점
① 서브쿼리를 괄호로 감싸서 사용한다. ② 서브쿼리는 단일 행 또는 복수 행 비교 연산자와 함께 사용 가능 ③ 서브쿼리에서는 ORDER BY를 사용하지 못한다.
서브쿼리가 사용이 가능한 곳
- SELECT - FROM - WHERE - HAVING - ORDER BY - INSERT문의 VALUES - UPDATE문의 SET
서브쿼리의 종류
① 단일행 서브쿼리(Single Row Subquery)
SELECT *
FROM Player
WHERE Team_ID = (
SELECT Team_ID
FROM Player
WHERE Player_name = "yonglae"
)
ORDER BY Team_name;
② 다중행 서브쿼리(Multiple Row Subquery)
SELECT *
FROM Team
WHERE Team_ID IN (
SELECT Team_ID
FROM Player
WHERE Player_name = "yonglae"
)
ORDER BY Team_name;
③ 다중컬럼 서브쿼리(Multi Column Subquery)
SELECT *
FROM Player
WHERE (Team_ID, Height) IN (
SELECT Team_ID, MIN(Height)
FROM Player
GROUP BY Team_ID
)
ORDER BY Team_ID, Player_name;
위치에 따라 사용되는 서브쿼리
① SELECT 절에서 사용되는 서브쿼리
SELECT Player_name, Height, (
SELECT AVG(Height)
FROM Player p
WHERE p.Team_ID = x.Team_ID) as AVG_Height
FROM Player x
② FROM 절에서 사용되는 서브쿼리 FROM 절에서 사용되는 서브쿼리를 인라인 뷰(Inline View)라고 한다. FROM 절에는 테이블 명이 오도록 되어 있다. 그런데서브쿼리가 FROM절에 사용되면 뷰(View)처럼 결과가 동적으로 생성된 테이블로 사용할 수 있다. 임시적인 뷰이기 때문에 데이터베이스에 저장되지는 않는다. 또한, 인라인 뷰로 동적으로 생성된 테이블이여서 인라인 뷰의 칼럼은 자유롭게 참조가 가능하다.
SELECT t.Team_name, p.Player_name, p.Height
FROM Player t, (
SELECT Team_ID, Player_name, Back_no
FROM Player
WHERE Position = 'MF') p
WHERE p.Team_ID = t.Team_ID;
③ WHERE 절에서 사용되는 서브쿼리
SELECT Player_name
FROM Player
WHERE Team_ID IN (
SELECT Team_ID
FROM Team
WHERE Team_country = 'KOR'
)
SQL> select avg(saPay), sum(saPay) from sawon; (O) SQL> select deptNo, avg(saPay), sum(saPay) from sawon; (X) 20개의 data┘ └각각 1개 data┘ * ORA-00937: 단일 그룹의 그룹 함수가 아닙니다 => 해결책! GROUP BY SQL> select deptNo, avg(saPay), sum(saPay) from sawon group by deptNo;
작성한 코드에 구문검사를 해서 구문에 이상이 있다면 오류를 내주어 작성한 유저에게 알려주고 만약 검사에 이상이 없다면 프로그램이 시작되기 전에 메모리에 올라간다. 이처럼 컴파일의 역할은 유저가 작성한 코드에 이상이 없는지 검사하고 코드에 작성된 변수나 함수들을 메모리에 올려주는 역할을 한다.
링크
프로그램을 만드는 마지막 작업이 바로 링크(Link)라는 과정이다. 필요한 조각들을 모두 모으거나 어떤 부분이 빠져 있는지 알아보기 위한 과정이다. 정적 라이브러리(Static Library)를 사용할 때, 링커는 프로그램이 필요로 하는 부분을 라이브러리에서 찾아서 그냥 실행파일에다 카피해버린다. 공유 라이브러리(또는 동적 라이브러리)의 경우에는 이렇게 하는 것이 아니라 실행파일에다가 단지 "실행될 때 우선 이 라이브러리를 로딩시킬 것"이라는 메시지만을 남겨놓는다. 당연히 공유 라이브러리를 사용하면 실행파일의 크기가 작아진다. 그들은 메모리도 또한 적게 차지하며, 하드 디스크의 용량도 적게 차지한다.
링킹(linking)은 여러가지 코드와 데이터를 묶어 메모리로 로드될 수 있는 하나의 실행 가능한 파일을 만드는 작업이다.
링킹은 컴파일-타임때 행해질 수도 있고, 로드-타임(로더에 의해), 혹은 런-타임(응용 프로그램에 의해)때도 행해질 수 있다.
Cygwin
윈도우 환경에서 GNU 프로그램을 사용할 수 있는 환경을 제공하는 프로그램
http://falinux.com/win/study/cygwin/cygwin1.html
Make Utility
1. 들어가기
프로그래머들은 작은 프로그램을 작성할 때는 단순히 수정하고 나서 모든 파일을 다시 컴파일 하여 새로 프로그램을 만들게 된다. 그러나 좀더 규모가 큰 프로그램에서는 이런 간단한 방법이 약간의 문제를 가져오게 될 것이다. 하나의 파일만 변경하게 되더라도 다시 컴파일 해야 하는 등의 수정하고 컴파일하고 테스트하는데 많은 시간을 소모하게 될 것이다. 이것 같은 문제를 해결하기 위해서 만들어 진 것이 make 유틸리티이다. 다시 정리하자면 이 유틸리티는 큰 프로그램을 유지하는 필요한 유틸리티이며, 프로그램 중 어느 부분이 새롭게 컴파일 되어야 하는지를 자동적으로 판단해서 커맨드(컴파일러, 쉘등)를 이용하여 프로그램을 재 컴파일을 하게 된다.
2. 왜 사용하지?
프로그램을 개발하게 되면 보통 라인 수가 증가하게 되어 하나의 파일만으로 프로그램을 구성하는 것은 어려운 일이다. 그래서 보통은 각각의 기능을 작은 모듈로 나누어 여러 파일로 나누어 개발을 하게 된다. 이 파일들은 서로 관계를 가지고 있는데, 어느 하나를 필요에 의해 바꾸게 되었을 때 그 파일에 있는 모듈(함수)를 이용하는 다른 파일도 새롭게 컴파일 되어야 한다. 하지만 파일 수가 많은 경우 이를 일일이 컴파일을 하게 될 때, 그 불편함과 함께 컴파일 하지 않아도 될 것도 컴파일을 하게 될 수 있고, 컴파일 해야 할 것도 미쳐 못하게 되어 링크시 에러를 발생하게 되는 경우도 있게 된다. 이런 상황에서 자동적으로 관계 있는 것만 새롭게 컴파일 하거나, 여러 개의 입력 파일로부터 출력 파일을 생성할 때 make 유틸리티는 필요하게 된다.
3. 어떻게 사용할까?
make 유틸리티는 많은 기능을 제공하지만, 자동으로 입력 파일을 인식하고, 컴파일 하여 출력 파일을 생성하지는 못하기 때문에 이 것에 대한 정보를 make가 알 수 있도록 파일을 제공해야 하는데 이것이 Makefile이라는 파일이다. 이것은 make가 이해할 수 있도록 일정한 형식을 가지고 있는 스크립트 언어와 흡사하다. Makefile에서는 시스템의 쉘을 사용할 수 있으며 컴파일러등의 프로그램들을 실행할 수 있다. Makefile은 대개 프로젝트의 다른 소스 파일과 같은 디렉토리에 존재하며, 큰 프로그램에서는 각 각의 기능들을 위해 독립적인 Makefile을 사용하여 프로그램을 관리한다.
4. Makefile에 대하여… …
메이크파일은기본적으로대상(Target), 의존관계(dependency), 명령(command)등에대한규칙들(rules)로이루어져있다. 아래의 list 4-1은기본적인메이크파일의플랫폼이다.
Target . . .:Dependency . . .
Command. . .
.. . .
. . .
List 4-1. Makefile의플랫폼
Note1
· Target : Command에 의해서 수행 되어서 나온 결과 파일을 지정하므로, 일반적으로 목적 파일(Object file)이나 실행 파일이다.
· Dependency : 생성되는 파일인 대상(Target)과 이것이 의존하는 파일들의 관계를 나타낸다.
· Command : Command 부분에 정의된 명령들은 의존 관계(Dependency)부분에 정의된 파일의 내용이 바뀌었거나, 대상(Target) 부분에 해당하는 파일이 없을 때 이곳에 정의된 것들이 차례대로 실행된다. 일반적으로 쉘에서 쓸 수 있는 모든 명령들을 사용할 수 있으며 Bash에 기반한 쉘 스크립트도 지원한다.
4.1. Makefile 예제 보기
·간단한 Makefile 만들기
간단하게 Makefile을만들어보자. 우리가만들려고하는프로그램은main.c, read.c, write.c로구성되어있고모두io.h을 사용하고 read.c는 defs.h을 더 포함하고, wirte.c는 buffer.h라는 라는헤더파일을사용한다고가정한다. 이들을각각컴파일해서 test 라는실행파일을생성시킨다아래의 list 4-2는쉘상에서실행파일을만든것이고, List 4-3은 Makefile을작성하여만든것이다.
$gcc -c main.c
$gcc -c read.c
$gcc -c write.c
$gcc -o test main.o read.o write.o
List 4-2. 쉘상에서실행파일만들기
test: main.o read.o write.o
gcc -o test main.o read.o write.o
main.o : io.h main.c
gcc -c main.c
read.o : io.h defs.h read.c
gcc -c read.c
write.o : io.h buffer.h write.c
gcc -c write.c
$make
gcc -c main.c
gcc -c main.c
gcc -c main.c
gcc -o test main.o read.o write.o
List 4-3. Makefile을작성하여실행파일만들기와실행화면
Note2
·쉘 상에서 make명령을 내리면 먼저 make는 먼저 현재 디렉토리에서 makefile이라는 파일을 찾는다. 이 파일이 존재하지 않으면 다시 Makefile이라는 파일을 찾는다.전통적인 유닉스 프로그래머는 makefile을 사용한다.
· make는 Makefile의 내용을 보고, 내부적으로 어떻게 파일들이 의존하고 있는지 조사한다.
·위의 예제에서는 test라는 실행 파일을 만들기 위해서는 main.o는 io.h, read.o는 io.h와 defs.h, 그리고 write.o는 io.h와 buffer.h의 헤더 파일과 모두 자신의 소스에 의존 관계임을 알 수 있다. 만약에 main.c를 고친다면 main.o가컴파일되어다시생기고, test 도다시링크되어갱신된다. 만약 io.h가바뀌었다고가정하면모든파일들이컴파일되어서목적파일이생기고, 그것들이링크가되어 test가생긴다
·변수를 사용하여 더 간단하게 만들기
위의 예제에서 변수를 사용하여 더 간단하게 Makefile을 작성한 것이 List 4-4 이다.
# Variables make Makefiles simpler
Objects = main.o read.o write.o
test: $(Objects)
gcc -o test $(Objects)
main.o : io.h main.c
gcc -c main.c
read.o : io.h defs.h read.c
gcc -c read.c
write.o : io.h buffer.h write.c
gcc -c write.c
List 4-4. 변수을 이용하여 Makefile만들기
Note3
· Makefile에서의 주석문은 #으로 시작하고, 한 줄의 끝까지 계속된다.
· Makefile에서는 변수를 사용하기 위해서는 값을 대입하기 위해서는 “=”을 사용하고 $(변수), ${변수}의 형식을 사용하여 값을 쓸 수 있게 된다.
· Makefile에서 사용되는 모든 규칙은 탭으로 시작하는 줄에 있어야 한다. 빈 칸은 허용되지 않는다. 다수의 빈 칸과 탭은 같은 것으로 보이고, 유닉스 프로그래밍의 다른 모든 경우에 빈 칸과 탭 사이에는 거의 차이가 없으므로 이것은 문제를 일으킬 수 있다. 또한, Makefile에서 줄의 마지막에 있는 빈 칸은 make명령이 실패하게 할 수 있다.
·명령들을 추론하여 만들기
make명령은 C 소스인 경우 .o을 이용하여 .c를 추론하여 명령을 내부 규칙에 따라 gcc -c을 수행하게 된다. 아래의 List 4-5는 이것을 보여 주고 있다.
#Letting make deduce the commands
OBJECTS = main.o read.o write.o
test: $( OBJECTS)
gcc -o test $( OBJECTS)
main.o : io.h
read.o : io.h defs.h
write.o : io.h buffer.h
.PHONY : clean
clean:
-rm –f $( OBJECTS)
@rm –f test
List 4-5. 명령을 추론하여 만든 Makefile
Note4
·위의 clean처럼 대상(Target) 부분에 해당하는 부분이 그냥 레이블과 같이 사용될 수 있다. 이것을 Phony Target이라고 하면 위의 형식처럼 사용하는데 .PHONY는 생략하여도 된다.
·위의 예제에서 rm명령 앞에 있는“-“는 make가 에러를 무시하게 한다. 예를 들어, 디렉토리를 만들기 원하고 디렉토리가 이미 존재할 경우에 에러를 무시하기 원한다면, mkdir 앞에 “-“를 추가하면 된다.
·위의 예제에서 rm명령 앞에 있는 @는 make가 명령을 실행하는 것을 표준 출력 장치로 출력하지 않도록 지시한다.
·또 다른 형태의 Makefile 만들기
내부 규칙에 따라 Target대신에 의존성(dependency)만을 사용하여 만들 것이 List 4-6이다.
# Alternative sytle of makefile
OBJECTS = main.o read.o write.o
test: $( OBJECTS)
gcc -o test $( OBJECTS)
$(Objects) : io.h
read.o : defs.h
write.o : buffer.h
List 4-6. 의존성을 이용하여 Makefile만들기
4.2. Makefile의 기능을 향상시키 주는 매크로 와 확장자 규칙
·매크로(Macro)란 무엇일까?
매크로는 특정한 코드를 간단하게 표현하기 위해 사용되며,프로그램을 작성할 때 변수를 지정하는 것처럼 하면된다. 매크로를 Makefile에서 사용하기 위해서는 $(..)나 ${..}, $를 사용하는데, 일반적으로 $(..)을 사용하기를 권고한다. 아래의 List 4-7은 매크로의 사용 방법을 보여 주고 있다.
# Macro makes Makefile happy.
OBJECTS = main.o read.o write.o
test: $( OBJECTS)
gcc -o test $( OBJECTS)
$(OBJECTS) : io.h
read.o : defs.h
write.o : buffer.h
List 4-7. 간단한 매크로 예제
·미리 정해져 있는 매크로(Macro)들의 무엇이 있을까?
프로그래머가 매크로를 만들어 사용할 수 있지만, 미리 정의된 매크로들이 있다. 이 매크로들을 보기 위해서는 ‘make –p’라고 입력해 보면 make에서 미리 정의 되어 있는 모든 값들(매크로, 환경 변수등등)을 볼 수 있다. 아래의 List 4-8은 미리 정의된 매크로를 보여 주고 있으며, List 4-9는 미리 정의 된 매크로를 사용하여 만든 예제이다.
ASFLAGS = (as 명령어의 옵션 세팅)
AS = gas
CFLAGS = (gcc 의 옵션 세팅)
CC = gcc
CPPFLAGS = (g++ 의 옵션)
CPP = g++
LDFLAGS = (ld 의 옵션 세팅)
LD = ld
List 4-8. 미리 정의된 매크로
Note5
·매크로는 관습적으로 대문자를 작성된다.
·쉘 상에서 정의한 환경 변수 값들은 그대로 이용된다.
OBJECTS = main.o read.o write.o
SRCS = main.c read.c write.c
CC = gcc
CFLAGS = -g -c
TARGET = test
$(TARGET) : $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)
clean :
rm -f $(OBJECTS) $(TARGET)
main.o : io.h main.c
read.o : io.h read.c
write.o: io.h write.c
$make
gcc -g -c main.c -o main.o
gcc -g -c read.c -o read.o
gcc -g -c write.c -o write.o
gcc -o test main.o read.o write.o
$make clean
rm -rf main.o read.o write.o test
List 4-9. 미리 정의된 매크로를 사용한 예제 와 실행 화면
Note6
· CFLAGS 같은 매크로는 make 파일의 내부에서 이용하여 .c파일을 .o파일로 바꾸어 주는 부분이 없어도 CFLAGS에 값을 세팅하면 make가 알아서 컴파일을 수행하여 .o파일을 생성한다.
·확장자 규칙(Suffix rule)란 무엇인가?
파일의 확장자를 보고, 그에 따라 적절한 연산을 수행시키는 규칙이다. 가령 가령 .c 파일은일반적으로 C 소스코드를가리키며, .o 파일은목적파일(Object file)을말하고있다. 그리고당연히 .c 파일은컴파일되어서 .o 파일이되어야하는것이다. .SUFFIXS라는매크로를사용하여확장자를등록하여줄수있다. 아래의 List 4-10은 .SUFFIXES 매크로를이용한예제이다.
.SUFFIXES : .c .o
OBJECTS = main.o read.o write.o
SRCS = main.c read.c write.c
CC = gcc
CFLAGS = -g –c
TARGET = test
$(TARGET) : $(OBJECTS)
$(CC) –o $(TARGET) $(OBJECTS)
clean:
rm –f $(OBJECTS) $(TARGET)
main.o : io.h main.c
read.o : io.h defs.h read.c
write.o : io.h buffer.h write.c
$make
gcc -g -c main.c -o main.o
gcc -g -c read.c -o read.o
gcc -g -c write.c -o write.o
gcc -o test main.o read.o write.o
List 4-10. .SUFFIXES를 사용한 예제와 실행 화면
Note7
·확장자 규칙에 의해서 make는 파일들 간의 확장자를 자동으로 인식해서 필요한 작업을 자동으로 수행한다. 위의 예제에서는 자동적으로 아래와 같은 루틴이 자동적으로 동작하게 된다.
·Makefile내부에서 .SUFFIXES 매크로의 값을 세팅해 주면 내부적으로 정의된 확장자의 연산이 동작을 하게 된다. 따라서 확장자 규칙은 make가 어느 확장자를 가진 파일들을 처리할 것인가를 정해 주는 것이다.
·내부 매크로(Internal macro)무엇일까?
make에서는 내부 매크로라는 것이 있다. 이것은 우리가 맘대로 정할 수 있는 매크로는 절대 아니다. 대신 매크로를 연산, 처리하는데 쓰이는 매크로라고 하는 것이 더 적당할 것이다. 아래의 Table 4-1은 내부 매크로에 대해 설명하고 있으며, List 4-11은 내부 매크로를 사용한 예를 보여 주고 있다.
내부 매크로
설명
$*
확장자가 없는 현재의 대상(Target) 파일
$@
현재의 대상(Target) 파일
$<
현재의 대상(Target) 파일보다 더 최근에 갱신된 파일 이름
(dependency중에서 처음에 위치한 파일 이름)
$?
현재의 대상(Target) 파일보다 더 최근에 갱신된 파일 이름
(모든 dependency 파일의 이름)
Table 4-1. 내부 매크로
main.o : main.c io.h
gcc -c $*.c ($* 는 확장자가 없는 현재의 대상 파일이므로 $* 는 결국 main에 해당된다.)
test : $(OBJECTS)
gcc –o $@ $*.c ($@ 는 현재의 대상 파일이므로 $* 는 결국 test에 해당된다.)
.c .o :
gcc -c $< (또는 gcc -c $*.c)
($< 는 현재의 대상 파일보다 더 최근에 갱싱된 파일 이름이므로, .o 파일보다 더 최근에 갱신된 .c 파일은 자동적으로 컴파일이 된다. 가령 main.o를 만들고 난 다음에 main.c를 갱신하게 되면 main.c는 $<의 작용에 의해 새롭게 컴파일 된다.)
List 4-11은 내부 매크로를 사용한 예제
4.3 Makefile를 작성할 때 알면 좋은 것들
·긴 명령어를 여러 라인으로 표시하기
Makefile을 작성할 때 명령어가 한 줄을 넘어간다면, ‘\’문자를 이용해서 여러 라인으로 나타낼 수 있다. 아래의 List 4-12은 긴 명려어를 여러 라인으로 나타내는 예제이다.
OBJECTS = shape.o \
rectangle.o \
circle.o \
line.o \
main.o \
read.o \
write.o \
List 4-12. 여러 라인으로 명령어 나타내는 예제
·매크로 치환(Macro substitution)
매크로를 지정하고, 그것을 이용하는 것을 이미 알고 있다. 그런데 필용에 의해 매크로의 내용을 조그만 바꾸어야 할 때가 있다. 매크로 내용의 일부만 바꾸기 위해서는 $(MACRO_NAME:OLD=NEW)과 같은 형식을 이용하면 된다. 아래의 List 4-13은 매크로 치환에 대한 예제이다.
MY_NAME = Hello World
YOUR_NAME = $(MY_NAME:Hello=Hi)
(Jack이란 부분이 Jook으로 바뀌게 된다. 즉 YOUR_NAME이란 매크로의 값은 Hi World이 된다.)
OBJS = main.o read.o write.o
SRCS = $(OBJS:.o=.c)
(SRCS에서는 OBJS에서 .o가 .c로 바뀌게 된다. 다음과 같이 변경되는 것이다.
SRCS = main.c read.c write.c)
List 4-13. 매크로 치환에 대한 예제
·자동 의존 관계 생성(Automatic dependency)
일반적인 make 구조는 대상(target), 의존 관계(dependency), 명령(command)이 연속적으로 정의 되어 있는데 실행되는데, 명령이 없이 대상과 의존 관계만 표시가 되면 이는 대상이 어는 파일에 의존하고 있는지 표시해 주는 정보 역할을 하게 됩니다. Makefile을 작성할 때 없어서는 안되는 부분입니다. 그런데 일일이 이런 정보를 만든다는 것은 쉬운 일이 아닙니다. 이런 단조롭고 귀찮은 일을 자동으로 해주기 위해서 gcc –M XX.c의 형식을 사용하여 의존 관계를 만들게 된다. 프로그램을 설치할 때 make dep라는 것을 친 기억이 있을 것이다. 파일들의 의존 관계를 작성해 준다는 의미이다. List 4-14는 자동 의존 관계를 생성하는 예제이다.
규모가 큰 프로그램들은 파일들이 하나의 디렉토리에 있지 않는 경우가 많다. 여러 개의 서브시스템이 전체 시스템을 구성한다고 가정하면 각 서브시스템에 Makefile이 존재한다. (서브시스템 = 서브디렉토리) 따라서 여러 개의 Makefile을 동작시킬 필요가 있도록 Makefile을 고쳐 보자. 서브디렉토리에 있는 Makefile을 동작시키는 방법은 의외로 간단하다. 아래의 List 4-16은 순환 make에 대한 예를 보여 주고 있다.
subsystem:
cd subdir; $(MAKE) .....(1)
subsystem:
$(MAKE) -C subdir .....(2)
(위의 예제에서 (1)과 (2)는 동일한 명령을 수행한다 우리가 만들 시스템의 타겟이 subsystem이다. 우선 subdir이라는 곳으로 가서, 거기에 있는 Makefile을 동작시키게 된다. MAKE라는 것은 그냥 make라는 명령어를 표시하는 매크로일 뿐이다.)
(make뒤의 대괄호의 1이라고 나타난 것은 현재의 레벨을 의미한다. 원래 디렉토리의 레벨이 0이고, 여기서는 레벨이 하나 더 내려갔으므로 1이라고 표시된 것이다.)
List 4-16. 순환 make 대한 예제 및 실행 화면
·불필요한 재컴파일 막기
의존 관계 규칙에 의해 하나가 바뀌면 그에 영향받는 모든 파일이 바뀐다고 앞에서 말했다. 그러나 다른 파일들에게 아무 영향을 주지 않도록 수정하였는데도 재컴파일을 시도한다면 시간 낭비가 될 수도 있다. 가령 모든 .c 파일에서 include 하는 헤더 파일에서 새로운 #define PI 3.14 라고 정의를 했다고 가정하자. 그리고 PI라는 것은 아무 곳에서도 사용을 하지 않는다. 이때는 'make -t' 라고 해보자. -t 는 touch를 의미하는 옵션으로써 컴파일을 하지 않는 대신 파일의 생성 날짜만 가장 최근으로 바꾸어 놓는다.새로 컴파일 된 것처럼 처리를 하는 것이다. touch유틸리티 명렁어에 익숙한 사람이라면 이해할 것이다. touch는 파일의 생성 날짜를 현재로 바꾸어 주는 간단한 유틸리티이다.
4.4 Makefile에 사용되는 옵션
make에서 거의 모든 것은 Makefile내부에서 모두 지정을 할 수 있다. 그중 일부를 make의 실행 시에 옵션으로 통해서 줄 수도 있다. List 4-17은 수많은 옵션중에서 가장 많이 사용 옵션을 보여 주고 있다.
-C dir
위에서도 밝혔듯이 Makefile을 계속 읽지 말고 우선은 dir로 이동하라는 것이다. 순환 make에 사용된다.
-d
Makefile을 수행하면서 각종 정보를 모조리 출력해 준다. (-debug) 결과를 파일로 저장해서 읽어보면 make 의 동작을 대충 이해할 수 있다.
-h옵션에 관한 도움말을 출력한다. (-help)
-f filefile 에 해당하는 파일을 Makefile로써 취급한다. (-file)
-r
내장하고 있는 각종 규칙(Suffix rule 등)을 없는 것으로 (-no-builtin-rules)간주한다. 따라서 사용자가 규칙을 새롭게 정의해 주어야 한다.
-t파일의 생성 날짜를 현재 시간으로 갱신한다. (-touch)
-vmake의 버전을 출력한다. (전 GNU make 3.73 을 씁니다.) (-version)
-pmake에서 내부적으로 세팅되어 있는 값들을 출력한다. (-print-data-base)
-k
make는 에러가 발생하면 도중에 실행을 포기하게 되는데 (-keep-going) -k 는 에러가 나더라도 멈추지 말고 계속 진행하라는 뜻.
1. 문자 함수 1-1) CHR 1-2) CONCAT 함수 1-3) INITCAP 함수 1-4) LOWER 함수 1-5) LPAD 함수 1-6) LTRIM 함수 1-7) NLS_INITCAP 함수 1-8) NLS_LOWER 함수 1-9) NLSSORT 함수 1-10) NLS_UPPER 함수 1-11) REPLACE 함수 1-12) RPAD 함수 1-13) RTRIM 함수 1-14) SOUNDEX 함수 1-15) SUBSTR 함수 1-16) TRANSLATE 함수 1-17) TREAT 함수 1-18) TRIM 함수 1-19) UPPER 함수 1-20) ASCII 함수 1-21) INSTR 함수 1-22) LENGTH 함수
2. 날짜 처리함수(datetime function) 2-1) ADD_MONTHS 함수 2-2) CURRENT_DATE 함수 2-3) URRENT_TIMESTAMP 함수 2-4) DBTIMEZONE 함수 2-5) EXTRACT(datetime) 함수 2-6) FROM_TZ 함수 2-7) LAST_DAY 함수 2-8) LOCALTIMESTAMP 함수 2-9) MONTHS_BETWEEN 함수 2-10) NEW_TIME 함수 2-11) NEXT_DAY 함수 2-12) NUMTODSINTERVAL 함수 2-13) NUMTOYMINTERVAL 함수 2-14) ROUND(date) 함수 2-15) SESSIONTIMEZONE 함수 2-16) SYS_EXTRACT_UTC 함수 2-17) SYSDATE 함수 2-18) SYSTIMESTAMP 함수 2-19) TO_DSINTERVAL 함수 2-20) TO_TIMESTAMP 함수 2-21) TO_TIMESTAMP_TZ 함수 2-22) TO_YMINTERVAL 함수 2-23) TRUNC(date) 함수 2-24) TZ_OFFSET 함수
3.데이터 형 변환 함수(conversion function) 3-1) ASCIISTR 함수 3-2) BIN_TO_NUM 함수 3-3) CAST 함수 3-4) CHARTOROWID 함수 3-5) COMPOSE 함수 3-6) CONVERT 함수 3-7) HEXTORAW 함수 3-8) NUMTODSINTERVAL 함수 3-9) NUMTOYMINTERVAL 함수 3-10) RAWTOHEX 함수 3-11) RAWTONHEX 함수 3-12) ROWIDTOCHAR 함수 3-13) ROWIDTONCHAR 함수 3-14) TO_CHAR(character) 함수 3-15) TO_CLOB 함수 3-16) TO_DSINTERVAL 함수 3-17) TO_LOB 함수 3-18) TO_MULTI_BYTE 함수 3-19) TO_NCHAR(character) 함수 3-20) TO_NCHAR(datetime) 함수 3-21) TO_NCHAR(number) 함수 3-22) TO_NCLOB 함수 3-23) TO_NUMBER 함수 3-24) TO_SINGLE_BYTE 함수 3-25) TO_YMINTERVAL 함수 3-26) TRANSLATE ... USING 함수 3-27) UNISTR 함수
4. 기타함수(miscellaneous single row function) 4-1) BFILENAME 함수 4-2) COALESCE 함수 4-3) DECODE 함수 4-4) DEPTH 함수 4-5) DUMP 함수 4-6) EMPTY_BLOB 함수 4-7) EMPTY_CLOB 함수 4-8) EXISTSNODE 함수 4-9) EXTRACT(XML) 함수 4-10) EXTRACTVALUE 함수 4-11) GREATEST 함수 4-12) LEAST 함수 4-13) NLS_CHARSET_DECL_LEN 함수 4-14) NLS_CHARSET_ID 함수 4-15) NLS_CHARSET_NAME 함수 4-16) NULLIF 함수 4-17) NVL2 함수 4-18) PATH 함수 4-19) SYS_CONNECT_BY_PATH 함수 4-20) SYS_CONTEXT 함수 4-21) SYS_DBURIGEN 함수 4-22) SYS_EXTRACT_UTC 함수 4-23) SYS_GUID 함수 4-24) SYS_XMLAGG 함수 4-25) SYS_XMLGEN 함수 4-26) UID 함수 4-27) USER 함수 4-28) USERENV 함수 4-29) VSIZE 함수 4-30) XMLAGG 함수 4-31) XMLCOLATTVAL 함수 4-32) XMLCONCAT 함수 4-33) XMLFOREST 함수 4-34) XMLELEMENT 함수
5.그룹함수 Aggregate 함수 5-1) AVG* 함수 5-2) CORR* CORR* 함수 5-3) COUNT* 함수 5-4) COVAR_POP 함수 5-5) COVAR_SAMP 함수 5-6) CUME_DIST 함수 5-7) DENSE_RANK 함수 5-8) FIRST 함수 5-9) GROUP_ID 함수 5-10) Grouping 함수 5-11) GROUPING_ID 함수 5-12) LAST 함수 5-13) MAX 함수 5-14) MIN 함수 5-15) PERCENTILE_CONT 함수 5-16) PERCENTILE_DISC 함수 5-17) PERCENT_RANK 함수 5-18) RANK 함수 5-19) REGR_(linear regression) function* 함수 5-20) STDDEV 함수 5-21) STDDEV_POP 함수 5-22) STDDEV_SAMP 함수 5-23) SUM 함수 5-24) VAR_POP 함수 5-25) VAR_SAMP 함수 5-26) VARIANCE 함수 5-27) Grouping sets 함수
6. Analytic 함수 6-1) AVG* 함수 6-2) CORR* CORR* 함수 6-3) COUNT* 함수 6-4) COVAR_SAMP 함수 6-5) CUME_DIST 함수 6-6) DENSE_RANK 함수 6-7) FIRST 함수 6-8) FIRST_VALUE 함수 6-9) LAG 함수 6-10) LAST_VALUE 함수 6-11) LEAD 함수 6-12) NTILE 함수 6-13) RATIO_TO_REPORT 함수 6-14) ROW_NUMBER 함수
7. 객체 참조 함수 7-1) REF 타입
8. PseudoColumn을 의미하는 것 8-1) ROWID 컬럼 8-2) ROWNUM 컬럼
1-1) CHR 함수 --------------------------------------------------------------------------------
입력된 수의 바이너리 코드에 해당하는 문자를 반환한다.
【예제】 SQL> select chr(75)||chr(79)||chr(82)||chr(69)||chr(65) 2 from dual;
CHR(7 ----- KOREA
SQL>
1-2) CONCAT 함수 --------------------------------------------------------------------------------
입력되는 두 문자열을 연결하여 반환한다. 입력되는 두 문자열의 타입이 다를 경우 다음과 같이 반환된다.
첫 번째 문자열 타입 두 번째 문자열 타입 반환되는 문자열 타입 CLOB NCLOB NCLOB NCLOB NCHAR NCLOB NCLOB CHAR NCLOB NCHAR CLOB NCLOB
【예제】 SQL> select concat('Republic of',' KOREA') from dual;
CONCAT('REPUBLICO ----------------- Republic of KOREA
SQL>
1-3) INITCAP 함수 --------------------------------------------------------------------------------
initcap('string‘) 함수는 입력 문자열 중에서 각 단어의 첫 글자를 대문자로 나머지는 소문자로 변환한 스트링을 반환한다
【예제】 SQL> select initcap('beautiful corea') from dual;
INITCAP('BEAUTI --------------- Beautiful Corea
SQL>
1-4) LOWER 함수 --------------------------------------------------------------------------------
lower(string) 함수는 입력된 문자열을 소문자로 반환한다.
【예제】 SQL> select lower('Beautiful COREA') from dual;
LOWER('BEAUTIFU --------------- beautiful corea
SQL>
1-5) LPAD 함수 --------------------------------------------------------------------------------
lpad(char1,n,char2) 함수는 지정된 길이 n에서 문자 char1으로 채우고 남은 공간은 왼쪽부터 char2로 채워서 출력한다.
【형식】 lpad (char1, n [, char2] )
【예제】 SQL> select lpad ('Corea', 12, '*') from dual;
LPAD('COREA' ------------ *******Corea
SQL>
1-6) LTRIM 함수 --------------------------------------------------------------------------------
LTRIM(문자열, 문자)함수는 문자열중 좌측으로부터 특정문자와 일치하는 문자를 제거하고 출력한다.
【형식】 ltrim(char [,set] )
【예제】 SQL> select LTRIM('xyxXxyLAST WORD','xy') from dual;
LTRIM('XYXXX ------------ XxyLAST WORD
SQL>
1-7) NLS_INITCAP 함수 --------------------------------------------------------------------------------
nls_initcap(‘string’) 함수는 입력 문자열 중에서 각 단어의 첫 글자를 대문자로 나머지는 소문자로 변환한 스트링을 반환한다. 단어의 white space나 character가 알파뉴메릭이 아니더라도 상관없다. nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며, 여기서 sort는 linguistic sort sequence나 binary중의 하나이다.
【형식】 nls_initcap ( char [,'nlsparam'] )
【예제】 SQL> select nls_initcap('beautiful corea', 'nls_sort=binary') 2 from dual;
NLS_INITCAP('BE --------------- Beautiful Corea
SQL> select nls_initcap('beautiful corea','nls_sort=XDutch') 2 from dual;
NLS_INITCAP('BE --------------- Beautiful Corea
SQL>
1-8) NLS_LOWER 함수 --------------------------------------------------------------------------------
nls_lower(‘string’) 함수는 입력 문자열을 모두 소문자로 변환한 스트링을 반환한다. 단어의 white space나 character가 알파뉴메릭이 아니더라도 상관없다. nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며, 여기서 sort는 linguistic sort sequence나 binary중의 하나이다.
【형식】 nls_lower ( char [,'nlsparam'] )
【예제】 SQL> select nls_lower('CITTA''','nls_sort=XGerman') from dual;
NLS_LO ------ citta'
SQL>
1-9) NLSSORT 함수 --------------------------------------------------------------------------------
nlssort(‘string’) 함수는 입력 문자열을 소팅하여 스트링을 반환한다. 단어의 white space나 character가 알파뉴메릭이 아니더라도 상관없다. nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며, 여기서 sort는 linguistic sort sequence나 binary중의 하나이다.
【형식】 nlssort ( char [,'nlsparam'] )
【예제】 SQL> select * from emp 2 order by nlssort(name, 'nls_sort=XDanish');
ID NAME SALARY BONUS ---------- ---------- ---------- ---------- 1101 Cho 250 125 1102 Joe 240 100 1104 jijoe 220 100 1103 kim 250 100
SQL>
1-10) NLS_UPPER 함수 --------------------------------------------------------------------------------
nls_upper(‘string’) 함수는 입력 문자열을 모두 소문자로 변환한 스트링을 반환한다. 단어의 white space나 character가 알파뉴메릭이 아니더라도 상관없다. nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며, 여기서 sort는 linguistic sort sequence나 binary중의 하나이다.
【형식】 nls_upper ( char [,'nlsparam'] )
【예제】 SQL> select nls_upper('gro?e') from dual;
NLS_U ----- gro?e
SQL> select nls_upper('gro?e','nls_sort=XGerman') 2 from dual;
NLS_UP ------ grosse
SQL>
1-11) REPLACE 함수 --------------------------------------------------------------------------------
이 함수는 문자열에서 지정한 문자를 다른 문자로 치환한다. 치환될 문자를 지정하지 않으면 해당 문자를 삭제한다.
【예제】 SQL> select replace('aaabb','a','b') from dual;
REPLA ----- bbbbb
SQL> select replace('aaabb','a') from dual;
RE -- bb
SQL>
1-12) RPAD 함수 --------------------------------------------------------------------------------
rpad(char1,n,char2) 함수는 지정된 길이 n에서 문자 char1으로 채우고 남은 공간은 오른쪽부터 char2로 채워서 출력한다.
【형식】 rpad (char1, n [, char2] )
【예제】 SQL> select rpad('Corea',12,'*') from dual;
RPAD('COREA' ------------ Corea*******
SQL>
1-13) RTRIM 함수 --------------------------------------------------------------------------------
RTRIM(문자열, 문자)함수는 문자열중 우측으로부터 특정문자와 일치하는 문자를 제거하고 출력한다.
【형식】 rtrim(char [,set] )
【예제】 SQL> select RTRIM('BROWINGyxXxy','xy') "RTRIM example" from dual;
RTRIM exam ---------- BROWINGyxX
SQL>
1-14) SOUNDEX 함수 --------------------------------------------------------------------------------
soundex(‘char’) 함수는 char과 같은 발음의 이름을 표현한다.
【예제】 SQL> select name from emp;
NAME ---------- Cho Joe kim jijoe
SQL> select name from emp 2 where soundex(name) = soundex('jo');
NAME ---------- Joe
SQL>
1-15) SUBSTR 함수 --------------------------------------------------------------------------------
substr(str,m,n) 함수는 문자열 str 중에서 특정 위치 m으로부터 특정 길이n 만큼의 문자를 출력한다. m이 0이나 1이면 문자열의 첫글자를 의미하고, n이 생략되면 문자열의 끝까지를 의미한다. m이 음수이면 뒤쪽으로부터의 위치를 의미한다.
SUBSTRB는 character 대신 byte를 사용하고, SUBSTDC는 unicode를 사용하며, SUBSTR2는 UCS2 codepoint를 사용하고, SUBSTR4는 UCS4 codepoint를 사용한다.
【형식】 {SUBSTR|SUBSTRB|SUBSTRC|SUNBSTD2|SUBSTR4} ( string, position [,substring_length] )
【예제】 SQL> select substr('abcdesfg', 3,2) from dual;
SU -- cd
SQL> select substr('abcdefg',3) from dual;
SUBST ----- cdefg
SQL> select substr('abcdefg', -3,2) from dual; ☜ 뒤에서 3번째부터 2글자를 의미한다. SU -- ef
SQL>
1-16) TRANSLATE 함수 --------------------------------------------------------------------------------
TRANSLATE (‘char’,‘from_string’,‘to_string’) 함수는 char 내에 포함된 문자중 from_string에 지정한 모든 각각의 문자를 to_string문자로 각각 변경한다.
【형식】 TRANSLATE ('char','from_string','to_string')
【예제】 SQL> select translate('ababccc','c','d') from dual;
TRANSLA ------- ababddd
SQL> select translate('2KRW229', 2 '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', 3 '9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') from dual;
TRANSLA ------- 9XXX999
SQL> select translate('2KRW229', 2 '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789') 3 from dual;
TRAN ---- 2229
SQL>
1-17) TREAT 함수 --------------------------------------------------------------------------------
TREAT 함수는 선언된 타입을 변경함으로써, 수퍼타입을 서브타입인 것처럼 처리할 수 있도록 한다.
【형식】 TREAT ( expr AS [ REF] [schema . ] type )
【예제】 SQL> select x.p.empno from person_table p; select x.p.empno from person_table p * ERROR at line 1: ORA-00904: "X"."P"."EMPNO": invalid identifier SQL> select treat(x.p as employee).empno empno, 2 x.p.last_name last_name 3 from person_table x; EMPNO LAST_NAME ---------- -------------------- Seoul 1234 Inchon 5678 Arirang SQL>
【예제】 SQL> select name, TREAT(VALUE(p) AS employee_t).salary salary 2 FROM person p;
NAME SALARY ---------------------- --------- Bob Joe 100000 Tim 1000
SQL>
1-18) TRIM 함수 --------------------------------------------------------------------------------
이 함수는 LTRIM과 RTRIM 함수를 결합한 형태로 문자값의 왼쪽 또는 오른쪽 부분에 정의한 문자를 절삭하여 출력한다. LEADING은 LTRIM처럼 문자열 왼쪽의 문자를 지정하여 절삭하고, TRAILING은 RTRIM처럼 문자열 오른쪽 문자를 지정하여 절삭한다. BOTH는 왼쪽과 오른쪽 문자를 지정하여 절삭한다.
【형식】 TRIM ([{{{LEADING|TRAILING|BOTH} [trim_char] } | trim_char} FROM] trim_source )
【예제】 SQL> select trim (0 from 000123400) from dual;
TRIM ---- 1234
SQL> select trim(trailing 'a' from 'abca') from dual;
TRI --- abc
SQL> select trim(leading 'a' from 'abca') from dual;
TRI --- bca
SQL> select trim(both 'a' from 'abca') from dual;
TR -- bc
SQL>
1-19) UPPER 함수 --------------------------------------------------------------------------------
upper(string) 함수는 입력된 문자열을 대문자로 반환한다.
【예제】 SQL> select upper('Beautiful COREA') from dual;
UPPER('BEAUTIFU --------------- BEAUTIFUL COREA
SQL>
1-20) ASCII 함수 --------------------------------------------------------------------------------
ASCII ascii(‘char’) 함수는 주어진 char의 첫 글자의 아스키 값을 반환한다. char의 타입은 char, varchar2, nchar, nvarchar2중의 하나이어야 한다.
【예제】 SQL> select ascii('Korea') from dual;
ASCII('KOREA') -------------- 75
SQL> select ascii('K') from dual;
ASCII('K') ---------- 75
SQL>
1-21) INSTR 함수 --------------------------------------------------------------------------------
이 함수는 문자 스트링 중에서 지정한 문자가 가장 처음 나타나는 위치를 숫자로 출력한다.
【형식】 {INSTR|INSTRB|INSTRC|INSTR2|INSTR4} ( string, substring [, position [,occurrence] ] )
【예제】 SQL> select instr('Corea','e') from dual;
INSTR('COREA','E') ------------------ 4
SQL> select instr('corporate floor','or',3,2) from dual;
1-22) LENGTH 함수 --------------------------------------------------------------------------------
LENGTH(char) 함수는 char의 길이를 반환한다. LENGTHB는 character 대신 byte를 사용하고, LENGTHC는 unicode를 사용하며, LENGTH2는 UCS2 codepoint를 사용하고, LENGTH4는 UCS4 codepoint를 사용한다.
2-3) URRENT_TIMESTAMP 함수 --------------------------------------------------------------------------------
이 함수는 현재 session의 날짜와 시간 정보를 반환한다. current_timestamp는 time zone까지 출력되지만, localtimestamp는 time zone은 출력되지 않는다. 【예제】 SQL> select current_timestamp, localtimestamp, 2 current_date from dual;
CURRENT_TIMESTAMP -------------------------------------------------------------------------- LOCALTIMESTAMP -------------------------------------------------------------------------- CURRENT_D --------- 04-AUG-04 11.17.40.768776 AM +09:00 04-AUG-04 11.17.40.768776 AM 04-AUG-04
SQL>
2-4) DBTIMEZONE 함수 --------------------------------------------------------------------------------
데이터베이스 timezone을 반환한다. 【예제】 SQL> select dbtimezone from dual;
SYSDATE last day Days Left --------- --------- ---------- 04-AUG-04 31-AUG-04 27
SQL>
2-8) LOCALTIMESTAMP 함수 --------------------------------------------------------------------------------
이 함수는 timestamp의 현재 날짜와 시각을 출력한다. current_timestamp는 time zone까지 출력되지만, localtimestamp는 time zone은 출력되지 않는다.
【형식】 localtimestamp [(timestamp_precision)]
【예제】 SQL> select current_timestamp, localtimestamp, 2 current_date from dual;
CURRENT_TIMESTAMP -------------------------------------------------------------------------- LOCALTIMESTAMP -------------------------------------------------------------------------- CURRENT_D --------- 04-AUG-04 11.17.40.768776 AM +09:00 04-AUG-04 11.17.40.768776 AM 04-AUG-04
SQL>
【예제】오류가 발생하는 이유를 잘 이해하자. SQL> CREATE TABLE local_test(col1 TIMESTAMP WITH LOCAL TIME ZONE);
Table created.
SQL> INSERT INTO local_test VALUES 2 (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF')); (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF')) * ERROR at line 2: ORA-01830: date format picture ends before converting entire input string
SQL> INSERT INTO local_test VALUES 2 (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM'));
1 row created.
SQL> select * from local_test;
COL1 -------------------------------------------------------------------------- 04-AUG-04 11.33.58.183398 AM
SQL>
2-9) MONTHS_BETWEEN 함수 --------------------------------------------------------------------------------
MONTHS_BETWEEN(date1,date2) 함수는 date1과 date로 나타내는 날짜와 날짜 사이의 개월 수를 출력한다.
2-10) NEW_TIME 함수 --------------------------------------------------------------------------------
NEW_TIME(date,zone1,zone2) 함수는 date, zone1 시간대를 zone2 시간대로 출력한다. 여기서 사용되는 zone은 다음 중의 하나이다.
AST,ADT : Atlantic Standard or Daylight Time BST,BDT : Bering Standard or Daylight Time CST,CDT : Central Standard or Daylight Time EST,EDT : Eastern Standard or Daylight Time GMT : Greenwich Mean Time HST,HDT : Alaska-Hawaii Standard or Daylight Time MST,MDT : Mountain Standard or Daylight Time NST : Newfoundland Standard Time PST,PDT : Pacific Standard or Daylight Time YST,YDT : Yukon Standard or Daylight Time
【예제】 SQL> alter session set nls_date_format = 2 'DD-MON-YYYY HH24:MI:SS';
ENAME HIREDATE NUMTODSIN ---------- --------- --------- SMITH 17-DEC-80 27-MAR-81 ALLEN 20-FEB-81 31-MAY-81 WARD 22-FEB-81 02-JUN-81 JONES 02-APR-81 11-JUL-81 MARTIN 28-SEP-81 06-JAN-82 BLAKE 01-MAY-81 09-AUG-81 CLARK 09-JUN-81 17-SEP-81 SCOTT 19-APR-87 28-JUL-87 KING 17-NOV-81 25-FEB-82 TURNER 08-SEP-81 17-DEC-81 ADAMS 23-MAY-87 31-AUG-87 JAMES 03-DEC-81 13-MAR-82 FORD 03-DEC-81 13-MAR-82 MILLER 23-JAN-82 03-MAY-82
14 rows selected.
SQL>
2-13) NUMTOYMINTERVAL 함수 --------------------------------------------------------------------------------
NUMTOYMINTERVAL(n,'char_expr') 함수는 n을 interval year to month로 변환하여 출력한다. char_expr은 다음 중의 하나이다. ‘YEAR’ ‘MONTH’
【예제】 SQL> select numtoyminterval(30,'month') from dual;
ENAME HIREDATE NUMTOYMIN ---------- --------- --------- SMITH 17-DEC-80 17-JUN-83 ALLEN 20-FEB-81 20-AUG-83 WARD 22-FEB-81 22-AUG-83 JONES 02-APR-81 02-OCT-83 MARTIN 28-SEP-81 28-MAR-84 BLAKE 01-MAY-81 01-NOV-83 CLARK 09-JUN-81 09-DEC-83 SCOTT 19-APR-87 19-OCT-89 KING 17-NOV-81 17-MAY-84 TURNER 08-SEP-81 08-MAR-84 ADAMS 23-MAY-87 23-NOV-89 JAMES 03-DEC-81 03-JUN-84 FORD 03-DEC-81 03-JUN-84 MILLER 23-JAN-82 23-JUL-84
14 rows selected.
SQL>
2-14) ROUND(date) 함수 --------------------------------------------------------------------------------
이 함수는 날짜를 주어진 형식으로 반올림하는 함수이다. 날짜 형식이 없으면 가장 가까운 날을 출력한다.
【형식】 ROUND( date [,fmt] )
【예제】 SQL> select localtimestamp, round(sysdate,'year') from dual;
2-20) TO_TIMESTAMP 함수 --------------------------------------------------------------------------------
이 함수는 문자열을 timestamp 형식으로 변환하여 출력한다
【형식】 to_timestamp ( char [,fmt ['nlsparam'] ] )
【예제】 SQL> select to_timestamp('2004-8-20 1:30:00', 'YYYY-MM-DD HH:MI:SS') 2 from dual;
TO_TIMESTAMP('2004-8-201:30:00','YYYY-MM-DDHH:MI:SS') -------------------------------------------------------------------------- 20-AUG-04 01.30.00.000000000 AM
SQL>
2-21) TO_TIMESTAMP_TZ 함수 --------------------------------------------------------------------------------
이 함수는 문자열을 timestamp with time zone 형식으로 변환하여 출력한다.
3-4) CHARTOROWID 함수 --------------------------------------------------------------------------------
이 함수는 char, varchar2, nchar, ncharvar2형 데이터 타입을 rowid 형 데이터 타입으로 변경한다. 【예제】 SQL> select name from emp 2 where rowid = chartorowid('AAAHZ+AABAAAMWiAAF');
NAME ---------- jijoe
SQL> select rowid,name from emp;
ROWID NAME ------------------ ---------- AAAHZ+AABAAAMWiAAA Cho AAAHZ+AABAAAMWiAAB Joe AAAHZ+AABAAAMWiAAC kim AAAHZ+AABAAAMWiAAF jijoe
SQL>
여기서 rowid의 의미는 다음과 같다. AAAHZ+ AAB AAAMWi AAA 객체번호 테이블스페이스번호 블록번호 행번호
3-5) COMPOSE 함수 --------------------------------------------------------------------------------
입력된 스트링을 unicode로 나타낸다.
【예제】 SQL> select compose('aa' || unistr('308') ) from dual;
CO -- aa
SQL>
3-6) CONVERT 함수 --------------------------------------------------------------------------------
입력된 문자열을 지정한 코드로 변환한다. 공용 문자셋은 살펴보자. US7ASCII US 7-bit ASCII 문자 WE8DEC 서유럽 8비트 문자 WE8HP HP 서유럽 레이져젯 8비트 문자 F7DEC DEC 프랑스 7비트 문자 WE8EBCDIC500 IBM 서유럽 EBCDIC 코드 페이지 500 WE8PC850 IBM PC 코드 페이지 850 WE8ISO8859P1 ISO 8859 서유럽 8비트 문자
【예제】 SQL> select convert('arirang','we8pc850') from dual;
CONVERT ------- arirang
SQL>
3-7) HEXTORAW 함수 --------------------------------------------------------------------------------
HEXTORAW(char) 함수는 char, varchar2, nchar, nvarchar2 따위의 문자로 주어지는 hexadecimal digit을 raw 값으로 변환한다.
【예제】 SQL> create table test(raw_col RAW(10));
Table created.
SQL> insert into test VALUES (HEXTORAW('7D'));
1 row created.
SQL> select * from test;
RAW_COL -------------------- 7D
SQL>
3-8) NUMTODSINTERVAL 함수 --------------------------------------------------------------------------------
NUMTODSINTERVAL(n,'char_expr') 함수는 n을 interval day to second로 변환하여 출력한다. char_expr은 다음 중의 하나이다. ‘DAY’ ‘HOUR’ ‘MINUTE’ ‘SECOND’
【예제】 SQL> select numtodsinterval(100,'MINUTE') from dual;
ENAME HIREDATE NUMTODSIN ---------- --------- --------- SMITH 17-DEC-80 27-MAR-81 ALLEN 20-FEB-81 31-MAY-81 WARD 22-FEB-81 02-JUN-81 JONES 02-APR-81 11-JUL-81 MARTIN 28-SEP-81 06-JAN-82 BLAKE 01-MAY-81 09-AUG-81 CLARK 09-JUN-81 17-SEP-81 SCOTT 19-APR-87 28-JUL-87 KING 17-NOV-81 25-FEB-82 TURNER 08-SEP-81 17-DEC-81 ADAMS 23-MAY-87 31-AUG-87 JAMES 03-DEC-81 13-MAR-82 FORD 03-DEC-81 13-MAR-82 MILLER 23-JAN-82 03-MAY-82
14 rows selected.
SQL>
3-9) NUMTOYMINTERVAL 함수 --------------------------------------------------------------------------------
NUMTOYMINTERVAL(n,'char_expr') 함수는 n을 interval year to month로 변환하여 출력한다. char_expr은 다음 중의 하나이다. ‘YEAR’ ‘MONTH’
【예제】 SQL> select numtoyminterval(30,'month') from dual;
ENAME HIREDATE NUMTOYMIN ---------- --------- --------- SMITH 17-DEC-80 17-JUN-83 ALLEN 20-FEB-81 20-AUG-83 WARD 22-FEB-81 22-AUG-83 JONES 02-APR-81 02-OCT-83 MARTIN 28-SEP-81 28-MAR-84 BLAKE 01-MAY-81 01-NOV-83 CLARK 09-JUN-81 09-DEC-83 SCOTT 19-APR-87 19-OCT-89 KING 17-NOV-81 17-MAY-84 TURNER 08-SEP-81 08-MAR-84 ADAMS 23-MAY-87 23-NOV-89 JAMES 03-DEC-81 03-JUN-84 FORD 03-DEC-81 03-JUN-84 MILLER 23-JAN-82 23-JUL-84
14 rows selected.
SQL>
3-10) RAWTOHEX 함수 --------------------------------------------------------------------------------
RAWTOHEX(raw) 함수는 raw 값을 hexadecimal 값으로 변환한다.
【예제】 SQL> create table test(raw_col RAW(10));
Table created.
SQL> insert into test VALUES (HEXTORAW('7D'));
1 row created.
SQL> select * from test;
RAW_COL -------------------- 7D
SQL> select rawtohex(raw_col) from test;
RAWTOHEX(RAW_COL) -------------------- 7D
SQL>
3-11) RAWTONHEX 함수 --------------------------------------------------------------------------------
RAWTONHEX(raw) 함수는 raw 값을 nvarchar2형 hexadecimal 값으로 변환한다.
【예제】 SQL> create table test(raw_col RAW(10));
Table created.
SQL> insert into test VALUES (HEXTORAW('7D'));
1 row created.
SQL> select * from test;
RAW_COL -------------------- 7D
SQL> select rawtonhex(raw_col) from test;
RAWTONHEX(RAW_COL) -------------------- 7D
SQL>
3-12) ROWIDTOCHAR 함수 --------------------------------------------------------------------------------
RAWIDTOCHAR(rowid) 함수는 rowid 값을 varchar2 형식의 데이터로 변환한다.
【예제】 SQL> select rowid from test;
ROWID ------------------ AAAHbHAABAAAMXCAAA
SQL> select rowid from test 2 where rowidtochar(rowid) like '%AABAA%';
ROWID ------------------ AAAHbHAABAAAMXCAAA
SQL>
여기서 rowid의 의미는 다음과 같다. AAAHbH AAB AAAMXC AAA 객체번호 테이블스페이스번호 블록번호 행번호
3-13) ROWIDTONCHAR 함수 --------------------------------------------------------------------------------
RAWIDTONCHAR(rowid) 함수는 rowid 값을 nvarchar2 형식의 데이터로 변환한다.
【예제】 SQL> select rowid from test;
ROWID ------------------ AAAHbHAABAAAMXCAAA
SQL> select rowid from test 2 where rowidtochar(rowid) like '%AABAA%';
ROWID ------------------ AAAHbHAABAAAMXCAAA
SQL> select lengthb(rowidtonchar(rowid)), rowidtonchar(rowid) 2 from test;
3-20) TO_NCHAR(datetime) 함수 --------------------------------------------------------------------------------
이 함수는 date, timestamp, timestamp with time zone, timestamp with local time zone, interval month to year, interval day to second 형식의 데이터를 nchar 형식의 데이터로 변환한다.
3-26) TRANSLATE ... USING 함수 --------------------------------------------------------------------------------
이 함수는 텍스트 형식의 데이터를 지정한 문자 형식의 데이터로 변환한다.
【형식】 TRANSLATE ( text USING {CHAR_CS|NCHAR_CS} )
【예제】 SQL> select translate('Corea' USING char_cs) from dual;
TRANS ----- Corea
SQL> select to_nchar('Corea') from dual;
TO_NC ----- Corea
SQL>
3-27) UNISTR 함수 --------------------------------------------------------------------------------
UNISTR('string') 함수는 스트링 형식의 데이터를 nchar 형식의 데이터로 변환한다.
【예제】 SQL> select unistr('abc0e50f10f6') from dual;
UNISTR ------ abc??o
SQL> select unistr('Corea') from dual;
UNIST ----- Corea
SQL>
4-1) BFILENAME 함수 --------------------------------------------------------------------------------
서버 파일 시스템 상에 실제로 위치한 LOB 바이너리 파일의 위치한 BFILE locator를 반환한다. 【형식】 bfilename ('디렉토리‘,’파일이름‘)
【예제】BFILE을 insert하는 예 SQL> connect system/manager
SQL> host mkdir /export/home/oracle/bfile
SQL> create directory bfile_dir as '/export/home/oracle/bfile';
Directory created.
SQL> grant read on directory bfile_dir to jijoe;
Grant succeeded.
SQL> connect jijoe/joe_password
SQL> create table bfile_doc (id number, doc bfile);
SQL> insert into bfile_doc
1 values(1111,bfilename('bfile_dir','unix.hwp'));
1 row created.
SQL>
4-2) COALESCE 함수 --------------------------------------------------------------------------------
이 함수는 나열된 값 중에서 NULL이 아닌 첫 번째 값을 반환한다.
【예제】 SQL> select coalesce('','','arirang','kunsan') from dual;
COALESC ------- arirang
SQL>
4-3) DECODE 함수 --------------------------------------------------------------------------------
DECODE는 일반적인 프로그래밍 언어의 IF문을 SQL 문자 또는 PL/SQL 안으로 끌어들여 사용하기 위하여 만들어진 오라클 함수이다. 따라서 일반 프로그래밍 언어의 IF문이 수행 할 수 있는 기능을 포함하고 있다. select시의 decode 사용은 from 절만 빼고 어디에서나 사용할 수 있다. 일반 프로그래밍과 decode 함수를 서로 비교하여 보자. IF문 Decode 함수 IF A=B THEN RETURN 'T';END IF; DECODE(A,B,'T') IF A=B THENRETURN 'T';ELSIF A=C THENRETURN 'F';ELSERETURN 'X';END IF; DECODE(A,B,'T',C,'F','X') 【형식】 DECODE(검색컬럼,조건1,결과값1, 조건2,결과값2,...,기본값);
SQL> insert into aa values(1234,'kunsan','jijoe') SQL> insert into aa values(3456,'seoul','sunny')
SQL> select * from aa;
PID ADDR NAME ---------- -------------------- ---------- 1234 kunsan jijoe 3456 seoul sunny
SQL> select decode(pid,1234,name) name from aa;
NAME ---------- jijoe
SQL> 【예제】 SQL> desc ddd Name Null? Type ----------------------------------------- -------- ---------------------------- NO NUMBER(4) NAME VARCHAR2(10) HIRDATE DATE DEPTNO NUMBER(5)
ID NAME SALARY BONUS ---------- ---------- ---------- ---------- 1101 Cho 250 125 1102 Joe 240 100 1103 kim 250 100 1104 jijoe 220 100
SQL>
5-6) CUME_DIST 함수 --------------------------------------------------------------------------------
이 함수는 그룹 값 내에서 어떤 값의 cumulative distribution(누적분포)을 계산한다.
【형식】 CUME_DIST(expr,... WITHIN GROUP (ORDER BY expr [DESC | ASC] [NULLS {FIRST|LAST}],...) 또는 CUME_DIST() over ([query_partition_clause] order_by_clause)
【예제】 SQL> select cume_dist(230) within group 2 (order by salary ) from emp;
ID NAME SALARY BONUS ---------- ---------- ---------- ---------- 1101 Cho 250 125 1102 Joe 240 100 1103 kim 250 100 1104 jijoe 220 100
SQL>
5-7) DENSE_RANK 함수 --------------------------------------------------------------------------------
그룹 내에서 순위를 반환한다.
【예제】 SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL> select dense_rank(230, .05) within group 2 (order by salary, bonus) "Dense Rank" 3 from employees;
Dense Rank ---------- 2
SQL>
5-8) FIRST 함수 --------------------------------------------------------------------------------
first나 last 함수는 행을 서열화 시켜서 첫 번째나 마지막 행을 추출한다. 【형식】 집합함수 KEEP ( DENSE_RANK FIRST ORDER BY expr [DESC|ASC][NULL{FIRST|LAST}],...) 【예제】 SQL> select 2 min(salary) keep (dense_rank first order by salary) "Worst", 3 max(salary) keep (dense_rank last order by salary) "Best" 4 from employees 5 order by id;
Worst Best ---------- ---------- 220 250
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
5-9) GROUP_ID 함수 --------------------------------------------------------------------------------
GROUP() 함수는 group by로 분리되어 복제된 번호로 복제 횟수를 구분하도록 출력한다. 번호가 0부터 시작되므로 n번 복제되었으면 n-1의 번호가 출력된다.
【예제】 SQL> select dept_no, group_id() from employees 2 group by dept_no;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
5-10) Grouping 함수 --------------------------------------------------------------------------------
Grouping 함수는 Rollup이나 cube 연산자랑 함께 사용하여 grouping 함수에서 기술된 컬럼이 그룹핑시 사용되었는지 보여주는 함수이다. 특별히 연산의 기능은 없으며, rollup이나 cube 연산 후 출력된 결과에 대한 사용자의 이해를 높이기 위해 사용된다. 즉, grouping 함수를 이용할 경우 출력되는 결과값 중 null 값이 있다면, 이 null 값이 rollup이나 cube 연산의 결과로 생성된 값인지, 원래 테이블상에 null 값으로 저장된 것인지 확인할 수 있다.
. grouping 함수는 인수로 하나의 값만을 가진다. . grouping 함수에 사용된 인수는 group by 절에 기술된 값 중에 하나와 반드시 일치해야 한다. . grouping 함수의 결과값으로 0 또는 1을 반환한다. 0은 해당인수로 쓰인 값이 rollup이나 cube 연산에 사용되었음을 나타나고, 1은 사용되지 않았음을 의미한다. 【형식】 SELECT 컬럼명,그룹함수(컬럼명), GROUPING(컬럼명) FROM 테이블명 WHERE 조건 GROUP BY [ROLLUP | CUBE] 그룹핑하고자하는 컬럼명,... HAVING 그룹조건 ORDER BY 컬럼명 또는 위치번호
【예제】 SQL> select grade,deptno,sum(salary),GROUPING(deptno) 2 from aaa 3 group by rollup(grade,deptno);
5-12) LAST 함수 --------------------------------------------------------------------------------
first나 last 함수는 행을 서열화 시켜서 첫 번째나 마지막 행을 추출한다. 【형식】 집합함수 KEEP ( DENSE_RANK LAST ORDER BY expr [DESC|ASC][NULL{FIRST|LAST}],...) 【예제】 SQL> select 2 min(salary) keep (dense_rank first order by salary) "Worst", 3 max(salary) keep (dense_rank last order by salary) "Best" 4 from employees 5 order by id;
Worst Best ---------- ---------- 220 250
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
5-13) MAX 함수 --------------------------------------------------------------------------------
이 함수는 최대 값을 반환한다.
【형식】 MAX ([{DISTINCT|ALL}] expr) [OVER(analytic_clause)]
【예제】 SQL> select max(salary) over (partition by dept_no) 2 from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
5-17) PERCENT_RANK 함수 --------------------------------------------------------------------------------
이 함수는 CUME_DIST 함수와 유사하게 percent_rank 값을 반환한다.
【형식】 PERCENT_RANK(expr,...) WITHIN GROUP (ORDER BY expr [{DESC|ASC}] [NULLS {FIRST|LAST}],...) 또는 PERCENT_RANK() OVER( [query_partition_clause] order_by_clause)
【예제】 SQL> select percent_rank(230,0.05) within group 2 (order by salary,bonus) from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
5-18) RANK 함수 --------------------------------------------------------------------------------
이 함수는 그룹 내에서 위치를 반환한다.
【형식】 RANK(expr,...) WITHIN GROUP (ORDER BY expr [{DESC|ASC}] [NULLS {FIRST|LAST}],...) 또는 RANK() OVER( [query_partition_clause] order_by_clause)
【예제】 SQL> select rank(230,0.05) within group 2 (order by salary,bonus) from employees;
RANK(230,0.05)WITHINGROUP(ORDERBYSALARY,BONUS) ---------------------------------------------- 2 SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
5-19) REGR_(linear regression) function* 함수 --------------------------------------------------------------------------------
선형 회귀(linear regression) 함수 ordinary-least squares regression line을 찾도록 한다. 사용되는 회귀함수는 자음 중 하나이다. REGR_SLOPE REGR_INTERCEPT REGR_COUNT REGR_R2 REGR_AVGX REGR_AVGY REGR_SXX REGR_SYY REGR_SXY
ID NAME SALARY BONUS ---------- ---------- ---------- ---------- 1101 Cho 250 125 1102 Joe 240 100 1103 kim 250 100 1104 jijoe 220 100
SQL>
5-27) Grouping sets 함수 --------------------------------------------------------------------------------
Grouping sets 함수는 Group by의 확장된 형태로 하나의 쿼리문에서 원하는 그룹핑 조건을 여러 개 기술할 수 있으며, grouping sets 함수 사용이 불가능한 이전 버전에서 복잡한 union all 연산자를 사용하여 기술하던 것을 간단하게 한 문장 안에서 해결할 수 있어 검색시 효율성이 증대 된다. 다시 말해서, grouping sets 함수를 사용하면, group by ... union all을 사용한 것보다 SQL 문이 간단해지고 또한 실행시 성능이 빨라진다. 【형식】 SELECT 컬럼명,그룹함수(컬럼명), GROUPING(컬럼명) FROM 테이블명 WHERE 조건 GROUP BY [ROLLUP | CUBE] 그룹핑하고자하는 컬럼명, ... [GROUPING SETS (컬럼명,컬럼명, ...), ...] HAVING 그룹조건 ORDER BY 컬럼명 또는 위치번호
【예제】 SQL> select grade,deptno,sum(salary) 2 from aaa 3 group by grouping sets(grade,deptno);
12 rows selected. SQL> 【예제】Union all을 사용한 경우 SQL> select grade,deptno,sum(salary) 2 from aaa 3 group by grade,deptno 4 union all 5 select grade,deptno,sum(salary) 6 from aaa 7 group by grade,deptno;
composite columns란 rollup, cube, grouping sets 절과 같은 기능을 사용하면 표현되는 각 컬럼이 하나가 아닌 복수 개의 컬럼으로 정의되는 경우이며 다음 표를 보고 이해하자. composite column 문의 경우 group by 문의 경우 group by grouping sets(a,b,c) group by a union allgroup by b union allgroup by c group by grouping sets(a,b,(b,c)) group by a union allgroup by b union allgroup by b,c group by grouping sets((a,b,c)) group by a,b,c group by grouping sets(a,(b),()) group by a union allgroup by b union allgroup by () group by grouping sets(a,rollup(b,c)) group by a union allgroup by rollup(b,c) group by rollup(a,b,c) group by (a,b,c) union allgroup by (a,b) union allgroup by (a) union allgroup by () group by cube(a,b,c) group by (a,b,c) union allgroup by (a,b) union allgroup by (a,c) union allgroup by (b,c) union allgroup by (a) union allgroup by (b) union allgroup by (c) union allgroup by ()
6-1) AVG* 함수 --------------------------------------------------------------------------------
조건을 만족하는 행(row)의 평균을 값을 반환하며, aggregate 함수나 analytic 함수로 사용된다.
ID NAME SALARY BONUS ---------- ---------- ---------- ---------- 1101 Cho 250 125 1102 Joe 240 100 1103 kim 250 100 1104 jijoe 220 100
SQL>
6-5) CUME_DIST 함수 --------------------------------------------------------------------------------
이 함수는 그룹 값 내에서 어떤 값의 cumulative distribution(누적분포)을 계산한다.
【형식】 CUME_DIST(expr,... WITHIN GROUP (ORDER BY expr [DESC | ASC] [NULLS {FIRST|LAST}],...) 또는 CUME_DIST() over ([query_partition_clause] order_by_clause)
【예제】 SQL> select cume_dist(230) within group 2 (order by salary ) from emp;
ID NAME SALARY BONUS ---------- ---------- ---------- ---------- 1101 Cho 250 125 1102 Joe 240 100 1103 kim 250 100 1104 jijoe 220 100
SQL>
6-6) DENSE_RANK 함수 --------------------------------------------------------------------------------
그룹 내에서 순위를 반환한다.
【예제】 SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL> select dense_rank(230, .05) within group 2 (order by salary, bonus) "Dense Rank" 3 from employees;
Dense Rank ---------- 2
SQL>
6-7) FIRST 함수 --------------------------------------------------------------------------------
first나 last 함수는 행을 서열화 시켜서 첫 번째나 마지막 행을 추출한다. 【형식】 집합함수 KEEP ( DENSE_RANK FIRST ORDER BY expr [DESC|ASC][NULL{FIRST|LAST}],...) 【예제】 SQL> select 2 min(salary) keep (dense_rank first order by salary) "Worst", 3 max(salary) keep (dense_rank last order by salary) "Best" 4 from employees 5 order by id;
Worst Best ---------- ---------- 220 250
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-8) FIRST_VALUE 함수 --------------------------------------------------------------------------------
이 함수는 서열화된 값에서 첫 번째를 출력한다.
【형식】 FIRST_VALUE ( expr ) OVER ( analytic_절)
【예제】 SQL> select salary,first_value(name) 2 over (order by salary asc) 3 from (select * from employees 4 where dept_no = 20 5 order by salary);
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-9) LAG 함수 --------------------------------------------------------------------------------
이 함수는 analytic 함수로서, self join하지 않고 하나의 테이블에서 동시에 한 행(row) 이상을 접근할 수 있도록 한다.
【형식】 LAG ( value_expr [,offset] [,default] ) OVER ([query_partition_clause] order_by_clause )
【예제】 SQL> select name,salary,LAG(salary,1,0) 2 OVER (ORDER BY salary) FROM employees;
NAME SALARY LAG(SALARY,1,0)OVER(ORDERBYSALARY) ---------- ---------- ---------------------------------- jijoe 220 0 Joe 240 220 Cho 250 240 kim 250 250
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-10) LAST_VALUE 함수 --------------------------------------------------------------------------------
이 함수는 서열화된 값에서 마지막 번째를 출력한다.
【형식】 LAST_VALUE ( expr ) OVER ( analytic_절)
【예제】 SQL> select salary,last_value(name) 2 over (order by salary asc) 3 from (select * from employees 4 where dept_no = 20 5 order by salary);
SALARY LAST_VALUE ---------- ---------- 220 jijoe 240 Joe
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-11) LEAD 함수 --------------------------------------------------------------------------------
이 함수는 analytic 함수로서, self join하지 않고 하나의 테이블에서 동시에 한 행(row) 이상을 접근할 수 있도록 한다.
【형식】 LEAD ( value_expr [,offset] [,default] ) OVER ([query_partition_clause] order_by_clause )
【예제】 SQL> select name,salary,LEAD(salary,1,0) 2 OVER (ORDER BY salary) FROM employees;
NAME SALARY LEAD(SALARY,1,0)OVER(ORDERBYSALARY) ---------- ---------- ----------------------------------- jijoe 220 240 Joe 240 250 Cho 250 250 kim 250 0
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-12) NTILE 함수 --------------------------------------------------------------------------------
이 함수는 analytic 함수로서, 데이터를 주어진 bucket 수 expr로 분리한다.
【형식】 NTILE ( expr ) OVER ([query_partition_clause] order_by_clause )
【예제】 SQL> select name,salary,NTILE(3) OVER (ORDER BY salary DESC) 2 FROM employees;
NAME SALARY NTILE(3)OVER(ORDERBYSALARYDESC) ---------- ---------- ------------------------------- Cho 250 1 kim 250 1 Joe 240 2 jijoe 220 3
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-13) RATIO_TO_REPORT 함수 --------------------------------------------------------------------------------
이 함수는 analytic 함수로서, 데이터 합에 대한 구성비를 계산한다.
【형식】 RATIO_TO_REPORT ( expr ) OVER ([query_partition_clause])
【예제】 SQL> select name,salary,RATIO_TO_REPORT(salary) OVER () 2 FROM employees;
NAME SALARY RATIO_TO_REPORT(SALARY)OVER() ---------- ---------- ----------------------------- Cho 250 .260416667 Joe 240 .25 kim 250 .260416667 jijoe 220 .229166667
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-14) ROW_NUMBER 함수 --------------------------------------------------------------------------------
이 함수는 analytic 함수로서, 각 행(row)에 unique 번호를 부여한다.
【형식】 ROW_NUMBER () OVER ([query_partition_clause] order_by_clause )
【예제】 SQL> SELECT ROW_NUMBER() OVER (ORDER BY salary DESC),name 2 FROM employees;
ROW_NUMBER()OVER(ORDERBYSALARYDESC) NAME ----------------------------------- ---------- 1 Cho 2 kim 3 Joe 4 jijoe
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
7-1) REF 타입 -------------------------------------------------------------------------------- 테이블의 어떤 컬럼이 독립된 다른 객체 테이블을 참조하는 데이터 타입을 의미한다. 일반적으로 테이블을 만들때 사용하는 외부키(foreign-key)를 이용한 참조관계와 유사하다. REF 타입의 컬럼 데이터를 읽을 때는 반드시 DEREF 함수를 사용한다. REF 타입으로 정의된 컬럼에는 실제 데이터가 저장되는 것이 아니고 참조되는 객체가 존재하는 포인트정보만 가지고 있기 때문에 객체가 삭제 된다면, 해당 컬러은 정상적으로 검색되지 못한다. 이러한 현상을 REF의 Dangling 현상이고 한다. 이러한 dangling 현상을 방지하기 위해서는 삭제된 객체 정보를 참조하는 행의 컬럼 정보를 analyze 명령어를 이용하여 null 값으로 변경해 주어야 한다. 【예제】 SQL> connect jijoe/jijoe_password connected
SQL> create type person_type as object( 2 first_name varchar2(10), 3 last_name varchar2(10), 4 phone varchar(12), 5 birthday varchar2(12)); 6 /
Type created.
SQL> create type emp_type as object ( 2 empno number, 3 emp person_type); 4 /
Type created.
SQL> create table emp2 of emp_type 2 oidindex emp_oid;
Table created.
SQL> insert into emp2 values( 2 emp_type(1000,person_type('junik','joe','123-1234','20-jul-04')));
1. 카티시안 곱 (Cartesial Product) - 조인 조건이 부적합하거나 조인 조건을 완전히 생략한 경우 행의 모든 조합을 표시하는 카티시안 곱이 생성된다. 첫번째 테이블의 모든 행이 두번째 테이블의 모든 행에 조인된다. 카티시안 곱은 너무 많은 행을 생성하므로 결과가 유용하게 사용되지 않는다. 특별히 모든 테이블에 있는 모든 행을 조합해야 하는 경우가 아니라면 where절에 유효한 조인 조건을 포함시켜야 한다. 적정 양의 데이터를 시뮬레이션하기 위해 많은 수의 행을 생성해야 하는 경우 등 일부 테스트에서는 유용하게 사용된다.
SQL> select last_name, department_name 2 from employees, departments;
2. 등가 조인 (equi join) - 단순 조인 or 내부 조인(inner join)이라고도 함 - 주로 Primary Key와 Foreign Key를 보조 수단으로 사용하여 조인 - departments 테이블과 employees 테이블은 department_id를 공통된 컬럼으로 가지고 있다. 따라서 이 컬럼을 where절에서 조건으로 지정해 준다면 등가 조인을 할 수 있다. - 등가 조인의 성능을 높이기 위해서는 Index 기능을 사용하는 것이 좋다.
SQL> select e.employee_id, e.last_name, d.department_id, d.location_id 2 from employees e, departments d 3 where e.department_id = d.department_id;
3. 비등가 조인 (non-equi join) - 동등 연산자(=)가 아닌 연산자를 포함하는 조인 - between and, is null, is not null, in, not in - ex) employees 테이블의 급여는 jobs 테이블의 min_salary와 max_salary 사이에 있어야 한다.
SQL> select e.last_name, e.salary, j.job_title 2 from employees e, jobs j 3 where e.salary between min_salary and max_salary;
4. 포괄 조인 (outer join) - outer join은 조인 조건을 만족하지 않는 행도 반환한다. - 연산자는 더하기 기호 (+) 이고, 조인시킬 값이 없는 조인측에 위치시킨다. - outer join 연산자는 표현식의 where절에서 한 편에만 올 수 있고, in, or 연산자는 사용할 수 없다. - 아래 쿼리문은 사원이 없는 부서의 테이블 이름도 반환한다.
SQL> select e.last_name, e.department_id, d.department_name 2 from employees e, departments d 3 where e.department_id(+) = d.department_id;
- 4.1 Left Outer Join : 왼쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용한다. (아래의 SQL문은 같은 의미)
SQL> select e.last_name, e.department_id, d.department_name from employees e left outer join departments d on (e.department_id = d.department_id)
SQL> select e. last_name, e.department_id, d.department_name 2 from employees e, departments d 3 where d.department_id (+) = e.department_id;
- 4.2 Right Outer Join : 오른쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용한다.
SQL> select e.last_name, e.department_id, d.department_name 2 from employees e 3 right outer join departments d 4 on (e.department_id = d.department_id);
SQL> select e.last_name, e.department_id, d.department_name from employees e, departments d where d.department_id = e.department_id (+)
- 4.3 Full Outer Join : 양쪽 테이블에 모두 Outer Join을 하는 것으로 Two-way Outer Join 이라고도 한다.
SQL> select e.last_name, e.department_id, d.department_name from employees e full outer join departments d on (e.department_id = d.department_id)
5. 자체 조인 (self join) - Equi Join과 동일하지만 하나의 테이블 안에서 조인이 일어난다. - 같은 테이블을 마치 2개의 테이블을 사용하는 것처럼 조인한다. - ex) 각 사원의 관리자 이름을 찾으려면 Employees 테이블을 자체 조인해야 한다. 즉, 각 사원의 매니저 ID와 사원 ID가 동일한 사원을 찾아야 한다.
SQL> select worker.last_name || ' works for ' || manager.last_name 2 from employees worker, employees manager 3 where worker.manager_id = manager.employee_id;
6. 교차 조인 (cross join) - cross join은 두 테이블의 상호간의 조합을 생성한다. - 두 테이블 사이의 카티시안 곱(cartesian product)의 결과와 동일하다.
SQL> select last_name, department_name from employees cross join departments
7. 자연 조인 (Natural Join) - 두 테이블의 하나 이상의 공통된 컬럼(데이터 타입과 이름이 일치해야함)을 기반으로 조인연산을 수행한다. - DEPARTMENTS 테이블과 LOCATIONS 테이블은 공통적으로 NUMBER(4) 타입의 LOCATION_ID 속성이 존재한다. 따라서 두 테이블은 LOCATION_ID 컬럼을 통해서 자연 조인이 가능하다. - 일반적으로 등가 조인 (equi join)과 동일하다고 보면 된다. 단지 where절로 조건을 거느냐 natural join 키워드로 조인을 거느냐의 차이? (자연 조인안에서 다시 where절로 조건을 걸수 있음)
SQL> select department_id, department_name, location_id, city 2 from departments 3 natural join locations;
- 7.1 Using절을 포함하는 조인 -- Using절을 사용하면 equi join에 사용될 열만을 지정할 수 있다. -- Using절 안에 포함되는 컬럼에 alias를 지정하면 오류가 발생한다.
SQL> select e.employee_id, e.last_name, d.location_id from employees e join departments d using (department_id)
- 7.2 On 절을 이용한 조인 -- 자연 조인의 기본 조인 조건은 기본적으로 같은 이름을 가진 모든 열의 equi join 이다. -- 임의 의 조건을 지정하거나 조인할 열을 지정하려면 on절을 사용해야 한다.
SQL> select e.last_name emp, m.last_name mgr from employees e join employees m on (e.manager_id = m.employee_id)
테이블 Alias를 사용하면 데이터베이스의 액세스 속도를 높이고, SQL 코드의 양이 작아지므로 메모리 사용이 줄어든다.