2018년 7월 13일 금요일

3주/4강: SQL 약간 고급 사용법

[커세라 강좌 소개] 자료기반 천문학(Data-Driven Astronomy)

-----------------------------------------------------------------
Week 3: Querying data using SQL
제3주차: 스퀠(SQL)을 이용한 자료 조회
- How to use databases to analyse your data
  획득한 자료를 분석하기 위해 데이터베이스 활용하는 법
- Investigating exoplanets in other solar systems
  다른 태양계의 외계행성 탐사
-----------------------------------------------------------------
-----------------------------------------------------------------
-----------------------------------------------------------------
-----------------------------------------------------------------
4강: SQL 약간 고급 사용법

[강의대본]


[00:05] 이제까지 SQL의 기본 조회문을 살펴봤다. 간단한 SELECT, FROM, WHERE가 들어간 문장으로 표(table)에서 간단한 조건을 주어 이에 맞는 정보를 추출해 냈다. 이번 강의는 조회문의 좀더 고급의 기능을 살펴보겠다. 외계행성 관측자료를 담은 데이터 베이스를 계속 사용할 텐데 케플러 우주망원경 임무를 통해 얻은 외계행성의 탐사자료들이다.


[00:27] SQL 문으로 가능한 일곱개의 구문이 있다. 앞서 SELECT, FROM 그리고 WHERE 가 들어간 문장을 사용해 봤었고 아울러 GROUP BY를 사용해 여러 행(row)을 한데 묶을 수 있었다. 그리고 HAVING 구문인데 한데묶은 자료(group data)중 일부를 걸러내는 용도로 사용한다. ORDER BY 는 묶은 결과를 정렬(sort)할 때 쓰이고, LIMIT는 말 그대로 조회에 의해 얻은 행의 갯수를 제한 할 때 쓰인다.

[00:49] 이번 강의는 SELECT 문을 좀더 효과적으로 사용하는 방법에 대해 배운다. 시작하기 전에, 기술 명령에 대해 설명을 덧붙이고자 한다.



포스트그레스큐엘(PostgresSQL, 확장표준 SQL)에서 \d 라고 쓰는데 지금 사용중인 데이터베이스에서 표의 구조를 들여다 볼 수 있다. 이는 원하는 조회를 결정 할 때 매우 유용하다.

[01:09] 이 시점에서 먼저 NULL 값의 중요한 의미를 짚어보고 가자. 아마도 NULL의 의미를 '값 없음(no value)'이라고 알고 있을 것이다. 하지만 NULL에는 세가지 다른 의미를 가지고 사용되고 있다. 첫째, NULL 은 '해당사항 없음(not applicable)'의 뜻이 있다.



예를 들어 외계행성 데이터베이스에서 케플러 명(kepler_name)이 지정되지 않았을 경우다. 이를 긍정오류(false positive)라고 하는데 오류(false)가 아니라 아직 명명되지 않은 상태라는 뜻이다.

[01:35] 둘째, NULL은 '아직 모른다'는 의미다. 예를 들어 외계행성의 밀도는 무게와 반경으로 계산 되는데 아직 측정되지 않았다는 뜻이다.

* 천체의 무게는 만유인력 법칙에 따라 공전 반경을 알아야 한다. 공전 주기가 긴 경우 측정에 상당한 관측 기간이 요구된다.



[01:45] 세번째, NULL은 '아직 정의되지 않음'의 의미다. 예를 들어, 외계행성의 공전주기가 데이터베이스에 정의되어 있지 않은 경우다.



[01:55] 여기서 정말로 중요한 것은 널(NULL)은 값이 '없다'라는 점이다. 값이 널이 될 수 있는데 널과 '같다'라고 등가(equality) 판단 할 수 없다. 따라서 '=NULL' 과 같은 연산은 작동하지 않는다. 사실 널은 자기 자신을 비롯해 어떤 값과도 비교대상이 될 수 없다. 단지 'IS NULL' 구문으로 값의 부재를 확인 할 수 있을 뿐이다. 따라서 공란 자료와 자료 존재가 혼동 되지 않을 것이다. (다른 결과를 얻게될 것이다.)



[02:22] 때로 이미 구성된 데이터베이스 표에 없는 항목을 가지고 계산해야 하는 경우도 있다. 예를 들어 별로부터 방출된 빛이 행성에 의해 차단된 에너지의 양을 계산하고 싶다고 하자. 이는 행성이 받을 에너지 량이라고 볼 수 있는데 행성의 지표면에 물의 존재를 판단할 요인이기도 하다. 행성은 거의 구의 모습을 할 것이므로 단면은 원이다. 이 원의 면적은 곧 행성에 쏟아지는 별빛의 양이다. 확인된 외계행성에 의해 차단되는 면적을 계산하여 조회 해보자. 



[03:02]  명령어 AS 가 데이터 베이스의 열 표제 area 와 함께 사용되 것이 눈에 띈다. 또한 조회문장에 IS NOT NULL 이 사용되고 있다. 소용없는 계산에 시간을 낭비하고 싶지 않을 것이다. 위의 예제에서 이름이 공식적으로 명명되지 않는 행성은 굳이 면적을 계산하지 않는다.



[03:22] 또한 SQL 언어에서 제공하는 함수를 쓸모있게 사용했다. 반지름을 게곱하기 위해 함수 POWER()를 사용 했다. 그외에도 상당량의 내장 함수(built-in functions)가 제공된다. 또다른 유용한 함수로 ROUND 가 있다. 계산을 수행 한 결과 소숫점 아래로 매우 긴 숫자가 딸려오기 마련이다. 측정은 오차가 있으므로 계산으로 나온 긴 소숫점 아래 숫자는 큰 의미 없다.(측정치와 계산 값을 비교하는 경우) ROUND 함수를 사용하여 숫자의 정밀도를 완화할 수 있다. 온-라인 과제에서 그외 내장 함수를 연습해 보기로 하자.

[참조]
1. PostrgesSQL, https://www.postgresql.org/
2. PostgresSQL Useful Functions,
   https://www.tutorialspoint.com/postgresql/postgresql_useful_functions.htm
3. PostgresSQL - C/C++ Interface,
   https://www.tutorialspoint.com/postgresql/postgresql_c_cpp.htm
4. PostgresSQL - Python Interface,
   https://www.tutorialspoint.com/postgresql/postgresql_python.htm

[03:50] 이번 강의는 다양한 함수 중에서 일부 몇가지와 당장 익혀야하는 약간의 SQL 명령어를 살펴봤을 뿐이다. 다음 강의는 SQL의 막강한 기능을 좀더 알아볼 것이며 대규모 데이터 베이스를 다뤄본다.


댓글 없음:

댓글 쓰기