[데브코스] SELECT, GROUP BY

Updated: Categories:

W2D3 - RDS MySQL에 접속하고 SELECT문 실습~

실습하다보니 문법 다 까먹어서 좀 정리해두려고 한다…


RDS - MySQL Workbench 접속

  • 이미 사용하는 환경과 동일해서 Pass


SELECT

  • 구문 순서 잘 지키기~
SELECT [DISTINCT] 필드명
FROM 테이블명
JOIN 테이블명 ON 기준설정(키값매핑)
WHERE 조건
GROUP BY 필드명1, 필드명2
ORDER BY 필드명 [ASC|DESC]
LIMIT N ;


COUNT

  • 카운트할때 기본적으로 NULL 값은 포함되지 않음
SELECT COUNT(*) ... -- => 결과값의 모든 레코드 수
SELECT COUNT(1) ... -- => 결과값의 모든 레코드 수
SELECT COUNT(0) ... -- => 결과값의 모든 레코드 수
SELECT COUNT(NULL) ... -- => 아예 카운트하지 않음
SELECT COUNT(필드명) ... -- => 해당 컬럼의 NULL을 제외하고 셈
SELECT COUNT(DISTINCT 필드명) ... -- => 중복제거 데이터 종류를 셈(NULL 제외)


CASE WHEN

  • 조건에 맞는 필드의 이름을 변환하여 출력할 때 사용
SELECT 필드명
CASE 
    WHEN 조건1 THEN 2
    WHEN 조건2 THEN 2
    ELSE 3
END AS 새로운 필드이름
FROM 테이블명


IN/LIKE

  • in은 OR로 작동함
  • SQL 와일드 카드는 *이 아닌 %이다
'필드명' IN (1, 2, 3)
'필드명' LIKE '%A%' 


str function

LENGTH('필드명')     
UPPER('필드명')
LOWER('필드명')
LEFT('필드명', '자를문자수')
RPAD('필드명', '뒤에얼마나붙일지', '-')


ORDER BY

  • NULL 값은 가장 작은 값으로 취급 (오름차순시 가장 앞에 나옴)
  • 옵션 생략시 오름차순(ASC)으로 정렬
ORDER BY '필드명'
ORDER BY '필드명' ASC
ORDER BY '필드명' DESC


타입변환

시간관련

  • 함수의 결과이므로 필드명을 설정해주자
SELECT
  CONVERT_TZ('필드명', 'GMT', 'Asia/Seoul') seoul_time,
  YEAR('필드명') y, QUARTER('필드명') q, MONTH('필드명') m, MONTHNAME('필드명') mnn, 
  DATE('필드명') d, HOUR('필드명') h, MINUTE('필드명') m, SECOND('필드명') s,
  DATEDIFF('날짜', '날짜') gap_in_days,    -- 두 날짜 뺀 일수
  DATE_ADD('날짜',  INTERVAL 'N' DAY) ten_days_after_created    -- 날짜에 입력값 더한 일수
  ...

연산관련

  • 정수끼리 연산 결과는 항상 정수나옴 ex) 1/2 = 0
  • 정확한 결과 얻으려면 캐스팅 필요
SELECT
    STR_TO_DATE('날짜문자열','%d,%m,%Y'),
    cast('바꿀값' as '타입'),
    convert('바꿀값', '타입'),
    ...


GROUP BY

  • SELECT 문이 실행된 결과를 그룹핑 하는 것임!!! (맨날 헷갈린다)
  • 필드에 집계함수가 쓰이면 그룹핑 이후 연산
  • group by에 숫자 넣는건 select 결과 필드들의 일련번호이다
  • count 함수에는 new 필드명이 들어가지 못하므로… 일련번호를 써줘야 한다
SELECT 
  LEFT(s.created, 7) AS mon,
  c.channel,
  COUNT(DISTINCT user_id) AS mau
 FROM prod.session s
 JOIN prod.channel c ON c.id = s.channel_id
GROUP BY 1, 2      
ORDER BY 1 DESC, 2 asc;
  • 나중에 위 sql이 뜻하는게 뭔지 보고 알아야함