Dev/SW Engineering

29. Databases - Structured Query Language with Database

HJChung 2020. 8. 17. 21:30

이번 sprint에서는 대표적인 관계형 데이터베이스관리 시스템(RDBMS)인 MySQL을 이용하여 Schema를 설계하고 SQL을 사용하여 데이터를 영속성있게(persisstently)저장하는 방법을 배우는 것이 목표였다. 

0. 데이터베이스가 필요한 이유

지난 여러 sprint를 진행해 오면서는 서버를 작성하고, 생성된 데이터들은 in-memory상에 저장하여서 클라이언트에서 HTTP를 이용하여 자원(데이터)를 요청하면 서버에 이 데이터를 돌려주는 방식으로 진행했었다.

(*in-memory: 서버가 켜져 있을 동안에만 변수에 할당된 값을 통해 저장하는 것)

그 다음에는 node.js의 fs모듈 중 readFfile이나 writeFile method를 이용하여 정보를 파일로 저장하기도 했다. 

 

이 두 방식의 한계는

in-memory의 한계: 저장한 곳을 끄면 데이터가 사라짐

File I/O 의 한계: 원하는 데이터만 가져올 수 없고 항상 모든 데이터를 가져온 뒤 서버에서 for, if문을 통해 필터링이 필요하다 그리고 데이터 중복으로 인해 여러 문제가 발생할 가능성도 있다.

 

그래서 이번 Sprint부터는 '필터링 외에도 File I/O로 구현이 힘든 관리를 위한 여러 기능들을 가지고 있는 데이터에 특화된 서버를 이용하고 필터링을 위해서는 Query문을 사용해서 간편하게 할 수 있는' Database에 대해 배웠다.

1. 개념

  • 데이터베이스(DB): 데이터베이스는 조직체의 운영 시스템들이 공유해서 사용하는 데이터들이 구조적으로 통합된 모임이다.
  • 데이터베이스 관리 시스템(DBMS): 데이터베이스를 정의하고, 질의어를 지원 등의 작업을 수행하는 소프트웨어이다. 
  • 예를 들면,
  • 사용자가 -> DBMS를 통해 -> 새로운 DB를 생성, DB 스키마를 명시... 등을 할 수 있다. 
  • 권한없는 사용자가 DB에 접근하려하면 -> DBMS가 DB를 보호
  • 여러사용자가 DBMS를 통해 DB에 안전하게 동시 접근 가능하게 함 .. 
  • SQL: Structured Query Language로 구조화된 Query언어라는 의미
  • Query: 직역을 하자면 "질의어"로, 저장 되어있는 정보를 필터하기 위한 문장

=> 그래서 SQL은 데이터베이스용 프로그래밍 언어로, 데이터베이스에 Query를 보내서 원하는 데이터만을 뽑아올 수 있다. 

2. 데이터베이스 시스템 구조 및 기본 개념

  • schema: 전체적인 데이터베이스 구조를 보여줌
  • 데이터베이스 상태: 특정 시점의 데이터베이스 내용을 의미

데이터베이스 서버에는 여러개의 데이터베이스가 있고, 

그 데이터베이스에는 여러개의 표가 있을 수 있다. 

 

3. RDBMS

: 관계형 데이터베이스

속성 및 특징)

- 모든 데이터를 2차원의 Row와 Column으로 이루어진 테이블로 표현

- 서로 관계가 있는 여러 테이블로 구성되어 있고, Entity-Relationship 모델이라고 해서 E-R 모델이라고도 한다. 

 테이블A가 테이블B와 어떤 관계를 가지고 있는지 표현한는데 유용하다.  

 

이 관계를 나타내는 것 중 가장 중요한 것이 Normalization이다. 즉, 복수로 들어가는 부분을 최대한 줄이면서 관계형으로 표현하는 방식이다. 

docs.google.com/presentation/d/e/2PACX-1vRH93UY-qrzkeNn0HEKjy8kdUyQkriYChX7PKvl4m9phG2G8JogIfMW_wETb-qSLtHmP0_3FeHYza7p/embed?slide=id.g106225b11d_0_140

<== 이거 여기에 잘 정리해서 다시 공개로 돌리기!!!!

 

4. 데이터베이스의 생성 및 사용

1)  MySQL을 설치한다. 

MacOS에서의 설치 및 사용 ↓

더보기

1. Homebrew 패키지 매니저 설치

$brew install mysql

$brew info mysql

2. MySQL 서비스 시작

$brew services start mysql

3. MySQL 접속

$mysql -u [계정명] -p

 

reference: https://gist.github.com/nrollr/3f57fc15ded7dddddcc4e82fe137b58e

이렇게 나오면 잘 설치 된 것이다. 

  • 데이터베이스 생성: 
CREATE DATABASE [데이터베이스명]
  • 데이터베이스 삭제: 
DROP DATABASE [데이터베이스명]
  • 데이버베이스 확인: 
SHOW DATABASES
  • 앞으로 나 이 데이터베이스 사용할거야~ 라고 명시: 
USE [데이터베이스명]

이렇게 잘 되었다면 GOODGOOD

4. 테이블의 CRUD

  •  테이블 생성 : 
CREATE TABLE [테이블명] (테이블 구조 선언)

  •  테이블에 데이터 CRUD 하기전 할 것들
    • 테이블 생성할 데이터베이스 선택 : USE [데이터베이스 명], 확인: SHOW DATABASES
    • 테이블 뭐있나 확인:
SHOW TABLES

 

  • 데이터를 넣을 테이블의 구조를 띄워놓고 그에 맞춰서 넣으면 좋으니 테이블 구조 확인:
DESC [테이블 명]

  • 테이블에 데이터 추가:
INSERT INTO (해당하는 Column명들) VALUES (해당하는 데이터 값들)

예) Insert a new record in the Customers table.

INSERT INTO Customers ( CustomerName, Address, City, PostalCode, Country ) 
VALUES ( 'Hekkan Burger', 'Gateveien 15', 'Sandnes', '4306', 'Norway' ) ;
  • 데이터 보기: 
SELECT

1. 모든 데이터 읽기: SELECT * FROM [테이블 명]

2. 읽고싶은 column만 표시: SELECT [Column명] FROM [테이블 명]

이 외에도 너무나 많은 데이터들을 이런 Query문을 통해 확인할 수 있다. 더 자세히는 뒤에서 정리할것이다. 

  • 데이터 수정:
UPDATE [테이블명] SET (뭘로 바꿀지) WHERE (어디를 바꿀지)

  • 데이터 삭제:
DELETE FROM [테이블명] WHERE [어디를 삭제할지]

이 외에도 다양한 명령어가 있다. 

DML(Data Manipulation Language) 데이터 조작

SELECT
https://www.w3schools.com/sql/sql_select.asp
데이터 조회
INSERT https://www.w3schools.com/sql/sql_insert_into_select.asp 데이터 추가
UPDATE
https://www.w3schools.com/sql/sql_update.asp
데이터 수정
DELETE
https://www.w3schools.com/sql/sql_delete.asp
데이터 삭제

 

DDL(Data Definition Language) 테이블 등의 데이터 구조 정의

CREATE
https://www.w3schools.com/sql/sql_create_table.asp
데이터 구조 생성
ALTER
https://www.w3schools.com/sql/sql_alter.asp
데이터 구조 변경
DROP
https://www.w3schools.com/sql/sql_drop_table.asp
TRUNCATE
TRUNCATE TABLE table_name;
데이터 구조 삭제
RENAME 데이터 구조 이름 변경

DCL(Data Control Language) 데이터 접근 제어

GRANT 데이터 접근 권한 부여
REVOKE 데이터 접근 권한 회수

DELETE, TRANCATE, DROP의 차이점

  • DELETE : 데이터만 삭제되며 테이블 용량은 줄어들지 않는다.또한 삭제후 되돌릴수 있다.
    롤백 정보를 기록하기 때문에 truncate 보다 느리다.
  • TRANCATE - 테이블 구조만 나머지 모든 데이터는 삭제된다. 되돌릴 수 없다.
  • DROP - 테이블 전체를 그냥 없앤다. 되돌릴수 없다.
구분 테이블 정의  저장공간 데이터 작업속도 SQL문 복구
DELETE 존재 그대로 유지 삭제 느림 DML 가능
TRUNCATE 존재 반납 삭제 빠름 DDL 불가능
DROP 삭제 반납 삭제 빠름 DDL 불가능

이 외에도 많은 문법들이 있는데 https://www.w3schools.com/sql/

 

SQL Tutorial

SQL Tutorial SQL is a standard language for storing, manipulating and retrieving data in databases. Our SQL tutorial will teach you how to use SQL in: MySQL, SQL Server, MS Access, Oracle, Sybase, Informix, Postgres, and other database systems. Start learn

www.w3schools.com

이 곳의 SQL Tutorial들이 너무 잘 되어있었다, 

https://elrion018.tistory.com/23

 

튜토리얼 하기 좋은 사이트 W3스쿨즈(w3schools.com)

https://www.w3schools.com/ 안녕하세요. 오늘은 문제만 풀 것이 아니라 코딩 학습에 유용한 웹페이지를 하나 추천하려고 포스팅합니다. 이전 SQL 포스팅 관련해서, 여기서 제가 SQL 튜토리얼을 진행하고

elrion018.tistory.com

여기를 참고해서 잘 활용하면 매우 좋을 것 같다!

 

5. Query문 실행 순서

위의 과정까지 다 하면 

  • Select
  • Where
  • And, Or, Not
  • Order By
  • Insert Into
  • Null Values
  • Update
  • Delete
  • Count
  • Like
  • Wildcards
  • Aliases
  • Joins
  • Inner Join
  • Left Join
  • Right Join
  • Group By

이런 키워드들의 기본적인 사용법은 익힐 수 있다. 완전 사람의 언어처럼 되어있어서 쉽긴하지만 가끔

어순(?) 이 햇갈릴 때가 있다. 

그래서 제공해주신 reference에 올려주신  '쿼리문이 실행되는 순서'가 매우 도움이 되었다. 

  • 해당 데이터가 있는 곳은 찾아갑니다 - FROM
  • 다른 데이터와의 어떤 연결고리가 있는지 봅니다 - ON
  • 다른 데이터와 연결시키고 - JOIN
  • 조건에 맞는 데이터만 가져와서 - WHERE
  • 원하는 데이터로 가공하고 - GROUP BY
  • 가공한 데이터에서 조건에 맞는 것을 가져와서 - HAVING
  • 선택하고 - SELECT
  • 중복을 제거하고 - DISTINCT
  • 정렬합니다 - ORDER BY
  • 결론

FROM → ON → JOIN →WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY