[데브코스] SELECT, GROUP BY
Updated: Categories: TILW2D3 - 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이 뜻하는게 뭔지 보고 알아야함