{ "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cidnametypenotnulldflt_valuepk
0state_codeINT0None0
1station_idINT0None0
2yearINT0None0
3monthINT0None0
4dayINT0None0
5hourINT0None0
6precipitationINT0None0
7flag_1VARCHAR(1)0None0
8flag_2VARCHAR(1)0None0
" ], "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", " \n", " \n", " \n", " \n", " \n", "
sql
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))
" ], "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 }