본문 바로가기
데이터베이스 & 웹/데이터베이스

데이터베이스 - 생활코딩

by tryotto 2020. 2. 4.

# 데이터베이스 개요



- 데이터베이스의 종류

    1) 관계형 데이터베이스 

- 모두 똑같은 데이터베이스 문법을 공유하나, 세부적인 부분에서 다른 특성을 지닌다

- ex) mysql, oracle, mssql

    2) nosql


- 전체적인 구조

    1) database Server : 실제로 데이터베이스(정보들) 가 저장되어 있는 곳

- 정보의 구조 : Database > Table

     > "Database" 라는 구조 안에, "Tables" 가 있고, Tables 안에 (row, col) 형식의 "field"가 있다

    2) database Client : 데이터베이스에 접근하기 위한 여러 툴들 (컴파일러같은거랑 비슷한 맥락)

- mysql client : cmd 창으로 하는 방식. (고전적인 툴)

- phpMyAdmin : php 를 이용해서 데이터베이스를 관리하는 방식

- mysql query browser





# 기본 데이터베이스 문법


- 데이터베이스 레벨 문법

    1) show databases :  데이터베이스를 시각적으로 표현하도록 하는 문법

    2) create database `~` : `~` 이름의 데이터베이스를 추가한다

> 이때, 여러 조건문이 추가적으로 뒤에 붙을 수도 있으나, 그 내용은 나중에 배움

    3) drop database `~` : `~` 이름의 데이터베이스 삭제

    4) use ~ : ~ 이름의 데이터베이스를 선택한다


- 테이블 레벨 문법

    1) show tables : 해당 데이터베이스에 있는 모든 테이블을 보여줌

    2) desc `~` : `~` 이름을 가진 테이블의 스키마를 출력

> 이때, "스키마" 는 쉽게 말하면 "스켈레톤"이랑 똑같다고 보면 됨

    3) create table `~` : 해당 데이터베이스에 `~` 이름의 테이블을 생성

> 기본 문법 :

CREATE TABLE table_name (

  칼럼명1 data_type,

칼럼명2 data_type

)

> 추가 조건문은 아래에 후술

    4) drop table `~` : 해당 데이터베이스에 있는 `~` 이름의 테이블 삭제

    




# 데이터 타입 종류


    - 문자 관련 데이터 타입 : 

> (최대 길이/용량 기준) char, varchar < tinytext < text

       ** char 의 경우, 정해진 길이가 있기 때문에 항상 차지하는 용량으로 인해 비효율적일 수 있으나, 검색 속도가 빠름

     ** varchar 의 경우, 길이가 다양하더라도, 딱 해당된 길이만큼만의 용량을 차지하기 때문에 메모리 낭비가 없다.


    - 숫자 관련 데이터 타입 : 

> (최대 길이/용량 기준) tinyint < smallint < mediumint < int


    - 날짜 관련 데이터 타입 : date, datetime 등


    - 특수 데이터 타입 : enum (딱 정해진 입력만 받을 수 있다)






# 테이블에 데이터 삽입하는 문법


- 방법1)    INSERT INTO table_name VALUES (value1, value2, value3,...) 

> 장점 : 일일이 컬럼 내용을 기술할 필요가 없어서 간편


- 방법2)    INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)

> 장점 : 컬럼 순서를 바꿔서 입력이 가능하며, 

해당 컬럼에 입력할 내용이 없을 경우, 디폴트 값으로 입력됨







# 테이블의 필드 값을 수정하는 문법


- 기본 문법 : 


> UPDATE (테이블명) SET (컬럼1=컬럼1에 새로 넣을 data), (컬럼2=컬럼2에 새로 넣을 data) WHERE (특정한 row 를 뽑기 위한 column조건문)


ex) UPDATE `student` SET address='서울';

> where 조건문이 따로 없기 때문에, 모든 row 에 대해서 적용

ex) UPDATE `student` SET name='이진경' WHERE id=1;

> id=1 인 row 에 대해서만, name 컬럼값을 이진경으로 바꿔줌

ex) UPDATE `student` SET name='이고잉', birthday='2001-4-1' WHERE id=3;

> 여러 개의 컬럼을 바꿔줄때도 이 방식을 활용





# 삭제 관련 문법



- 테이블 "자체를" 전체 삭제 문법 

> drop (테이블 명) : `~` 라는 이름의 테이블을 삭제한다


- 행 단위로 테이블 데이터 삭제 : 

> delete from (테이블 명) [where (삭제하려는 행의 column 관련 조건)]

    ex) DELETE FROM student WHERE id = 2;


- 테이블 안에 있는 "데이터들 전체" 삭제 문법

> truncate (테이블 명)






# 조회 관련 문법


- 기본 문법 구조 :

      > select (특정 column 명) from (특정 테이블 명) where (특정 column 을 뽑기 위한 column 조건)

ex) SELECT name, birthday FROM student WHERE id=3;

      > 조건문 종류 :
                 1) limit

2) group by

3) order by

4) key

5) join


- limit 조건문 :

      > select (~) from (~) limit  숫자1, 숫자2 : 숫자1을 기준으로, 숫자2 개의 행을 가져온다

ex) SELECT * FROM student LIMIT 1,3 <- 1행을 기준으로, 3개의 행을 가져온다


- group by 문법 :

      > SELECT (특정 column 명) FROM (테이블명) GROUP BY (그룹핑 할 기준 칼럼명)

> 이렇게 할 경우, 그룹핑 기준으로 행들을 정리할 수 있다.

    ex) select sex from student group by sex;

    ex) select sex,sum(distance), avg(distance) from student group by sex;


- order by 문법 : 

      > select (특정 column 명) from (테이블 명) order by (정렬 기준이 되는 column 명1, desc/asc),  (정렬 기준이 되는 column 명2, desc/asc)

ex) select * from student order by distance desc, address asc;



- 조회를 위한 설정 : key

     > key 종류 : primary key, unique key, normal key, 중복 key

1) primary key

     ex) PRIMARY KEY (`id`) ;

2) unique key

       ex)  UNIQUE KEY `idx_number` (`number`) USING BTREE ;

> 두 키의 공통점 : 중복을 허용하지 않는다 -> 따라서, 검색이 빠르다

> 두 키의 차이점 : primary 의 경우엔 오로지 하나의 column만을 설정할 수 있으나, 

unique 의 경우엔 여러 개의 column 을 unique 설정할 수 있다

3) normal key

     ex)  KEY `idx_department` (`department`),

> 특정 컬럼의 값을 키 값으로 설정함. 

   이때, 키 값을 컬럼과는 다른 이름으로 지을 수 있다는 점에서는 메리트가 있는듯.

   내가 편하게 쓸 수 있는 키 값의 이름으로 설정할 수 있으므로.

4) 중복 key

     ex)  KEY `idx_department_name` (`department`,`address`),

> 여러 개의 컬럼을 하나로 묶어서, 하나의 키 값으로 사용할 수 있다.


- Join 문법 :

     > 문법 형식 : SELECT (출력 하고 싶은 column)  FROM (테이블 1) LEFT JOIN (테이블 2) ON (두 테이블을 연결시킬 조건);


     > 의의 : 여러개의 테이블을 하나로 뭉치기 위한 방식


     > 전체적인 원리 : 

1. (두 테이블을 연결시킬 조건)을 기준으로, 집합을 그려본다 <- 교집합 부분은, 테이블1과 2가 공통으로 조건을 만족하는 행이다

2. Join 의 종류에 따라, 다르게 출력한다


     > 종류 : (링크 : https://opentutorials.org/course/195/1409 )

1) 내부 join : 오로지, 교집합인 행만 출력한다

2) 외부 join : 교집합 이외의 다양한 집합 행을 출력한다

       > 대표적으로 left join, right join 이 있으며, full outer join문도 있다





# 사용자 권한 문법


- 기본 문법 형식 :

> GRANT (권한 종류) ON (데이터베이스 . 테이블) TO ('아이디'@'호스트') IDENTIFIED BY ('비밀번호')


- 각 부분별 설명 (1) : TO ('아이디'@'호스트') IDENTIFIED BY ('비밀번호')

     > 용도 : 사용할 수 있는 사람이 누구인가?

     > 아이디 형식 : 

1) egoing@123.100.100.100 : egoing 이라는 사용자이며, 123.100.100.100 라는 IP 에서 접근할때만 가능

2) egoing@% : egoing 이라는 사용자이기만 하면 가능 (IP 제한 없음)

    > 이 아이디이 형식이어야 하며 + 비밀번호도 일치해야 한다


- 각 부분별 설명 (2) : ON (데이터베이스 . 테이블)

     > 용도 : 어떤 테이블에 접근하고 싶은가?

     > 형식 :

1) 기본 : 

2) 특수 : 

    -  (데이터베이스 명) . *    : 특정 데이터베이스의 "모든" 테이블들을 가져온다

    -  * . *    : "모든" 데이터베이스의 "모든" 테이블들을 가져온다


- 각 부분별 설명 (3) : 권한의 제한


     > 용도 : 어떤 권한을 허용할 것인가?


     > 종류 : create, drop, alter 등등..


     > 주로 통용되는 권한 템플릿

1) 개발자에게 허용되는 권한 :   

        (테이블 내용물 변경) DELETE, INSERT, SELECT, UPDATE

> 테이블의 "내용물" 에 접근하는것만 허용함

2) 설계자에게 허용되는 권한 :   

        (테이블 구조 변경) ALTER, CREATE, DROP, INDEX     <- 데이터베이스/테이블 "자체" 를 생성/변경한다

        (테이블 내용물 변경) INSERT, SELECT, UPDATE, DELETE, INSERT   <- 테이블의 "행" 만을 생성/변경한다

> 테이블 "구조"를 변경하는 것도 허용

3) DBA에게 허용되는 권한 :   "모든" 권한 허용


     > 특정 사용자의 권한 열람 

- 문법 : SHOW GRANTS [FOR 사용자]

     ex) SHOW GRANTS FOR dev;


- 사용자의 권한 제거를 위한 문법


     1) 권한만 삭제하는 방식    : Revoke 문법

> 형식 : REVOKE (권한 종류) ON (데이터베이스 . 테이블) FROM (사용자)

       - 특정 사용자가, 특정 테이블에 접근하는 특정 권한을 제거해준다

  ex) revoke DELETE on class.* from dev;


     2) 아예 허용 가능했던 사용자를 삭제하는 방식 : Drop User 문법

  > 형식 : DROP USER (사용자 형식)

       - 특정 사용자를 아예 권한 이용 자체를 못하도록 해준다

  ex) DROP USER `dev`@`%`;


'데이터베이스 & 웹 > 데이터베이스' 카테고리의 다른 글

ER 모델링  (0) 2020.04.29