학습주제
- JOINS
- UNION
- WITH
- Subquery
- 타임스탬프 함수
- 타입변환
- 조건문
- 그 외 유용한 함수
주요 메모 사항 소개
- JOIN : 두 개 이상의 테이블을 특정 Key를 기준으로 결합하는 것
- INNER JOIN : 두개의 테이블에서 일치하는 행만 가져온다. (교집합)
- LEFT JOIN : 왼쪽 테이블의 모든 행 가져오고 오른쪽에서 일치하는 행만 가지고 온다.
- 불일치 값은 null로 채워짐 - RIGHT JOIN : 오른쪽 테이블의 모든 행 가져오고 왼쪽에서 일치하는 행만 가지고 온다.
- FULL OUTER JOIN : 모든 행 조합(필터링 없음)
- 모든 행을 더하기 때문에 DB에 과부하가 심하게 걸릴 수 있다. 꼭 필요할때만 사용 - Alias : 별칭과 같다
- UNION : SELECT 한 결과문 위 아래로 붙히는 것
- 중복행 제거
- 컬럼 개수, 데이터 타입이 일치해야 한다. - UNION ALL : UNION 과 같지만 중복행 제거하지않음
- WITH (적극 사용 추천)
- CTE라고 부르며, MySQL 8.0 버전 이상에서만 지원한다.
- 임시결과 집합을 생성하여 복잡한 쿼리를 쉽게 작성할 수 있도록 돕는다.
- 복잡한 쿼리에서 하위 쿼리를 사용해 같은 결과를 여러 번 계산해야하는 경우를 줄여준다.
- 쿼리 가독성을 높여 유지보수를 용이하게 한다.
- DB Optimizer는 CTE를 단순한 뷰나 서브쿼리보다 더 효율적으로 처리한다.
- Subquery : 다른 내부에 포함되어있는 쿼리
SELECT c.*(
SELECT name
FROM managers
WHERE managing in ('스포츠', '주방용품')) a
INNER JOIN clicks c on a.name = c.user_name
- 이런식으로 이중 SELECT 문을 생각하시면 편합니다.
- 데이터 타입
- STRING : 'yyyy-mm-dd', 'yyyy-mm-dd HH:MM:SS'
- DATE : yyyy-mm-dd (시간입력이 없기에 저장효율은 제일 좋다)
- DATETIME : YYYY-MM-DD HH:MM:SS (시간의 간격계산에 용이하다)
- TIMESTAMP : YYYY-MM-DD HH:MM:SS UTC
- 용량이 클수록 시간단위를 어디까지 지정할지 잘 선택해야 한다.
- 시간관련 함수
- NOW() : UTC 기준으로 현재 시간을 가져오는 함수
- CURRENT_TIMESTAMP()
- CURTIME() : 현재 시간 반환
- CURRENT_DATE() = CURDATE() : yyyy-mm-dd 형식으로 반환 - SYSDATE() : 함수가 호출된 시간을 반환
- YEAR() / MONTH() / DAY() / HOUR() / MINUTE() / SECOND() / WEEKDAY() / MONTHNAME() / DAYNAME() ..
- NOW() : UTC 기준으로 현재 시간을 가져오는 함수
- 날짜 형식화
- STR_TO_DATE : 문자열 타입을 날짜 타입으로 변경
- DATE_FORMAT : 지정된 형식으로 날짜를 출력
- %Y : 연도(2023) / %y : 연도(23) / %m : 월(12) / %d : 일(20) / %H : 시(05), 24h 형태/ %T : hh:mm:ss / %s : 초
- 타입변환
- 데이터 타입 불일치로 인한 연산 / 비교 오류를 피하기 위함
- 다양한 데이터 소스 산의 호환성을 유지하기 위함
- CAST()
- CONVERT
- 조건문
- IF(조건, '참일 때 값' , '거짓 일때 값')
- IFNULL(값, 'null 값일때 바꿀 값')
- CASE WHEN
- 조건에 따라 case를 처리하기 위함
SELECT price
CASE WHEN price > 10000 THEN '고가' -- 10000원 초과 물품은 '고가'
WHEN (price <= 10000 AND price > 4000) THEN '중가' -- 이후 WHEN으로 조건 추가 가능
ELSE '저가' -- 나머지 값
END AS price_class
FROM products_B
- WINDOW 함수
- RANK() : 동점시 랭크 숫자 건너뛰고 출력한다.
- DENSE_RANK() : 동점인 랭크가 있을 시 랭크 숫자를 건너뛰지 않고 빽빽하게 채워 출력한다..
- PERCENT_RANK() : 몇 퍼센트의 다른 값들이 지금 보고있는 값보다 작은지 알려준다.
- LEAD() : 파티션 내에서 다음으로 오는 값을 찾는다.
- 값결 - LAG() : 파티션 내에서 이전에 온 값을 찾는다.
- 밑에는 참조 문서입니다. 더욱 다양한 코드가 필요하시면 들어가서 찾으시면 됩니다.
- https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html
MySQL :: MySQL 8.0 Reference Manual :: 12.20.1 Window Function Descriptions
12.20.1 Window Function Descriptions This section describes nonaggregate window functions that, for each row from a query, perform a calculation using rows related to that row. Most aggregate functions also can be used as window functions; see Section 12
dev.mysql.com
공부하면서 어려웠던 내용
- window 함수와 조건문을 섞어서 SQL문을 작성하려니 생각보다 어려웠다. 계속해보면서 손에 익혀야겠다.
반응형
'데이터분석' 카테고리의 다른 글
14. 효율적인 SQL 코드 작성법 (1) | 2023.12.07 |
---|---|
13. 데이터 타입 (1) | 2023.12.06 |
11. SQL 과 RDB (1) | 2023.12.04 |
10. 결측치란? (0) | 2023.12.01 |
9. 캐글 시작 (1) | 2023.11.30 |