728x90
반응형
산술 함수
숫자형 데이터의 절대값, 올림, 내림, 반올림 등을 계산할 수 있게 해줍니다.
create table SampleMath
(m numeric (10, 3), # Numeric은 고정 소수점 값을 나타냄. numeric(10, 3)은 소수점 이하 자리수를 포함한 총 자리수가 10이고 소수점 이하 자릿수는 3이라는 의미.
n integer,
p integer);
insert into SampleMath(m, n, p) values (500, 0, NULL);
insert into SampleMath(m, n, p) values (-180, 0, NULL);
insert into SampleMath(m, n, p) values (NULL, NULL, NULL);
insert into SampleMath(m, n, p) values (NULL, 7, 3);
insert into SampleMath(m, n, p) values (NULL, 5, 2);
insert into SampleMath(m, n, p) values (NULL, 4, NULL);
insert into SampleMath(m, n, p) values (8, NULL, 3);
insert into SampleMath(m, n, p) values (2.27, 1, NULL);
insert into SampleMath(m, n, p) values (5.555, 2, NULL);
insert into SampleMath(m, n, p) values (NULL, 1, NULL);
insert into SampleMath(m, n, p) values (8.76, NULL, NULL);
select * from samplemath;
select m, abs(m) as abs_m # abs는 절대값 계산
from SampleMath;
select n, p, mod(n, p) as mod_col # mod는 나눗셈의 나머지
from SampleMath;
select m, n, round(m, n) as round_col # Round 함수는 반올림. round(m,n)은 m열의 데이터를 소수 n번째 자리까지 반올림을 하라는 의미
from SampleMath;
- 올림: ceil()
- 내림: floor()
문자열 함수
문자 데이터를 처리할 때 사용되는 함수입니다.
create table SampleStr
(str1 varchar(40), # varchar는 가변길이 문자형
str2 varchar(40),
str3 varchar(40));
insert into SampleStr (str1, str2, str3) values ('가나다', '라마', NULL);
insert into SampleStr (str1, str2, str3) values ('abc', 'def', NULL);
insert into SampleStr (str1, str2, str3) values ('김', '철수', '입니다');
insert into SampleStr (str1, str2, str3) values ('aaa', '라마', NULL);
insert into SampleStr (str1, str2, str3) values (NULL, '라마', NULL);
insert into SampleStr (str1, str2, str3) values ('*&^%0', NULL, NULL);
insert into SampleStr (str1, str2, str3) values ('abc', NULL, NULL);
insert into SampleStr (str1, str2, str3) values ('ABC', NULL, NULL);
insert into SampleStr (str1, str2, str3) values ('abcDA', 'abc', 'ABC');
insert into SampleStr (str1, str2, str3) values ('abcdeafasd', 'abc', 'ABC');
insert into SampleStr (str1, str2, str3) values ('아이우', '이', '우');
- concat: 여러 열의 문자열을 연결하는데 사용합니다.
select str1, str2, concat(str1, str2) as str_concat # 연결시키려는 값 중 NULL이 포함되어 있으면 결과도 모두 NULL이다.
from SampleStr;
- lower: 모든 알파벳을 소문자로 변환
select str1, lower(str1) as low_str
from SampleStr;
- upper: 모든 알파벳을 대문자로 변환
select str1, upper(str1) as low_str
from SampleStr;
- replace: 문자열 안에 있는 일부 문자를 다른 문자열로 변경. replace(대상 문자열, 치환 전 문자열, 치환 후 문자열)
select str1, str2, str3,
replace(str1, str2, str3) as rep_str
from SampleStr;
날짜 함수
현재 날짜와 시간, 일시를 다루는 함수의 경우 from 구문 없이 사용이 가능합니다.
- current_date: 현재 날짜
- current_time: 현재 시간
- current_timestamp: 현재 일시
- extract: 날짜에서 일정 부분만 추출
select
current_date,
extract(year from current_date) as year,
extract(month from current_date) as month,
extract(day from current_date) as day;
술어
- =(등호): 문자열을 검색할 때 사용. 완전히 일치하는 경우에만 참이 반환
- like: 문자열 중 부분 일치를 검색할 때 사용
create table SampleLike
(strcol varchar(6) not null,
primary key (strcol));
insert into SampleLike (strcol) values ('abcddd');
insert into SampleLike (strcol) values ('dddabc');
insert into SampleLike (strcol) values ('abdddc');
insert into SampleLike (strcol) values ('abcdd');
insert into SampleLike (strcol) values ('ddabc');
insert into SampleLike (strcol) values ('abddc');
- 전방일치: 검색 조건이 되는 문자열이 검색 대상 문자열의 가장 앞에 위치하고 있는 행을 선택합니다.
- 중간일치: 검색 조건이 되는 문자열이 검색 대상 문자열의 어딘가에 포함되어 있으면 행을 검색하며 위치는 어디든 상관없습니다.
- 후방일치: 검색 조건이 되는 문자열이 검색 대상 문자열의 가장 뒤에 위치하고 있는 행을 검색합니다.
select *
from samplelike
where strcol like 'ddd%' # %는 '0문자 이상의 임의 문자열'을 의미하는 특수기호, 여기서는 ddd로 시작하는 모든 문자열
select *
from samplelike
where strcol like '%ddd%' # 중간일치. ddd가 포함된 모든 문자열
select *
from samplelike
where strcol like '%ddd' # 후방일치. ddd로 끝나는 모든 문자열
- between: 범위 검색을 수행
select *
from goods
where sell_price between 100 and 1000; # sell_price가 100이상 1000미만.
- is null: 값이 null인 데이터 선택
- is not null: 값이 null이 아닌 데이터 선택
select *
from goods
where buy_price = null; # error! null은 비교가 불가능한 특별한 표시어이기에 제대로 작동하지 않는다.
select *
from goods
where buy_price is null; # buy_price가 null인 데이터 선택
- in: 조건을 여러 개 한 번에 지정
select *
from goods
where buy_price = 320
or buy_price = 500
or buy_price = 5000;
select *
from goods
where buy_price in (320, 500, 5000)
case 식
경우에 따라 값을 구분합니다.
case when <평가식 1> then <식1>
when <평가식 1> then <식1>
when <평가식 1> then <식1>
...
else <식 n> # 생략 가능
end
select goods_name, sell_price,
case when sell_price >= 6000 then '고가'
when sell_price >= 3000 and sell_price < 6000 then '중가'
when sell_price < 3000 then '시가'
esle null
end as price_classify # case 식의 결과를 price_classify 열에 저장
from goods
테이블 결합
- 내부 결합(inner join): 공통된 것을 기준으로 결합
select *
from storegoods as store
inner join goods as goods # goods 테이블을 goods라는 별명으로 가져옴
on store.goods_id = goods.goods_id; # 두 테이블에서 해당 열들을 기준으로 합쳐짐. 다른 테이블에 같은 열이 있으므로 어떤 테이블의 열인지 명시해주어야 함.
- 외부 결합(outer join): 한쪽 테이블에만 존재하는 데이터도 출력
select store.store_id, store.store_name, goods.goods_id, goods.goods_name, goods.sell_price
from StoreGoods as store
right outer join Goods as goods
on store.goods_id = goods.goods_id; # 한 쪽에만 있는 값일 때는 없는 쪽은 null 값을 가짐
윈도우 함수
순위 계산, 누적합 계산, 소계 등 고급 집계 처리를 합니다. 랭킹, 순번 생성 등 일반적인 집약 함수로는 불가능한 고급처리가 가능합니다.
Group By를 사용했을 때와 달리, 기존 데이터에 집계된 값이 추가되어 나타납니다.
<윈도우 함수> over ([partition by <열 리스트>] order by <정렬용 열 리스트>
# partition by는 생략가능
# partition by를 통해 구분된 행 집합을 '윈도우'라고 표현하며, 범위를 나타냅니다. partition by를 지정하지 않으면 전체 테이블이 윈도우가 됩니다.
- 윈도우 함수로 사용할 수 있는 함수
- 윈도우 전용 함수: rank, dense_rank, row_number 등. 원칙적으로 select 구에만 사용 가능
- 집약함수: sum, avg, count, max, min 등
# rank: 같은 순위인 행이 복수개 있으면 후순위를 건너뜁니다. ex) 1 2 2 4
select goods_name, goods_classify, sell_price,
rank() over (partition by goods_classify order by sell_price) as ranking # partition by는 해당 열을 기준으로 행이 구분된다는 것이다.
from Goods;
# dense_rank: 같은 순위인 행이 복수개가 있어도 후순위를 건너뛰지 않습니다. ex) 1 2 2 3
# row_number: 순위와 상관없이 연속 번호를 부여합니다. ex) 1 2 3 4
select goods_name, goods_classify, sell_price,
dense_rank() over (order by sell_price) as ranking,
row_number() over (order by sell_price) as ranking
from Goods;
select goods_id, goods_name, sell_price,
sum(sell_price) over() as current_sum
from Goods;
select goods_id, goods_name, sell_price,
sum(sell_price) over(order by goods_id) as current_sum # 누적합계
from Goods;
select goods_id, goods_name, sell_price,
avg(sell_price) over(order by goods_id) as current_sum # 누적평균
from Goods;
select goods_id, goods_classify, goods_name, sell_price,
avg(sell_price) over(order by goods_id rows 2 preceding) as moving_avg # rows 2 preceding = 현재 행과 앞의 두 개 행을 사용해라 = 최근 3개
from Goods;
# preceding은 현재 행 포함
# 앞의 행이 아닌 뒤의 행을 이용해 계산하고 싶다면 preceding 대신 following 사용
select goods_id, goods_classify, goods_name, sell_price,
avg(sell_price) over(order by goods_id rows between current row and 2 following) as moving_avg
from Goods;
# 현재 행과 뒤의 2개의 행
728x90
반응형
'Programming Language > MySQL' 카테고리의 다른 글
[MySQL] MySQL 비밀번호 변경 (0) | 2023.12.27 |
---|---|
[MySQL] upsert에 대한 이해 (0) | 2023.12.27 |
[MySQL] MySQL 기초 - 1 (1) | 2023.12.27 |
[MySQL] Mac M1 MySQL 재설치 (0) | 2023.12.27 |