JOIN
... FROM products INNER JOIN managers on
products.category = managers.managing...
-
LEFT JOIN : 왼쪽 테이블의 모든 col을 가져오고, 오른쪽 테이블에서 일치하는 행을 가져와 JOIN한다. 일치하는 행이 없는 경우는 NULL값으로 표시된다. 왼쪽 테이블에 중복되는 값이 있는 경우 테이블이 더 커질 수 있다.
-
RIGHT JOIN : LEFT JOIN의 반대 JOIN
-
FULL OUTER JOIN : 두 테이블의 모든 col을 가져와 JOIN 실행, 일치하지 않는 행의 경우는 NULL값으로 표시한다
-
CROSS JOIN : 두 테이블의 가능한 모든 조합을 생성한다. 집계를 해야 하는 경우 주로 사용
- table1의 row가 n, table2의 row가 m이라고 하면 결과 table은 n * m의 row를 가지게 된다 -> 엄청 무거운 JOIN이다
-
SELF JOIN : 같은 table을 INNER JOIN을 사용하여 JOIN하는 경우. Alias를 필수적으로 사용해야한다
-
주의사항
UNION
- UNION : 두개 이상의 SELECT문의 결과를 결합하여 하나로 만들어줌 (각 SELECT문의 col의 수와 각 col의 데이터 타입은 동일해야한다)
- 중복되는 row를 제거하고, unique한 row만 포함시킨다 (col 전체가 같은 경우)
- UNION ALL : 중복된 row를 제거하지 않는다
WITH, Subquery
- WITH : CTE(Common Table Expression)이라고 부르며, 임시 결과 집합을 생성하여 복잡한 쿼리를 쉽게 작성할 수 있도록 돕는 기능을 한다.
- Table을 return 하는 함수로 생각할 수 있다
- Subquery : 소괄호"()"로 묶여진 query의 블록.
날짜와 시간 다루기
- 날짜/시간을 저장하는 데이터 타입
- 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
- TIME ZONE을 고려 가능, 하지만 DATETIME보다 범위가 좁음
- 날짜/시간 함수
- NOW(): UTC 기준으로 현재 시간을 가져오는 함수
- 비슷한 함수들 : CURRENT_TIMESTAMP(), CURTIME(), CURRENT_DATE(), ...
- SYSDATE() : 함수가 호출된 시간을 반환
- YEAR()/MONTH()/DAY() : 날짜에서 연도/월/일를 추출
- HOUR()/MINUTE()/SECOND() : 시간에서 시/분/초를 추출
- WEEKDAY() : 오늘이 일주일 중 어떤 요일인지 반환
- MONTHNAME() : 몇월인지 반환
- STR_TO_DATE : string을 날짜 타입으로 변경
- DATE_FORMAT : 지정된 형식으로 날짜를 출력
- %Y, %y, %m, %d, %H, %T, %s
- ADDDATE()/DATE_ADD() : 특정 시간/날을 더함
- SUBDATE()/DATE_SUB() : 특정 시간/날을 뺀다
- CONVERT_TZ() : 타임존을 변경하여 출력
- TIMEDIFF()/DATEDIFF() : 두 시간/날짜 간의 차이를 반혼
- TIME_TO_SEC() : 시간을 초 단위로 반환
조건문
- IF(condition, value1, value2) : condition을 충족하면 value1, 아니면 value2를 return
- IFNULL(col, value) : col에 NULL값이 있는 경우 value로 채워서 return
- CASE WHEN condition1 THEN ... : IF와 같은 역할을 수행하지만, 케이스가 많은 경우에 사용하기 좋다
자주 사용하는 함수들
- CAST, CONVERT : data type을 변경할때 사용
- rank() : 특정 등수를 기준으로 랭크를 매기는 함수(동점의 경우 같은 랭크)
- dense_rank() : 동점인 숫자가 있을 때 같은 등수로 처리하지 않음
- percent_rank() : 해당 값보다 더 작은 값의 비율을 리턴
- lead() : 파티션 내에서 다음으로 오는 값을 찾는 함수
- lag() : 그 전에 어떤 값이 왔는지 역으로 찾아가는 함수 (lead()의 반대)