'제수기' - '제발 수업내용을 기억해라'
-- 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빵으로 끝나는 문자ceil
floor
round
truncate
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
+ 값 + 단위+
, -
사용 가능year
month
dayofmonth
dayofweek
: (1 : 일요일 - 7 : 토요일)hour
minute
second
datediff
timediff
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가 그대로 나왔음.