2007년 8월 9일 목요일

양신규 교수님의 글

정치에 대해서 그다지 관심도 없고, 존경도 없는 사람 중에 한 사람이지만,

간혹 이런 생각하게 하는 글이 있어서 읽어보고는 합니다.

물론 양신규 교수님의 생각에 전적으로 동감하는 바는 아니지만, 읽어볼만 하네요.

이 글의 원문은 여기에서 보실 수 있습니다.



* * *


번호 279 날짜 1998년 11월 91일 55시 44분
이름 양신규(skyang) 조회수 3
제목 우파혁명가 떨어지다: The Fall of Newt Gingrich


나의 1994 년 글 깅그리치 vs. 클린튼 을 기억하는 사람은 내가 클린튼만이 아니라 뉴트 깅그리치에도 깊은 존경심과 애정이 있다는 것을 눈치 채고 있을 것이다.(이걸 또 미국 편향이라고 왜곡하는 조선일보나 문XX 같은 중상모략군이 있을까봐 미리 말하면; 난 그들보다 김대중, 김영삼, 김종필 씨를 더 존경하니깐 씰데없는 걸로 뒤에서 씹고 다니지 말기 바란다. 이씨 조선은 원균같은 중상모략군들 땜에 망했고, 남한이 망하면 조선일보, 문XX, 이XX, 박XX 같은 좀생이 중상모략군 들 땜에 망할 것이다. 고런 모략군들을 제어하는 방부제로 옮겨놓은 글이 저 아래 딴지일보의 글이다.)

내가 깅그리치나 빌 클린튼을 존경하는 이유는 세 가지, 하나는 자신의 철학적 정치적 노선에 대해 진지하고 정직하다는 점이고, 다른 한가지는 그 노선을 유지하면서도 실제적 정치 프로세스에서 승리할 수 있는 현실적 능력이다. 그리고 마지막으로는 깡촌의 노동계급출신의 홀어머니 밑에서 자란 주제에 어렸을 때부터 가슴에 가공할 만한 야망을 품고, 어느 경우에도 그 야망을 버리지 않고 결국 성취해낸 뛰어난 능력과 그 굳건한 의지 때문이다. 아마 우리나라 삼김씨를 비롯해서 세계적으로 위대한 정치 지도자들에게서 공통적으로 발견되는 강점일 것이다.

신자유주의 정치운동의 영웅 뉴트 깅그리치가 주적으로 삼은 대상은 역사적 사명을 다하고 사라져가는 관료주의 국가체제다.

20세기 전반에 대공황과 두 차례 세계대전을 거치면서 소유-경영 일체의 자본가 계급은(아담스미스와 마르크스의 분석대상인 자본가 계급으로 우리나라의 재벌 가족에 해당함) 정치경제 영역에서의 권력을 상실한다. 생산대중과 연합해 이들을 몰아내고 새롭게 정치경제의 권력을 장악한 세력이 바로 관료적 파워엘리뜨 계층이다. 소련의 볼세비키 체제, 중국 일당독재체제, 미국의 뉴딜체제, 일본의 관료주의 체제, 유럽의 코포러티즘 (사민주의 체제)의 일관된 공통점은 바로 이 관료적 지배질서이다.

이 쇠창살 (iron cage) 관료 체제의 등장을 제대로 예언한 사람이 이십세기 초의 막스 베버이고; 19세기자본가계급위주의 자유방임경제체제에서 20세기 관료적 지배로의 전이과정을 알아챈 사람이 금세기 중반의 폴라니 이며; 부패해 가는 이 체제의 문제점을 알아챈 사람이 역시 금세기 중반의 C. 라이트 밀즈이다.

이 관료주의 국가체제는 1930년대의 대공황과 두차례의 세계대전을 거치면서 이전의 모든 전근대적 근대적 국가체제를 완벽하게 대치한다. 이 새로운 현대 관료주의적 국가체제는 이전의 영국식 자유방임적 국가체제; 프랑스식 보나빠띠즘식 국가체제; 독일, 일본, 이탈리아의 파시즘적 국가 체제를 차례로 무너뜨리고 세계를 전일적으로 재편하는 것이다. (연관된 얘기로 독일, 일본, 남한의 파시즘과 재벌과의 관계에 대한 간단한 노트가 다음에 올라온다. )

아무튼, 경제적으로는 테일러-포디즘에 기반하고 정치적으로는 관료주의에 기반한 관료국가체제는 파시즘이라는 참혹한 종말적 범죄로부터 지구를 구하는 위업을 달성하지만, 인류의 공적인 파시즘을 무너뜨리자 마자 곧 부패의 길로 들어선다. 소위 자본주의 진영과 사회주의 진영이라고 억지로 가공의 적을 만들어내어 전국민을 공포 속으로, 세계를 핵전쟁의 위협에 몰아넣는다. 서방에서는 매카시적 반공주의의 광풍이 소련과 중국 등의 블록에서는 반자유주의적 광풍이 불어 양측모두 반인류적인 제국주의적 범죄와 타락의 길로 들어서는 것이다. 서방은 국가 개입의 케인즈주의로, 동구권에서는 스탈린의 일국 사회주의론으로 이론적 무기를 삼고 세계 민중을 죽음의 공포 바로 앞으로 몰아세운다.

한국 전쟁과 월남전은 바로 이렇게 타락해가는 냉전하의 관료 국가체제의 모순을 적나라하게 노정한 사건이다. 그 이후 계속되는 박정희 지원, 전두환 지원 등을 통해 미국의 관료국가의 반동성은 한반도에서도 지속적으로 노정된다. 언젠가 모든 먼지가 걷히면 한국전쟁과 광주학살에 대한 배상을 미국 정부로 부터 반드시 받아내야 한다. 반인류적 범죄에 대한 책임과 배상은 천년이 지난 다음에도 반드시 이루어져야 한다.

그렇기 때문에 1960년대 후반과 1970년대 초반 케네디-존슨-닉슨 행정부와 군산복합체를 상대로한 미국 학생들의 월남전 반전운동은 바로 지구 구하기 독수리 오형제적인 영웅적인 투쟁이었다. 이 반전운동과 궤를 같이한 유럽의 학생운동 역시 그 빛나는 성과를 물려 받아야 마땅하다. 물론 1980년대 한반도에서의 미 제국주의에 대한 투쟁 또한, 제국주의적 관료국가에 대한 반미운동으로 영웅적 투쟁으로 정당하게 역사적 업적을 인정받아야 한다. (북한은 그냥 넘어가자. 잘못말했다가 조선일보나 문XX에게 꼬뚜리 잡힐 테니...)

이 지구를 구하는 대투쟁의 선봉에 섰던 세대 (미국의 빌 클린튼, 앨 고어, 영국의 토니 블레어, 프랑스의 조스팽, 독일의 슈뢰더, 애고 이탈리아는 그 누구냐. . .) 가 40-50 대가 되어서 세계 정치의 전면에 나서고 있는 것은 결코 우연이 아니고 전지구적인 민주화투쟁 세대의 정당한 권력 쟁취과정으로 읽어줘야 한다.

부패한 관료국가체제의 종말기에 대담하게 끼어들어 영광을 나꿔채려던 세력이 바로 신자유주의 정치 동맹이다. 정치적으로는 소위 경제적 보수주의와 사회적 도덕주의의 결합이고, 계급적으로는 관료들과 전문경영자들에게 권력을 상실한 대자본가, 중소자본가 계급과 새로운 지식노동자 상층의 연합체인 이 신자유주의는 바로 케인즈와 스탈린 체제를 동시에 전면적으로 부정하며 1980 년부터 세계를 풍미한다.

이 신자유주의 정치운동의 영웅들이 바로 마아가렛 대처, 헬무트 콜, 뉴트 깅그리치이다. 그들의 이론적 지주는 물론 1960년대 이후 줄기찬 이론적 투쟁을 해온 밀튼 프리드만, 게리 베커, 밥 루카스 등의 노벨상급의 시카고학파 경제학자들이다. 신자유주의 정치운동은 18세기 부르조아 자유주의 정치운동과 같은 것이다. 노동계급이 서방에서건 동방에서건 관료국가체제의 포로가 되어 냉전논리로 내몰리고 있을 때, 이들 대자본가, 중소자본가, 상층지식노동자들은 반케인지안적 반스탈린적 자세를 선명하게 견지하고 전지구적인 해방운동에 나서는 것이다.

마치 18세기 부르조아들이 생산대중과 연대하여 생산력과 인간의 자유를 중세적 속박에서 해방시키는 선도에 나서듯이, 신자유주의동맹의 자본가와 상층지식노동자 연합은 관료주의적 거미줄에 걸려 헤메는 손노동계층과는 달리 이 거미줄에서 비교적 자유로운 새롭게 광범하게 성장하는 지식노동자를 동원 신자유주의적 혁명을 이루어 낸다.

신자유주의적 정치 강령을 가장 선명하게 엮어낸 이가 바로 뉴트 깅그리치이다. 그의1994 년 소위 공화당 혁명의 '미국과의 계약'(Contract of America)이야말로 신자유주의적 정치운동의 압권이고, 그는 40 년 만에 상하 양원을 공화당이 장악하는 대사건의 주역이 된다.

노동계급과 좌파세력이 스탈린주의와 케인지안적 냉전적 사고에서 헤메는 동안 대신 진보적 입장에 서왔던 신자유주의가 이제 그 역사적 사명을 다하고 다시 진보세력에게게 세계적 패권을 서서히 넘겨주고 있다. 독일의 지난달 총선에서의 사회당 집권과 이번달 미국 총선후 뉴트 깅그리치의 사임은 이 전지구적 권력이동을 상징하는 멋진 사건이다.

나의 영웅 우파 혁명가 뉴트 깅그리치여, 편히 쉬기를. 그대는 위대한 인생을 살았다. 그대는 자본가를 동원 혁명을 성공시켰으나, 생산대중이 요구하는 진짜 진보의 방향을 읽지 못해서 클린튼-고어 에게 질 수 밖에 없었다.

한국은 어디 뉴트 깅그리치같은 우파 혁명가 없나? 재벌-관료 연합의 체제를 쓸어버릴 대담한 혁명가 말이다.

Turney의 논문을 통해 본 Opinion mining

Measuring Praise and Criticism : Inference of Semantic Orientation from Association


The evaluative character of a word is called its semantic orientation.

semantic orientation이라는 말은 text를 이용한 감정인식인 emotion detection of text, text mining, opinion mining 등에서 자주 볼 수 있는 단어이다. 지금 살펴 볼 논문은 이러한 이와 같은 분야에서 다루는 Gloss, valence, evaluative character 등에 대한 개념을 이해하고 opinion mining에 있어서 중요한 착수점이 되는 연구에 대한 것이다.

1. Introduction
subjective meaning에 대한 초창기 연구에서, Osgood 등은 사람들에게 어떤 단어에 대해 점수를 매기게 했다. 각각의 단어는 달콤한/신, 남루한/세련된, 신성한/불경스런 과 같은 대립되는 두 단어 사이에서 7단계로 나눠진 등급 중에 하나로 점수가 매겨진다. 많은 실험 data를 이용해 Osgood 등은 사람들이 점수를 매기는 두 형용사 쌍들에서 3가지 중요한 factor를 발견하였다.

사람들은 대부분 몇개의 형용사 싸에 점수를 매겼다.
첫번째 가장 주된 쌍은, good/bad beautiful/ugly kind/cruel honest/dishonest 였다. Osgood 등은 이 쌍들을 evaluative factor라고 불렀다.
두번째 쌍들은 potency factor라고 불렸는데, strong/week large/small heavy/light 였다.
세번째 쌍들은 activity라고 불렸으며, active/passive fast/slow hot/cold 였다.

evaluative factor는 이후 sematic orientation이라고 불리기도 하고, valence라고 불리기도 하며 언어학에 관련되어 중요한 factor로 쓰이게 되었다. semantic orientation은 positive, negative한 특성으로 분류할 수 있으며 또한 strong,mile와 같은 특성으로도 분류할 수 있다.

사실 각 단어들에 대해서 sematic orientation을 결정하는 것은 개개인의 주관적 관점에 의해서 다를 수 있다고 생각되지만, 여러 연구 결과에서 sematic orientation이 상당한 일치를 보이는 상황을 볼 수 있으며 이를 통해 어떤 단어들에 대해선 지배적인 sematic orientation이 존재함을 알 수 있다.

2. Application
semantic orientation을 이용한 Application은 여러 분야에 걸쳐 나타날 수 있다.
예를 들면,
1)자동적으로 동의어와 반대말을 찾는 시스템(Hatzivassiloglou and McKeown(1997)),
2)영화 감상평에 대해서 긍정적 반응, 부정적 반응을 구분하는 시스템(Turney 2002)),
3)검색에 반영할 수도 있고(예를 들면 파리 여행 : positive인 경우 목적에 더 부합하는 질의 결과를 얻을 수도 있을 것이다.(Hearst 1992)),
4)리뷰 요약으로 긍정 리뷰로 판명된 경우 가장 긍정적 문장을 보여줄 수도 있을 것이며,
5)악플에 대한 filtering 기능을 제공 할 수도 있을 뿐만 아니라(Spertus 1997),
6)Timelines에서 sentiment를 펼쳐 볼 수도 있다.(Tong 2001)) 이것은 advertiser, p0litician들이 여론을 파악하거나 광고 효과를 파악하는데 도움을 줄 수 있다.
7)게임이나 chatbot같은 application에도 보다 더 현실적인 느낌을 주는데 이용될 수도 있다.
8)마지막으로 survey resplonse들에 대한 분석에도 이용될 수 있다.

3.Semantic orientation from association
논문에서는 semantic association으로 부터 semantic orientation을 추론하고자 한다.
한 단어의 semantic orientation은 positive한 단어들 집합과의 연관 정도에서 negative한 단어들 집합과의 연관 정도를 뺀것으로 계산된다.


여기서 pword, nword는 문맥에 관계하지 않고 일반적으로 positive한, 또는 negative한 의미를 지니는 단어들을 선별할 필요가 있다.

여기서 사용된 positive한 단어들 집합은
good, nice, excellent, positive, fortunate, correct, superior이다.
그리고 negative한 단어들 집합은
bad, nasty, poor, negative, unfortunate, wrong, inferior이다.

그렇다면 이 연관정도를 나타내는 A(Word1, Word2)는 어떻게 계산하는 걸까? 이 계산 방법엔 여러가지 알고리즘들이 있다. 본 논문에서는 2가지 알고리즘을 소개하고 있다.

1)Sematic orientation from PMI
Turney2001은 Pointwise Mutual Information이라는 방법을 이용해 연관 정도를 측정하였는데, 이 방법의 성능은 TOEFL에서 동의어 80개를 찾아내는 문제에서 74% 정확도를 보였다.

sematic orientation, 즉 그 단어가 가지고 있는 근원적 의미(여기서는 positive한 단어들과 netgative한 단어들과의 상관 관계이지만...)를 어떻게 찾을 수 있을까? 직관적으로 sematic orientation을 정의할 수 있는 또 다른 언어들(good, nice등등)이 있을 것이며, 아마도 이러한 단어들은 전혀 관계없는 단어들보다 더 자주 같이 쓰일 것이라고 생각할 수 있다. PMI는 이러한 직관에 의거하여 연관 정도를 계산한다.

P(word1&word2)는 word1, word2가 동시에 발생할 확률이다. 이것을 측정하기 위해 Turney는 Altavista 검색 엔진을 이요했다. 알타비스타는 350만개의 웹 페이지를 가지고 있다.(영어로 씌여진...) 각 페이지 마다 300개 정도의 단어가 있다고 가정할 때 적어도 척억개 이상의 단어가 있다고 할 수 있다. 알타 비스타를 쓴 이유는 이 당시 이 검색 엔진에서 NEAR 연산자를 쓸 수 있었는데, NEAR 연산자는 가까운 거리에 2 단어가 쓰여진 웹 페이지를 검색한다. 상대적으로 먼 거리에서 같이 씌여진 2단어는 연관성이 없을 수 있음을 감안한 것이라고 볼 수 있다.

Hit수를 이용해 p(word1, word2)를 계산하면 다음과 같은 식을 생각할 수 있다.
N은 웹 검색 엔진이 indexing한 전체 document숫자이고 hit함수는 해당 질의어로 검색된 web page 수이다. 이를 이용해 SO-PMI(word)를 계산해보면
과 같이 유도 될 수 있다.
14개의 postive, negative word를 이용한 질의를 통해 SO-PMI가 계산되며 hits(nword), hits(pword)는 상수값이다. 다른 연관정도 계산 방법으로 Maniing과 Schutze(1999)방법이 있을 수 있고, Dunning(1993)이 제안한 likelihood ratio사용 방법이 있을 수 있다.(Z-score) 그러나 이 두 방법의 성능은 PMI보다 좋지 않은 것으로 알려져 있다.
0으로 나누지 않기 위해 여기서는 hits함수 결과에 0.01을 더하는 방법을 취했고 이는 laplace smoothing효과를 가져온다고 한다.
2)Sematic orientation from LSA
SO-LSA방법은 연관 정도를 계산하기 위해서 Latent Semantic Analysis(LSA)를 이용한다. LSA는 corpus내의 단어들 사이의 통계적 관계를 분석하기 위해 Singular Value Decomposition을 이요한다.(아직은 무슨 말인지 알 수 없을 것이다.)
먼저, Matirx X를 만들기 위해서 text를 이용하는데 X의 row vector는 단어들을 나타내고 column vector는 단어 묶음(즉, sentences, paragraphs, documents)를 나타낸다. 각각의 cell은 한 chunk of text에 대한 한 단어의 가중치(weight)이다. 이 weight는 전형적으로 if-idf score로 계산된다.
그 다음으로, singular value decomposition을 Matrix X에 적용시킨다.

LSA는 PCA(Principal components analysis)와 유사하다. LSA는 original Matrix X대신에 축소형태로 smoothed matrix를 사용해(SVD를 이용) 단어들의 유사도를 측정한다.이 유사도는 LSA(Word1, Word2)로 표현되고 SVD가 적용된 Matrix의 row vector들 사이의 cosine of the angle을 취해 측정된다. 즉!!! 앞서 단어들 사이의 연관 정도가 단어들 사이의 유사도라는 개념으로 측정되는 것이다. 직관적으로 방법은 다르지만 일견 비슷해 보이는 면이 있어 보이지 않는가?
LSA방법은 유사도를 consine of angle로 측정하기 때문에 값이 작을수록 더욱 유사한 값이 나오게 된다.
따라서, PMI와는 반대로, PMI값이 양일때 단어가 positive했던것과는 달리 LSA에서는 negarive하다고 볼 수 있다.
값이 음으로 나올때는 그 반대의 경우이다.
4.Related work
관련 연구는 크게 3가지 그룹으로 나눌수 있다.
단어를 positive, negative semantic orientation으로 분류하는 연구
리뷰들을 positive, negative로 분류하는 연구
text내에서 주관성을 인식하는 연구들이 그것이다.
1)Classifying Words
Hatzivassiloglou and McKeown(1997)은 앞에서 연관 정도, 유사성에 대해서 살펴본 것처럼 semantic orientation을 결정하는 문제가 곧 단어를 분류하는 문제라고 생각했다. 그들은 4 단계의 supervised learning algorithm을 세웠는데 HM이라고 불리는 알고리즘이다.
-1 : adjectives의 모든 conjunctions들이 주어진 corpus에서 추출된다.
-2 : supervised learning algorithm이 단어들을 같은 semantic orientation을 갖는 것 끼리 묶고, 다른 semantic orientationd을 갖는 것들을 분류하는 방법으로서 label 쌍으로 된 adjectives들과 연관시킨다. 결과적으로 adjectives이 노드가 되고 link들은 같거나 다른 semantic orientation을 가리키는 graph가 된다.
-3 : clustering algorithm을 통해 같은 semantic orientation을 갖는 것들끼리 묶어서 크게 2가지 묶음(same, different)으로 묶는다.
-4 : positive adjectives가 보다 더 빈번하게 나타나기 때문에 higher average frequency를 갖는 cluster를 positive semantic orientation을 갖는 그룹이라고 한다.

evaluation결과 training set이 늘어날 수록 HM의 accuracy는 향상 되었다. 이 결과를 볼때 큰 corpora에서 HM의 성능은 더욱 만족할 만할 것이라고 예측했다. 하지만, HM은 and나 or를 이용한 단어를 분류를 하기 때문에 동사나 명사에 대해서는 성능이 좋지 않을 것이다. 예를 들면 "나는 달리기가 빠르지만 걸음은 느리다."를 영어로 풀어볼때, but으로 묶이는 단어가 fast, slow이므로 adjective에는 만족할 만하지만 "사랑과 죽음", "로마제국의 성장과 몰락"같은 경우 전혀 이상한 점이 없지만 and로 묶인 두 단어들이 positive, negative한 반대 양상을 띈다. 이 경우에 효과적으로 대처하지 못하는 맹점이 있다.
2)Classifying Reviews
Turney(2002)는 리뷰를 분류하기 위해 3단계 알고리즘을 세웠다.
-1 : 한 단어는 형용사나 부사로 이루어진 두 단어구를 찾는다.(ex romantic ambience, horrific events)
-2 : 찾아진 구들에 대해서 각각 semantic orientation을 SO-PMI를 이용해 계산한다.
-3 : 계산된 값들의 평균을 취해 분류한다.

연구 결과가 한 단어나 구들에 SO-PMI를 적용했을때 어떤 작용이 일어나 효과를 일으키는지 원리를 밝혀주지는 못하지만, 성능 면에서는 유용하다고 할 수 있다.
한 단어만을 고려한다고 볼때는 각 단어에 대해서 manual하게 semantic orientation을 주석을 다는 것도 효과적인 방법일 수 있겠지만, 두 단어 이상을 함께 고려한 semantic orientation을 application에 응용하게 될 때는 그 노력의 크기가 비교할 수 없을 정도로 커지게 된다. 그러한 의미에서 Tuney의 So-A 방법은 automatic한 측면에서 의미가 있다. 또한 두 단어 이상의 semantic orientation의 필요성은 각 domain에 따라 같은 단어의 semantic orientation이 다를 수 있음을 생각해 보면 알 수 있다. 예를 들면, unpredictable이란 단어는 자동차에 대한 리뷰에서는 negative한 semantic orientation을 갖는다. "unpredictable steering"과 같은 경우를 생각해 보자. 한편, 영화 리뷰에서는 "unpredictable plot"처럼 unpredictable이 positvie한 semantic orientation을 갖는다고 볼 수 있다.
Pang 일행(2002)은 movie review를 positive, negative한 종류로 구분하는 방법에 있어서 고전적인 text classification 방법들을 적용했다. Pang일행은 세개의 supervised learning algorithm과 8개의 feature set들을 비교하였다. 총 24번의 조합 중에서 가장 좋은 결과를 낸 것은 feature집합이 한 단어들로 이뤄져 있고, 각 단어가 있고 없고에 상관하여(출현횟수와는 상관없이) SVM(Support vector machine)을 적용했을때였다. Pang의 알고리즘이 Tuney에 비해 더 정확할 것이라고 기대하는 이유는 Pang의 알고리즘이 supervised learning algorithm이기 때문이다. 한편, 각각의 domain에 따라 retraining이 필요할 것이라고 예상되는데 그 이유는 앞에서 본 자동차 리뷰와 영화 리뷰를 생각해 보면 알 수 있을 것이다.

3)Subjectivity Analysis
subjectivity analysis는 글자 그대로 주관이 들어간 글과, 사실을 전하는 글을 구별하는 일을 의미한다.[wiebe 2000; wiebe et al.2001] wiebe등은(2001) 자동적으로 주관이 들어간 글을 구별하는 작업은 매우 다양한 응용 분야에 쓰일 수 있다고 언급했다. flames를 인식하는 것(Spertus, 1997), email을 분류하는 것, radio 방송에서 speaker 역할을 분류하는 것, review들을 분류하는 것 등등이 그 예이다.
물론 위에서 언급한 application들이 sematic orientation과 직접적으로 관련이 있을 수 있다고 할 수도 있지만, 일반적으로 2 단계 방법을 취한다. 먼저 subjectivity를 확인하고 그 다음 positive, negative한 것들로 구분하는 것이다.
논문에는 Experiments결과도 상세히 적혀 있고, opinion mining이나 text mining 을 연구하고자 하는 사람들은 주의 깊게 살펴볼 내용도 있다. 하지만, 일단은 개략적으로 opinion mining이 뭔지, semantic orientation이 뭔지, 기본 개념에 충실하기 위해 이 정도 까지 살펴보도록 하자. 뭔가 신기한 개념들이 보이지 않는가? 적어도 재미있는 application으로의 활용 가능성은 볼 수 있지 않을까?

2007년 8월 7일 화요일

IR Chapter2 Modeling - 3 전형적 모델 외 다른 집합 모델

1. 퍼지 집합 모델

"한 동안 내 마음은 멈춰 있을 것이다."
이 문장을 키워드로 나열한다면, 이 문장이 갖는 원래의 의미가 표현이 될 수 있을까?

문헌과 질의를 키워드 집합으로 표현하는 것은 해당 문헌과 질의가 실제 의미하는 내용의 부분적인 표현이 되며 결과적으로, 문헌과 질의 용어의 정합은 근접 또는 모호한 정합이 된다. 이는 질의 용어를 퍼지 집합으로 정의하고 각 문헌을 이 집합의 소속 정도(degree of membership)로 모델링할 수 있다.

퍼지 집합 이론은 경계가 불분명한 클래스 표현을 다루며, 주요 개념은 클래스 원소와 연관된 소속 함수가 된다. 이 함수는 [0, 1] 구간의 값을 가지는데, 0은 클래스에 소속되지 않은 것을 말하고 1은 완전 소속을 나타낸다. 따라서 퍼지 집합의 소속 함수는 전형적인 불 논리의 이진값이 아닌 점증적인 값을 가진다.

정의
전체 집합 U에서, A와 B를 두 개의 퍼지 부분 집합이라고 하고 A^를 전체 집합 U에서 A의 여집합이라고 하자. 또 u를 U의 원소라 하면
Standard complement
cA(x) = 1 − A(x) : 여집합.
Standard intersection
(A ∩ B)(x) = min [A(x), B(x)]
Standard union
(A ∪ B)(x) = max [A(x), B(x)] (wiki 참조)

퍼지 정보 검색은 시소러스를 이용하게 된다.
시소러스는 용어간 관계를 정의한 것으로 용어간 연관 행렬(C벡터 : 키워드 연결 행결, Keyword connection matrix)을 정의함으로써 구성할 수 있는데, 이의 행과 열은 문헌 컬렉션의 색인어로 구성된다. 퍼지 집합 모델의 기본 개념은 질의 안의 색인어 집합을 시소러스에서 얻은 연관 용어로 확장하는 것이며, 결과적으로 사용자 질의만 사용한 것보다 더 많은 연관 문헌을 검색하게 된다.

두 용어 Ki와 Kj간의 정규 연관 요소 Ci,j는 다음과 같이 정의 할 수 있다.
Ci,j = Ni,j / (Ni + Nj - Ni,j)

이 연관 행렬 식은 매우 일반적인 것으로 널리 사용된다.
위 식을 조금 살펴보면 Ni,j는 Ki와 Kj가 동시에 실린 문헌의 개수이다. Ni는 Ki가 실린 문헌의 개수이고 Nj역시 마찬가지다. 이것은 Ki 혹은 Kj가 실린 문헌에서 Ki 그리고 Kj가 동시에 실린 문헌의 비율을 연관 요소 값이라고 보는 것으로 항상 동시에 실리는 경우 1로서 최대 값을 갖는다.

이러한 fuzzy 집합을 이용하면, Ci,j 정규 연관 요소에 의해 질의가 확장이 될 수 있고, 이런 확장된 질의 집합에 의해서 더 좋은 검색결과를 가져올 수 있다.

fuzzy 집합 모델과 관련한 내부 수식은 조금 더 구체적인 부분이 있지만, 그 내용이 단순하고 개념적인 것은 이미 다 언급되어 있어서 생략한다. fuzzy 집합 모델은 대중적이지 못하고 퍼지 이론에 관련된 문헌에만 논의되고 있다.

2. 확장 불리안 모델
불리안 모델은 단순하고 강력하지만, 용어 가중치를 제공하지 않기 떄문에 결과 집합의 순위화가 불가능하고, 결과 집합이 너무 크거나 작다. 이런 특성은 불리안 모델에 기반한 검색 시스템의 성능에 악영향을 미치게 된다.
그래서 불리안 모델을 확장하여 부분 정합이나 용어 가중치를 줄 수 있는 방법이 새로 모색되었고, 불리안 질의에 벡터 모델의 특성을 가미한 확장 불리안 모델이 개발되었다.

확장 불리안 모델은 기존 불리안 모델에 if-idf요소로써 용어 문헌쌍에 연관된 가중치를 적용하였다. 예를 들어 2개의 term(용어)만 적용한 좌표를 생각해보자.

2007년 8월 6일 월요일

블로그 쓰레드를 분석해서 중요한 블로거, 선동자를 찾는 방법

NICT와 협력 관계를 맺고 있는 우리 랩은 몇가지 공동 연구를 진행하고 있다.
(자세한 사항은 관리자가 아니라서 모르겠지만...)

블로그나 웹 마이닝, social network등에 관심이 있어 서베이를 하던 중 NICT에서 나의 연구 목표와 비슷한 주제로 수행했던 프로젝트 논문을 발표했다.

블로그엔 트랙백이라는 것이 존재하며, comment 기능도 있어서 conversational tool로서 볼 수도, 활용할 수도 있지만 블로그 사용자인 당신(?)은 hot topic 즉 뜨거운 감자인 논쟁 거리에 대해서 갑론 을박 서로 토론하는 내용의 글들을 트랙백을 따라서 보기는 뭔가 많이 부족하다고 느낀적이 없는가?

현재 우리 블로그는 이러한 conversational 측면에서 논리의 흐름을 보여주는 측면은 상당히 빈약하다. 대부분 그런 점을 느끼겠지만... 사실 게시판(bulletin board)의 순서대로 작성된 글들에 비해 선 이런 측면에서 뭔가 모자란 느낌을 받을 수 있다. 그것은 우리 블로그가 하이퍼 링크된 블로그들의 snapshot같은 역할을 하도록 보여지고 있기 때문이다.

이 논문은 그러한 내용들을 개선하고자 하는 노력으로 시도되었다.
그리고 hot conversation들을 찾기 위해 이러한 conversation에서 중요한 위치를 차지하는 블로거들을 찾는 방법을 제안하였다. 블로그를 돌아다니다 보면, 블로거들이 적은 이 전의 글들을 통해 그들의 관심사를 알게 되고 답글, 인용 수 등을 보면 그가 얼마나 좋은 글을 썼는 지 짐작할 수 있다. 이러한 정보가 절대적으로 블로거의 위상에 힌트가 되지는 않지만, 중요한 정보를 준다는 사실엔 틀림없다. 이러한 독자가 블로그를 돌아다니며, 블로거들에 대해 판단하는 과정들을 컴퓨터가 할 수 있도록 자동화해서 hot conversation을 찾겠다는 이들의 시도는 3가지 가설에 의거한다.

첫째, 선동자로서의 블로거는 다른 사용자들로 부터 in-link가 많을 것이다.
즉, 좋은 블로그 글을 남기기 때문에 trackback이라던지 reply-link가 많을 것이라는 예상이다.
둘째, 선동자로서의 블로거가 글을 남긴 뒤에는 topic에 있어서 변화가 있을 것이다.
즉, 선동자가 글을 남기기 전의 쓰레드에서의 글들은 통일성없이 다양한 형태의 논지로 글을 쓰지만, 선동자가 글을 남긴 뒤에는 그 뒤 블로거 글들은 선동자의 글의 논지를 따르게 될 것이라는 예상이다.
셋째, 선동자가 글을 남긴 뒤에는 일정 시간동안 쓰레드에 글이 더욱 많아질 것이다.
즉, 선동자가 쓰레드에 활력을 일으키는 역할을 할 것이라는 예상이다.

어찌 보면 당연한 얘기지만, 이러한 논문을 볼때 항상 경이로운 생각이 드는 것은 당연할 것 같은 이치에 대한 논리 정연한 논거와 그를 뒷받침하는 과학적 분석, 과학적 실험 설계에 대한 놀라움이다.

2007년 8월 2일 목요일

IR Chapter2 Modeling - 2 전형적인 정보검색 모델

전형적인 정보 검색 모델에서 문헌은 색인어라고 불리는 키워드 집합으로 표현되며,
이 색인어는 의미적으로 해당 문헌의 주제를 기억하는데 도움을 주는 단어이다.

문헌 내용을 요약하기 위해 용어의 중요도를 결정하는 일은 그리 단순한 문제가 아니지만,
이 어려움에도 불구하고 용어의 중요도를 평가하는데 유용하거나 쉽게 측정할 수 있는 색인어의 특성이 존재한다. 예를 들어 수십만 개의 문헌 집합을 고려해 보자. 모든 문헌에 출현한 단어는 색인어로서 완전히 무용한데, 이는 어떤 문헌이 사용자가 관심있는 것인지에 대해 아무런 도움을 못 주기 때문이다. 반면, 단지 몇 개의 문헌에만 출현한 단어는 사용자가 관심있어 할 문헌 공간을 상당히 줄여주기 때문에 매우 유용하다.(이러한 개념에서 tf, itf가 도출될 수 있다.)

따라서 문헌 내용을 설명하는데 같이 사용된 단어들이라 하더라도 다양한 비중을 가지고 있으며, 문헌의 색인어 각각에 가중치를 부여하는 효과를 가져온다.

색인어 ki와 문헌 dj가 주어졌을때, Wi,j >= 0 를 (ki, dj)쌍의 가중치라고 하면,
이 가중치는 문헌의 의미적 내용을 설명하지 위한 색인어의 중요도를 정량화한다.

색인어 가중치는 상호 독립적이라고 가정하지만, 실제 문헌 내에서의 색인어 출현은 서로 무관하지 않기 때문에 이는 너무 단순화한 것이 된다. 예를 들면 컴퓨터 네트워크 분야의 한 문헌을 색인하기 위새 '컴퓨터'와 '네트워크'가 사용되었다고 할 때, 한 문헌에서 이 두 단어가 서로 독립적으로 나타나지 않으며 두 단어가 상호 연관되어 있고 색인어 가중치도 영향을 받는다.
그럼에도 불구하고 이런 색인어 가중치의 상호 독립적 가정은 모델을 매우 단순화하여 색인어 가중치 계산이나 빠른 순위 계산이 가능하게 한다. 더욱이 색인어 연관성을 고려한 연구가 좋은 결과를 낸 적이 없기 때문에 다른 언급이 없는 한 색인어는 상호 독립적이라고 가정한다.
최근엔 용어 연관성에 근거하여 특정 문헌 집합에서 좋은 결과를 낸 최신의 검색 기술이 있으며, 이런 추세가 점점 확대되어 가는 듯하다.
다음에서 볼 전형적인 정보 검색 모델에서 중요한 개념은 이 세가지다.
문헌, 색인어, 질의


!!! 꼭 기억하자. 문헌은 색인어 집합이며, 색인어는 질의와 문헌을 연결해주는 매개체이다.

다음으로 전형적인 정보 검색 모델 3가지에 대해 알아보자.

1. 불리안 모델

불리안 모델은 집합론과 불리안 대수에 기반한 단순 모델로서, 이때 질의는 명확한 의미를 가진 불리안 표현으로 정의된다.
간결함과 단순한 불리안 모델에는 몇개의 중대한 단점이 있다.
첫째, 검색 전략이 이진 값에 근거하여 순위 구분없이 연관/비연관 중의 하나로 결정된다는 점이며 이는 좋은 검색 성능을 방해한다. 따라서 불리안 모델은 실제로 정보 검색 모델ㅇ이라기 보다는 데이터 검색 모델에 더 가깝다.
둘째, 불리안 표현이 명확한 의미를 지니기는 하지만, 사용자 요구를 불리안 표현으로 변환하는 것은 그리 간단하지가 않다.
불리안 모델의 주요 장점은 모델의 명확한 형식과 단순성이며, 단점은 정확한 정합 때문에 검색 문헌이 너무 작거나 많다는 점이다. 오늘날, 색인어 가중치가 실질적인 검색 성능 향상을 가져온다고 알려져서 이 색인어 가중치를 고려한 벡터 모델이 선호되고 있다.

2.벡터모델
벡터 모델은 이진 가중치 사용이 너무 제한적이어서(불리안 모델은 질의가 '나무 여행'이었다면, 본문에 '나무'만 있거나 '여행'만 있는 부분 정합의 경우는 제외된다.), 부분 정합이 가능한 틀을 제공한 것으로 인식할 수 있으며, 이는 질의나 문헌의 색인어에 비이진 가중치를 할당함으로써 가능하다.
정의
벡터 모델에서 용어, 문헌 쌍(Ki, Dj)의 가중치 Wi,j는 양의 비이진 값이며, 질의 색인어도 가중치를 가진다. [Ki, q]의 가중치를 Wi,q >= 0이라 하면, 질의 벡터 q벡터는
q벡터 = (W1,q , W2,q , ... , Wt,q)로 정의되며, 여기서 t는 시스템 내의 전체 색인어 수이다.
문헌 Dj벡터는 Dj벡터 = (W1,j , W2,j, ... , Wt,j)로 표현된다.



따라서 색인어가 2개인 경우 다음처럼 2차원 벡터로
질의와 문서가 표현될 수 있다. 보다 일반적으로 t차원 백터로 표시된다고 생각하자.
벡터 모델에서 문헌 Dj와 질의 q의 유사도 측정은 두 벡터 Dj벡터와 q벡터의 상관도로 구할 수 있으며, 이 상관도의 예로 두 벡터간 사이각의 코사인 값으로 정량화할 수 있다.

벡터모델의 결과로는 코사인 값으로 0과 1 사이의 값을 매기게 된다. 즉, 벡터 모델은 문헌이 관련있나 없나만을 예측하기 보다는 질의와의 유사도 값에 따라 순위를 매기기 때문에 부분적으로 질의에 정합되는 문헌이라도 검색되며 또, 일정한 유사도 값 이상의 문헌만을 검색하기 위해 임계치를 둘 수 도 있다.
그렇다면, 색인어 가중치는 어떻게 구할까? 언어학자들이 미리 정의 했둔걸까. 아니면 임의로 직접 값을 적절히 설정하는 것일까? 물론 여러 방법이 있을 수 있다. 여기서는 가장 효과적인 용어 가중치 기법의 주요 아이디어에 대해 집중해 보자.
먼저 용어 문헌쌍(문헌 색인어)가중치를 살펴보자.
정보 검색 문제를 클러스터링 중의 하나로 보는 관점은 Salton의 초반 작업에 따르며 후반에 나오는 클러스터링 기법의 기본 원칙과 연관이 있는데, 문헌을 객체의 전체 집합 C로 보고 사용자 질의를 모호한 객체 집합 A로 간주한다. 그러면 정보 검색 문제는 어떤 문헌이 집합 A에 속하는지 아닌지를 결정하는 클러스터링 문제로 간주할 수 있다.
클러스터링 문제에서는 두 가지 주요 과제를 해결해야 한다.
첫째는 집합 A에 속하는 객체를 잘 표현할 수 있는 특성을 결정하는 일이며,
둘째는 전체 컬렉션 C에서 집합 A에 속하는 것과 아닌것을 잘 구분할 수 있는 특성을 찾는 일이다.
첫번째 특성 집합은 클러스터 내 유사도(intra-cluster similarity)를 양자화하는데 사용되는데, 문헌 Dj에 출현한 용어 Ki의 빈도수를 측정함으로써 수치화된다. 이런 용어 빈도수는(term frequency) 통상 tf요소라고 불리며 그 용어가 문헌의 내용을 얼마나 잘 표현하는가의 척도가 된다.
두번째 특성 집합은 클러스터간 비유사도(inter-cluster dissimilarity)를 구하는데 사용되는데, 전체 문헌 컬렉션 중에서 용어 Ki가 출현한 문헌 빈도수의 역수를 계산함으로써 구할 수 있는데, 이는 역문헌 빈도수(inverse document frequency)요소라고 불리며, idf 요소 사용의 동기는 많은 문헌에 출현한 용어가 연관 문헌과 비연관 문헌의 구분에 무용하다는데 있다.
다음으로 질의 용어 가중치(질의 색인어 가중치) 역시 tf/idf로 구해진다.
벡터 모델의 주요 장점은
1. 용어-가중치 할당 기법이 검색 성능을 향상시키고,
2. 부분 정합 전략으로 질의 조건에 근접한 문헌 검색이 가능하며,
3. 코사인 순위화 수식이 문헌을 질의에 유사한 순서대로 정렬한다는 점이다.
반면, 벡터 모델은 색인어의 상호 독립성 가정이라는 이론적인 단점을 가지고 있지만 앞서 얘기한 대로 이 가정이 성능에서 문제를 가져온다고 볼 수는 없다.
다른 많은 모델이 있지만, 일반적으로 벡터 모델이 더 우월하거나 비슷한 것으로 나타났으며, 더욱이 단순하고 빠르기 때문에, 벡터 모델은 현재 가장 대중적인 검색모델이다.

3. 확률 모델
여기서는 간략히 확률 모델의 중요 특성을 부각하기 위해 BIR(binary independence retrieval)이라는 전통 확률 모델을 소개한다.
만약, 사용자 질의가 주어졌을 때 확실히 연관된 문헌들의 집합이 존재하고 이를 이상적인 해답 집합이라 하며, 이 이상적인 해답 집합을 서술할 수만 있다면 그 문헌들을 검색하는데 문제가 없을 것이다. 따라서 질의 과정은 이상적인 해답 집합의 특성을 규정하는 작업으로 볼 수 있는데(정보 검색 문제를 클러스터링 문제로 해석하는 것과 유사), 문제는 이 특성이 정확히 무엇인지를 모르고 이 특성을 규정하는데 사용된 의미를 가진 색인어만 알고 있다는 점이다. 이 특성은 질의 시점에는 알 수 없으므로, 그것이 무엇인지 초기에 추정할 필요가 있으며, 이 초기 추정은 초기 문헌 집합을 검색하는데 사용될 예비 확률 표현을 생성하고, 사용자와의 상호작용을 통해 이상적인 해답 집합의 확률적 표현으로 개선된다. 즉, 반복적으로 해답 집합을 찾아가는 것이다.
이 과정은 다음과 같이 진행된다.
사용자는 검색된 문헌 중에서 어떤 것이 관련이 있고 없는 지를 제시하며(실제로 검색된 최상위 문헌들만이 대상이 된다.), 시스템은 이 정보를 이용해 이상적인 해답 집합 표현으로 수정된다. 이 작업을 반복적으로 수행하면, 그 표현은 점점 실제 이상적인 해답 집합 표현에 가까워질 것이라고 기대할 수 있다.(자꾸 머신러닝이 떠오르는 건 왜일까.)
시작 시에는 이상적인 해답 집합에 대한 추정이 필요하다는 점만 인식하고 있으면 되고, 의식적인 개선 노력이 확률 용어로 표현된다.
정의
확률 모델에서 색인어 가중치 변수는 모두 이진값으로 즉, Wij가 0이나 1인 가중치 값을 갖고 Di,q역시 0이나 1인 가중치 값을 갖으며, 질의 q는 색인어의 부분 집합이다. R(이상적인 해답 집합)을 초기 추정한 연관 문헌 집합이라고 하면, R^은 R의 여집합으로 비연관 문헌 집합이다.
P(R Dj벡터)는 문헌 Dj가 질의 q에 연관될 확률이고,
P(R^ Dj벡터)는 비연관 확률이다.
문헌 Dj와 질의 q의 유사도 sim(Dj, q)는 다음과 같이 정의 된다.
sim(Dj, q) = 문헌 Dj가 질의 q에 연관될 확률 / 비연관 확률
또한 P(Ki R)과 같은 R집합 내에서 색인어 Ki가 포함되어 있을 확률과 같은 것은 알 수 없으므로 단순한 가정을 한다. 예를 들면
P(Ki R) = 0.5
P(Ki R^) = ni/N(ni는 Ki가 출현한 문헌수)
확률 모델의 주요 장점은 이론상으로 문헌들이 연관 확률 값에 따라 내림차순으로 순위화 된다는 점이다.
단점은 문헌들을 연관/비연관으로 초기에 추정 분리할 필요가 있고, 문헌 내 색인어 빈도수가 고려되지 않는 방법이라는 사실과, 색인어에 대해 독립 가정을 적용했다는 점이다. 그러나 색인어 독립 가정은 실제 상황에서 성능에 어떤 영향을 미치는지 알 수 없으므로 문제가 있는지는 확실하지 않다.

4. 전통적 모델의 간략한 비교
일반적으로 부분 정합의 인식 불가로 인해 자주 낮은 성능을 보이는 불리안 모델이 세 전통 모델 중에서 가장 약한 것으로 여겨진다. 확률 모델이 벡터 모델보다 우월하다는 주장과 실험들이 있었지만, 이후 여러 측정을 통하여 일반 컬렉션의 경우 벡터 모델이 확률 모델보다 우월하다는 점이 일반적으로 받아들여지고 있다.

기본적인 SQL문 정리

네이버의 yura000님 께서 훌륭하게 정리하신 글이 있기에 퍼왔습니다.
보는데 편하도록 글 배치와 색상은 약간 수정했습니다
.


제 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 를 종료한다.


1.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_DATEFROM S_EMP ;



2.산술식을 사용한 검색산술 연산자를 사용하여 검색되는 데이타 값을 변경

산술 연산식은 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 EMPLOYEEFROM S_EMP ;



3. 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 COMMISSIONFROM S_EMP ;


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

SELECT DISTINCT column명, column명FROM table명;

[ 예제 ]S_DEPT TABLE 에서 NAME 이 중복되지 않게 검색하시오.
SELECT DISTINCT NAMEFROM 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 exprFROM table명ORDER BY {column명, expr} [ASCDESC] ;

[ 예제 ]S_EMP TABLE 에서 LAST_NAME, DEPT_ID, START_DATE 를 LAST_NAME 순으로 검색하시오.
SELECT LAST_NAME, DEPT_ID, START_DATEFROM S_EMP ORDER BY LAST_NAME ;


5.특정 row의 검색
WHERE 절에서 조건식을 기술하여 조건을 만족하는 ROW 만 검색할 수 있다.
조건식은 COLUMN 명, COMPARISON OPERATOR, VALUE 로 구성되어 있다.
문자 값은 ' ' 으로 묶어주고 값의 대소문자를 구별하여 적어준다.
날짜 값은 ' ' 으로 묶어주고 지정된 날짜 형태로 적어준다. '01-MAR-97' 숫자값은 값만 적어준다.
특정 ROW 만 검색한다.

SELECT exprFROM table명WHERE expr operator value;

[ 예제 ]S_EMP TABLE 에서 LAST_NAME 이 Magee 인 사원의 FIRST_NAME, LAST_NAME,TITLE 을 검색하시오. (=,>,<,>=,<=,<>)
SELECT FIRST_NAME, LAST_NAME, TITLEFROM S_EMPWHERE LAST_NAME = 'Magee' ;


6.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' ;


7.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_IDFROM S_EMPWHERE DEPT_ID IN (10, 31, 41, 50) ;


8.like
찾고자 하는 값을 정확히 모를 때, LIKE OPERATOR 를 사용하여 문자형태가 같은 ROW 를 검색한다.
WILDCARD 를 사용하여 문자의 형태를 지정한다.
% : 여러 문자,
_ : 한문자
LIKE '형태', NOT LIKE '형태'

[ 예제 ]S_EMP TABLE에서 LAST_NAME 이 M 으로 시작하는 사원의 LAST_NAME 을 검색하시오.
SELECT LAST_NAME FROM S_EMPWHERE LAST_NAME LIKE 'M%' ;
SELECT LAST_NAME FROM S_EMPWHERE LAST_NAME LIKE '__M____' ;


9.is nullIS
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, salaryFROM s_empWHERE commission_pct is null;


10.And와 Or
조건식의 결합조건식을 기술할 때 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, TITLEFROM S_EMP WHERE DEPT_ID = 41AND TITLE = 'Stock Clerk' ;



11.Single Row Functions
1)먼저, LOWER를 알아보자.
소문자로 변환,모든 문자를 소문자로 변환시킨다.
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' ;

2)이번엔, 대문자로 변환인 UPPER를 보자.
모든 문자를 대문자로 변환시킨다.
UPPER(COLUMN명)

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


3)INITCAP
첫글자만 대문자로 변환, 단어의 첫글자는 대문자로, 나머지는 소문자로 변환시킨다.
INITCAP(COLUMN명)

[ 예제 ]S_EMP TABLE 에서 TITLE 을 단어의 첫글자만 대문자로 출력시키시오.
SELECT INITCAP(TITLE)FROM S_EMP ;

4)SUBSTR
문자의 부분을 자름문자를 시작위치(M)에서 자리수(N) 만큼 잘라준다.
자리수(N)이 생략되면 시작위치(M)에서 끝까지 잘라준다.
SUBSTR(COLUMN명, M, N)

[ 예제 ]S_PRODUCT TABLE 에서 NAME COLUMN 의 앞에서 부터 3글자가 Ace 인 제품의 NAME 을 출력하시오.
SELECT NAMEFROM S_PRODUCTWHERE SUBSTR(NAME, 1, 3) = 'Ace' ;


5)Length
문자의 길이를 계산문자의 길이를 RETURN 한다.
LENGTH(COLUMN명)

[ 예제 ]S_PRODUCT TABLE 에서 NAME, NAME 의 길이를 출력하시오.
SELECT NAME, LENGTH(NAME)FROM S_PRODUCT;

6)Round
숫자의 반올림지정된 자리수(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 ;


7)Trunc
숫자의 절사지정된 자리수(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 ;


8)나누기의 나머지, MOD
M 을 N 으로 나누고 남은 나머지를 RETURN 한다.
MOD(M, N)

[ 예제 ]10 을 3 으로 나눈 나머지를 구하시오.
SELECT MOD(10, 3)FROM SYS.DUAL ;


9)날짜의 연산
DATABASE 안의 DATE 값은 다음과 같은 숫자로 저장되어 있다.
■ CENTURY, YEAR, MONTH, DAY, HOURS, MINUTES, SECONDS그러므로 산술 연산을 할 수 있다.
● DATE + NUMBER : 숫자만큼 일이 더해진 날짜가 RETURN 된다.
● DATE - NUMBER : 숫자만큼 일이 빼진 날짜가 RETURN 된다.
● DATE1 - DATE2 : 두 날짜 사이의 일수가 계산된다.날짜 계산을 한다.
DATE + NUMBERDATE - NUMBERDATE1 - 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_DATEFROM 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_DATEFROM 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 ;


12.여러Table로부터 Data검색
1)Equijoin
SIMPLE JOIN (EQUI-JOIN)
여러개의 TABLE 들로부터 정보를 검색하려면, SELECT 문장의 FROM 절에 TABLE명들을 적고 WHERE 절에 각 TABLE의 ROW들을 연결시킬 조건식을 기술한다.
각 TABLE 의 COLUMN명이 중복될 때는 반드시 COLUMN명 앞에 TABLE명을 붙여야 한다.
(중복되지 않을 때는 붙이지 않아도 되지만 명확성을 위해서나 ACCESS 를 위해서 붙이는 것이 좋다.)
N 개의 TABLE 을 JOIN 할 때는 최소한 N-1 개의 조건식이 필요하다.
복합 COLUMN 으로 JOIN 할 때는 더 많은 조건식이 필요하다.
2개 이상의 TABLE 에서 = 조건식을 만족시키는 ROW 들을 연결하여 검색한다.
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 ;

2)특정 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' ;

3)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 ;

4)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 이 간편하다.)

5)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.NAMEFROM S_EMP E, S_CUSTOMER CWHERE E.ID(+) = C.SALES_REP_ID ;

6)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 ;


13.Group FunctionsGroup Function
각각의 FUNCTION 은 ARGUMENT 를 받는데 기능은 다음과 같다.
■ DISTINCT : 중복된 값은 제외한다.
■ ALL : DEFAULT 로써 모든 값을 포함한다.
■ COLUMN명 : NULL 값은 제외한다.
■ * : NULL 값도 포함한다.
1)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(*) 는 급여를 받지 않는 사원의 인원수도 포함된다.)

2)소group으로 분리
기본적인 SELECT 절(그룹화 되지 않은 SELECT절)에는 COLUMN 명과 GROUP FUNCTION이 같이 기술될 수 없다.SELECT 절에 COLUMN 명이 기술되려면 GROUP BY 절이 반드시 기술되어야 한다.
SELECT 절에 기술된 COLUMN 명들은 전부 GROUP BY 절에 기술되어야 하며 GROUP BY 절에 기술된 COLUMN 명들은 SELECT 절에 기술되지 않아도 된다.(하지만 결과를 파악하기 위해서는 SELECT 절에 기술해주는 것이 좋다.)GROUP BY 절을 기술하면 GROUP BY 절에 기술된 COLUMN 값으로 1 개의 TABLE이 소 GROUP 으로 나눠진다. 결과는 COLUMN 값으로 SORT 되어서 출력된다.
1 개의 TABLE 을 소 GROUP 으로 나누어 GROUP FUNCTION 값을 구한다.
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_EMPGROUP BY DEPT_ID, TITLE;

3)특정 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 ;

4)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_EMPGROUP BY DEPT_IDORDER BY COUNT(*) DESC ;

14.Subquery
1)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, TITLEFROM S_EMP
WHERE TITLE = ( SELECT TITLE FROM S_EMPWHERE LAST_NAME = 'Smith') ;

2)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 <>


3)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 IDFROM S_DEPTWHERE NAME = 'Operations') ;

4)Multi Column Subquery
SELECT 문장의 WHERE 절에서 여러개의 COLUMN 값을 비교하려면 LOGICALOPERATOR 를 사용하여 여러개의 조건식을 기술하여야 한다.그런데 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_IDFROM S_EMP WHERE (DEPT_ID, TITLE)
IN(SELECT DEPT_ID, TITLE FROM S_EMP WHERE LAST_NAME = 'Patel') ;
SELECT LAST_NAME, TITLE, DEPT_IDFROM S_EMP WHERE (DEPT_ID)
IN(SELECT DEPT_IDFROM S_EMP WHERE LAST_NAME = 'Patel')
OR (TITLE) IN(SELECT TITLE FROM S_EMPWHERE LAST_NAME = 'Patel') ;


15.Table 생성이름 붙이는 법
이름은 다음의 규칙을 따라서 지정한다.
■ TABLE 명이나 COLUMN 명은 문자로 시작하고 30 자 이내로 지정한다.
■ A ~ Z, a ~ z, 0 ~ 9, _ , $ , # 을 사용할 수 있다.
■ 한 USER 내에서는 다른 OBJECT 의 이름과 동일하게 지정할 수 없다.
■ ORACLE7 SERVER 예약어를 사용할 수 없다.
■ 대소문자를 구별하지 않는다.

16.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


17.다른 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_41AS SELECT ID, LAST_NAME, USERID, START_DATEFROM S_EMPWHERE DEPT_ID = 41;(S_EMP TABLE 에서 COLUMN명, TYPE, SIZE, NOT NULL CONSTRAINT 가 복사되어 EMP_41 TABLE 이 생성되며, 데이타는 DEPT_ID = 41 인 ROW 만 복사된다.)


18.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명..)


19.Table 생성

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

[ 예제 ]


20.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_TYPEFROM   USER_OBJECTS;
■ GRANT 와 관련된 DICTIONARY TABLE 의 이름을 검색한다.SELECT   TABLE_NAMEFROM   DICTIONARYWHERE   UPPER(COMMENTS) LIKE '%GRANT%';
■ S_EMP TABLE 의 CONSTRAINT 종류를 검색한다.SELECT   CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION,R_CONSTRAINT_NAMEFROM   USER_CONSTRAINTSWHERE   TABLE_NAME = 'S_EMP';
■ S_EMP TABLE 의 COLUMN CONSTRAINT 를 검색한다.SELECT   CONSTRAINT_NAME, COLUMN_NAMEFROM   USER_CONS_COLUMNSWHERE   TABLE_NAME = 'S_EMP'

2007년 8월 1일 수요일

기본적인 sql 문

1. 행의 삽입 - INSERT

1)INSERT문의 기본 구성
형식
INSERT [INTO] {table_name view_name}[(column_list)] {VALUES values_list select_statement}
- INSERT 절
행을 삽입할 테이블 또는 뷰를 지정한다.
전체 행이 아닌 특정 컬럼들을 지정하는 컬럼 리스트를 사용할 수 있다
- VALUES절
삽입할 데이터를 지정한다.
모든 자료형들은 각각의 입력 형식을 가진다
VALUES('123-45-6789', 'Chen', 'Sue', '900 555-1221', '214 Main St. ' , 'Kent' , 'WA' , '98000', 0)

**********사용 예제************
디폴트 옵션
DEFAULT VALUES
INSERT table_name DEFAULT VALUES
- 모든 컬럼에 대해 디폴트 값을 가지는 행을 삽입한다.


DEFAULT
INSERT table_name
VALUES( ..., DEFAULT, .....)
- 지정된 컬럼에 디폴트 값을 삽입한다.
- 변수가 values_list에 나타날 수 있다.

고려사항
- 해당 컬럼에 대한 디폴트나 사용자정의 자료형에 대한 디폴트 값이 존재하는 경우에 그 값이 삽입된다.
- 컬럼이 IDENTITY 속성을 가지거나 timestamp자료형인 경우에는 적절한 값이 삽입된다.
- DEFAULT의 경우에는 IDENTITY속성을 가지는 컬럼에 대해서는 유효하지 않다.
- 컬럼에 디폴트가 없고 NULL이 허용되는 경우에는 NULL 이 삽입된다.
- 컬럼에 디폴트가 없고 NULL이 허용되지 않는 경우에는 에러를 반환하고 INSERT는 실패한다.


부분 데이터의 삽입
NULL이나 디폴트 값을 허용하는 컬럼에 대해서는 데이터를 지정하지 않을 수 있다.
INSERT [INTO] {table_name view_name} (column_list) {VALUES vlaues_list select_statement}
- INSERT 절에 컬럼 이름을 명시한다.
- VALUES 절의 값들은 각각 column_list의 컬럼들에 대응된다.
- 열거 되지 않은 컬럼들에 대해서는 DEAFULT와 같이 처리된다.

INSERT publishers (pub_id, pub_name)VALUES ('9975', 'Unbound Press')
=>publishers라는 테이블에 pub_id, pub_name이라는 칼럼에다가 각각 '9975', 'Unbound Press'라는
값을 넣어라.


2)SELECT를 사용한 행의 삽입

SELECT 문을 사용하여 하나 이상의 다른 테이블로부터 이미 존재하는 테이블로 행을 삽입할 수 있다.
INSERT table_name
SELECT column_list FROM table_list WHERE search_conditions

고려사항
- 같은 테이블에서도 가능하다.
- 삽입할 테이블과 SELECT 결과 집합은 컬럼의 개수, 컬럼의 순서, 자료형 등에 호환성이 있어야 한다.
- 완전히 같은 자료형이거나 SQL서버가 자동적으로 호환성이 있도록 변화 할 수 있는자료형이어야 한다.
- INSERT만을 사용하는 경우와는 달리 한번에 여러 행을 삽입한다.
- 생략된 컬럼에 대해서는 해당 컬럼에 디폴트가 존재하는지 또는 NULL이 허용되는지를 확인해야 한다.

저장 프로시져를 사용한 삽입
저장 프로시져에 의해 반환되는 결과 값을 사용하여 테이블을 조작할 수 있다.
INSERT [INTO] table_name
EXECUTE {procedure_name @procedure_name_var}
[[@parameter_name=]{value @variable [OUTPUT] DEFAULT }
{,[@parameter_name=]{value @variable[OUTPUT] DEFAULT}]...]
- 저장 프로시져는 로컬 또는 원격 시스템에 있을 수 있다.
- 결과 정보를 로컬 테이블에 저장하는데 주로 이용한다.

고려사항
- 삽입할 테이블은 반드시 미리 생성 되어 있어야 한다.
- 테이블에는 저장 프로시져 내의 SELECT 문장에 의한 결과 데이터들이 삽입된다.
- 저장 프로시져에서의 PRINT, RAISERROR, FETCH등의 결과는 테이블에 삽입되지 않는다.
- SELECT문의 결과로 반환되는 데이터들은 반드시 테이블의 컬럼들과 자료형이 일치해야 한다.




2. SELECT 문의 기본구성

- SELECT
- 검색할 컬럼들을 지정
- FROM
- 검색할 테이블을 지정
- WHERE
- 검색할 테이블 내의 행을 결정
- WHERE절이 없는 경우에는 해당 테이블의 모든 행들을 검색한다.


SELECT select_list [INTO new_table_] FROM table_source [WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC DESC] ]
// 참고 : [ ] = 생략가능 { } = 중복가능 = 선택가능
// 잘 모르겠으면 Books Online을 100% 활용하자.


이장 까지의 이 글의 출처를 다음과 같이 밝힙니다.
http://sqler.pe.kr/



3. Alter 명령어 사용법

컬럼 추가 mysql> alter table 테이블명 add 컬럼명 varchar(50);

추가할 필드를 기존 테이블의 제일 마지막에 위치 mysql>alter table 테이블명 add 추가할필드명 필드타입;

추가할 필드를 기존 테이블의 제일 첫번째에 위치 mysql>alter table 테이블명 add 추가할필드명 필드타입 first;

추가할 필드를 기존 테이블의 중간에 위치 mysql>alter table 테이블명 add 추가할필드명 필드타입 after 생성될필드가 위치할 앞 필드명;

컬럼 삭제 mysql> alter table 테이블명 drop 컬럼명;

컬럼명,타입 변경 mysql> alter table 테이블명 change 컬럼명 컬럼명1 varchar(12);

컬럼 타입 수정 mysql> alter table 테이블명 modify 컬럼명 varchar(14);

마지막으로 테이블명 수정 mysql> alter table 테이블명 rename 테이블명1;

테이블의 필드명을 다른 이름으로 변경 mysql>alter table 테이블명 change 기존필드명 바꿀필드명 바뀐필드타입;

테이블명 변경 mysql>alter table 테이블명 rename 바뀔테이블명;

4. Auto_increment된 걸 리셋

TRUNCATE TABLE tbl_name;

이때 tbl_name 내의 모든 data는 사라지지만, entry나 entry 속성은 그대로 남는다. (리셋과 같다고 보면됨)