SQL과 RDB에 대해 배웠고 SQL에서 사용하는 연산자 및 함수는 무엇이 있는지 알아보았습니다. 또한 DDL과 DML에 대해서보 배웠습니다.
Data Product: 데이터 사이언티스트, 데이터 분석가가 만들어내는 다양한 데이터 산출물을 포괄하는 말
Data Product를 만들 때 데이터베이스에서 데이터를 가져온다. (주로 SQL로 사용한다. - 데이터를 관리할 때도 사용한다.)
SQL 학습 목적
1. 원하는 형태로 데이터를 가져올 수 있다.
SQL 쿼리문을 작성할 때 대상 데이터가 작을수록 효율이 좋다. (기획팀 먼저 필터링 후 팀 별 sum을 하는 것이 더 효율적이다.)
2. 간단한 데이터 분석을 수행할 수 있다.
데이터 분석을 할 때 SQL은 데이터를 csv와 같은 형태로 추출하는 목적으로만 사용하고 파이썬이나 엑셀과 같은 다른 소프트웨어를 추가로 활용해 데이터 분석을 하는 경우도 자주있지만 기본적인 데이터 분석은 SQL로도 수행 가능하다. (빠르고 쉽게 원하는 값을 구할 수 있다.)
RDBMS / SQL 개요
데이터베이스는 데이터를 쌓아두는 것 뿐만 아니라 데이터를 관리하는 시스템을 필수적으로 필요하다. 따라서 데이터베이스는 관리 시스템까지 포함하는 개념으로 주로 사용한다.
관계형 데이터베이스(RDBMS)
가장 일반적으로 많이 사용하는 데이터베이스
표 형태
예) MySQL, PostgreSQL, MSSQL, ORACLE
비관계형 데이터베이스(NoSQL)
관계형 데이터베이스에 반발하는 의미에서 이름이 붙었다.
같은 NoSQL이라도 DB마다 데이터를 쌓는 형태가 다양하다.
표 형태가 아니라 기준이 되는 키를 통해 그에 대응되는 값에 접근하는 형태
예) MongoDB, Redis, cassandraDB
NoSQL의 하위 개념
- Key-value Store
- Column-family
- DocumentDB
- Graph DB
RDBMS
Transaction: DB상태를 변화시키는 논리적 실행 단위(데이터 작성, 수정, 삭제)
데이터 일관성: DB에서 transaction이 안전하게 수행된다는 것을 보장하기 위한 성질
RDBMS의 성질: ACID
Atomicity(원자성): transation의 시작과 종료사이에 일어난 data의 변경은 정상적이면 모두 저장되어야 하고, 문제가 있으면 모두 취소되어야 한다.
Consistency(일관성): Data 저장 시 엄격한 규칙을 적용하여 DB가 안깨지도록 보장하는 성질
Isolation(격리성): 여러 개의 transaction이 동일한 DB를 CRUD(생성, 읽기, 갱신, 삭제)할 때 중간 처리 결과를 참조하지 못하게하여 오류를 방지하는 성질
Durability(영속성): 저장된 데이터는 장애가 나도 저장되며 수동을 ㅗ지우지 않는 한 영구적으로 보관된다는 성질
스키마: 데이터베이스 내에서 데이터가 어떤 구조로 저장되어 있는지 나타낸다. (문자열, 정수)
수평 확장(Scale Out): DB에 데이터가 감당할 수 없는 수준까지 많아 졌을 때 DB를 여러 대로 늘려서 문제를 해결하는 방식
NoSQL
MongoDB와 같이 ACID Transaction을 지원하는 NoSQL DB도 경우도 있지만, 어떤 DB들은 성능상 이점을 누리기 위해 ACID 중 일부를 보장하지 않는 경우도 있다.
NoSQL DB는 데이터가 중복으로 저장되는 경우가 있고 이런 경우 수평 확장이 상대적으로 용이하다.
SQL
테이블: 행과 열로 이루어진 하나의 2차원 표 (하나 이상의 열과 행으로 이루어져있고 RDBMS에서는 모든 데이터가 테이블에 저장된다.)
행: 가로 한줄
열: 세로 한줄
관계형이라고 붙여진 이유는 데이터가 하나 이상의 열, 행과 관계를 맺고 있기 때문이다.
SQL문은 다른말로 SQL쿼리라고 한다. (쿼리는 질의하다라는 뜻이다.)
SELECT: 필요한 열
FROM: 필요한 테이블
WHERE: 조건
실무에서는 가능하다면 테이블 스키마를 미리 확인한 뒤 필요한 컬럼만 지정해 사용하는 것이 좋다. (쿼리를 효율적으로 작성하기 위해서는 필요한 행과 열만 가져와야 한다.)
여러 조건들이 있을 경우 조건을 편하게 삭제하고 추가하기 위해 WHERE 옆에 무조건 참인 조건을 넣어둔다. (1 = 1)
논리 연산자: AND, OR, NOT, IN, LIKE, BETWEEN, IS NULL
AND: 양 옆의 조건이 모두 참일 때 참을 반환
OR: 양 옆의 조건 중 하나라도 참이면 참을 반환
NOT: 거짓이면 참을 반환
IN: 좌측값이 우측 괄호 안에 포함될 때 참을 반환 (예: category IN (’스포츠’, ‘디지털’, ‘식품’))
NOT IN: 좌측값이 우측 괄호 안에 포함되지 않을 때 참을 반환 (예: category NOT IN (’스포츠’, ‘디지털’, ‘식품’))
LIKE: 문자열을 패턴을 검색하는데 사용한다. (예: name LIKE ‘%보호%’, name LIKE ‘_그릇’)
%: 0개 이상의 문자열을 의미한다.
: 한 개의 문자열를 의미한다. (가 여러 개 있다면 _의 개수만큼 문자열이 온다)
BETWEEN 연산자는 양쪽 끝 값도 포함한다.
IS NULL: 컬럼 값이 비어있는지 검사한다.
괄호의 역할
괄호 안의 연산을 먼저 수행한다.
쿼리가 헷갈릴 경우 조건을 하나씩 나눠 결과를 확인하는 것도 이해를 할 수 있는 좋은 방법이다.
정렬
ORDER BY: 오름차순, 내림차순으로 정렬할 때 사용(ASC: 오름차순, DESC: 내림차순)
문자열도 정렬 가능하다. (한국어: 가나다순, 영어: 알파벳순)
여러 컬럼을 통해 여러 정렬도 가능하다. (ORDER BY price DESC, name ASC - price 먼저 정렬)
컬럼명 대신 숫자도 사용 가능하다. (ORDER BY 1 DESC, 2 ASC - 1: 최종 결과의 첫번째 컬럼, 2: 최종 결과의 두번째 컬럼)
집계
집계함수는 SELECT 절에서 사용한다.
sum(컬럼명): 컬럼값의 합을 구하는 함수
avg(컬럼명): 컬럼값의 평균을 구하는 함수 (NULL값이 존재하면 그 행은 계산에서 제외한다. 5개 중 1개가 NULL이면 1개를 제외한 4개의 평균을 구한다.)
count(조건): 조건에 맞는 행 수를 반환 (조건에 1이나 *이 들어가면 NULL과 관계없이 행 수를 계산한다. 컬럼명이 들어가면 NULL값은 제외된다.)
count(distinct 조건): 조건에 맞는 행 중 중복되는 행은 하나로 생각하고 행 수를 반환 (5개 중 2개의 값이 동일하다면 4를 반환한다.)
집계 함수는 조건절(WHERE)을 먼저 실행 후 적용된다.
as: 새로운 컬럼명을 작성할 때 사용한다. 또한 기존 테이블에 없던 값을 옆에 붙일 수 있다. (넣을 값 as 컬럼명 - ‘programmers’ as new_col)
GROUP BY
결과값의 특정 컬럼을 기준으로 그룹화한다.
2개 이상의 컬럼에서도 그룹화가 가능하다.
HAVING
WHERE 절과 비슷하다.
차이점: WHERE 절은 그룹화를 하기 전에 필터링을 하고 HAVING은 그룹화 이후 결과를 필터링한다.
CONCAT: 여러 컬럼의 문자열 값들을 하나의 컬럼으로 합치기 위해 사용한다. (예: SELECT CONCAT(category, ‘-’, name), SELECT CONCAT(name, ‘의 가격은 ’, price, ‘입니다.’))
SUBSTRING: 문자열을 잘라서 부분만 변환하는 함수 (SUBSTR로도 사용 가능, 3개 값을 input으로 받는다.)
SUBSTRING(추출을 원하는 컬럼명, 시작위치, 추출을 원하는 길이)
LEFT(컬럼명, 추출 길이): 왼쪽부터 길이만큼 잘라서 변환하는 함수
RIGHT(컬럼명, 추출 길이): 오른쪽부터 길이만큼 잘라서 변환하는 함수
UPPER(조건): 알파벳을 대문자로 변환
LOWER(조건): 알파벳을 소문자로 변환
대소문자를 통일하면 검색의 오차를 줄일 수 있다.
CHAR_LENGTH(조건): 문자열의 길이를 반환하는 함수
ROUND(조건, 자리수): 반올림을 하는 함수 (자리수는 생략가능하고 기본값은 0이다.)
CEIL(조건): 소수점 올림 함수
FLOOR(조건): 소수점 내림 함수
TRUNCATE(조건, 자리수): 특정 자리수 이하를 버리는 함수 (자리수 생략 불가)
ABS: 절대값 함수
MOD(분자, 분모): 나머지를 구하는 함수 (0으로 나누면 NULL값이 반환된다.)
POW(x, y): x의 y승을 구하는 함수
GREATEST: 최대값을 구하는 함수
LEAST: 최소값을 구하는 함수
COALESCE(컬럼명, 값): NULL값을 특정한 값 혹은 같은 행의 다른 컬럼값으로 채우는 함수 (예: SELECT COALESCE(purchase_date, product_name), SELECT COALESCE(purchase_date, ‘Unknown’))
DDL과 DML의 차이
DDL: 테이블 구조를 생성, 삭제, 변경한다.
DML: 생성된 테이블 내에서 만들어진 결과물을 조회, 수정, 삭제한다.
뷰: 가상의 테이블, 기존의 테이블의 일부분이나 다른 테이블과 결함해 보여줄 때 사용한다.
인덱스: 데이터베이스에서 원하는 데이터를 빠르게 찾기 위한 목적으로 만드는 색인(index)
DROP와 DELETE의 차이
DROP은 테이블 전체를 삭제하는 반면 DELETE는 테이블 내에서 특정한 데이터를 삭제한다.
unsigned: 음수를 사용하지 않는다는 의미
varchar(문자열 길이): 문자열 길이에 따라 공간을 할당한다.
char(문자열 길이): 문자열 길이에 상관없이 주어진 공간을 할당한다.
varchar는 길이를 계산하는데 시간이 걸리므로 길이가 동일한 문자열을 생성할 경우 char로 해주는 것이 더 좋다.
PRIMARY KEY: 테이블 내에 모두에게 적용되는 고유한 id (각 행에 대한 주민등록번호같은 것 - 행마다 모두 다른 값이다.)
다른 DDL과 DML을 구분하기 위해 끝이나면 ;를 마지막에 붙인다.
RDBMS에 따라 할당한 문자열 길이를 초과하면 잘리기도하고 오류가 발생하기도 한다.
ALTER: 테이블 구조를 변경한다.
ALTER TABLE 테이블명 (add/modify/drop column/rename column) 컬럼명 데이터타입(사이즈);
새로운 열 추가: ALTER TABLE 테이블명 ADD COLUMN 새로운열명 데이터유형; (예: ALTER TABLE products ADD COLUMN description varchar(255);)
기존 열 수정: ALTER TABLE 테이블명 MODIFY COLUMN 열명 새로운데이터유형; (예: ALTER TABLE products MODIFY COLUMN price float;)
기존 열 삭제: ALTER TABLE 테이블명 DROP COLUMN 열명; (예: ALTER TABLE products DROP COLUMN description;)
DROP: 테이블을 삭제한다.
INSERT: 데이터를 삽입한다.
VALUES: 데이터를 삽일할 때(INSERT) 삽입할 데이터를 작성할 때 사용한다.
UPDATE: 테이블의 값을 변경할 때 사용한다.
DELETE: 특정 데이터를 삭제할 때 사용한다.
이번 강의를 통해 SQL의 다양한 연산자와 함수가 있다는 것을 알았지만 양이 많아 활용하는데 시간이 오래 걸릴 것 같습니다.