데이터베이스

  • 데이터베이스를 사용하기 전까지는 파일 시스템을 이용해서 데이터를 관리
    • 파일 시스템 : 파일(데이터의 모임)을 저장 장치에 저장하고 사용하기 위한 일종의 규칙이나 체계
    • 파일 시스템의 단점 : 데이터간 불일치, 동시성 제어 제공X, 회복 기능 X, 데이터 독립성과 무결성 X, 데이터 모델링 개념이 부족
  • 데이터 종속성, 데이터 중복성, 데이터 무결성 문제를 해결하기 위해 데이터 베이스 사용

 

데이터베이스 특징

(1) 무결성

  • 여러 경로를 통해 잘못된 데이터가 발생하는 경우를 방지
  • 데이터의 오류 X, constraints(제약 조건) 사용

(2) 독립성

  • DB 물리적 크기, 위치 변경에도 SW에 영향을 끼치지 않는다.

(3) 보안성 

  • 인가된 사용자만 DB 접근 허용해서 데이터 보호, 계정 관리, 권한 설정

(4) 중복 최소화

  • 데이터베이스의 데이터를 통합해서 관리해서 자료 중복, 데이터 종속성 해결

(5) 일관성

  • 하나의 데이터를 변경했을 때, 발생할 수 있는 데이터의 불일치성 배제

MySQL Data Type

- 빈번한 데이터 변화에는 VAR(variable)보다 CHAR 사용 권장

 

MySQL 내장 함수

- 문자열 함수

(1) CHAR_LENGTH : 문자 수 계산

(2) LENGTH : 문자 byte 계산, 한글은 1글자에 3byte

(3) CONCAT : 문자열 연결

(4) CONCAT_WS : 문자열에 특정 문자 넣기

(5) FORMAT : 3자리씩 콤마를 찍어준다. -> 금액 표현

(6) TRIM : 문자열 앞 뒤 공백 제거

(7) REPLACE : 특정 문자열을 다른 문자열로 교체

(8) SUBSTRING : 지정 범위 문자열 출력

 

- 날짜 함수

(1) CURDATE() : 현재 연월일, YEAR(CURDATE()) 으로 연도만 사용할 수 있다.

(2) NOW() : 현재 연월일 및 시분초

SELECT CHAR_LENGTH('abcde'), -- 5 --
	CHAR_LENGTH('홍길동'), -- 3, 문자 수 계산 --
    LENGTH('abcde'), -- 5, byte 수 계산 --
    LENGTH('홍길동'); -- 9 --


SELECT CONCAT('소리없는', '아우성'), -- 문자열 연결 --
CONCAT_WS('-','2022','02','20'); -- 문자열에 끼워넣기 --

SELECT FORMAT(1234567.1415234,3); 
-- 소수점 3째자리,--


SELECT TRIM('		소리없는 아우성	'),
	REPLACE('이것은 소리없는 아우성','소리', '양심'),
    SUBSTRING('이것은 소리없는 아우성',3,5);

SELECT CURDATE(),
	NOW(),
	YEAR(CURDATE());

 

 

 

 

 

 

SQL

- DML(Data Manipulation Language) : Insert, select, update, delete

- DDL(Data Defination Language) : Create, Drop, Alter

- DCL(Data Control Language) : grant, deny

 

DML vs DDL

- Transaction의 사용 가능 유무

- DML Transaction 영향 O

- DDL Transaction 영향 X

 

Transaction(트랜잭션)

- 작업의 최소 단위

- 임의로 설정할 수 있는 개념이다.

- 여러 SQL 문장을 하나의 논리적인 단위인 Transaction으로 설정한다.

- 사용 이유 : Transaction 설정시 DBMS가 ACID 보장

- commit(반영) or rollback(무효화)

 

MySQL Workbench Auto Commit Transactions

- 워크벤치 기능에 쿼리를 할 때마다 자동적으로 트랜잭션해주는 모드가 켜져 있다.


ACID

(1) Atomicity(원자성)

- All or nothing

- 모든 작업이 완료되거나 실행이 아무것도 되지 않아야 한다.

 

(2) Consistency(일관성)
- 트랜잭션이 끝난 후, 결과가 제약조건에 위배 되지 않는 상태(correct state)이 된다.

 

(3) Isolation(독립성)

- 모든 트랜잭션이 다른 트랜잭션에 독립적이다.

- Thread 동기화 처리와 일치한다.

 

(4) Durability(지속성)

- 트랜잭션 종료 시, 해당 결과가 2차 저장소에 영구적으로 저장된다.

 

Ex. 이체 시스템

- A 계좌 SELECT (잔고 확인)

- A 계좌 UPDATE (잔고 수정)

- B 계좌 SELECT (입금 전 금액) 

- B 계좌 UPDATE (입금 후 금액)

 


 

JOIN

(1) INNER JOIN

- 일반적인 JOIN

 

(2) OUTER JOIN

- LEFT, RIGHT, FULL

- JOIN 조건을 만족하지 않는 행을 포함한다.


(3) SELFT JOIN

 

(4) CROSS JOIN

- 일반적으로 많이 사용하지 않는다.

- 더미데이터 생성에 사용

 


실습 SQL문 정리

-- 평균 구하기 --
SELECT AVG(칼럼명) FROM 테이블명;

-- 사용자별 평균 구매 금액 --
SELECT userID, AVG(칼럼명) FROM 테이블명
GROUP BY userID;

-- 가장 큰 키, 작은 키 회원의 이름과 키 출력 --
SELECT 이름, 키 FROM 테이블명
WHERE 키 = (
SELECT MAX(키 칼럼) FROM 테이블명
)
OR 키 = 
(
SELECT MIN(키 칼럼) FROM 테이블명
);

-- 사용자별 총 구매 금액 1000 이상 --
SELECT userID, SUM(구매금액*구매횟수) 
FROM 테이블명
GROUP BY userID
HAVING SUM(구매금액*횟수) >= 1000;


-- 트랜잭션 --
SELECT distinct userID FROM 테이블명;

START TRANSACTION -- 트랜젝션의 시작 구문 -- 

DELETE FROM 테이블명; -- 테이블 삭제 --
DELETE FROM 테이블명 WHERE 칼럼명 = '조건' LIMIT 100; -- 상위 100개만 지우기 --

COMMIT; -- 지금 작업한 내용 데이터베이스에 적용 -- 
ROLLBACK; -- 무효화 --

연습문제 SQL문 정리

-- FLOOR(AVG(SAL)) : 정수만 출력, 실수 값 버리기 --
SELECT JOB as '직무', FLOOR(AVG(SAL)) as '급여 평균' FROM EMP
WHERE DEPTNO=30
GROUP BY JOB;


-- 칼럼들의 누적 합계 구하기 -- 
-- FORMAT(금액, '0.000') : 금액 천단위마다 콤마 출력 --
SELECT JOB as '직무명', FORMAT(SUM(SAL), '0,000') as '급여의 합' FROM EMP
GROUP BY JOB
UNION ALL
SELECT 'TOTAL', FORMAT(SUM(SAL), '0,000') FROM EMP
ORDER BY '직무명';


-- CROSS JOIN : 2개 테이블 열 기준으로 붙이기 --
SELECT * FROM A CROSS JOIN B;


-- 1. IFNULL(칼럼명, 0) : NULL 처리 (NULL + 0이상의 값 = NULL이 출력된다) --
-- 2. FORMAT()으로 금액 천단위마다 콤마 + CONCAT()으로 금액 + '원' 출력
SELECT ENAME as '직원명', CONCAT(FORMAT(SAL+IFNULL(COMM, 0), '0,000'),'원') as '급여' FROM EMP
ORDER BY SAL+IFNULL(COMM, 0) DESC;


-- DATE_FROMAT() : DATE 타입 출력 형식 -- 
-- CASE WHEN ~ THEN : 조건별 표현식 --
SELECT ENAME as '직원명', DATE_FORMAT(HIREDATE, '%Y년 %m월 %d일') as '입사년월일',
   (CASE 
 	WHEN HIREDATE BETWEEN '1980-01-01' AND '1980-12-31' THEN 'A'
        WHEN HIREDATE BETWEEN '1981-01-01' AND '1981-12-31' THEN 'B'
        WHEN HIREDATE BETWEEN '1982-01-01' AND '1982-12-31' THEN 'C' 
        WHEN HIREDATE BETWEEN '1983-01-01' AND '1983-12-31' THEN 'D'
    END) as '등급'
 FROM EMP;
 
 
 -- 3중 조인 --
SELECT * FROM A
INNER JOIN B
ON A.칼럼1 = B.칼럼1
INNER JOIN C
ON B.칼럼2 = C.칼럼2;

 

 

Database(데이터베이스)

- 데이터의 집합

- 관련있는 대용량의 데이터 집합들을 체계적으로 구현해 놓은 것

- 여러명 사용 가능, 데이터 처리, 여러 개의 Database 관리 가능

- DBMS(Database Management System) : 데이터베이스를 운영, 관리 하는 Software

 

 

MySQL Oracle, 무료, 유료
MariaDB MariaDB, 무료
Oracle Oracle, 상용 시장 점유율 1위
DB2 IBM, 메인 프레임 시장 점유율 1위
SQL Server Microsoft, 중/대형급 시장 사용
PostgreSQL PostgreSQL, 무료

 

DBMS(Database Management System) 특징

(1) 무결성 : 데이터의 오류 X, constraints(제약 조건)

(2) 독립성 : DB 물리적 크기, 위치 변경에도 SW에 영향을 끼치지 않는다.

(3) 보안성 : 계정관리, 권한 설정

(4) 중복 최소화 : 자료 중복, 데이터 종속성 해결

(5) 안정성 (backup/resotre) 

 

 

DBMS의 종류

(1) 계층형 DBMS : 각 계층은 tree 형태, 변경이 어렵다는 단점

(2) 네트워크 DBMS : 계층형의 단점을 보완, 모든 구조를 이해해야 하기 때문에 구현이 어렵다.

(3) 관계형 DBMS : 테이블(table)이라는 최소 단위로 구성. 

- 테이블 : 열(column) + 행(row)

 

(4) 객체지향 Database

(5) 객체-관계형 Database : 대표 Oracle. 관계형 데이터베이스에서 객체지향의 장점을 추가한 데이터베이스

- 사용자 타입 지원

- 참조 타입 지원 : 레코드가 다른 레코드 참조 가능

- 중첩 테이블 지원 : row가 다른 테이블로 구성

- 객체 간의 상속 가능

 

 


DBMS 구조

- Table : 데이터를 저장하기 위한 "표" 형태의 구조(relation)

- PK : 각각의 row를 unique하게 식별할 수 있는 column의 집합

 

Schema(스키마)

- database 안에서 (data의 구조, 표현 방법, 타입, 관계) 형식 언어를 이용해서 정의한 구조

- MySQL(MariaDB)에서는 schema = Database

(1) 외부 스키마 external schema : 사용자 입장에서 데이터베이스 모습으로 조직의 일부분 정의

(2) 개념 스키마 conceptual schema : 데이터를 통합한 조직 전체의 데이터베이스 구조를 논리적으로 정의 -> data의 논리적 구조

(3) 내부 스키마 Internal schema : 전체 데이터베이스의 물리적 저장 형태 기술

 

 

스키마 생성 실습

- schema : shopdb

- table 2개 생성

1. memberTBL

열 이름(한글) 영문 이름 데이터 형식 길이 NULL 허용
아이디 memberID 문자(CHAR) 8글자(영문) X
회원 이름 memberName 문자(CHAR) 5글자(한글) X
주소 memberAddress 문자(CHAR) 20글자(한글) O

 

2. productTBL

열 이름(한글) 영문 이름 데이터 형식 길이 NULL 허용
제품 이름 productName 문자(CHAR) 4글자 (한글) X
가격 cost 숫자(INT) 정수 X
제조일자 makeDate 날짜(DATE) 날짜형 O
제조회사 company 문자(CHAR) 5글자(한글) O
남은 수량 amount 숫자(INT) 정수 X

 


Index

- primary key를 설정하려면, 해당 column index가 설정

 

 

view

- 가상의 테이블

(1) 안전하게 데이터 유지

(2) 보안적인 측면

(3) 사용의 편리성

 

 

Procedure(프로시저)

- 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합

- 여러줄의 쿼리문을 한 번의 요청으로 실행할 수 있도록 해준다.

- 장점 : 최적화, 캐시, 유지 보수, 트래픽 감소, 보안

- 단점 : 호환성, 성능, 디버깅

 

 

Stored Procedure(저장 프로시저)

- 함수 Interface 제공

 

 

Trigger

- 테이블에 부착

- Insert, Update, Delete가 발생한다.

- 테이블에서 회원정보를 삭제해야 하는 경우 -> 일반적으로 flag(update)

 


MySQL workbench utility

(1) SQL 구문 자동 생성

(2) Query editor 설정

- 예약어 대문자로 변경

- 자동완성

- 주석쿼리

- SQL 구문의 표준 형태로 변경

(3) 사용자 생성과 권한

 


SQL : SELECT 구문

SELECT 

FROM

WHERE 조건

GROUP BY 

HAVING 조건

ORDER BY

+ Recent posts