데이터 베이스(Data Base)

  • 전자적으로 저장되고 체계적인 데이터 모음
  • DBMS (데이터베이스 관리 시스템) 라는 소프트웨어를 사용하여 데이터를 저장, 검색 및 편집


데이터베이스 특징

  • 실시간 접근성(real time accessibility)
  • 계속적인 변화(continuous change)
    • 생성, 수정, 삭제를 통한 최신 데이터 유지
  • 동시 공유(concurrent sharing)
  • 내용에 따른 참조(reference by content)
    • 사용자가 원하는 데이터를 주소가 아닌 내용에 따라 참조 가능
  • 데이터 독립성(Data Independence)


DBMS(DataBase Management System)

  • 데이터베이스를 운영하고 관리하는 소프트웨어

  • SQL(Structured Query Language)
    • DBMS에서 사용하는 언어
  • DBMS 유형
    • 계층형(Hierarchical)

    • 망형(Network)

    • 관계형(Relational)

      • 가장 많이 사용하는 데이터베이스

      • 데이블의 행과 열로 구성

        img_mysql_table

  • 객체지향형(Object-Oriented)
  • 객체관계형(Object-Relational)

  • RDBMS : 정형화된 데이터 관리
  • NoSQL : 비정형 데이터 관리


SQL 명령어

  • 데이터 정의어(DDL: Data Definition Language)
    • CREATE, UPDATE, ALTER, TRUNCATE
  • 데이터 조작어(DML: Data Manipulation Lauguage)
    • CRUD: INSERT, UPDATE, DELETE, SELECT
  • 데이터 제어어(DCL: Data Control Language)
    • GRANT, REVOKE, TRANSACTION, COMMIT, ROLLBACK ..


SQL 데이터 자료형

  ORACLE MYSQL/MariaDB SQL Server PostgreSQL
숫자
(Numeric Type)
NUMBER
FLOAT
TINTINT
SMALLINT
INT
BIGINT
DECIMAL
FLOAT
DOUBLE
BIGINT
INT
SMALLINT
TINYINT
NUMERIC/DECIMAL
FLOAT
REAL
SMALLINT
INTEGER
BIGINT
DECIMAL
NUMERIC
REAL
DOUBLE
문자(열)
(String Type)
CHAR
VARCHAR2
CHAR
VARCHAR
CHAR
VARCHAR
CHAR
VARCHAR
boolean   BIT BIT BOOLEAN
날짜/시간
(Date/Time Type)
DATE
TIMESTAMP
DATE
TIME
DATETIME
TIMESTAMP
YEAR
DATE
DATETIME
DATETIME2
SMALLDATETIME
TIME
DATE
TIME
TIMESTAMP
큰 객체 LONG
CLOB
BLOB
TEXT
MEDIUMTEXT
LONGTEXT
BLOB
TEXT
BINARY
IMAGE
TEXT


기본 문법

수정사항 반영

  • FLUSH PRIVILEGES


CREATE

  • 데이터베이스,계정,테이블을 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
# 데이터베이스 생성
CREATE DATABASE 데이터베이스이름

# 계정 생성
CREATE USER 'ID'@'localhost' IDENTIFIED BY 'PASSWORD'
CREATE USER 'ID'@'%' IDENTIFIED BY 'PASSWORD'

# 테이블 생성
CREATE TABLE 테이블이름 (
    필드이름1 필드타입1,
    필드이름2 필드타입2,
    ...
)


DROP

  • 데이터베이스,계정,테이블을 삭제
1
2
3
4
5
6
7
8
9
10
11
# 데이터베이스 삭제
DROP DATABASE 데이터베이스이름;

# 계정 삭제
DROP USER 'ID'@'localhost' IDENTIFIED BY 'PASSWORD'
DROP USER 'ID'@'%' IDENTIFIED BY 'PASSWORD'

# 테이블 삭제(테이블 전체를 삭제)
DROP TABLE 테이블이름
# 테이블의 내용만 전체 삭제
TRUNCATE TABLE 테이블이름


GRANT

  • 데이터베이스의 권한 부여
1
GRANT ALL PRIVILEGES ON 데이터베이스이름.* TO 'ID'@'%' IDENTIFIED BY 'PASSWORD'


ALTER

  • 데이터베이스와 테이블의 내용을 수정
1
2
3
4
5
6
7
8
9
10
11
12
# 데이터베이스 수정
1. ALTER DATABASE 데이터베이스이름 CHARACTER SET=문자집합이름
2. ALTER DATABASE 데이터베이스이름 COLLATE=콜레이션이름

# 새로운 필드 추가
ALTER TABLE 테이블이름 ADD 필드이름 필드타입

#기존 필드의 삭제
ALTER TABLE 테이블이름 DROP 필드이름

#필드 타입 변경
ALTER TABLE 테이블이름 MODIFY COLUMN 필드이름 필드타입


INSERT

  • 테이블에 새로운 레코드 추가
1
INSERT INTO 테이블명(필드이름1, 필드이름2, ...) VALUES(1, 2, ...);


UPDATE

  • 레코드의 내용 수정
1
2
3
UPDATE 테이블명 
SET 필드이름1=데이터값1, 필드이름2=데이터값2, ...
WHERE 필드이름=데이터값


DELETE

  • 테이블의 레코드를 삭제
1
DELETE FROM 테이블이름 WHERE 필드이름=데이터값


SELECT

  • 테이블의 레코드를 조회
1
2
3
SELECT 필드이름
FROM 테이블이름
WHERE 조건
  • 애스터리스크(asterick)와 별칭(alias)
    • 애스터리스크(asterick): 별표(*)를 이용하여 테이블의 모든 필드 조회
    • 별칭(alias): 테이블과 필드에 임시로 별칭(alias)을 부여하고, 해당 별칭을 SELECT 문에서 사용
1
2
3
4
5
6
7
8
9
# 애스터리스크(asterisk)
SELECT * FROM 테이블이름

# 별칭(alias)
1. SELECT 필드이름 AS 별칭
FROM 테이블이름;

2. SELECT 필드이름
FROM 테이블이름 AS 별칭;


ORDER BY

  • SELECT문으로 조회한 결과를 정렬
  • 기본 설정은 오름차순
1
2
3
4
5
6
# 오름차순
SELECT * FROM 테이블이름 ORDER BY 필드이름
SELECT * FROM 테이블이름 ORDER BY 필드이름 ASC

#내림차순
SELECT * FROM 테이블이름 ORDER BY 필드이름 DESC


JOIN

  • 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현

126506342_185593353279185_54862267095710781_n

1
2
3
4
5
6
7
8
9
# INNER JOIN
첫번째테이블이름 INNER JOIN 두번째테이블이름 ON 조건
첫번째테이블이름 JOIN 두번째테이블이름 ON 조건

# LEFT JOIN
첫번째테이블이름 LEFT JOIN 두번째테이블이름 ON 조건

# RIGHT JOIN
첫번째테이블이름 RIGHT JOIN 두번째테이블이름 ON 조건


GROUP BY

  • 동일한 값을 가진 컬럼을 기준으로 그룹별 연산을 적용
  • 집계함수(COUNT(), MAX(), MIN(), SUM(), AVG()) 와 함께 자주 사용
1
2
3
4
SELECT 필드이름, 그룹함수(필드이름)
FROM 테이블이름
[WHERE 조건]
GROUP BY 필드이름;


HAVING

  • SELECT 문의 WHERE 절처럼 GROUP BY 절에 의해 반환되는 결과 집합의 조건을 설정
1
2
3
4
5
SELECT 필드이름, 그룹함수(필드이름)
FROM 테이블이름
[WHERE 조건]
GROUP BY 필드이름
HAVING 조건;


제약 조건

  • NOT NULL: 해당 필드는 NULL 값을 저장할 수 없음
1
2
3
4
5
6
7
8
9
# CREATE 문으로 NOT NULL 설정
CREATE TABLE 테이블이름 (
       필드이름 필드타입 NOT NULL,
       ...
   )

# ALTER 문으로 NOT NULL 설정
ALTER TABLE 테이블이름
ADD 필드이름 필드타입 NOT NULL
  • UNIQUE: 설정된 필드는 중복된 값을 저장할 수 없음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# CREATE 문으로 UNIQUE 설정
1. CREATE TABLE 테이블이름 (
       필드명 필드타입 UNIQUE,
       ...
   )

2. CREATE TABLE 테이블이름 (
       필드이름 필드타입,
       ...,
       [CONSTRAINT 제약조건이름] UNIQUE (필드이름)
   )

# ALTER 문으로 UNIQUE 설정
1. ALTER TABLE 테이블이름
   ADD 필드이름 필드타입 UNIQUE

2. ALTER TABLE 테이블이름
   ADD [CONSTRAINT 제약조건이름] UNIQUE (필드이름)
  • PRIMARY KEY: NOT NULL + UNIQUE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# CREATE 문으로 PRIMARY KEY 설정
1. CREATE TABLE 테이블이름 (
       필드이름 필드타입 PRIMARY KEY,
       ...
   )

2. CREATE TABLE 테이블이름 (
       필드이름 필드타입,
       ...,
       [CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)
)

# ALTER 문으로 PRIMARY KEY 설정
1. ALTER TABLE 테이블이름
   ADD 필드이름 필드타입 PRIMARY KEY
2. ALTER TABLE 테이블이름
   ADD [CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)
  • FOREIGN KEY
    • 한 테이블을 다른 테이블과 연결해주는 역할
    • FOREIGN KEY 제약 조건은 하나의 테이블을 다른 테이블에 의존
1
2
3
4
5
6
7
8
9
10
11
12
13
# CREATE 문으로 FOREIGN KEY 설정
CREATE TABLE 테이블이름 (
    필드이름 필드타입,...,
    [CONSTRAINT 제약조건이름]
    FOREIGN KEY (필드이름)
    REFERENCES 테이블이름 (필드이름)
)

# ALTER 문으로 FOREIGN KEY 설정
ALTER TABLE 테이블이름
ADD [CONSTRAINT 제약조건이름]
FOREIGN KEY (필드이름)
REFERENCES 테이블이름 (필드이름)


페이징 처리

  • 많은 데이터를 한번에 볼 수 없기 때문에 특정 위치부터 특정 개수까지 표시
  • DB별 페이징 처리
    • ORACLE : ROWNUM
    • MySQL, MariaDB: LIMIT
    • MSSQL: OFFSET,FETCH(2012 이후)


VIEW 테이블

  • 실질적으로 존재하는 테이블이 아닌 정의만 갖고있음.
  • READ ONLY 테이블(SELECT만 가능)
1
2
3
4
5
6
7
8
#  생성(원본 테이블과 같은이름 사용 불가)
CREATE VIEW v_뷰이름 AS
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 조건

# 삭제
DROP VIEW 뷰이름


프로시저, 트리거

  • 프로시저(Procedure)
    • DB에 대한 일련의 작업을 정리한 절차를 관계형 데이터베이스 관리 시스템에 저장한 것
1
2
3
4
5
6
7
8
9
10
11
12
13
# 프로시저 생성
create procedure sp_프로시저명()
begin
    SELECT 필드이름1, 필드이름2, ...
	FROM 테이블이름
	WHERE 조건
end

# 프로시저 출력
call sp_프로시저명()

# 프로시저 삭제
drop procedure sp_프로시저명()
  • 트리거(Trigger)
    • DML문이 수행될 때 DB에서 자동으로 동작하도록 작성된 프로그램
1
2
3
4
5
6
7
8
9
10
11
# 기존 테이블 업데이트  새로운 테이블에 기존 내용이 입력되는 트리거
CREATE TRIGGER tg_트리거명
	BEFORE UPDATE
	ON 기존테이블명
	FOR EACH ROW
BEGIN
	INSERT INTO 새로운테이블명
	(필드이름1, 필드이름2, ...)
	VALUES 
	(old.필드이름1, old.필드이름2, ...)
END

댓글남기기