데이터베이스 프로그래밍 기초
- DBMS 기초
- DBMS 란?
- 정의 : DataBase Management System 의 약자로 데이터베이스를 관리하기 위해서 데이터를 저장, 유지보수하고 검색하는 시스템을 이야기한다. -> CRUD (Create(생성), Retrieve(검색), Update(수정), Delete(삭제))
- 목적
- 대량의 데이터를 처리한다. (빅데이터보다 작은 단위를 말한다.)
- 주로 검색을 사용한다.
- 다양한 자료 구조와 검색 구조를 사용해서 주로사용하는 검색을 빠르게 할 수 있도록 하여 검색에 최적화를 한다. (검색의 최적화를 위해서 데이터를 정렬한다.)
- DBMS 최적화
- DBMS 에서 주로 사용하는 것이 검색 기능으로 이를 최적화하기 위해서 정렬과 인덱스라는 기술을 사용한다.
- 정렬
- 정의 : 데이터를 빠르게 찾기 위해서 알파벳 또는 숫자 순으로 나열하는 것을 말한다.
- DBMS 에서 주로 사용하는 검색을 빠르게 하기 위해서 반드시 정렬 되어 있어야 한다.
- 정렬이 되어 있지 않으면, 자료가 어디 있는지 알 수가 없기 때문에 평균적으로 전체 데이터의 절반이 필요하다.
- 정렬이 되어 있으면, 자료가 어디 있는지 파악하기가 쉽기 때문에 빠른 시간 안에 찾을 수 있다.
- 정렬을 할 때 주로 적은 시간이 사용되는 퀵정렬이나 힙정렬 계열이 주로 사용된다.
- 인덱스
- 정의 : 데이터가 추가 / 삭제 / 변경될 때마다 특정 위치 예를 들어 한 가운데 / 왼쪽 가운데 / 오른쪽 가운데 값 등을 미리 계산해서 자료를 찾기 쉽게 하는 것으로 사전이나 책에서 목차라고 생각하면 이해가 쉽다.
- 인덱스 종류
- 이진 검색 (Binary Search)
- 데이터를 정렬 후 특정 단어를 검색하는 경우 저장된 정보를 이용해서 단어가 나올 때까지 계속 찾는다.
- B-Tree 계열
- 이진 검색과 유사하지만 한 번에 비교를 2 번하며, 각 세가지 경우에 따라서 특정 단어를 찾는다.
- 작은 값 보다 작은 경우, 큰 값과 작은 값 사이인 경우, 큰 값보다 큰 경우
- 인덱스는 데이터가 추가, 수정, 삭제 시에 반드시 갱신을 한다.
- DBMS 의 종류
- 계층형 데이터베이스
- 네트워크형 데이터베이스
- 관계형 데이터베이스 (RDBMS)
- 객체지향 데이터베이스
- 객체관계형 데이터베이스 (ORDBMS)
- NoSQL(Not Only SQL)
- RDBMS (관계형 데이터베이스)
- 정의
- 관계형 데이터베이스 시스템이다.
- 주로 테이블 기반의 DBMS 로 테이블 - 컬럼 형태의 데이터 저장방식으로 하나의 테이블에 여러 개의 컬럼으로 구성된다.
예) 학생테이블
이름 |
성별 |
나이 |
전화번호 |
김래원 |
남자 |
32 |
010-1234-1234 |
신세경 |
여자 |
30 |
010-5678-1234 |
... |
... |
... |
... |
서지혜 |
여자 |
31 |
010-7890-1234 |
- 테이블과 테이블 간의 연관관계를 이용해 필요한 정보를 구하는 방식이다.
- 모델링은 E-R(Entity Relationship) 모델을 사용한다.
- 기본 용어
- 스키마 (Schema)
- DB, 테이블 정의 내역을 의미한다.
- SQL 쿼리 (Standard Query Language)
- 관계형 DBMS 를 사용하는 전용 질의 언어이다.
- 대소문자를 가리지 않는다.
- 예) SELECT * FROM STUDENT_TABLE
- 테이블 (Table)
- 정보들의 묶음 단위이다.
- 예) 학교, 학생, 교수, ...
- 컬럼 (Column)
- 테이블을 구성하는 정보들이다.
- 예) 학생 테이블 - 이름, 주소, 전화번호, 나이, 성별, ...
- 레코드 (Record)
- 테이블에 들어 있는 여러가지 인스턴스 하나하나를 지정
- 컬럼에 대한 데이터들을 의미한다.
- 예) 학생 테이블 - 이름 : 홍길동, 주소 : 서울시 ..., 전화번호 : 010-1234-1234, 성별 : 남자 ...
- 기본키(Primary Key:PK)로 구별 가능하다.
- 기본키 (Primary Key:PK)
- 테이블에서 하나의 레코드를 지정할 수 있는 하나 이상의 컬럼 집합으로 각 레코드를 구별할 수 있는 유일한 정보이다.
- 예) 주민등록번호, 학번, SSN(Social Security Number), ...
- 외래키 (Foreign Key:FK)
- 어떤 테이블의 기본키가 다른 테이블의 컬럼에 들어 있을 경우를 의미한다.
- 도메인 값 (Domain Value)
- 각 컬럼에서 나올 수 있는 후보 값을 의미한다.
- MySQL 설치 및 제거 방법
- MySQL 설치 방법
- MySQL 홈페이지로 이동해서 사용하고자 하는 툴을 받아서 설치하는 작업을 진행한다.
- MySQL 홈페이지 : https://www.mysql.com/
- MySQL 다운로드 경로 : http://dev.mysql.com/downloads/mysql/
- MySQL 삭제 방법
- Windows
- 설치된 툴을 지우는 프로그램 추가/삭제 를 이용해서 삭제하도록 한다.
- 설치 시에 필요에 따라서 .NET Framework 4.5.2 를 설치 요구를 할 수 있다.
- OS X
- 아래 명령어를 차례로 입력하도록 하며, 기존에 사용하던 파일이 지워지므로 반드시 백업을 하고 진행한다.
- 명령어
- sudo rm /usr/local/mysql
- sudo rm -rf /usr/local/mysql *
- sudo rm -rf /Library/StartupItems/MySQLCOM
- sudo rm -rf /Library/PreferencePanes/My*
- rm -rf /Library/PreferencePanes/My*
- sudo rm -rf /Library/Receipts/mysql*
- sudo rm -rf /Library/Receipts/MySQL*
- sudo rm -rf /var/db/receipts/com.mysql.*
- OS X 에서 MySQL 설치 후에 World 데이터베이스가 출력되지 않아서 Windows 환경에서 실습 진행
- MySQL 기본 사용법
- Windows 에서 설치가 마무리가 되면, "C:\Program Files\MySQL\MySQL Server 5.7\bin" 위치를 확인하면 MySQL 에서 사용하는 명령어들이 보이며, 주로 "mysql" 실행 파일을 사용한다.
- MySQL 시작하는 방법은 Windows 의 CMD 창을 열어서 위 경로를 이동한다.
- CMD 창에서 환경변수 설정해서 바로 사용하는 방법
- 내 컴퓨터 마우스 오른쪽 클릭해서 속성을 누른다.
- 속성 내에서 아래 그림과 같이 "고급 시스템 설정" 을 누른다.
- 시스템 속성에서 "환경 변수" 를 선택하면 아래와 같은 창이 뜬다.
- 환경 변수 창에서 아래 시스템 변수부분에 "편집(I)" 버튼을 눌러서 그림과 같이 입력해주고 "확인 " 버튼을 누른다.
- 그리고 시스템 변수 내에 "Path" 를 찾아서 편집을 눌러서 "%MySQL_HOME%;" 을 입력한다.
- 그 후 모두 "확인" 버튼을 눌러서 창을 닫아준다. (취소 버튼을 누르면 해당 설정이 저장되지 않은 상태로 되지 조심한다.)
- CMD 창을 열어서 아래 그림과 같은 메시지가 출력되면 환경변수가 제대로 설정이 된 것이다.
- 그 후에 실습을 진행한다.
- 실행 방법은 cmd 창에서 "mysql -uroot -p" 를 입력 후 비밀번호를 입력하여 로그인하여 사용
- 로그인 후에 "sql>" 프롬프트 창에서 아래 명령어를 입력한다.
- show databases; : DB 들의 목록을 표시한다.
- use world; : 목록에 표시된 DB 중에 "world" 라는 DB 를 선택한다.
- show tables; : World DB 의 테이블 목록을 표시한다.
- desc city; : city 테이블의 구조를 표시한다.
- select * from city; : city 테이블의 내용을 표시한다. (결과가 많아서 명령어 친 부분은 보이지 않는다.)
- SQL(DML)
- SQL이란?
- SQL은 Structured Query Language의 약자로 데이터베이스에 있는 필요한 정보를 사용할 수 있도록 도와주는 언어이다.
- 사용방법이나 문법이 다른 언어(Java, C, C#, VB 등) 보다 단순하여 하나를 배워두면 모든 DBMS에서 사용가능하다.
- 대소문자 구별하지 않으나 테이블 내의 데이터 내용은 구별한다.
- SQL의 이해
- 사용자나 프로그램이 필요한 데이터를 가져오기 위해 SQL을 작성한다.
- DBMS가 DB에서 사용자가 작성한 SQL을 통해서 데이터를 가져온다.
- 사용자는 SQL을 통해서 가져온 데이터를 볼 수 있다.
- 해당 내용은 아래 그림으로 요약할 수 있다.
- SQL의 종류
- DML(Data Manipulation Language)
- 테이블의 데이터를 조작하는 기능
- 테이블의 레코드를 CRUD(Create, Retrieve, Update, Delete)
- INSERT : 데이터베이스 객체에 데이터를 입력한다.
- SELECT : 데이터베이스 객체 안에 데이터를 조회한다.
- UPDATE : 데이터베이스 객체 안의 데이터를 수정한다.
- DELETE : 데이터베이스 객체에 데이터를 삭제한다.
- DDL(Data Definition Language)
- DB, 테이블의 스키마를 정의, 수정하는 기능
- 테이블 생성, 컬럼 추가, 타이변경, 각종 제약조건 지정, 수정 등
- CREATE : 데이터베이스 객체를 생성한다.
- SHOW : 등록된 데이터베이스 객체를 조회한다.
- DROP : 데이터베이스 객체를 삭제한다.
- ALTER : 기존에 존재하는 데이터베이스 객체를 다시 정의한다.
- DCL(Data Control Language)
- DB나 테이블의 접근권한이나 CRUD 권한을 정의하는 기능
- 특정 사용자에게 테이블의 조회권한 허가/금지 등
- GRANT : 데이터베이스 객체에 권한을 부여한다.
- REVOKE : 이미 부여된 데이터베이스 객체 권한을 취소한다.
- CRUD(Create, Retrieve, Update, Delete)의 이해
- DML에서 CRUD 이해
- Create에 해당하는 DML은 INSERT로 새로운 레코드를 추가한다. 사용방법은 "INSERT INTO 추가할 레코드 내용"
- Retrieve에 해당하는 DML은 SELECT로 조건을 만족하는 테이블의 레코드를 찾아서 조회해준다. 사용방법은 "SELECT * FROM 조회할 테이블 명"
- Update에 해당하는 DML은 UPDATE로 조건을 만족하는 테이블의 레코드를 수정한다. 사용방법은 "UPDATE 수정할 테이블 명 SET 수정할 내용"
- DELETE에 해당하는 DML은 DELETE로 조건을 만족하는 테이블의 레코드를 삭제한다. 사용방법은 "DELETE FROM 삭제할 테이블 명"으로 DELETE 사용 시에 반드시 조건을 지정해야하며 그렇지 않으면 모든 레코드가 지워진다.
- 쿼리 결과 중복 제거(DISTINCT)
- DML의 SELECT문의 결과값에서 특정 컬럼만 출력할 경우, 중복된 값들이 나오는 경우에 이를 제거해서 표시하는 기능
- 사용방법 : SELECT DISTINCT 컬럼명1, 컬럼명2, ... FROM 테이블 명 WHERE 조건절
- 적용 그림은 다음과 같다.
- 논리연산자(AND, OR, NOT, IN, BETWEEN)
- SELECT문의 조건절에 논리 조건을 적용하는 연산자
- 사용방법 : SELECT * FROM 테이블 명 WHERE (NOT) 조건1 AND/OR 조건2, ...
- AND, OR, NOT 과 관련된 결과 그림은 다음과 같다.
- AND 결과
- OR 결과
- NOT 결과
- IN 결과
- IN 과 = 의 차이
- Where 절에서 = 은 관계연산자로 특정 컬럼의 값이 지정한 값과 같은 결과만 출력한다.
- Where 절에서 IN은 =, OR을 한 결과와 같다, IN의 경우는 = 과는 다르게 다중입력이 가능하다. ex) IN ('KOR', 'USA')
- BETWEEN 결과
- 결과 정렬(ORDER BY)
- SELECT문의 결과값을 특정한 컬럼을 기준으로 오름차순/내림차순으로 정렬한다.
- 기본 값은 오름차순이며, 내림차순은 ORDER BY 컬럼명 DEESC 로 표현한다.
- 정렬 전 테이블
- 오름차순으로 정렬한 테이블
- 내림차순으로 정렬한 테이블
- 결과 값 일부 조회
- 결과값 일부조회하는 LIMIT(ROWNUM, TOP)
- SQL 쿼리 결과가 너무 크면 전체화면에서 모두 나타내지 못해서 잘리는 경우가 발생하거나 상위 몇 번째까지만 보고 싶을 경우에 사용한다.
- 비표준 기능으로 오라클에서는 ROWNUM, SQLServer 에서는 TOP으로 사용된다.
- 사용 시에 다음과 같은 결과를 얻을 수 있다.
- 집합 함수(Aggregation Function)
- 테이블의 전체 레코드를 대상으로 특정 컬럼을 적용해서 한 개의 값을 리턴하는 함수
- 사용함수 종류 : Count(), Avg(), Sum(), Min(), Max(), First(), Last, ...
- Count 결과
- Sum 결과
- Avg 결과
- Min 결과
- Max 결과
- 기타 유용한 함수
- LENGTH() : 레코드의 문자열 컬럼의 글자 수를 리턴한다.
- MID() : 문자열의 중간부분을 리턴한다.
- UPPER()/LOWER() : 문자열을 대문자/소문자로 리턴한다.
- ROUND() : 레코드의 숫자 컬럼 값을 반올림해서 리턴한다.
- Join
- 서로 다른 테이블을 공통 컬럼을 이용해서 합치는 테이블 연산을 말한다.
- 조인의 결과는 이전 테이블의 컬럼 수와 동일한다.
- 조인 시에 각 테이블의 컬럼을 구분하기 위해서 테이블1.컬럼1, 테이블2.컬럼1 이런 식으로 구분을 한다.
- 사용 방법 : SELECT * FROM 테이블1 Join 테이블2 on 테이블1, 2에 대한 조건문
- Join의 종류
- INNER Join : 조인 시에 NULL 값을 허용하지 않으며 NULL 값인 경우 제외하고 결과를 출력한다.
- LEFT Join : 조인 시에 왼쪽 테이블의 NULL 값을 포함해서 결과를 출력한다.
- RIGHT Join : 조인 시에 오른쪽 테이블의 NULL 값을 포함해서 결과를 출력한다.
- Full Join : 조인 시에 NULL 값을 허용해서 결과를 출력하는데 MySQL에서는 지원하지 않는다.
- ALIAS
- SQL 쿼리 결과 생성 시에 컬럼 명에 대한 별도의 명칭을 붙이는 기능이다.
- 조인 시에 많이 사용된다.
- 사용 방법 : SELECT 테이블1.컬럼1 AS 별명1, .. FROM 테이블1
- 뷰(VIEW)
- SQL 쿼리의 결과 테이블을 임시 테이블로 저장해서 사용하는 용도로 사용하며, 그 용도가 끝나면 명시적으로 삭제해야 한다.
- 사용방법 : CREATE VIEW 뷰 이름 AS SELECT ...
- SELECT INTO와 INSERT INTO
- 뷰의 기능과 동일하게 테이블을 생성한 후에 바로 결과 테이블을 저장할 수 있고, 동일한 테이블을 생성한 후에 INSERT 를 이용해서 결과 테이블을 저장할 수 있는 방법이 있다.
- 테이블을 생성한 후에 바로 테이블을 저장하는 방법 : CREATE TABLE 테이블명 SELECT * FROM 테이블 명 -> SELECT INTO
- 테이블을 생성한 후에 그 테이블에 저장하는 방법 : INSERT INTO 테이블명1 SELECT * FROM 테이블2 ... -> INSERT INTO
- CASE ... WHEN ... END
- SQL의 조건문에 해당하며, IF/ELSE 와 동일하다고 생각하면 된다.
- 사용방법 : CASE WHEN 조건값 1 THEN ... WHEN 조건값2 THEN... ELSE... END
- 사용 시 주의점은 CASE 조건문을 모두 작성 후에 END를 붙여주어서 조건문의 끝을 알려주도록 한다.
- Like 검색
- Like 는 검색하려는 키워드를 모두 알지 못할 때 일부문자를 사용해서 해당 패턴에 맞는 레코드들을 찾아줄 떄 사용한다.
- 사용방법 : SELECT * FROM 테이블 WHERE 컬럼명 LIKE 패턴 (와일드 카드인 %, _ 를 사용한다.)
- LIKE 검색 시에 OR 같은 논리연산을 하지 않도록 한다. DB에 부담을 줄 수 있기 때문이다.
- %를 이용한 LIKE검색
- _를 이용한 LIKE 검색
- NULL 값과 NULL 함수
- 레코드 중에 NULL 값을 허용할지 여부는 컬럼명 IS NULL 을 이용해서 허용하고, IS NOT NULL을 이용해서 허용하지 않는다.
- NULL 함수는 집합 함수 등을 이용할 때 레코드 중에 NULL 값을 제외할 지 NULL 인 경우 처리해주는 함수가 있다.
- MySQL : IFNULL(컬럼명, 처리할 값)
- SQL Server : ISNULL(컬럼명, 처리할 값)
- 오라클 : NVL(컬럼명, 처리할 값)
- Group by와 Having
- Group by는 집합함수를 같이 사용해서 그룹별 연산 시에 적용한다. 예를 들어 국가코드가 일치하는 값의 개수를 구할 때 사용한다.
- Having 은 그룹별 연산 시에 조건을 추가할 때 사용한다. 별다른 조건이 없다면 생략해서 사용되기도 한다.
- Group by, Having 사용방법 : SELECT 컬럼명, 집합함수(컬럼명) FROM 테이블 GROUP BY 컬러명 Having 조건절
- 서브쿼리
- 쿼리 내에 또 다른 쿼리 문이 있는 형태이다.
- 서브쿼리는 메인 쿼리에 포함되는 관계이다.
- () 를 사용해서 감싸서 구분하도록 한다.
- 서브쿼리에선 ORDER BY를 사용할 수 없다.
- 서브쿼리 종류
- 단일행(Single Row) 서브쿼리
- 결과가 레코드 하나로 된 서브쿼리이다.
- 일반 연산자(=, >, <, ...) 사용
- 사용 예) SELECT Count(*) FROM CITY WHERE CountryCode = (select code from country where name='South Korea'); 또는 SELECT NAME, POPULATION FROM CITY WHERE POPULATION > (select avg(Population) from city where countrycode='KOR') ORDER BY POPULATION DESC;
- 다중행(Multi Row) 서브쿼리
- 결과가 레코드 여러개로 된 서브쿼리이다.
- 다중행 연산자(IN, ALL, ANY, EXISTS) 사용
- ALL 은 여러 개의 레코드의 AND 효과를 가지며 가장 큰 값 보다 큰 값들을 나타낸다. (Population > ALL(select population ...))
- ANY 는 여러 개의 레코드의 OR 효과를 가지며 가장 작은 값보다 큰 값들을 나타낸다. (Population > ANY(select population ...))
- IN
- 결과 값 중에 존재여부를 나타내는 의미한다.
- 전체 레코드를 스캔해서 존재하면 TRUE, 존재하지 않으면 FALSE로 표시한다.
- EXIT
- 결과 값 중에 존재여부를 나타내는 의미로 존재여부만 확인하고 스캔하지 않아서 IN 보다 속도가 빠르다.
- 존재여부만 확인해서 존재하면 TRUE, 존재하지 않으면 FALSE로 표시한다.
- 다중 컬럼(Multi Column) 서브쿼리
- 결과가 컬럼 여러 개인 서브쿼리
- 단일 행이면서 다중 컬럼인 경우가 있고, 다중 행이면서 다중 컬럼인 경우가 있다.
- 집합연산
- 각 종 집합연산을 지원하며, 합집합(UNION), 교집합(INTERSECT), 차집합(MINUS), ...
- MySQL에선 합집합만 지원한다.
- 교집합과 차집합은 IN 등 별도의 연산으로 대체되어서 사용된다.
- 합집합에는 UNION과 UNION ALL 두 가지 형식으로 지원된다.
- UNION은 두 쿼리의 결과 값을 합쳐서 리턴하는 것으로 두 쿼리의 형식이 동일해야한다.
- UNION ALL은 중복을 허용하는 UNION으로 조건은 UNION 과 동일하게 두 쿼리의 형식이 동일해야한다.
- SQL(DDL)
- 스키마 정의
- DDL(Data Definition Language)로 데이터베이스와 테이블을 CRUD(Create, Retrieve, Update, Delete)하는 것을 의미하며, 테이블에 대한 정보는 메타데이터(Metadata)로 데이터 사전에 저장, 관리된다.
- 데이터베이스 생성방법 : CREATE DATABASE 데이터베이스 명;
- 테이블 생성방법 : CREATE TABLE 테이블 명(컬럼명 데이터타입(크기), ...);
- 자료형
- 데이터베이스를 표현하기 위해서 사용되는 데이터의 형태로 정수형, 실수형, 문자열, 시간 등으로 표현된다.
- 정수형(부호있음/부호없음)
- 부호가 있거나 또는 부호가 없는 정수 형태의 숫자를 의미한다.
- TINYINT(-128 ~ 127 / 0~ 255)
- INT(-21억 ~ 21억 / 0~ 43억)
- BIGINT(-9경 ~ 9경 / 0 ~ 18경)
- 실수형(길이, 소수점 이하 자리수)
- 소수점이 있는 형태의 숫자를 의미한다.
- FLOAT(size, d)
- DOUBLE(size, d)
- DECIMAL(size, d)
- 문자열
- 영문, 한글, 일본어 등 문자를 의미한다.
- CHAR 고정길이 문자열(최대 255자)
- VARCHAR 가변길이 문자열(최대 255자)
- TEXT문자열
- 문자열보다 긴 길이의 글자를 의미한다.
- TEXT(최대 65,535자)
- MEDIUMTEXT(최대 16,777,215자)
- LONGTEXT(최대 4,294,967,295자)
- BLOB(Binary Large Object)
- 바이너리 형태를 의미한다.
- BLOB(최대 65,535바이트)
- MEDIUMBLOB(죄대 16,777,215바이트)
- LARGEBLOB(최대 4,294,967,295바이트)
- 시간
- 시간을 나타내는 것을 의미한다.
- DATE(YYYY-MM-DD)
- TIME(HH:MI:SS)
- DATETIME(YYYY-MM-DD HH:MI:SS)
- TIMESTAMP(YYYY-MM-DD HH:MI:SS)
- 제약조건
- 데이터를 입력할 때의 제약 조건을 걸어서 해당되지 않는 데이터는 입력되지 않도록 한다.
- NOT NULL: 데이터가 NULL 값을 받아들이지 않는다.
- UNIQUE: 테이블에 동일한 값이 입력되어 있을 경우 받아들이지 않는다.
- PRIMARY KEY: 기본키 제약조건으로 기본키에 해당하는 값은 NOT NULL과 UNIQUE 제약조건을 동시에 만족해야한다.
- FOREIGN KEY: 외래키 제약조건으로 다른 테이블에서 기본키로 동작하고 있는 값을 공유하고 있다면, 참조 무결성을 유지해야한다는 제약 조건으로 다른 테이블에서 참조가 되고 있는 값은 같이 유지가 되거나 같이 없어져야한다.
- CHECK: 입력값을 확인한다. (예: Age >= 0), MySQL에서는 지원되지 않는다.
- DEFAULT: 컬럼 값이 입려되지 않으면 기본값을 입력한다.
- AUTO INCREMENT: 레코드가 증가하면 자동으로 증가되도록 한다.
- 중복정보 제거
- 테이블 간에 중복되는 정보가 있다면, 하나의 테이블에서 수정이 일어났을 때 해당하는 테이블을 모두 찾아서 수정이 필요하고, 유지보수에 어려움이 있어서 동일한 정보를 여러 테이블이 아닌 하나의 테이블에서 관리하도록 한다.
- 중복정보 제거를 위해서 정규형을 사용하여 중복을 제거한다.
- 정규형
- 정규형이란? 데이터베이스에서 중복을 제거하기 위해서 사용하는 테이블의 규칙이다.
- 제 1 정규형: 나눌 수 있을 만큼 쪼개도록 한다.
- 제 2 정규형: 테이블의 컬럼들이 기본키와 직접 연관되는 컬럼만으로 구성한다.
- 제 3 정규형: 컴럼들 간의 종속관계가 있으면 안된다.
- BCNF 정규형: 결정자이면서 후보키가 아닌 것을 제거한다.
- 제 4 정규형: 다치 종속 제거로 특정 A가 결정되었을 때, 여러 개의 결정될 수 있는 B가 존재하는 것을 의미하며, 간단한 예로 한 과목이 결정되었을 때, 그 과목을 다룰 수 있는 교재가 여러개인 것으로 생각할 수 있다.
- 제 5 정규형: 조인 종속성을 이용하는 것으로 모든 조인 종속이 후보키를 통해서만 만족하는 것을 의미한다.
- 관련 링크 : https://blog.naver.com/o_oloveo/220204342144
- 참조무결성
- 외래키에만 적용되는 규칙으로 외래키를 참조하면 원래 테이블에 해당 레코드 값이 반드시 존재해야한다.
- 만약 원래 레코드를 삭제하려면 참조하는 외래키 값을 먼저 NULL로 만들거나 지운 후에 원래 레코드를 삭제하도록 하는 순서가 발생한다.
- 외래키 참조 관계가 있을 경우 레코드 추가/삭제 시에 선후관계가 발생한다.
- 스키마 수정
- 이미 생성된 스키마에 대해서 수정할 경우 사용한다.
- 크게 테이블 컬럼 추가, 삭제, 수정과 제약 조건 추가, 삭제, 수정으로 나뉜다.
- 테이블 컬럼 추가, 삭제, 수정
- 테이블 컬럼 추가: ALTER TABLE 테이블 명 ADD 컬럼영 데이터 타입
- 테이블 컬럼 삭제: ALTER TABLE 테이블 명 DROP COLUMN 컬럼영
- 테이블 컬럼 수정: ALTER TABLE 테이블 명 CHANGE 컬럼영 new_컬럼명 데이터타입(컬럼명 변경)
- 테이블 컬럼 테이터타입 수정: ALTER TABLE 테이블 명 MODIFY 컬럼영 데이터 타입(컬럼타입 변경)
- 제약조건 추가, 삭제, 수정
- 기본키 제약 조건 추가: ALTER TABLE 테이블 명 ADD PRIMARY KEY (컬럼명)
- 기본키 제약 조건 삭제: ALTER TABLE 테이블 명 DROP PRIMARY KEY
- UNIQUE 제약조건 추가: ALTER TABLE 테이블 명 ADD UNIQUE(컬럼명)
- UNIQUE 제약조건 제약 명 같이 추가: ALTER TABLE 테이블 명 ADD CONTRAINT 제약명 UNIQUE(컬럼명1, 컬럼명2)
- UNIQUE 제약조건 삭제: ALTER TABLE 테이블 명 DROP UNIQUE 제약 명
- 외래키 제약조건 추가: ALTER TABLE 테이블 명 ADD FOREIGN KEY (컬럼명) REFERENCES 원테이블명(원컬럼명)
- 외래키 제약조건 삭제: ALTER TABLE 테이블 명 DROP FOREIGN KEY 컬러명
- 테이블 명 수정: ALTER TABLE 테이블 명 RENAME new_테이블 명
- CHECK 제약조건 추가: ALTER TABLE 테이블 명 ADD CHECK 조건
- CHECK 제약조건 조건 명 같이 추가: ALTER TABLE 테이블 명 ADD CONSTRAINT 조건명 CHECK (조건절)
- CHECK 제약조건 삭제: ALTER TABLE 테이블 명 DROP CHECK 조건 명
- DEFAULE 제약조건 추가: ALTER TABLE 테이블 명 ALTER 컬럼명 SET DEFAULT 기본 값
- DEFAULT 제약조건 삭제: ALTER TABLE 테이블 명 ALTER 컬럼명 DROP DEFAULT
- 스키마 삭제
- 생선된 스키마에 대해서 삭제할 경우 사용한다.
- 크게 데이터베이스 삭제와 테이블 삭제가 있다.
- 데이터베이스(DB) 삭제
- DROP DATABASE 데이터베이스 명: 데이터베이스 삭제
- 테이블 삭제
- DROP TABLE 테이블 명: 테이블 삭제, 내용과 테이블 전체 삭제
- DELETE * FROM 테이블 명: 레코드를 하나씩 지우지만, 테이블 스키마는 유지된다.
- TRUNCATE TABLE 테이블 명: 테이블 내용만 지움, 테이블 스키마는 유지, 전용 명령어이다.
- SQL(DCL)
- 권한 설정
- DCL(Data Control Language)
- 권할 및 역할을 설정하는 언어이다.
- 등록된 사용자에게 특정 테이블에서 특정 쿼리만 사용할 수 있도록 권한을 설정한다. 즉 특정 테이블에 대한 CRUD(Create/Retrieve/Update/Delete) 권한 설정을 의미한다.
- 권한 부여(Grant) / 권한회수(REVOKE)로 나눈다.
- 주로 DBA(DataBase Administrator) 가 설정한다.
- 예제
- 특정 사용자에게 모든 권한을 주는 예제 : grant all on *.* to 특정 사용자 명@localhost identified by '비밀번호'
- 특정 사용자에게 World DB에 대한 검색/추가 권한을 주는 예제: grant select, insert on world.* to 특정 사용자 명@localhost identified by '비밀번호'
- 특정 사용자에게 World DB의 city 테이블의 도시명의 업데이트 권한만 주는 예제: grant update(Name) on world.city to 특정 사용자 명@localhost identified by '비밀번호'
- 역할 설정
- 개별 테이블에 대한 CRUD 권한을 사용자별로 설정하는 설정되어 경우의 수는 테이블 수 X 사용자 수의 조합으로 생긴다.
- 조합의 수가 많아지기 때문에 역할 별로 권한 설정하고 사용자에게 역할을 부여한다.
- 사용자가 여러 개의 역할을 가지는 것이 가능하다.
- MySQL에는 ROLE 관련 명령이 지원 안된다.
- 사용방법
- 역할 생성: CREATE ROLE 역할명;
- 역할에 대한 권한 설정: GRANT CRUD ON 테이블명 TO 역할명;
- 사용자에게 역할 부여: GRANT 역할 TO 사용자명;
- MySQL 원격접속 설정
- 권한 설정 및 역할 설정을 통해서 MySQL을 원격 접속권한 설정을 주어서 서버에 접근 가능하도록 설정할 수 있다.
- 설정 방법은 아래 링크를 참고한다: https://pjt3591oo.github.io/blog/database/2017/05/03/abou_mysql_remote_connect.html
- SQL Advanced
- INDEX
- 인덱스란? 검색을 빠르게 도와주는 자료구조를 의미하며, 주로 B 트리 계열이다.
- 기본키는 자동으로 인덱스 설정된다.
- 인덱스 ON/OFF를 통해서 검색속도 차이를 체감하며 보통 100만, 1000만 이상의 대용량 데이터 검색을 할 때 영향을 많이 받는다.
- 조인 시에도 영향을 준다.
- 인덱스 추가 방법
- CREATE INDEX 인덱스 명 ON 테이블 명(컬럼명)
- CREATE INDEX 인덱스 명 ON 테이블 명(컬럼명1, 컬럼명2, ...)
- CREATE UNIQUE INDEX 인덱스 명 ON 테이블 명(컬럼명)
- 인덱스 삭제 방법
- ALTER TABLE 테이블 명 DROP INDEX 인덱스 명
- 인덱스명 지정방법: 테이블_컬럼명_INDEX
- 메타데이터(Meta Data)
- 개념 : 데이터를 위한 데이터로 DB, 테이블의 스키마에 대한 정보를 저장하는 테이블이다.
- 종류
- 데이터 사전(Data Dictionary) : Information_schema 데이터베이스에 저장
- 데이터베이스의 정보를 저장한다.
- 시스템 카탈로그(System Catalog)라고도 한다.
- 일반적으로 읽기 전용 정보이다.(Read-only)
- 데이터 디렉토리(Data Directory)
- DBMS의 모든 데이터가 저장된 디렉토리(폴더)이다.
- DB를 저장하거나 로그를 저장한다.
- 오라클, MSSQL 모두 동일하게 Information_schema 데이터베이스를 가지고 있다.
- Character Set
- 데이터베이스의 문자 인코딩 정보로 메타 데이터의 일종이다.
- 문자열인 VARCHAR, CHAR의 값을 저장할 때 사용하는 기본정보이다.
- DB/테이블 별로 별도 설정이 가능하다.
- Collation
- 데이터를 검색하거나 정렬할 때 사용하는 정보이다.
- 정렬 시에 대소문자 구분여부도 결정한다.
- ci가 붙으면 대소문자 구분하지 않고, ci가 붙이 않으면 대소문자를 구분한다.
- 예) utf8_general_ci 는 utf8로 된 일반문자의 대소문자를 구분하지 않는다.
- 대표적인 문자셋인 UTF-8 Collation 지정방법
- utf8_general_ci
- utf8_unicode_ci
- 스토리지 엔진
- 개념 : 데이터베이스엔진이라고도 하며, DBMS가 데이터를 CRUD할 때 사용하는 기본 구성요소를 의미한다.
- 대표적으로 MyISAM, InnoDB, Aria, Falcon 등이 있다. (관련링크 : 데이터베이스_엔진)
- InnoDB - 트랜젝션 지원, 업데이트에 용이, 줄단위로 락, 복구가 용이, 동시처리서능이 높아 대부분 많이 사용
- MyISAM - 상대적으로 높은 성능으로 속도가 빠름, 읽기에 용이, 테이블단위 락
- 데이터베이스 백업, 복원
- 데이터베이스 백업
- 특정 시점에서 데이터베이스 상태를 별도의 파일로 저장하는 방법이다.
- 백업 방법
- 전체 데이터베이스 백업
- mysqldump -u아이디 -p --all-databases > 덤프파일명.sql
- 예) mysqldump -uroot -p --all-databases > dump.sql
- 특정 데이터베이스 백업
- mysqldump -u아이디 -p --databases DB명 > 덤프파일명.sql
- 예) mysqldump -uroot -p --databases world> dump.sql
- 특정 테이블 백업(데이터 포함)
- mysqldump -u아이디 -p DB명 테이블명 > 덤프파일명.sql
- 예) mysqldump -uroot -p world city> dump.sql
- 스키마만 백업
- mysqldump -u아이디 -p --no-data DB명 테이블명 > 덤프파일명.sql
- 예) mysqldump -uroot -p --no-data world city> dump.sql
- 데이터만 백업
- mysqldump -u아이디 -p --no-create-info DB명 테이블명 > 덤프파일명.sql
- 예) mysqldump -uroot -p --no-create-info world city> dump.sql
- 데이터베이스 복원
- 특정 시점에서 저장한 데이터베이스 파일을 가져와서 사용하는 방법이다.
- 복원의 경우 백업을 어떻게 했느냐에 따라서 데이터가 복원이 될 수도 있고, 스키마만 복원이 될 수 있다.
- 복원 방법
- 전체 데이터베이스 복원
- mysql -u아이디 -p < 파일명
- 예) mysql -uroot -p < dump.sql
- 특정 데이터베이스 복원
- mysql -u아이디 -p DB명 < 파일명
- 예) mysql -uroot -p world < dump.sql
- 특정 테이블 복원
- mysql -u아이디 -p DB명 테이블명 < 파일명
- 예) mysql -uroot -p world city < dump.sql
- 데이터베이스 로그
- 로그란? 통상 로그는 현재 프로그램이 어떻게 동작하고 있는지에 대한 정보를 담고 있으며, 데이터베이스에서는 운영상황 즉, 데이터베이스, 테이블의 조회, 추가, 수정 등에 대한 정보들을 저장한다.
- 로그의 종류
- 에러로그(Error Log) : Query 에러에 관련된 메시지를 저장한다.
- 일반로그(General Log) : 전체 쿼리에 대한 메시지를 저장한다.
- 슬로우 쿼리 로그(Slow Query Log) : 설정된 시간 이상을 소요한 쿼리에 대해서 저장한다.
- 이진 로그(Binary Log)/릴레이 로그(Relay Log) : 쿼리를 수행하면서 쌓는 로그로 복제에서 사용하고, 시점 복구등을 수행하는 역활을 한다.
- 데이터 파티셔닝/샤딩
- 데이터 파티셔닝(Partitioning)
- 데이터들을 저장한 DBMS 레벨을 분할한다. ex) P1, P2, ...
- DBMS 내부에서 분할이 발생해 사용자는 사용하는데 변화를 느끼지 못한다.
- 제약사항
- 테이블단위 연산이 힘들어진다.
- 외래키(FK)의 효용문제
- 이점
- 데이터 전체 검색 시 필요한 부분만 탐색해 성능 증가
- 전체 데이터를 손실할 가능성이 줄어듦
- 파티션별 백업/복구 가능
- 파티션 단위로 I/O 분산가능으로 업데이트 성능 향상
- 방식
- 파티션을 나눌 기준을 정해서 나누는 범위(Range)
- 해시함수를 파티션별로 크기를 비슷하게 나누는 해시(Hash)
- 특정한 컬럼을 기준으로 하는 리스트(List)
- 1~3번을 두 가지 정도로 합치는 컴포지트(Composite)
- 샤딩(Sharding)
- 데이터들을 저장한 DBMS 외부에서 분할 / 응용레벨에서 구별해야 한다.
- DBMS 외부에서 분할이 발생해 사용자가 그에 맞게 대응이 필요하다.
- 데이터베이스 복제
- 정의 DBMS의 내용을 마스터/슬레이브 관계를 설정하여 동일한 DBMS를 여러개 생성한다.
- 마스터에서는 추가, 수정, 삭제가 이루어진다.
- 슬레이브에서는 검색만 이루어진다.
- 데이터베이스 복제로 인해서 검색 성능이 향상된다.
- 복제 방법
- 로그기반 복제(Binary Log)
- Statement Based : SQL문장복제, SQL에 따라 결과가 달라지질 수 있다.
- Row Based : SQL에 따라 변경된 라인만 기록하는 바식으로 데이터가 많이 변경된 경우 데이터가 커진다.
- Mixed 위 두 방식을 혼합한다.
- Full Text Search
- 컬럼 내용 전체를 단순 문자열로 검색하는 방법으로 LIKE 검색을 여러번 사용할 경우, DB에 부담을 주기 때문에 생겨난 기능
- MySQL에서 Full Text Search 방식
- 자연어 검색
- 형식 : where match(컬럼명) against('검색어 또는 검색문장')
- 검색의 정확도는 as score로 확인 가능
- 결과는 검색 정확도에 따라 내림차순으로 정렬
- 불린 검색
- 형식 : where match(컬럼명) against('검색어*' -제외단어 in boolean mode)
- 검색의 정확도로 정렬하는 기능은 없고, 연산자를 이용한 구문 검색 가능
- 연산자
- + : 필수 단어
- - : 제외 단어
- * : 부분 단어
- Bulk Insert
- 테이블에 Insert를 여러 번 할 수 있도록 하는 기능
- INSERT 문을 실행하는 경우 인덱스가 있는 테이블은 한 번 실행할 때마다 인덱스 작업을 해야한다.
- Bulk Insert를 사용하면 INSERT 문을 여러 개 입력한 후에 마지막에 인덱스 작업을 할 수 있게 가능하다.
- 인덱스 정지/실행 명령어
- 인덱스 정지 : ALTER TABLE 테이블명 DISABLE KEYS;
- 인덱스 재실행 : ALTER TABLE 테이블명 ENABLE KEYS;
- 방식
- 기존 INSERT 문에 VALUES(...) VALUES(...) ... VALUES(...)를 여러개 입력하는 방식
- 파일로 덤프하는 방식
- SQL 문을 이용한 방법 : mysqldump -u아이디 -p DB명 테이블명 > 덤프파일명.sql
- CSV(Comma Seperated Value) 파일을 이용한 방법
- 아래 명령어를 차례로 입력
- LOAD DATA INFILE '파일 경로' INTO TABLE 테이블명 FIELDS TERMINATED BY ‘\t’ ENCLOSED BY ‘”’ ESCAPED BY ‘\\’ LINES STARTING BY ‘’ TERMINATED BY ‘\n’
- CSV 파일 생성방법 : SELECT * FROM 테이블명 INTO OUTFILE '파일 경로'
- 주의점
- CSV 파일을 이용하는 방법은 보안 문제로 인해서 특정 디렉토리에서만 사용하게 제한한다. (secure-file-priv=path 옵션)
- Bulk Insert 사용 시 반드시 인덱스 정지하고, 명령어를 입력하고 난 후에 인덱스를 재실행하도록 한다.