[SQL] SELECT, CASE WHEN, NULL, COUNT, STRING, 판다스 연동

SELECT 필드이름1, 필드이름2,...
FROM 테이블이름
WHERE 선택조건
GROUP BY 필드이름1, 필드이름2
ORDER BY 필드이름[ASC|DESC] -- 필드 이름 대신에 숫자 사용 가능
LIMIT N; N행만큼만 가져옴

SELECT

%%sql

SELECT *
FROM raw_data.user_session_channel;
  • raw_data 데이터베이스안에 user_session_channel을 다 가져옴
%%sql

SELECT userId, sessionId, channel
FROM raw_data.user_session_channel;
  • user_session_channel 테이블에서 SELECT 뒤 컬럼 이름들만 뽑아서 가져옴

LIMIT

%%sql

SELECT *
FROM raw_data.user_session_channel
LIMIT 10;
  • user_session_channel 테이블 전체를 가져오되 10개까지만 가져오도록 함

DISTINCT

%%sql

SELECT DISTINCT channel  -- 유일한 채널 이름을 알고 싶은 경우
FROM raw_data.user_session_channel;

  • user_session_channel 테이블에서 channel 컬럼을 가져오는데 DISTINCT 때문에 중복이 모두 제거되고 고유값만 나옴

COUNT

%%sql

SELECT channel, COUNT(1) --채널별 카운트를 하고 싶은 경우. COUNT 함수!!
FROM raw_data.user_session_channel
GROUP BY 1;

  • SELECT로 골라진 컬럼중 GROUP BY 의 숫자번째 컬럼을 기준으로 channel의 숫자들의 합을 구함
%%sql

SELECT COUNT(1) -- 테이블의 모든 레코드 수 카운트. COUNT(*). 하나의 레코드
FROM raw_data.user_session_channel;

  • user_session_channel 테이블의 모든 레코드(행) 수 카운트
%%sql

SELECT COUNT(1)
FROM raw_data.user_session_channel
WHERE channel = 'Facebook'; 
  • user_session_channel 테이블에서 channel이 "Facebook" 인 행의 숫자를 구함

  • SELECT COUNT(1) FROM count_test → 7
  • SELECT COUNT(0) FROM count_test → 7
  • SELECT COUNT(NULL) FROM count_test → 0 NULL값이라 기준이 없어서 스킵해, 카운트가 안됨
  • SELECT COUNT(value) FROM count_test → 6 널값 아닌것만 카운트
  • SELECT COUNT(DISTINCT value) FROM count_test → 4 널을 제외한 유니크한값 갯수만 파악

CASE WHEN

%%sql

SELECT
  channel,
  CASE
    WHEN channel in ('Facebook', 'Instagram') THEN 'Social-Media'
    WHEN channel in ('Google', 'Naver') THEN 'Search-Engine'
    ELSE 'Something-Else'
END channel_type
FROM raw_data.user_session_channel
LIMIT 100;

  • user_session_channel테이블의 channel컬럼을 가져오는데
  • CASE를 사용해서 WHEN 채널 데이터가 페이스북, 인스타 그램이면 'Social-Media'
  • 구글, 네이버면 'Search-Engine'으로
  • 그 외에는 'Something-Else'로
  • END 뒤에 있는 이름의 컬럼에 표시가 되도록 함
  • 리미트로 100개까지

NULL

  • 값이 존재하지 않음을 나타내는 상수. 0 혹은 "" 과는 다름
  • 필드 지정시 값이 없는 경우 NULL로 지정 가능
    - 테이블 정의시 디폴트 값으로도 지정 가능
  • 어떤 필드의 값이 NULL인지 아닌지 비교는 특수한 문법을 필요로 함

WHERE

IN

%%sql

SELECT COUNT(1)
FROM raw_data.user_session_channel
WHERE channel in ('Google','Facebook');
  • user_session_channel 테이블에서 채널 컬럼중에 구글과 페이스북이 있는 레코드만 가져오고
  • 전체개수를 컬럼으로 만듦

ILIKE

%%sql

SELECT DISTINCT channel
FROM raw_data.user_session_channel
WHERE channel ILIKE '%o%';

  • channel에서 o를 중간 값을 가지고 있는 채널만을 조건으로
  • 유니크한 값만 컬럼에 가져와줌
  • o% -> o로 시작하는, %o% -> 중간에 o가 들어가는, %o->끝이 o인 조건으로 가져옴
  • LIKE는 대소문자 구분, ILIKE 대소문자 구분 암함

STRING Functions

%%sql

SELECT
    LEN(channel),     
    UPPER(channel),
    LOWER(channel), 
    LEFT(channel, 4)
FROM raw_data.user_session_channel
LIMIT 100;
  • LEN -> 문자열 길이
  • UPPER -> 문자열을 모두 대문자로
  • LOWER -> 문자열을 모두 소문자로
  • LEFT -> 왼쪽부터 몇글자만 남김

ORDER BY

  • 기준을 정함
ORDER BY 1 ASC
ORDER BY 1 DESC
  • ASC는 오른차순
  • DESC는 내림차순
  • NULL 값들은 ASC 에서 마지막에 위치
  • NULL 값들은 DESC 에서 처음에 위치함

타입 변환

%%sql

SELECT 
    GETDATE(),
    CONVERT_TIMEZONE('America/Los_Angeles', GETDATE());

  • GETDATE로 현재 시간을 가져오고 컨버트 타임존을 사용해서 첫번째 인자 시간으로 두번째 인자 시간을 바꿈
  • 이거말고 다른 여러가지 툴이 있음

Type Casting

%%sql

SELECT 1/2, 1/2::float;

  • ::를 사용해서 float를 속성을 정의함
  • 컬럼 속성을 설정할 수 있음

판다스 변형

result = %sql SELECT * FROM raw_data.user_session_channel
df = result.DataFrame()

  • DataFrame()을 통해 판다스 포맷으로 변경 가능함

좋은 웹페이지 즐겨찾기