Programming Language/MySQL

[MySQL] MySQL 기초 - 2

LeeJaeJun 2023. 12. 27. 00:44
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

 

테이블 결합

https://commons.wikimedia.org/wiki/File:SQL_Joins.svg

 

  • 내부 결합(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