< @변수선언 >
SET @VAR1 = '2022-12-12';
SET @VAR2 = NOW( );
SET @VAR3 = 3.14;
=> 이런식으로 변수선언해두고 조회할 때 편하게 사용
( connection 사용하는 동안만 유지 - 임시 )
SELECT * FROM emp WHERE hire_date = @VAR1;
( @까지 포함해서 변수이름이다. )
< 형변환 함수 CAST / CONVERT / FORMAT >
=> 셋다 문법만 다르고 기능은 똑같다.
SELECT CAST (10 AS DECIMAL(10, 5)); => AS
select CONVERT(10, decimal(10,5)); => , 쉼표
select FORMAT( 데이터, 소수점 몇개까지 ); => 정수부분에 , 쉼표로 끊어쓰기 해서 표현
select format( 3.141592, 2); => 3.14 (반올림 된다)
=> 10.00000
( 날짜 구분자 다른걸로 써놓은걸 정상으로 바꿔주기도 함 )
select cast('20220703' as date);
select cast('2022$07$03' as date);
date - 날짜 => 시간까지 있는 data 를 날짜까지만으로 짜를 수 있다.
datetime - 날짜 + 시간
- as signed integer - 정수로만 ( 반올림)
< 자동형변환 >
- 문자열 -> '숫자'로만 구성 => 자동으로 int로 변환
- 문자열 -> '숫자.숫자' 로만 구성 => 자동으로 double로 변환
select '3.14' + 1; => 4.14
select '100' + '200'; => 300
select '100가나다' + '200가나다' => 300
< 참거짓 1/0 >
1 - true
0 - false
select 7=7; => 1
select 10-5=4; =>0
[ 조건함수 IFNULL / NULLIF / IF / CASE ]
**< IFNULL( 데이터, 변환값 ) >
=> 만약 데이터가 NULL 이면 변환값으로 바꿔줘
- 다른 DATA TYPE 으로 변환할 수 있다.
SELECT last_name, ifnull(commission_pct, '보너스 없음') from emp;
< NULLIF (데이터1, 데이터2 ) >
=> ( 데이터1 = 데이터2 ) 같으면 null 리턴
다르면 데이터1 리턴
( 두개 값이 equal 한지 판단할 때 사용)
select nullif(100, 100); => null
select nullif(100, 200); => 100
**< IF ( 조건, 참결과, 거짓결과 ) >
select last_name, IF( 커미션 is not null, 커미션, '못받는다') from emp;
select last_name, if(salary>=15000, '임원', if(salary>=10000, '부장', if(salary>=5000, '과장', '대리/사원'))) from employees;
=> ( if 의 거짓 부분에 if 다시 주면 => java 에서 else if 역할 )
( 거짓 = else )
<** CASE >
select
case salary
when salary>=15000 then '임원'
when salary>=10000 then '부장'
when salary>=5000 then '과장'
else '대리/사원'
end 직급
from employees;
- 알리아스 end 끝나고 쓴다
- when 은 else 개념 내포. 15000 이상이 아니면, 15000미만이라는 else 의미 내포
=> when 절 순서 중요. 걸러지는 개념
만약 처음에 salary>1000 then '임원'
조건이 나오면, 다 처음에 걸러져서 => 나머지는 실행 안됨
< length( ) > 문자열 byte 길이
영어나 숫자일땐(1byte), 사실상 글자수와 같지만,
한글 사용시 개당 3개(byte) 길이.
select length('안녕하세요'); => 3*5 = 15
select char_length('안녕하세요'); => 5
< char_length( ) > 문자열 길이
=> 글자수 길이 ( 한글 포함 글자수만 )
select char_length('hello world!')+length(1234); => 12+4=16
=> 이건 데이터 조회할 때, 이름처럼 데이터마다 길이가 다른거에 대해
길이만큼 뭐 해줘 하는 식으로 많이 쓰인다,
< field( target, 데이터, 데이터, 데이터... ) > 인덱스
select field('문자', '데이터, '데이터', '데이터' );
=> 문자가 데이터중 몇번 째 인덱스에 있는지
select field(2022, 2001,2013,1021,2022); => 4
< instr( 데이터, target ) > 인덱스
select instr('일이삼사', '이'); => 2
select ~ where instr(데이터, target)=5;
=>인덱스 5번에 데이터에서 target 포함한거 찾아줘
(5번 이내에)
< locate( target, 데이터 ) > 인덱스
select locate( '삼사', '일이삼사'); => 3
=> 뭐 이런 함수 써서 인덱스를 찾았다면
< ** substring ( 데이터, 인덱스부터, 몇개 ) >
substring ( 데이터, 2 ,3 ); 2번째부터 3개
2022-07-04
select substring( hire_date, 1,4 ) from emp; => 2022
select substring( hire_date, 6,2 ) from emp; => 07
< round( 데이터, 자리수) > 반올림
select round(3.141592, 3); => 3.142
select round(16666.42, -1); => 16670
- 자리수에서 -1 주면 10의자리까지 반올림
-2 주면 100의자리까지 반올림
( truncate 도 마찬가진데 버리면서 보여줌 )
< *truncate( 데이터, 자리수 ) > 버림
select truncate(3.141592, 3); => 4.141
< mod ( A , B ) > 나머지
select mod(100, 3); => 1
select id, if(mod(employee_id, 2)=0, '짝수사번', '홀수사번');
<** insert ( 데이터, 인덱스부터, 몇개, 이걸로 대체 > - 지정 숫자 갯수만큼 삭제하고 insert
select insert( 'abcdef ', 3, 2, ' - ' );
문자열에서 3번째 문자부터 2개를 삭제하고, 그자리에 - 를 넣어라
( - 는 하나만 들어간다. => repeat 사용 )
( 인덱스로 줘서 안전 / 인덱스 세는 작업 필요 )
< replace ( 데이터, 타겟, 이걸로 대체 ) > - 지정한 문자열을 바꿔라
select replace( 'abcedf' , 'cef' , '*' );
데이터에서 cef 문자열을 * 로 바꿔라
( *주의- 이건 의도치 않게, 데이터의 다른 부분에 같은 문자열이 있을시
그 부분을 바꿔버릴 수 도 있다.
확실히 그런 경우가 아닐 때 사용 )
< repeat ( 데이터, 몇번 ) >
select repeat( 'abc', 3)
end; =>abcabcabc
데이터를 3번 반복해서 붙여서 보여주라.
(end 해줘야 한다.)
=> end 줄 때, from ~ "여기" where~
넣어줘야한다.
from 끝나고 바로 넣어줌
< 전화번호 번호 가리기 >
select insert (phone_number, 10, 13, repeat('*', 4) ) from emp
end;
=> 010-1132-****
< upper, lower ( 문자열 ) > 대문자 소문자화
( MySQL 은 조회할때 등, 문자열 알파벳 대소문자 구분 X
/ ORACLE 에서는 대소문자 구분 O - 오라클에서 많이 사용 )
select upper('stRiNg'); => STRING
=> 조회해서 보여줄 때, 일괄적으로 바꿔서 보여줄 때 사용
< 날짜 함수 >
now(); = sysdate();
=> 날짜 + 시간
curdate(); 날짜
curtime(); 시간
date/ time / year / month / day / hour / minute / second
select date(now()), time(now()), year(now()), month(now()), day(now()), hour(now()), minute(now()), second(now());
now() 에서 year 만 보여줘 month만 보여줘
이런식으로 뽑아서 쓸 수 있다.
select hire_date from emp where year(hire_date) = '2006';
select hire_date from emp where month(hire_date) = '6'; / '06' 둘다됨
< adddate / subdate ( 날짜데이터, interver 기간 ) > 날짜 계산
select adddate( 날짜데이터, interver 4 year ); 4년 더하기
select subdate( 날짜데이터, interver 1 day ); 하루 빼기
< addtime / subtime ( 시간데이터, 시간 ) > 시간 계산
select addtime( '2022-12-12 18:00:00', '2:00:00');
=> 시간은 그냥 쉼표로 바로 준다.
=> 날짜전체로 줘도, 시간만 더한다.
select addtime( curtime(), '2:00:00');
< datediff / timediff ( 데이터, 데이터 ) > 날짜,시간 차이 계산
select datediff(now(), '2022-06-20');
select timediff(time(now()), '16:00:00');
( 차이는 앞에꺼에서 뒤에껄 뺀다.
앞 데이터 - 뒤 데이터
더 미래랑 비교하는거면 음수로 나옴 )
- datediff 한거 7 로나눠서 ( format 으로 정수로 주면) 그게 week diff 가 되겠지
< period_diff( 연월, 연월 ) > month 차이
select period_diff('202307', '202207'); => 12
=> 데이터 연도랑월만 (- 없이) 붙여서 줘야 한다.
< dayofweek(날짜) / weekday(날짜) >
-dayofweek(now()) => 1 / 일요일 시작
-weekday(now()) => 0 / 월요일 시작
<** date_format( 날짜, '포맷' ) >
select date_format(now(), '%Y&%m&%d%a');
- 구분자 마음대로 지정
- 포맷 약속값 (대소문자 구분)
%Y 4자리연도 %y 2자리연도 %m 2자리월 %c 1자리월 %M 영문월
%d 2자리일 %e 1자리일
%a 요일(축약) %W 요일(전체)
%H 24시간 %I 12시간
%i 2자리분 %S 2자리초
=> select hire_date from emp where date_format(hire_date, %m)=06;
( m 달 부분이 06 인 데이터를 조회 )
포맷만 잘 사용하면 사실상 날짜는 다 가지고 놀 수 있다.
'Back to the DataBase' 카테고리의 다른 글
| MySQL Join 쿼리 / 효율적인 DB의 시작 (0) | 2022.07.14 |
|---|---|
| MySQL 데이터타입 => int / decimal / varchar / datetime (0) | 2022.07.14 |
| 커맨드로 MySQL 사용하기 (0) | 2022.07.13 |
| MySQL 에서 DB 백업 순서 차근차근 (0) | 2022.07.13 |
| MySQL , SQL 기본 문법들 (0) | 2022.06.14 |