[ 오늘의 TODO ]
코드 스테이츠) 금 내용 복습// SQL- 패스트 캠퍼스) 인강 3개 이상 듣기 // optional
생활) 물 1L 이상 마시기

[ 오늘의 복습 ]
오늘 복습할 내용은 SQL 이다.
1. SQL 개념
데이터베이스는 관계형 데이터베이스와 비관계형 데이터베이스로 구분한다. 전자의 경우, SQL 을 기반으로 하고, 후자는 NoSQL 을 다룬다.
1) SQL 이란?
SQL 은 Structured Query Language 의 약자로 데이트 베이스의 언어다. MySQL, Oracle, SQLite, PostgreSQL 등 다양한 데이터베이스에서 SQL 구문을 사용할 수 있다, 데이터 베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있다. 그리고 이름에서 유추할 수 있듯이 구조화된 테이블을 사용하는 데이터베이스에서 활용할 수 있다. Query(쿼리) 란, 질의문이란 뜻이다. 검색할 때 입력하는 검색어가 일종의 쿼리다. 즉, 쿼리는 저장돼 있는 데이터를 필터링하기 위한 질의문이라 할 수 있다.
관계형 데이터베이스는 테이블의 구조와 데이터 타입 등을 사전에 정의하고, 테이블에 정의된 내용에 알맞은 형태의 데이터만 삽입할 수 있다. 이는 구조화 되어 있어서 SQL 을 사용할 수 있는 환경이라는 것을 의미한다. 특정 형식을 지키기에 데이터를 정확히 입력하면 데이터를 사용하거나 탐색할 때 매우 수월하다. 관계형 데이터베이스에서는 테이블관의 관계를 직관적으로 파악할 수 있다.
대표적으로 MySQL, Oracle, SQLite, PostgresSQL, MariaDB 등이 관계형 데이터베이스며 SQL 언어를 사용한다.
2) NoSQL 이란?
SQL 을 사용할 수 있는 데이터베이스와 달리, 데이터의 구조가 고정돼 있지 않은 데이터 베이스를 NoSQL 이라고 한다. 이런 경우, 테이블을 사용하지 않고 데이터를 다른 형태로 저장한다.
NoSQL 기반의 비관계형 데이터베이스는 구조화 돼있지는 않으나 다음과 같이 구성된다.
key - value
속성을 key-value 의 쌍으로 나타나는 데이터를 배열에 저장한다.
문서형 데이터베이스
데이터를 테이블이 아닌 문서처럼 저장한다. JSON 과 유사한 형식으로 묶어 문서화하야 저장한다. 각 문서는 하나의 속성에 대한 데이터를 가지고 컬렉션이라는 그룹으로 묶어 관리한다.
Wide-Column 데이터베이스
데이터베이스의 열에 대한 데이터를 집중적으로 관리하는 데이터베이스다. 각 열은 key-value 의 형태로 데이터가 저장되고 열의 집합체 단위로 데이터를 처리한다. 보통 규모가 큰 데이터 분석에 주로 사용된다.
그래프 데이터베이스
자료구조의 그래프와 비슷한 형식으로 데이터 간의 관계를 구성한다. 노드에 속한 속성별로 데이터를 저장하고 각 노드 간의 관계는 선으로표현한다.
3) SQL 기반 데이터베이스와 NoSQL 데이터베이스의 차이점
데이터 저장
NoSQL 의 데이터 저장 방식은 위에서 설명한 방식으로 저장되고, 관계형 데이터베이스는 데이터를 테이블에 저장한다. 저장 방식은 미리 작성해둔 스키마를 기반으로 정해진 형식과 구조에 맞춰서 저장한다.
스키마
SQL 을 사용하기 위해 고정된 형식의 스키마가 필요하다. 이는 데이터 속성별로 열에 대한 정보를 미리 정해둬야 한다는 것이다. 이러면 스키마를 수정은 할 수 있으나 데이터베이스 전체를 수정하거나 오프라인으로 전환해야할 수 있다. NoSQL 의 경우 스키마의 형태를 동적으로 관리할 수 있다. 새로운 열 추가가 쉽고 개별 속성에 대해 모든 열에 대한 데이터를 반드시 입력하지 않아도 된다.
쿼리
관계형 데이터베이스에서는 테이블 형식과 관계에 맞춰 데이트를 요청해야 한다. 그래서 정보 요청할 때 SQL 과 같은 구조화된 쿼리 언어를 사용한다. 반면, 비관계형 데이터에서는 쿼리를 통해 데이터 그룹 자체를 조회한다. 따라서 구조화되지 않은 쿼리 언어로도 데이터 요청이 가능하다
확장성
일반적으로 SQL 기반의 관계형 데이터베이스는 수직적으로 확장한다. 데이터베이스가 구축된 하드웨어의 성능을 많이 이용하기에 비용(높은 메모리, CPU 사용 등)이 많이 들고 복잡하고 시간이 많이 든다. 반면, NoSQL 은 수평적으로 확장한다. 많은 트래픽을 보다 편리하게 처리할 수 있고 저렴한 범용 하드웨어나 클라우드 기반의 인스턴스에 NoSQL 데이터베이스를 호스팅할 수 있어서 비용이 상대적으로 저렴하다.
이 둘은 각 상황에 맞춰서 적절하게 사용해야 한다.
SQL 을 사용하는 경우
- 데이터베이스의 ACID 성질을 준수하는 경우
=> 전자 상거래를 비롯한 금융 서비스를 위한 소프트 웨어 개발 등 - 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우
NoSQL 을 사용하는 경우
- 데이터 구조가 거의, 또는 전혀 없는 대용량의 데이터를 저장할 경우
- 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우
- 빠르게 서비스를 구축하는 과정에서 데이터 구조를 자주 업데이트 하는 경우
2. 데이터 베이스 관련 명령어
1) 데이터베이스 생성
CREATE DATABASE 데이터베이스_이름;
2) 데이터베이스 사용
데이터베이스를 이용해 테이블을 만들거나 수정, 삭제 작업을 하려면 데이터베이스를 사용하겠다는 명령을 먼저 전달해야 한다.
USE 데이터베이스_이름
3) 테이블 생성
USE를 이용해서 데이터베이스를 선택하면 테이블을 생성할 수 있다.
// 테이블 생성
CREATE TABLE 테이블_이름 (
속성1 int PRIMARY KEY AUTO_INCREMENT,
// Praimary key 이면서 자동 증가하도록 설정
속성2 varchar(255)
// 문자열 최대 255개 문자
)
SQL 콘솔에서 엔터키를 이용해 여러 줄의 코드를 입력할 수 있다.
4) 테이블 정보 확인
DESCRIBE 테이블_이름
3. SQL 명령어, 내장함수 간략하게 살피기
[ 명령어 ]
1) SELECT
데이터셋에 포함될 특성을 특정한다.
SELECT 'hi!'
SELECT 2
SELECT 8+8
// 문자열, 숫자, 간단한 연산 등이 들어갈 수 있다
2) From
테이블과 관련한 작업을 할 때 반드시 입력해야 한다. FROM 뒤에는 결과를 도출해낼 데이터베이스 테이블을 명시한다
SELECT 특성_1, 특성_2
FROM 테이블_이름
SELECT *
FROM 테이블_이름
* 는 와일드 카드로, 전부를 선택할 때 사용한다
3) WHERE
필터링을 하는 쿼리문이다.
// 특정 값과 동일한 데이터 찾기
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 = "특정 값"
// 특정 값을 제외한 값을 찾기
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 <> "특정 값"
// 부등호 사용 가능
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 > "특정 값"
// 문자열에서 특정 값과 비슷한 값 필터할 때 LIKE, %, * 등을 사용한다.
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 LIKE "%a" // a로 끝나는 것 (a% 라면 a로 시작하는 것)
// 리스트 값과 일치하는 데이터를 필터할 떄
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 IN ("특정값_1", "특정값_2")
// 값이 없는 경우 NULL 을 찾고자 할 떄
SELECT *
FROM 테이블_이름
WHERE 특성_1 IS NULL
// 값이 없는 경우를 제외할 때
SELECT *
FROM 테이블_이름
WHERE 특성_1 IS NOT NULL
4) ORDER BY
돌려받은 데이터 결과를 정렬할 때 사용한다.
SELECT *
FROM 테이블_이름
ORDER BY 특성_1
// 일반적으로 오름 차순이다.
ORDER BY 특성_2 DESC
// DESC 가 붙으면 내림 차순이다
5) LIMIT
결과로 출력할 데이터 갯수를 지정한다. 쿼리문에서 사용할 때 가장 마지막에 위치한다.
SELECT *
FROM 테이블_이름
LIMIT 200
// 200개까지의 데이터만 출력
6) Distinct
유니크한 값을 받고 싶을 때 SELECT 뒤에서 사용할 수 있다.
SELECT DISTINCT 특성_1,
FROM 테이블_이름
// 특성_1 을 기준으로 유니크한 값만을 가져온다.
SELECT DISTINCT 특성_1, 특성_2, ...
FROM 테이블_이름
// 각 특성들의 유니크한 조합 값을 선택한다.
7) INNER JOIN
INNER JOIN 이나 JOIN 으로 실행할 수 있다. ON 뒤에 테이블의 특성을 지정하고 그 특성에서 공통된 부분을 기준으로 연결한다.
SELECT *
FROM 테이블_1
JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B
8) OUTER JOIN
left, right, full 등의 선택지들이 존재한다. Left의 경우 FROM 바로 뒤에 적힌 테이블이 기준이 되고, Rigth 의 경우, JOIN 다음에 오는 테이블이 기준이 된다. FULL 은 둘 다를 의미.
[내장 함수]
1) GROUP BY
데이터를 조회할 때 그룹으로 묶어서 조회한다.
SELECT * FROM customers
GROUP BY State;
GROUP BY 를 통해서 customer 라는 테이블에 state 에 따라 그룹화할 수 있다.
2) HAVING
HAVING 은 GROUP BY 로 조회된 결과를 필터링한다.
SELECT CustomerId, AVG(Total)
FROM invoices
GROUP BY CustomerId
HAVING AVG(Total) > 6.00
이렇게 작성하면 모든 고객 주문서에서 가격의 평균을 구하고, 그 평균이 6.0 이 넘는 결과들만 조회한다. HAVING 은 WHERE 와 비슷하게 보일 수 있지만, HAVING 은 그룹화의 결과고, WHERE 는 저장된 레코드를 필터링하는 것이다.
3) COUNT ()
condition 으로 필터링된 table의 column 갯수를 센다. 즉, 레코드의 갯수를 헤아릴 때 사용한다.
SELECT COUNT(column_name)
FROM table_name
WHERE condition;
4) AVG ()
레코드의 평균값을 계산한다.
SELECT AVG(column_name)
FROM table_name
WHERE condition;
5) SUM ()
레코드의 합을 계산한다.
SELECT condition, SUM(column_name)
FROM table_name
GROUP BY condition;
GROUP BY 로 필터링했을 때 COUNT, AVG, SUM 만을 SELECT 하면 어떤 결과물인지 확인이 어려우므로 무엇을 기준으로 SUM을 한 것인지 알리기 위해 조건을 SELECT 하는 경우가 많다. WHILE 의 경우에도 condition 을 SELECT 할 수 있지만, WHILE 안에는 부등호 등의 연산 등이 들어갈 수 있기에 그 점을 유의하여 사용하면 된다.
6) MAX() / MIN()
MAX 는 레코드의 최댓값, MIN 은 레코드의 최솟값을 리턴한다.
SELECT MIN(column_name)
FROM table_name
WHERE condition;
SELECT MAX(column_name)
FROM table_name
WHERE condition;
[ SELECT 문 실행 순서 ]
데이터를 조회하는 SELECT 문은 다음과 같은 순서대로 동작한다.
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
4. ACID
ACID란 데이터베이스 내에서 일어나는 하나의 트랜잭션의 안전성을 보장하기 위해 필요한 성질을 뜻한다. 트랜잭션이란 여러 작업을 하나로 묶은 실행 유닛이다. 즉, 모든 작업이 다 정상 완료 돼야지 완료가 되고 만약 하나라도 실패할 경우 트랜잭션에 속한 모든 작업이 실패한 것으로 받아들인다. 이런 트랜 잭션의 특성을 Atomacity, Consistency, Isolation, Durability, 총 네 개로 구분하였고 약어로 ACID 라 부른다.
1) Atomicity (원자성)
앞서 설명했듯이 트랜잭션에 속해있는 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있어야 한다는 것이 원자성을 기반으로 하는 것이다. 트랜잭션이 부분적으로 어떤 것은 성공, 어떤 것은 실패로 실행된다면 업데이트가 일어났지만 누가 업데이트를 했는지 모르거나 데이터가 누락되는 등 일관되지 못하고 난잡하게 데이터가 구성될 수 있다.
2) Consistency (일관성)
데이터베이스의 상태가 일관돼야 한다는 성질이다. 트랜잭션이 일어난 후에도 데이터베이스는 데이터베이스가 갖고 있던 제약이나 규칙이 유효해야 한다는 것이다.
3) Isolation (격리성, 고립성)
모든 트랜잭션은 다른 트랜잭션으로부터 독립돼야 한드는 것이다. 트랜잭션이 하나만 실행되지 않고 여러 개가 동시에 실행될 경우 각 트랜잭션은 서로 격리돼 있어서 순차적으로 실행된 것과 동일한 결과를 내보내야 한다.
4) Durability (지속성)
하나의 트랜잭션이 성공적으로 수행됐다면, 해당 트랜잭션에 대한 로그가 남아야 한다. 만약, 런타임 오류나 시스템 오류가 발생하더라도 해당 기록은 영구적으로 보존돼야 한다.
5. 데이터 베이스 설계
1) 관계형 데이터베이스
구조화된 데이터는 하나의 테이블로 표현할 수 있다. 관계형 데이터베이스에서 사용하는 기본적인 언어들은 알아두고 가자.
- 데이터(data) : 각 항목에 저장되는 값
- 테이블(table / relation) : 사전에 정의된 열에 데이터 타입대로 작성된 데이터가 행으로 축적된다,
- 칼럼(column / field) : 테이블의 한 열
- 레코드(record / tuple) : 테이블의 한 행에 저장된 데이터
- 키(key) : 테이블의 레코드(행)를 구별할 수 있는 값. 각 레코드마다 고유한 값을 가지는데 기본 키(primary key)와 외래키(foreign key) 등이 있다. 어설픈 예를 들면 엑셀에서 맨 왼쪽에 있는 행 번호
2) 관계의 종류
1:1 관계
하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우를 뜻한다.
한 남성이 결혼했다고 하자. 그러면 그 남성의 배우자는 여성 한 명 뿐이다. 반대로 그 남성의 배우자인 여성도 마찬가지로 그 여성의 배우자는 남성 한 명 뿐이다. 이런 경우를 1:1 관계라고 한다. 1:1의 관계는 자주 사용하진 않는다.
1:N 관계
하나의 레코드가 서로 다른 여러 레코드와 연결된 경우를 뜻한다.
아버지인 사람은 슬하에 여러 자식을 둘 수 있다. 반면에 그 부모의 여러 자식의 아버지는 한 분뿐이다. 이와 같은 경우를 1:N 의 관계라고 한다. 보통, 이 관계가 많이 쓰인다.
N:N 관계
N:N 이란 여러 레코드가 다른 테이블의 여러 레코드와 관계가 있는 경우를 의미한다.
학원은 여러 학생들을 받을 수 있다. 반대로, 학생도 마찬가지로 여러 학원을 다닐 수 있다. 이런 경우를 N:N 이라고 한다.
자기 참조 관계
자기 참조 관계란 한 레코드가 자신이 속한 테이블 중 다른 레코드를 참조하는 경우를 말한다. 예를 들어 한 학원의 수강생들이라는 테이블 내부에서 레코드로 존재하는 한 학생이 추천인이 누군지 파악하는 용도로 다른 레코드를 참조할 수 있다.
다음은 음원을 판매하는 사이트의 스키마 예시다.
'코드스테이츠 > 코드스테이츠 @ 개발 복습' 카테고리의 다른 글
[코드 스테이츠] 91일차, "13주차 복습 (2)" (0) | 2021.10.17 |
---|---|
[코드 스테이츠] 90일차, "13주차 복습 (1)" (0) | 2021.10.16 |
[코드 스테이츠] 84일차, "12주차 복습(2)" (0) | 2021.10.11 |
[코드 스테이츠] 83일차, "12주차 복습 (1)" (0) | 2021.10.09 |
[코드 스테이츠] 63일차, "9주차 복습 (2) - Redux" (0) | 2021.09.19 |