우재남님의 "혼자 공부하는 SQL"을 기반으로 학습한 게시물입니다.
📕 목차
1. 데이터 베이스란?
2. 데이터 베이스 모델링
3. 데이터 베이스 활용
4. 데이터 베이스 개체
1. 데이터 베이스란?
📌 What is Databse?
- 데이터베이스(Database) : 데이터의 집합
- DBMS(Database Management System) : 데이터베이스를 관리하고 운영하는 소프트웨어
- 여러 명의 사용자나 응용 프로그램과 공유하고 동시에 데이터베이스에 접근 가능해야 함
- Microsoft Excel은 데이터 집합을 관리하고 운영하긴 하나, 대용량 데이터 관리·공유 개념과는 거리가 있어 DBMS라고 부르지 않음.
- pros: 데이터 독립성, 데이터 공용으로 인한 중복 최소화, 일관성/무결성 유지, 보안 보장, 표준화
- cons: 운영비 증가, 자료 처리방법 복잡화, 성능상 문제
- DBMS 필수 기능
- 정의 기능
- 데이터베이스 구조를 정의
- 논리적 구조, 물리적 구조, 두 구조 사이의 매핑 정의
- Data Definition Language(DDL)에 의해 지원
- 조작 기능
- 데이터 처리 기능(검색, 갱신, 삭제, 추가)
- Data Manipulation Language(DML)에 의해 지원
- 제어 기능
- 데이터에 대한 정확성과 안전성 유지
- 트랜잭션, 동시성 제어, 데이터 무결성, 보안 등
- Data Control Language(DCL)에 의해 지원
- 정의 기능
- DBMS 종류
DBMS | 제작사 | 작동 운영체제 | 기타 |
MySQL | Oracle | Unix, Linux, Windows, Mac | 오픈 소스(무료), 상용 |
MariaDB | MariaDB | Unix, Linux, Windows | 오픈 소스(무료), MySQL 초기 개발자들이 독립해서 만듦 |
PostgreSQL | PostgreSQL | Unix, Linux, Windows, Mac | 오픈 소스(무료) |
Oracle | Oracle | Unix, Linux, Windows | 상용 시장 점유율 1위 |
SQL Server | Microsoft | Windows | 주로 중/대형급 시장에서 사용 |
DB2 | IBM | Unix, Linux, Windows | 메인 프레임 시장 점유율 1위 |
Access | Microsoft | Windows | PC용 |
SQLite | SQLite | Android, iOS | 모바일 전용, 오픈 소스(무료) |
📌 DBMS 분류
- 계층형(Hierarchical)
- 트리 구조, 처음 구성을 변경하기가 너무 까다롭다.
- 현재는 사용하지 않음
- 망형(Network)
- 트리 구조에서 보다 유연한 연결을 허용한 구조
- 프로그래머가 모든 구조를 이해해야만 프로그램 작성 가능
- 현재는 사용하지 않음
- 관계형(Relational)
- 관계형 DBMS를 줄여서 RDBMS라고 부름
- 대부분의 DBMS가 RDBMS 형태로 사용되며, 테이블(Table)이라는 최소 단위로 구성된다.
- 테이블은 하나 이상의 열(column)과 행(row)로 이루어져 있다.
- 객체지향형(Object-Oriented)
- 객체관계형(Object-Relational)
📌 SQL(Structured Query Language)
- SQL : DBMS에 데이터를 구축, 관리하고 활용하기 위해 사용되는 언어
- 특정 회사에서 만드는 것이 아닌, 국제 표준화기구에서 SQL 표준을 정해 발표함. (표준 SQL)
- 현실적으로 표준 SQL이 각 회사 제품 특성을 모두 포용하지 못해서 SQL 방언이 생김
- Oracle은 PL/SQL
- SQL Server는 T-SQL
- MySQL은 SQL
📌 MySQL
- MySQL : 대표적인 관계형 DBMS
- MySQL Server : MySQL 여러 소프트웨어 중 엔진 기능을 하는 핵심 소프트웨어(DBMS)
- MySQL Workbench : 웹 서버에 데이터를 요청하고 렌더링을 위해 웹 브라우저를 사용하듯이, MySQL 서버에 접속해서 사용해도록 도와주는 도구
구분 | MySQL | MariaDB |
회사 | 오라클 | MariaDB Inc |
초기 개발자 | 몬티 와이드니어스 | 몬티와이드니어스 |
라이선스 | 상업용/업무용은 유료 개인 및 교육용은 무료 |
모두 무료 |
클라이언트 도구 |
MySQL Workbench | HeidiSQL |
SQL 문법 | 거의 동일 | 거의 동일 |
사이트 | https://www.mysql.com/ | https://mariadb.org/ |
로고 | 돌고래 | 물개 |
2. 데이터 베이스 모델링
📌 프로젝트 진행 단계
- Project
- 현실 세계에서 일어나는 업무를 컴퓨터 시스템으로 옮겨놓는 과정
- 대규모 소프트웨어를 작성하기 위한 전체 과정
- Software process model
- 폭포수 모델(Waterfall model)
- 병렬 개발 모형(Parallel model)
- 프로토타이핑 모델(Prototyping model)
- 나선형 모델(Spiral model)
- 애자일 모델(Agile model)
- 폭포수 모델(Waterfall model)
- 데이터베이스 모델링은 업무 분석과 시스템 설계 단계에 해당한다.
📌 데이터베이스 모델링
- Database modeling
- 테이블 구조를 미리 설계 (건축 설계도를 그리는 것과 비슷)
- 현실 세계의 사물이나 작업을 DBMS의 데이터베이스 개체로 옮기기 위한 과정
- '직원', '고객', '진열품목', '물건을 산다'와 같은 객체와 행위의 특징을 추출하여 각각의 테이블이라는 개체로 변환
- 데이터베이스 모델링에는 정답이 없다.
- 더 좋은 모델링만이 존재할 뿐이다.
📌 전체 데이터베이스 구성도
- 데이터(Data)
- 하나하나의 단편적인 정보
- tess, 아이유, 바나나와 같은 개별적 정보에 해당
- 테이블(Table)
- 회원이나 제품 데이터 입력을 위해 표 형태로 표현한 것
- 데이터베이스(Database, DB)
- 테이블이 저장되는 장소
- 각 데이터베이스는 이름이 서로 달라야 한다.
- DBMS(Database Management System)
- 데이터베이스 관리 시스템 또는 소프트웨어
- MySQL이 여기에 해당한다.
- 열(Column)
- 테이블의 세로
- 열 이름
- 각 열을 구분하기 위한 이름
- 열 이름은 각 테이블 내에서는 서로 달라야 한다.
- 데이터 형식
- 열에 저장될 데이터 형식
- 1234는 숫자지만 "1234"는 문자이므로 타입을 지정해주어야 한다
- 행(Row)
- 실질적인 진짜 데이터 (레코드)
- 행의 개수가 곧 데이터 개수를 의미한다
- 기본키(Primary Key)
- 각 행을 구분하는 유일한 열이므로 중복되어서는 안 된다.
- 테이블에 열이 여러 개 있지만 기본 키는 1개만 지정해야 하며, 일반적으로 1개의 열에 지정한다
- SQL(Structured Query Language)
- 구조화된 질의 언어(SQL)를 통해 DBMS에 작업을 요청한다.
3. 데이터 베이스 활용
여긴 너무 쉬운 부분이라 쿼리문만 조금 정리 해놓고 패스
- 스키마(Schema): MySQL 안의 데이터베이스. (데이터베이스라고 보면 된다.)
- 데이터 형식: CHAR, INT 등의 열에 저장될 타입
- 예약어: SELECT, FROM, WHERE 등의 기존에 약속된 SQL
SELECT * FROM member; -- member 테이블의 모든 행 조회
SELECT member_name, member_addr FROM member; -- member 테이블의 이름, 주소 조회
SELECT * FROM member WHERE member_name="아이유" -- 이름이 아이유인 member 조회
4. 데이터 베이스 개체
테이블은 데이터베이스의 핵심 개체이지만, 이 외에도 몇가지 개체들이 더 있다.
인덱스, 뷰, 스토어드 프로시저, 트리거, 함수, 커서 등이 해당한다.
- 인덱스: 데이터 조회할 때 결과가 나오는 속도를 빠르게 해준다
- 뷰: 테이블 일부를 제한적으로 표현
- 스토어드 프로시저: SQL에서 프로그래밍이 가능하도록 해준다
- 트리거: 잘못된 데이터가 들어가는 것을 미연에 방지
📌 인덱스 (Index)
- 책의 '찾아보기'와 비슷한 개념. ('홍길동'이라는 단어를 찾고 싶다면, 색인페이지에서 '홍'이나 'ㅎ'로 시작하는 색인을 찾아보고 빠르게 조회)
- 데이터의 저장(INSERT, UPDATE, DELETE) 성능을 희생하고, 데이터 읽기 속도를 높이는 테이블 동작속도(조회)를 높여주는 자료구조
- 인덱스가 없어도 데이터베이스 작동에 문제는 없다. 다만, 데이터가 억대 단위로 커지면 중요해지는데, 잘못 사용하면 성능이 크게 떨어지는 역효과도 있다.
- 인덱스 생성 시 DB 크기의 약 10% 정도의 추가 공간이 필요하다.
- 데이터 조회에는 잘 쓰면 성능이 압도적으로 좋아지지만, 데이터 변경이 자주 일어나면 성능이 감소된다.
SELECT * FROM student WHERE sname = 'Jaeseo';
예를 들어, 위와 같은 쿼리문을 던진 상황에서 당연히 올바른 데이터를 찾아서 보여줄 것이다.
문제는 'Execution Plan(실행 계획)'탭을 눌러보니 Full Table Scan이라고 뜬다.
즉, 하나의 데이터를 조회하기 위해서 전체 테이블을 뒤져본 것인데, 데이터가 1억 개라면? 문제가 있을 것이다.
CREATE INDEX idx_student_sname ON student(sname);
이번에는 인덱스를 직접 생성해보고 차이를 확인해보자.
"ON student(sname)"은 student 테이블의 sname 열에 인덱스를 저장하라는 의미이다.
그리고 다시 처음의 쿼리문을 던져보면 Non-Unique Key Lookup이라고 나온다.
자세한 내용은 이후 별도의 포스팅으로 다루겠지만, 여튼 이렇게 하면 인덱스를 통한 검색(Index Scan)을 한 것이다.
📌 뷰 (View)
- 가상의 테이블, 일반 사용자 입장에서는 테이블과 구분할 수 없다.
- 실제 데이터를 가지고 있지 않으며, 진짜 테이블에 link된 개념 ('바로 가기'와 비슷)
- 뷰의 실체는 SELECT문이다.
CREATE VIEW student_view AS SELECT * FROM student; -- view 생성
SELECT * FROM student_view;
- 특정 사용자에게 테이블 전체가 아닌 일부만을 보여줄 수 있으며, 복잡한 쿼리를 단순화할 수 있다.
- 한 번 정의된 뷰는 변경할 수 없으며, 삽입,삭제,갱신 작업 제한 사항과 자신만의 인덱스를 가질 수 없다는 단점
📌 스토어드 프로시저 (Strored procedure)
- MySQL에서 제공하는 프로그래밍 기능, 여러 개의 SQL문을 하나로 묶어 하나의 함수처럼 실행하는 쿼리의 집합
- 연산식, 조건문, 반복문 등을 사용할 수도 있다.
- 코드 자산으로서 재사용성이 나빠서 실무에서는 거의 사용하지 않는다.
SELECT * FROM student WHERE sname = "Jaeseo";
SELECT * FROM professor WHERE pname = "Codd";
위의 예시처럼 거의 매번 동시에, 그리고 반복적으로 사용하는 SQL문이 있다고 가정해보자.
DELIMITER //
CREATE PROCEDURE myProc() -- stored procedure 이름 지정
BEGIN
SELECT * FROM student WHERE sname = "Jaeseo";
SELECT * FROM professor WHERE pname = "Codd";
END //
DELIMITER ;
CALL myProc();
- DELIMITER // ~ DELIMITER ; : 스토어드 프로시저를 묶어준다
- BEGIN과 END 사이에 SQL문을 넣어준다.
- CALL문으로 프로시저를 실행한다.