Redshift를 활용하여 Sql을 공부하기 위한 환경을 만들어 보겠습니다.
먼저 AWS Management Console을 이용하여 Redshift 대시보드를 만들어줍니다. (학습을 위한 무료 Serverless를 사용하였습니다.)

이제 대시보드에 데이터를 미리 저장해서 사용할 것인데 사용할 데이터베이스의 예제는 다음과 같습니다.
웹 서비스 사용자와 그에 맞는 세션 정보를 임의의 데이터를 저장하여 활용할 예정입니다.
큰 틀의 데이터베이스 구성을 이렇게 하고

각각의 테이블들을 다음과 같이 저장해놓는다.
![]() | ![]() |
|---|---|
user_session_channel 테이블 | session_timestamp 테이블 |
위에서 저장한 데이터들을 이용하여 Redshift 중심으로 DDL과 DML을 알아보겠습니다.
CREATE TABLE raw_data.user_session_channel (
userid int,
sessionid varchar(32) primary key,
channel varchar(32)
);
DROP TABLE table_name;
/*없는 테이블을 지우려고 하는 경우 에러를 냄*/
DROP TABLE IF EXISTS table_name;
/*IF EXISTS를 이용하여 에러 방지*/
vs. DELETE FROM
/*DELETE FROM은 조건에 맞는 레코드들을 지움 (테이블 자체는 존재)*/
3.ALTER TABLE
새로운 컬럼 추가:
- ALTER TABLE 테이블이름 ADD COLUMN 필드이름 필드타입;
기존 컬럼 이름 변경:
- ALTER TABLE 테이블이름 RENAME 현재필드이름 to 새필드이름
기존 컬럼 제거:
- ALTER TABLE 테이블이름 DROP COLUMN 필드이름;
테이블 이름 변경:
- ALTER TABLE 현재테이블이름 RENAME to 새테이블이름;
Redshift를 활용하여 Sql을 공부하기 위한 환경으로 Colab을 이용해 보겠습니다.
구글 colab에서는 Sql이 업데이트 되어서 다른 모듈과 충돌하여 다운그레이드를 이용해주어야 할 필요가있습니다.
!pip install ipython-sql==0.4.1
!pip install SQLAlchemy==1.4.49
그후 sql을 이용하기 위해 아래의 코드를 실행해 주고
%load_ext sql
아래와 같은 방식으로 이용하여 줍니다.
%%sql
SQL코드내용
SELECT를 이용하는데 추가적인 정보를 소개하겠습니다.
1. SELECT
SELECT의 기본적인 문법
SELECT 필드이름1, 필드이름2, …
FROM 테이블이름;
*을 통해 모든 필드를 불러오는 방법이 있습니다.
또는 테이블의 이름을 자신이 원하는 순서대로 불러올 수 있습니다.
SELECT *
FROM 테이블이름1, 테이블이름2, 테이블이름3;
유일한 필드 이름을 알고 싶은 경우
SELECT DISTINCT 필드이름
FROM 테이블이름;
필드의 모든 레코드 수 카운트. COUNT(*). 하나의 레코드
SELECT 필드이름, COUNT(1)
FROM 테이블이름;
추가로 WHERE을 이용해 세부이름의 레코드만 카운트도 가능합니다.
WHERE 필드 = '세부이름';
CASE WHEN
- 필드 값의 변환을 위해 사용 가능
CASE WHEN 조건 THEN 참일때 값 ELSE 거짓일때 값 END 필드이름
- 여러 조건을 사용하여 변환하는 것도 가능
CASE
WHEN 조건1 THEN 값1
WHEN 조건2 THEN 값2
ELSE 값3
END 필드이름
NULL이란?
- 값이 존재하지 않음을 나타내는 상수. 0 혹은 ""과는 다름
- 필드 지정시 값이 없는 경우 NULL로 지정 가능
테이블 정의시 디폴트 값으로도 지정 가능
- 어떤 필드의 값이 NULL인지 아닌지 비교는 특수한 문법을 필요로 함
field1 is NULL 혹은 field1 is not NULL
- NULL이 사칙연산에 사용되면 그 결과는?
SELECT 0 + NULL, 0 - NULL, 0 * NULL, 0/NULL
- 전부 NULL값이 나오게 됩니다!
IN
- WHERE channel in (‘Google’, ‘Youtube’)
WHERE channel = ‘Google’ OR channel = ‘Youtube’
- NOT IN
LIKE and ILIKE
- LIKE is 는 case sensitive string match. ILIKE is 는 case-insensitive string match
- WHERE 필드이름 LIKE ‘가%’ -> ‘가*’
- WHERE 필드이름 LIKE ‘%나%’ -> ‘*나*’
- NOT LIKE or NOT ILIKE
BETWEEN
- Used for date range matching
위의 오퍼레이터들은 CASE WHEN 사이에서도 사용가능
STRING Functions
- LEFT(str, N)
왼쪽부터 N개의 str만 가져옴
- REPLACE(str, exp1, exp2)
exp1의 값을 exp2의 값으로 교체해줌
- UPPER(str)
대문자로 변경
- LOWER(str)
소문자로 변경
- LEN(str)
- LPAD, RPAD
특정 str을 붙여준다 (L, R으로)
- SUBSTRING
LEFT와 비슷하지만 시작위치를 설정할 수 있다.
ORDER BY
- Default ordering is ascending
ORDER BY 1 ASC
- Descending requires “DESC”
ORDER BY 1 DESC
- Ordering by multiple columns:
ORDER BY 1 DESC, 2, 3
- NULL 값 순서는?
NULL 값들은 오름차순 일 경우 (ASC), 마지막에 위치함
NULL 값들은 내림차순 일 경우 (DESC) 처음에 위치함
이를 바꾸고 싶다면 NULLS FIRST 혹은 NULLS LAST를 사용
타입 변환
DATE Conversion:
- 타임존 관련 변환
CONVERT_TIMEZONE('America/Los_Angeles', ts)
select pg_timezone_names();
- DATE_TRUNCATE
시간, 일 또는 월 등 지정하는 날짜 부분을 기준으로 타임스탬프 표현식 또는 리터럴을 자릅니다.
- DATE_TRUNC
첫번째 인자가 어떤 값을 추출하는지 지정(week, month, day, …)
- EXTRACT or DATE_PART:
날짜시간에서 특정 부분의 값을 추출가능
- DATEDIFF
날짜의 차이점 반환
- DATEADD
날짜 더해주기
- GETDATE
현재날짜
- TO_CHAR, TO_TIMESTAMP
날짜를 char형으로 바꿔주거나 char를 날짜형식으로 바꿔줌
주