{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SQL에서 테이블 생성하기\n",
"---------------------\n",
"\n",
"기본적인 SQL질의를 써서 테이블의 값을 찾는 실습 전에 테이블의 **생성** 방법을 알아보자.\n",
"\n",
"\n",
"**NOTE: \"dataset_1.db\" 파일이 이 노트북과 같은 디렉터리에 있는지 확인하자.**"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'Connected: @dataset_1.db'"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%load_ext sql\n",
"%sql sqlite:///dataset_1.db"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"활동 02a:\n",
"------------\n",
"\n",
"스키마 & 테이블 생성"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"우리가 불러 온 데이터베이스에는 `precipitation_full`이라는 테이블이 하나 있다. 그리고 그 스키마는 다음과 같다.\n",
"\n",
"> * `state_code`\n",
"> * `station_id`\n",
"> * `year`\n",
"> * `month`\n",
"> * `day`\n",
"> * `hour`\n",
"> * `precipitation`\n",
"> * `flag_1`\n",
"> * `flag_2`\n",
"\n",
"이 테이블의 각 터플은 어떤 장소(`station_id`)에서의 한 시간 동안의 상태값 (`state_code`)과 강우량을(`precipitation`- 100분의 1인치 단위)을 나타낸다. 어떤 터플에`hour=25`이 기록되어 있다면 그것은 그 날의 전체 강우량을 나타낸다. 당장은 `flag_1`과 `flag_2`은 사용하지 않는다.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"자, 이제 이미 존재하는 테이블의 **schema**를 확인하는 방법을 알아보자. 여러 다른 방법들이 있지만, 그 중 몇 개의 예를 보자.\n",
"\n",
"* DESCRIBE tablename\n",
"* SHOW CREATE TABLE tablename\n",
"* SHOW COLUMNS tablename\n",
"\n",
"불행하게도 이 명령들이 모든 DBMS에서 가능한 것은 아니고 우리가 IPython 환경에서 쓰고 있는 SQLite에서도 지원을 하지 않아 쓸 수가 없다. 대신 `.schema tablename` 이라는 명령이 있지만 IPython notebook에서는 쓸 수 없다. \n",
"\n",
"여기서 쓸 수 있는 명령은 다음과 같다."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * sqlite:///dataset_1.db\n",
"Done.\n"
]
},
{
"data": {
"text/html": [
"
\n",
" \n",
" cid | \n",
" name | \n",
" type | \n",
" notnull | \n",
" dflt_value | \n",
" pk | \n",
"
\n",
" \n",
" 0 | \n",
" state_code | \n",
" INT | \n",
" 0 | \n",
" None | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" station_id | \n",
" INT | \n",
" 0 | \n",
" None | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" year | \n",
" INT | \n",
" 0 | \n",
" None | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" month | \n",
" INT | \n",
" 0 | \n",
" None | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" day | \n",
" INT | \n",
" 0 | \n",
" None | \n",
" 0 | \n",
"
\n",
" \n",
" 5 | \n",
" hour | \n",
" INT | \n",
" 0 | \n",
" None | \n",
" 0 | \n",
"
\n",
" \n",
" 6 | \n",
" precipitation | \n",
" INT | \n",
" 0 | \n",
" None | \n",
" 0 | \n",
"
\n",
" \n",
" 7 | \n",
" flag_1 | \n",
" VARCHAR(1) | \n",
" 0 | \n",
" None | \n",
" 0 | \n",
"
\n",
" \n",
" 8 | \n",
" flag_2 | \n",
" VARCHAR(1) | \n",
" 0 | \n",
" None | \n",
" 0 | \n",
"
\n",
"
"
],
"text/plain": [
"[(0, 'state_code', 'INT', 0, None, 0),\n",
" (1, 'station_id', 'INT', 0, None, 0),\n",
" (2, 'year', 'INT', 0, None, 0),\n",
" (3, 'month', 'INT', 0, None, 0),\n",
" (4, 'day', 'INT', 0, None, 0),\n",
" (5, 'hour', 'INT', 0, None, 0),\n",
" (6, 'precipitation', 'INT', 0, None, 0),\n",
" (7, 'flag_1', 'VARCHAR(1)', 0, None, 0),\n",
" (8, 'flag_2', 'VARCHAR(1)', 0, None, 0)]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%sql PRAGMA table_info(precipitation_full);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"너무 자세하긴 하지만, 우리가 우리가 원하는 목적은 달성했다!\n",
"\n",
"그리고, 이 테이블을 생성할 때 어떤 문장을 썼는지 알려주는 명령이 있다. (**가이드가 있다는 것은 좋은 일이다**):"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" * sqlite:///dataset_1.db\n",
"Done.\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" sql | \n",
"
\n",
" \n",
" CREATE TABLE precipitation_full(state_code INT, station_id INT, year INT, month INT, day INT, hour INT, precipitation INT, flag_1 VARCHAR(1), flag_2 VARCHAR(1)) | \n",
"
\n",
"
"
],
"text/plain": [
"[('CREATE TABLE precipitation_full(state_code INT, station_id INT, year INT, month INT, day INT, hour INT, precipitation INT, flag_1 VARCHAR(1), flag_2 VARCHAR(1))',)]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%sql SELECT sql FROM sqlite_master WHERE name = 'precipitation_full';"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"위의 테이블은 하나의 레코드에 매 시간마다 각각의 스테이션에서 한 시간 동안 생긴 침전물의 양을 나타내는 테이블이다.\n",
"\n",
"강수량 확인 회사의 직원이 되어 이 부서의 일을 지원한다고 해보자. 이제까지 배운 것들과 인터넷에 있는 모든 정보를 종합하여 직원의 할당량을 저장하는 테이블을 만들어 보자. 생성될 테이블의 요구 사항은 다음과 같다:\n",
"\n",
"* 강의실에 있는 사람의 수만큼 비오는 날에 컵을 정해진 몇 시간동안 지정된 스테이션에서 들고 서 있어야 한다. 매일 같은 시간에 같은 사람이 수행해야 한다. \n",
"* 모든 사람은 일 주일 중 하루만 쉴 수 있다.\n",
"* 각 사람이 들고 있는 컵의 크기는 다르며 담을 수 있는 최대 용량은 실수 체계를 따른다. \n",
"* 데이터 서버의 용량이 충분하지 않아 모든 사람이 매일 생성하는 데이터를 저장할 수가 없다. 랜덤하게 선택된 사람은 비오는 날에 컵이 없이 밖에 서 있어야 한다. 컵의 유무가 생성되는 테이블에 표기가 되어야 한다.\n",
"* 수강생 중 어떤 사람의 이름은 매우 길다. \n",
"\n",
"생성한 테이블 생성 문장을 아래에 작성하고 확인을 받자:\n",
"\n",
"*NOTE:* IPython notebook에서 한 줄 또는 여러 줄의 질의문을 작성하기 위해서는 `%sql` 또는 `%%sql` 이 있어야 한다."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}