DATABASE의 기초
컴파일 언어?
- 컴파일러(compiler)는 고급 언어로 작성 된 소스 코드를 저급 언어로 번역하는 프로그램을 가리킨다. 여기서 고급 언어는 사람이 이해하기 쉽도록 작성된 프로그래밍 언어로 C, C++, JAVA 등이 이에 속한다. 저급 언어는 컴퓨터 내부에서 바로 처리 가능한 프로그래밍 언어로 기계어와 어셈블리어 등이 이에 속한다.
- 컴파일러 언어는 컴파일러를 통해 컴파일 타임에 전체 소스 코드를 한 번에 기계어로 변환 후 실행파일을 만든다. 컴파일러 언어는 컴파일 단계와 실행 단계가 각각 분리되어 있으며, 컴파일은 단 한번만 수행한다. 실행은 실행 파일을 실행시킴으로써 할 수 있으며, 실행시에는 컴파일 과정을 거치지 않고 실행만 하면 되므로 코드 실행 속도가 빠르다. 단, 프로젝트의 규모가 클 경우 컴파일 시간이 오래 걸릴 수 있다는 단점이 있다.
- 컴파일러 언어의 종류
C, C++, C#, JAVA 등이 있다
인터프린트?
- 인터프리터(interpreter)는 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램을 말한다.
- 인터프리터 언어는 소스 코드를 한번에 기계어로 변환하는 컴파일러와 달리, 컴파일 하지 않고 소스 코드를 한 줄씩 읽어들여 실행한다. 컴파일 하는 과정이 없기 때문에 컴파일 하는 시간은 소요되지 않으나, 인터프리터 언어는 실행파일을 별도로 생성하지 않기 때문에 실행시마다 인터프리트 과정이 반복 수행되어 실행 속도가 느리다는 단점이 있다.
- 인터프리터 언어의 종류
Python, Javascript, Ruby 등이 있다.
DBMS란?
- 데이터베이스 관리 시스템(DataBase Management System, DBMS)은 데이터베이스를 조작하는 별도의 소프트웨어로, DBMS를 통해 데이터베이스를 관리하여 응용 프로그램들이 데이터베이스를 공유하고, 사용할 수 있는 환경을 제공한다. DBMS는 데이터베이스를 구축하는 틀을 제공하고, 효율적으로 데이터를 검색하고 저장하는 기능을 제공한다.
- 또한 응용 프로그램들이 데이터베이스에 접근할 수 있는 인터페이스를 제공하고, 장애에 대한 복구 기능, 사용자 권한에 따른 보안성 유지 기능 등을 제공한다. 즉, 데이터베이스 내의 정보를 구성하는 컴퓨터 프로그램의 집합으로서, 자료의 중복성을 제거하고 다른 특징들 중에 무결성, 일관성, 유용성을 보장하기 위해서 자료를 제거하고 관리하는 소프트웨어 체계이다.
DB의 종류
현재 가장많이 사용되는 DBMS의 구분은 2종류이다.
Relational // NoSQL
Relational DBMS(빠름)
Database를 Table에 구성, 현재에도 많이이 사용되는 구조
정규화를 통해 정형 data로 만들어 저장된 구조화된 DBBS
Sqlite, OrcleDb, MySQL, MariaDB, Postgresql등
*젤 많이 씀
NoSQL(느림)
비정형 데이터를 처리하는데 적합하고 홗장성이 뛰어남
정규화를 의도적으로 풀어(비정규화)데이터를 관리
MongogDb,HBASE, Redis등
왜 DBMS를 쓰는가?
- DB의 기능이 유효하면서, 보안성도 지니고 있고, 또한 용량을 최소화 해주며, 이를 사요할 수 있도록 언어들과 연동이 되어야 한다.
- 이 프로젝트를 완성하기 위해 바닥부터 설계하긴 무진장 힘듬!
- 이미 만들어진 DBMS를 사용한다.
- DBMS 중 유료와 오픈소스가 존재한다.
- 유료인 이유는 안정성 때문에 그렇다.(문제 터지면 니탓임!)
DB용어
Query(쿼리)
: 질문. DB에 데이터를 요구하기 위한 문장을 의미.(명령어)
Transaction(트랜직션)
:DB의 기본적인 작업의 단위. 조작하고 통제하는 작업의 단위.
Commin, Rollback(커밋, 롤백)
:트랜잭션들을 적용할지, 이전의 단계로 돌아갈지 정하는 것.
Primary Key(기본키)
:Table에서 데이터를 대표하는 속성. 자세한건 이후에!
Foregin Key(외래키)
:다른 Table의 기본키. 자세한건 이후에!
Normalization(정규화/종류는 총 6가지!)
: 관계형 DB에서 중요한 데이터 절약 및 관계형 DB의 관계를 구성하는 틀. 자세한건 이후에!
DB의 구조
DBMS를 다루는 구조
DB>table
여러가지 DB가 존재할 수 있으며 DB내부에 여러 Table들이 존재
여러 사용자가 특정 DB의 권한을 받아 여러 Table에 대하여 해당 권한만큼을 사용 할 수 있음.
Table과 Table은 관계를 형성하며, 이를 위해 정규화 과정을 거치고 나눠 용량을 절약할 수 있다.
Server에 Db를 두고 원격으로 Client가 접속하여 여러명이 하나의 DB를 공유 할 수 있음.
SQL이란?
Structured Query Language의 줄임말으로, DB를 다루기 위한 언어
DB와 SQL은 땔래야 땔수 없는 존재지만 DB==SQL은 아니다.
때문에 DBf를 다룰 줄 아는 것과 SQL을 다룰 줄 아는 것은 깊이에서 차이가 존재한다.
SQL은 생각보다 직관적으로 표현으로 난이도가 쉬운 편이나, 깊이는 더 깊은 편.
앞선 DBMS들 모두가 공통적으로 SQL 문법이 같으나 작은 부분에서 다르기 때문에 주의해야 한다.
maria DB
오픈 소스 관계형 DBMS.
MySQL과 동일한 소스 코드를 기반으로 하지만, MySQL이 오라클 소유가 되고 오라클이 라이센스 상태를 변경하면서 이에 반발하여 MySQL개발자가 개발한 DBMSdlek.
때문에 MySQL을 사용하는 방식을 다소 공유 할 수 있다.
다운로드 링크
https://mariadb.org/download/?t=repo=config
설치순서
1.os및 버전 선택
2.MariaDB 버전 선택
3.설치 명령어 입력
실행순서
1. MariaDB 서버 실행(sudo service mysql start)
2.기본 설정
3.실행된 서버로 접속
4.DB생성(CREATE DATABASE {DB이름};)
5.DB접속(use{DB이름};)
sudo service mysql start(서버오픈)
sudo mariadb(실행)
Query OK, 1 row affected (0.000 sec) 이라고 뜸.
create database test;(test라는 데이터베이스 생성)
show databases;(데이터베이스 출력)
MariaDB [(none)]> drop database test;(데이터베이스 삭제)
use test;(test 사용한다는 선언)
show tables;
help; 그외 다른 명령어
SQL기본 문법
CRUD
CREATE(생성)
:DB 혹은 TABLE, TUPLE을 생성하는 행동
앞선, DB생성 명령어에 해당
REAK(조회)
:원하는 데이터를 요구에 맞게 검색 및 조회하는 행동
SELECT문에 해당
UPDATE(수정)
:주어진 DaTA를 수정하는 행동
DELETE(삭제)
:주어진 DATA를 삭제하는 행동
예제.
CREATE TABLE DEPT ( DEPTNO DECIMAL(2), DNAME VARCHAR(14), LOC VARCHAR(13), CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO)); INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK'), (20,'RESEARCH','DALLAS'), (30,'SALES','CHICAGO'), (40,'OPERATIONS','BOSTON'); CREATE TABLE EMP ( EMPNO DECIMAL(4), ENAME VARCHAR(10), JOB VARCHAR(9), MGR DECIMAL(4), HIREDATE DATE, SAL DECIMAL(7,2), COMM DECIMAL(7,2), DEPTNO DECIMAL(2), CONSTRAINT PK_EMP PRIMARY KEY (EMPNO), CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)); INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20), (7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30), (7521,'WARD','SALESMAN',7698,'1981-02-21',1250,500,30), (7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20), (7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30), (7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30), (7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10), (7788,'SCOTT','ANALYST',7566,'1987-07-13',3000,NULL,20), (7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10), (7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30), (7876,'ADAMS','CLERK',7788,'1987-07-13',1100,NULL,20), (7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30), (7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20), (7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
SHOW COLUMNS FROM {Table명};
:입력된 table의 속성값을 확인 하는 명령어. 줄여서 'DESC{Table명}'
SELECT*FROM DEPT; - DEPT의 데이터를 가지고 옴.
SELECT*FROM EMP; - EMP의 데이터를 가지고 옴.
SELECT*DEPTNO FROM DEPT; - DEPT의 데이터중 DEPTNO의 데이터를 뽑아 옴.
SELECT ENAME FROM EMP; -
SELECT EMPNO, ENAME, JOB FROM EMP; - EMP의 데이터 중
SELECT * FROM DEPT WHERE DNAME = 'RESEARCH'; - DEPT의 데이터중 RESERCH에 대한 데이터만 뽑아옴.
SELECT * FROM EMP WHERE EMPNO = 5; - 데이터가 없기 때문에 가져올 수 없음.
SELECT * FROM EMP WHERE SAL > 1000; /OR/ SAL != 100; - SAL의 데이터가 1000을 초과할 때만 출력
SELECT * FROM EMP WHERE ENAME >'B'; /OR/ ENAME > 'ALLEN' ; -해당 문자의 아스키코드를
SELECT * FROM EMP WHERE HIREDATE > '1981-01-01'; /OR/ ;1981.01.01'; - 시간 값 자료형 시간순으로 뽑아와
SELECT * FROM EMP WHERE ENAME LIKE '%NE%'; - 중간에 ne가 들어가는 문자의 대이터 모두 뽑아와
Like문법
'%'
: 문자의 형태와 길이를 제한하지 않는 와일드 카드. 특정 문자 앞에 있을 경우 그 문자 앞으로만 적용되며 반대로도 가능
EX) SELECT * FROM WHERE ENAME LIKE '%AR%';
'_'
:문자의 형태는 상관없지만 길이는 1개로 제한하는 와일드카드. %와 똑같이 사용되나 _ 하나당 한 문자로 매칭 시킬 수 있다.
EX) SELECT*FROM EMP WHERE NAME LIKE '%AR_';
SELECT*FROM EMP WHERE ENAVE LIKE'_NE%';
두개 붙이면 두개 댐!
AND, OR, NOT, XOR
SELECT * FROM EMP WHERE ENME = 'ALLEN' AND SAL = 1100;
:매칭 결과가 없으니까.
SELECT * FROM EMP WHERE ENAME = 'ALLEN' OR SAL = 1100;
SELECT * FROM EMP WHERE ENAME = NOT LIKE '%AR%';
SELECT * FROM EMP WHERE ENAME = 'ALLEN' XOR SAL = 1100;
SELECT * FROM EMP WHERE ENAME = 'ALLEN' XOR SAL = 1600;
ORDER BY 문법(DBMS는 데이터를 순서대로 넣지 않음 지맘대로임.)
: 생각과 결과와는 다르게 데이터는 순서대로 저장되지 않는다.
이 문법은 명령한대로 정렬을 해준다.
기본형>>
SELECT{Column명} FROM {Table명} [ORDER BY{Column명}[추가조건]]
SELECT * FROM EMP ORDER BY ENAME; - A,B,C
/OR/ORDER BY JOB,SAL - 오름차순
SELECT * FROM EMP ORDER BY HIRDEATE;-
:시간값 또한 비교가 가능하다.
SELECT * FROM EMP ORDER BY ENAME DESC;-내림차순
SELECT * FROM EMP LIMINT 5; - 위에서 부터 5개 까지만 나옴
SELECT * FROM ORDER BY ENAME LIMIT 5;
:문법상 ORDER BY 보다 LIMIT이 더 뒤로 와야한다.
SESECT
검색 범위 지정 OFFSET, LIMIT
LIMINT : 최대 출력을 조정
OFFSET : 시작지점을 조정, LIMIT과 다르게 단독 사용 불가
ORDER BY 뒤에 사용할 수 있도록 함.(작동은 하지만다른 DBMS에서는 불허)
SELECT * FROM EMP ORDER BY ENAME LIMIT 3 OFFSET 3;
:또한 순서에 주의
SELECT * FROM EMP WHERE SAL > 1100 ORDER BY ENAME LIMIT 3 OFFSET 3;
INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK',7902,'1980-12-17' , 800, NULL, 20), (7499, 'ALLEN','SALESMAN', 7698, '1981-02-20', 1600,300,30);
얘는 중복되서 안됨.
DataType
- 프로그래밍 언어 이상으로 DataType이 중요함.
- 가능하면 최소한의 크기의 Datatype을 사용하는 것이 좋음
- ex)예/아니오를 선택한 항목을 저장하는데 int보다 bool값이 좋음.(int는 4바이트 bool은 1바이트 1비트만 쓰는데 단위가 글케 써서)
- 이제 따라, 사전에 어떠한 정보를 어떠헥 저장할지에 대해 고민을 해야함.
- 몰론, 경우에 따라서 이 Data Type을 수정하는 것이 가능하지만 최소한으로 진행해야 한다.
- 만약 DB에서 바뀌게 되면 이와 연동된 프로그램들에서도 수정을 해야하는 소요가 생기기 때문이다.
정수형
INT : -2147483648~2147483647의 범위를 가짐. UNSIGNED를 조건으로 줄 시 0~4294967295
를 가진다. (2의 32제곱, 32bit, 4Bytes)
BIGINT : INT보다 2제곱 많이, 즉, 2의 64제곱의 수를 대상으로 하며 또한 UNSIGNED 조건이
존재한다.(64bit, 8Bytes)
MEDIUMINT : -8388608~8388607 사이싀 수를 대상으로 하며 또한 UNSIGNED(0~16777215)
조건이 존재한다.(24bit, 3Bytes)
SMALLINT : -32768~32767 사이의 수를 대상으로 하며 또한 UNSIGNED(0~65535) 조건이 존
재한다.(16bit, 2Bytes)
TINYINT : -127~127 사이의 수를 대상으로 하며 또한 UNSIGNED(0~255) 조건이 존재한
다.(8bit, 1Bytes)
BOOL : True와 False만 저장할 때 사용하는 값. 다만, 그렇다고 1bit를 사용하진 않습니다.
TINYINT와 같이 1Bytes를 저장할 수 있지만 0이 아닌 모든 수는 True에 해당하므로 주의해
야 합니다.
너비로 저장값에 제한을 줄 수 있으나 데이터 저장을 덜하게 만들진 않습니다.
Ex) 10만을 저장하기 위해 INT를 너비를 제한하더라도 저장은 4Bytes가 된다.
실수형(부동 소수점)
FLOAT : 총 4Bytes의 수를 이용하여 소수점 이하 7자리까지의 정밀도를 제공하는 소수점을
나타내는 타입. 7자리가 넘어가는 수를 입력할 경우 나머지 자리수는 버린다. 근사값이므로
실제 값과 차이가 발생할 수 있다.
DOUBLE: 총 8Bytes의 수를 이용하여 소수점 이하 15자리까지의 정밀도를 제공하는 소수점
을 나타내는 타입. 이하 FLOAT와 같다.
실수형(고정 소수점)
DECIMAL
: 가변적인 형태의 용량을 저장하는 5~17Bytes의 타입. 최대 자리수(65)에서 소수점 자리수
(최대 30)을 지정하여 고정적으로 소수점을 지정할 때 사용한다. 부동소수점과 다르게 근사
값이 아니기 때문에 정확한 값을 저장할 순 있으나 정확도가 높아질수록 Bytes수가 증가하
므로 주의해야한다. 때문에 생성시 총 자리수와 소수점 이하의 자리수를 각각 지정해줘야
한다. Default값은 (10, 0)[10자리수 중 소수점 이하는 0개]이다. 정수값은 자리수를 넘어갈
경우 에러, 소수점은 자리수를 넘어갈 경우 입력한 자리수 앞에서 반올림 된다.
문자열 타입
CHAR(M) [CHARACTER SET {Set명}] : 문자열 데이터타입으로, 입력할 데이터셋(utf8, utf16
과 같은)과 길이에 따라 크기가 달라진다. CHAR타입은 고정 길이이므로 그보다 작은 글자
는 공백이 채워진다. 최대 255글자까지 가능하다.
VARCHAR(M) [CHARACTER SET {Set명}] : CHAR와 같지만 최대 65535길이의 글자까지 가능
하다. 또한 CHAR와 다르게 고정길이가 아닌 가변길이로 이를 위해 1~2Bytes의 길이를 나타
내는 추가 용량이 필요하다.
BINAYR / VARBINARY(M) : 입력 방식은 위와 동일하지만 저장되는 방식은 바이트코드로 저
장된다.
BLOB / TEXT [(M)] : 대용량 문자열을 저장하는 데이터타입. BLOB은 바이트코드로 저장이
되고 TEXT는 순수 문자열로 저장이 된다.
TINYBLOB / TINYTEXT // MEDIUMBLOB / MEDIUMTEXT // LONGBLOB / LONGTEXT
: 필요 길이에 따라 조절
날짜 시간 타입
DATE 타입
: YYYY-MM-DD, YY-MM-DD, YYYYMMDD, YYMMDD등등의 방식으로 날짜타입을 입력하여 사
용한다. 날짜만 저장할 때 사용한다. (1000-01-01 ~ 9999-12-31)
TIME 타입
: HH:MM:SS 등등의 방식으로 시간타입을 입력하여 사용한다. 시간단위를 저장하며, 24시간
제 이상의 시간도 저장이 가능하다.(-838:59:59 ~ 838:59:59)
TIMESTAMP
: 1970-01-01 00:00:01부터 2038-01-19 03:14:07 까지 범위를 가지는 날짜와 시간을 합친 시
간타입. UNIX 시간을 이용할 수 있다. UTC시간을 적용할 때 편하다. 소수점 이하에 대한 조
건을 추가할 경우 소수점 이하 6자리의 정밀도를 추가할 수 있다.
DATETIME
: 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59의 범위를 가진다.
DELETE
DELETE FROM {Table명} [WHERE {조건식}] [ORDER BY {속성명} [추가조건]]
[LIMIT {INT}];
DELETE FROM EMP WHERE ENAME IS NULL;
START TRANSACTION;(AUTO COMMIT을 잠시 비활성)
DELETE FROM EMP;
SELECT * FROM EMP;
ROLLBACK;
: 조건없이 사용하게되면 큰일 날 수 있음.
START TRANSACTION;
DELETE FROM EMP WHERE ENAME = ‘SAM’;
COMMIT;
: COMMIT을 해야만 적용이 됨. 실수를 예방할 수 있음. 기본적으로 AUTO
COMMIT이 적용되어있음.
UPDATE
UPDATE {Table명} SET {적용 속성명} = {변경 값} [조건식];
: UPDATE EMP SET COMM = 100 WHERE COMM IS NULL;
: UPDATE EMP SET COMM = NULL WHERE COMM = 100;
START TRANSACTION;
UPDATE EMP SET COMM = 100;
SELECT * FROM EMP;
ROLLBACK;
: UPDATE 또한 DELETE와 마찬가지로 조건을 잘 지정해줘야한다.
'데이터베이스' 카테고리의 다른 글
pandas라이브러리 & matplotlib.pyplot (0) | 2024.10.10 |
---|---|
프로시저와 트리거 (0) | 2024.09.20 |
수강신청 DB만들어보기 (0) | 2024.09.08 |
DB 만들어보기 (0) | 2024.09.06 |
댓글