
'제수기' - '제발 수업내용을 기억해라'
-- SQL 함수는 반드시 하나의 리턴값을 가진다.
-- api 참조
# 함수의 유형
-- 1. 단일행 함수 : 각 행별로 처리되는 함수
-- - 문자함수
-- - 날짜함수
-- - 숫자함수
-- - 기타함수
-- - 형변환함수
-- 2. 그룹함수 : 각 그룹별로 처리되는 함수
API 링크
char_length 문자열 길이 반환length 문자열 byte수 반환
concat('문자', '문자') 이렇게 쓰면 문자문자 이렇게 합쳐서 주는데,concat_ws(', ', '문자', '문자') 이렇게 쓰면 문자, 문자 이렇게 콤마랑 띄어쓰기까지 중간 중간에 넣어서 반환해준다.
instr(대상문자열, 검색문자열) -> 인덱스
format
lpad(문자열, 길이, 채울문자) : 왼쪽에 채워줌rapad(문자열, 길이, 채울문자) : 오른쪽에 채워줌
replace(대상문자열, old문자열, new문자열)
substring(문자열, 시작인덱스, 길이)길이를 안 주면 잘라내려는 시작 인덱스부터 문자 끝까지 출력해줌
-💥 메일주소를 문자열 자리에 넣고, 시작인덱스는 1로 두고, instr로 @가 위치한 곳을 길이 자리에 넣었는데 맨 뒤에 -1은 뭐지?
-1의 역할:
-1은 @ 기호가 포함되지 않도록 하기 위해 길이를 조정합니다.
instr로 찾은 위치값은 '@'의 위치를 포함하므로,
이를 제외하기 위해 -1을 적용하여 '@' 이전의 문자열만 잘라냅니다.

substring_index + 기준 삼을 문자 + 시작할 곳 지정기준 삼을 문자 앞이나 뒤로 다 지우고 출력 (1) (-1)
regexp_replace : [^0-9] - 숫자만 뽑아달라. 💥맨 뒤에 '' 역할은?regexp_substr : [0-9]+ - 잘라내기 💥여기서 + 역할은?regexp_instr : 인덱스 반환
regexp_like^.{5}$ 5개짜리 문자[국밥빵]$ 국or밥or빵으로 끝나는 문자
ceilfloorroundtruncate
rand()
- 0.0 이상 1.0 미만의 실수형 난수 반환.
floor(rand() * n + m)
- 특정 범위의 정수형 난수를 생성하는 공식.
- 공식:
rand() * 경우의 수 + 시작값
floor()를 사용해 소수점을 버리고 정수로 만든다.
- + 1: 시작값을 1로 설정.
cast(rand() * n + m AS signed)
- 정수형으로 변환된 난수.
- CAST를 사용해 특정 데이터 타입으로 변환
- rand() * 10 + 1: 1.0 ~ 11.0 사이의 실수 생성.
- CAST AS signed: 정수형으로 변환 (소수점 제거).

now : 지금 날짜, 시각curdate : 날짜curtime : 시각
addate 더하기subdate 빼기
interval + 값 + 단위
+, - 사용 가능
yearmonthdayofmonthdayofweek : (1 : 일요일 - 7 : 토요일)
hourminutesecond
datedifftimediff
str_to_date
cast ('날짜/시간' as date/time)

ifnull (expression, replacement)
테이블에서 NULL 값 처리
category_code가 NULL인 경우 '미분류'로 표시
컬럼의 자료형은 딱 하나만 처리한다. 숫자, 문자가 같이 들어가면 그냥 모두 다 문자 처리를 해버림. '미분류'가 있어야 하니까 category_code를 다 문자 처리로 함.

coalesce : NULL이 아닌 최초의 값을 반환
ifnull + coalesce : 모두 NULL 값이면 두 번째 인자(기본값)으로 지정한 값을 반환함

if (조건, 참, 거짓)

조건: orderable_status = 'Y'
- 만약 orderable_status가 'Y'라면 빈 문자열'' 반환. 그렇지 않으면 '주문불가' 반환

1️⃣ CASE (Type 1): 조건식 사용 : 여러 조건을 순차적으로 평가하며, 첫 번째로 참(TRUE)인 조건의 값을 반환
CASE
WHEN 조건1 THEN 결과1
WHEN 조건2 THEN 결과2
...
[ELSE 기본값]
END
🔍 동작 원리
menu_price < 10000: 메뉴 가격이 1만 원 미만일 때 '만원이하' 반환.menu_price BETWEEN 10000 AND 20000: 메뉴 가격이 1만 원 이상 2만 원 이하일 때 '만원대' 반환. 그 외 모든 경우에는 '이만원 이상' 반환.ELSE 처리: 모든 조건이 거짓(FALSE)인 경우 ELSE에 정의된 기본값 반환.
2️⃣ CASE (Type 2): 표현식 + 값 매칭 : 특정 표현식의 값과 매칭해서 처리한다.
CASE 표현식
WHEN 값1 THEN 결과1
WHEN 값2 THEN 결과2
...
[ELSE 기본값]
END
🔍 동작 원리
CASE 표현식: orderable_status 열의 값을 기준으로 처리.
값이 'Y'면 '주문가능' 반환.
값이 'N'이면 '주문불가' 반환.
ELSE 생략:
CASE문에서 ELSE를 생략한 경우, 매칭되지 않는 값은 NULL로 처리된다.

🔑 요약
CASE 사용법:
활용 예:
실용성:
- 그룹별로 실행하고 하나의 결과를 반환하는 함수
- group by를 통해 그룹 지정. 그룹지정이 없다면, 모든 행이 하나의 그룹으로 처리
❗그룹함수는 일반 컬럼과 함께 사용할 수 없다.
non-aggreagted 컬럼 동시 사용 불가
count는 사용 가능. 결과에서 null이 없으니까 행 수 22가 그대로 나왔음.



