다음의 절차에 따라 진행하였습니다.
예제) 웹 사이트에서 각 유저의 정보와 세션 정보 저장 테이블.
user id
session id
정리) 기록되는 정보: 사용자 id, 세션 id, 세션 생성 시각, 채널
위 정보들을 통해서 데이터 분석 및 지표 설정이 가능합니다.
다수의 SQL문 실행 시 세미콜론이 필요합니다. ex) SQL문1; SQL문2; SQL문3;
주석처리 방법은 다음과 같습니다.
SQL 키워드는 대문자로 포맷팅합니다. ex) SELECT, FROM, WHERE, ..
테이블과 필드 이름의 명명규칙을 정해야 합니다.
테이블 구조 정의 언어.
primary key 속성을 지정할 수 있으나 무시됩니다. (not primary key uniqueness)
테이블 생성 예시)
CREATE TABLE schema_name.table_name(
field_1 field_1의 타입,
field_2 field_2의 타입
);
CTAS (생성과 동시에 레코드 저장)
CREATE TABLE schema_name.table_name AS SELECT ~~;
=> SELECT를 통해서 읽은 레코드로 table을 생성함.
테이블 삭제
DROP TABLE IF EXISTS(예외처리) schema_name.table_name;
=> table_name의 table이 있다면 해당 table을 삭제함.
테이블 변경
ALTER TABLE 테이블이름 ADD COLUMN 필드이름 필드타입;
ALTER TABLE 테이블이름 RENAME 현재 필드이름 TO 새 필드이름;
ALTER TABLE 테이블이름 DROP COLUMN 필드이름;
ALTER TABLE 테이블이름 RENAME TO 새 테이블이름;
테이블 데이터 조작 언어.
삽입) INSERT INTO 테이블이름 VALUES();
해당 연산은 속도가 느려서, 보통 bulk update 방식으로 합니다.
삭제)
DELETE FROM schema_name.table_name;
=> 테이블 내 레코드만 삭제. (테이블은 존재.)TRUNCATE
=> 위와 기능은 동일하며, 다만 TRANSACTION에 사용이 불가능하다는 차이점이 있습니다.선택)
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 선택 조건
GROUP BY 필드이름1, 필드이름2, ...
ORDER BY 필드이름 ASC or DESC
LIMIT N;
SELECT DISTINCT channel FROM ~~;
: 유일한 채널 이름을 알고 싶은 경우.
SELECT DISTINCT channel, COUNT(1) FROM ~~ GROUP BY 1;
: 채널별 카운트를 하고 싶은 경우. 1은 channel이 1번 필드이기 때문에 1로도 작성 가능. GROUP BY channel과 동일한 기능.
CASE WHEN 조건1 THEN 값1 WHEN 조건2 THEN 갑2 ELSE 값3 END 필드이름
: 특정 조건에 따라 값을 리턴 가능.
STRING
ORDER BY
TIME
Type Casting
현업에서 깨끗한 데이터란 존재하지 않습니다. 그러므로 항상 데이터를 의심해야 합니다. 그러기 위해서는 노가다(?)식으로 실제 레코드를 살펴보는 수밖에 없습니다.
데이터 품질에 관해서 다음과 같은 내용을 고려할 필요가 있습니다.
회사가 성장하고 어느 시점이 되면 너무나 많은 테이블들이 생기게 됩니다.
따라서, 회사 성장과 밀접한 관련이 있으며 중요 테이블들이 무엇이고 그것들의 메타 정보를 잘 관리하는 것이 중요합니다.
Data Discovery 문제를 해결하기 위한 다양한 오픈소스와 서비스들이 출현했습니다.