정형 데이터 - RDBMS, SQL
08 Jul 2019 | 데이터빅데이터 청년인재 Day 6
목차
데이터
- 정형 데이터 (structured data)
- 반정형 데이터 (semi structured data) : JSON, XML
- 비정형 데이터 (unstructured data)
데이터베이스 개요
-
80% (unstructured) vs 20% (structured)
-
Big Data = structured data + unstructured data (what companies don’t know how to exploit yet)
-
Data : raw facts, now context, just numbers and text
-
Information : processed data, data with context, value-added data => make decisions
database | data | information |
---|---|---|
collection of data organized in a manner that alllows access, retrieval, and use of that data | collections of unprocessed items (text, number, ) | processed data (document, audio, images, video) |
데이터베이스
- a collection of interrelated data
- a set of intergrated stored, shared and operational data
데이터베이스 조건
- 통합 (Integrated)
- 동일한 데이터가 중복되지 않도록 구성
- 최소한의 중복 또는 통제된 중복만 허용
- 저장 (Stored)
- 컴퓨터로 접근 가능한 물리적 저장 매체
- 공유 (Shared)
- 공동으로 소유하고 유지하며 이용하는 데이터
- 운영 (Operational)
- 존재 목적이나 기능 수행에 꼭 필요한 데이터 집합
데이터베이스 특징
- 실시간 접근성 (Real-time Accessibility)
- 데이터들 간의 밀접한 관계로 연결
- 중복 데이터를 배제하도록 지양
- 사용자의 어떤 요구에도 즉각 응답
- 계속적인 변화 (Continuous evolution)
- 현실 세계의 상태를 정확히 반영
- 동적으로 삽입/삭제/수정하여 현재의 데이터 유지
- 동시 공유 가능 (Concurrent sharing)
- 여러 사용자들이 동시에 이용
- 같은 시간에 같은 데이터에 접근하여 이용
- 내용에 의한 참조 가능 (Content reference)
- 저장된 주소나 위치에 의해서 참조하지 않고 사용자가 요구하는 데이터의 내용/값에 따라 참조
DBMS
- a collection of programs
- manage the database structure
- controls access to the data stored in the data
DBMS의 역할
- 데이터베이스들 수정 (create databases)
- 데이터 삽입, 수정, 삭제 (insert, update and delete data)
- 데이터들 정렬 및 쿼리 (sort and query data)
- create from and report
DBMS 역할과 장점
- Improved data sharing
- Improved data security
- Minimized data inconsistency
- Improved data access
- Improved decision making
- Increased end-user productivity
- Reduce application development data
DBMS 종류
- 계층형 모델 (Hierarchical Datase Model)
- 트리 형태로 표현 (1:N)
- 객체를 노드, 객체 집합들 사이의 관계를 링크로 표현
- 네트워크형 모델 (Network Database Model)
- 그래프 형태로 표현 (N:M)
- 각 개체가 여러 관계를 가질 수 있음
- 관계 데이터 모델 (Relational Database Model)
- 객체를 테이블, 객체 집합들 사이들 관계를 공통 속성으로 연결
- 객체 관계 모델 (Object-Relational Database Model)
- 속성-관계
- 객체-관계
RDBMS
왜 RDBMS를 사용하는가?
- 데이터 안전성 (Data Safety)
- 동시 접근성 (Concurrent Access)
- 장애 허용성 (Fault Tolerance)
- 데이터 무결성 (Data Integrity)
- 데이터 확장성 (Scalability)
- 데이터 보고서 (Reporting)
RDBMS Concepts
- Relation / table
- Tuple / Row or Record
- Attribute / Column or Field
- Cardinality / Number of Rows
- Degree / Number of Columns
- Domain / Pool of legal values
- Primary key / Unique identifier
개체 관계 모델 (Entiti-Relationship-Model)
- 개체 (Entity)
- 실 세계에 존재하는 분리된 실체 하나를 표현, 일반적으로 명사 하나에 해당
- 관계 (Relationship)
- 개체들 사이에 존재하는 연관이나 연결, 일반적으로 동사에 해당
- 최소 대응수(minimun cardinality)와 최대 대응수(maximun cardinality)로 구성
- 속성 (Attibute)
- 개체의 성질, 분류, 식별, 수량, 상태 등을 나타내는 세부 항목
- 관계 또한 속성을 보유할 수 있음
- 기본키 (Primary key)
- 모든 개체를 고유하고 식별할 수 있는 속성
SQL
SQL
- Structured Query Language
- RDBMS의 데이터를 관리하기 위해 만들어진 언어 (대부분 ISO 표준을 따름)
- 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리 등을 고안
SQL 명령
- 데이터 정의 언어 DDL (Data Definition Language)
- CREATE, DROP, ALTER, TRUNCATE , …
- 데이터 조작 언어 DML (Data Manipulation Language)
- INSERT, UPDATE, DELETE, SELECT ,…
- 데이터 제어 언어 DCL (Data Control Language)
- GRANT, REVOKE, ..
SQL 구문
- 문(Statement), 절(Clause), 식(Expression), 술어(Predicate)
Data Type
- Boolean
- TRUE나 FALSE로 표현
- Character (CHAR, VARCHAR)
- CHAR : 고정 ex) 주민등록번호
- VARCHAR : 가변 ex) 댓글
- 이름이나 사람, 도시들과 같은 column 표현
- Exact numeric (NUMERIC, DECIMAL, INTEGER, SMALLINT, BIGINT)
- 숫자 표현
- Approximate numeric (REAL, FLOAT, DOUBLE)
- Datetime (DATE, TIME, TIMESTAMP)
- time of a day
- datetime fields (시간, 분, 초) 들을 포함
- syntax : TIME[(precision)]
- Precision : seconds value, default is 0 / 3 means miliseconds / 6 means microseconds
SQLite 기초
# sqlite3 import
import sqlite3
# 버전 출력
print(sqlite3.version)
print(sqlite3.sqlite_version)
# 데이터베이스 연결(생성)
conn = sqlite3.conntect(':memory:')
# cursor 생성 (해당 database의 connection으로부터 인스턴스 생성)
cur = conn.cursor()
dir(conn)
# conn 에도 cursor가 있지만 임시로 생성하기 때문에 cur = conn.cursor()처럼 cursor를 받아서 쓰는 것이 좋다
dir(cur)
# execute - sql문 실행
# executemany - 하나의 sql문을 sequential 여러개 입력해야 할 때
# executescript - 여러 개의 sql문 실행
# fetchall - 리스트의 형태로 결과를 전부 보여준다
# fetchone - 결과를 하나만 가져온다
# fetchmany(size) - 결과를 내가 지정한 갯수만큼만 가져온다
# 테이블 생성
cur.execute("create table people (name_last, age)")
who = "아라곤"
age = 130
# qmark style
cur.execute("insert into people values(?, ?)", (who, age))
# named style
cur.execute("select * from people where name_last=:who and age=:age", {"who":who, "age":age})
print(cur.fetchone())
# output : ('아라곤', 130)
- qmark style : 파라미터를 ?로 넘기는 것
- 데이터 구조가 복잡해지거나 변수명이 섞이거나 관계를 가지면 힘들어진다
- named style : named placeholders
- key-value 쌍으로 넘기면 되기 때문에 변수명만 제대로 넘겨주면 쿼리를 수정 할 필요가 없다. 데이터 값만 바꾸면 된다.
# 데이터베이스 닫기
conn.close()
1) executemany
(1) qmark style
sql = "insert into people values (?,?)"
curData = [('A',1), ('B',2), ('C',3)]
cur.executemany(sql, curData)
(2) named style
dataDict = [{"who":"E", "age":4},{"who":"D", "age":5},{"who":"F", "age":6}]
cur.executemany("INSERT INTO people VALUES(:who, :age)", dataDict)
cur.execute("SELECT * FROM people")
cur.fetchall()
# output : [('아라곤', 130), ('A', 1), ('B', 2), ('C', 3), ('E', 4), ('D', 5), ('F', 6)]
2) executescript
commit
문을 먼저 실행 한 다음 매개변수로 가져온 sql 스크립트를 실행한다.
cur.executescript("""
create table person (
first_name text pirmary key,
last_name text not null
);
insert into person values ('name', 'kim');
""")
cur.execute('select * from person')
print(cur.fetchall())
# output : [('name', 'kim')]
SQLite 응용
1) DDL 로 DB 만들기
(1) DB 및 table 생성
cur = sqlite3.connect('create.db')
print("Opened database successfully")
cur.execute('''
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL);
''')
print("Table created successfully")
2) DML로 DB 조작하기
(1) table에 데이터 넣기
execute
# qmark style
cur.execute("INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00)");
# named style
cur.execute("INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (:id, :name, :age, :address, :salary)", {'id':2, 'name':'Allen', 'age':25, 'address':'Texas','salary':15000.00});
execuemany, executescript
data = [(3, 'Teddy', 23, 'Norway', 2000000.00),
(4, 'Mark', 25, 'Rich-Mond', 65000.00)]
cur.executemany("INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) VALUES (?, ?, ?, ?, ?)", data);
cur.executescript("""
INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY)
VALUES (5, 'Mark1', 25, 'Rich-Mond', 65000.00);
INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY)
VALUES (6, 'Mark2', 25, 'Rich-Mond', 65000.00);
""");
(2) table에서 데이터 가져오기
cur.execute("SELECT id, name, address, salary from COMPANY")
cur.fetchall()
- 이 방법은 execute 하는 순간 cursor가 데이터를 물고 있다. 그래서 아래 방법을 추천
cur.execute('select * from company')
for row in cur:
print(row)
# print("ID = ", row[0])
# print("NAME = ", row[1])
# print("ADDRESS = ", row[2])
# print("SALARY = ", row[3], end='\n\n')
(3) table에서 데이터 수정하기
cid = 1
cur.execute("UPDATE COMPANY set SALARY = 25000.00 where ID = :id", {'id':cid})
cur.execute("select id, name, address, salary from COMPANY")
for row in cur:
print(row)
(4) table에서 데이터 삭제하기
cur.execute("DELETE from COMPANY where id = 2;")
cur.execute("select id, name, address, salary from COMPANY")
for row in cur:
print(row)
Comments