본문 바로가기

신세게 - Java 공부

8주차 배운점 느낀점 - MysQL 데이터 형식, 문자열 함수, 파일 입출력

728x90
반응형

8주차 시작

 

mySQL의 데이터 형식을 배웠다. 숫자 문자, 날짜, JSON 형식 등이 있다.
SQL에도 변수가 있다. 변수를 이용해서 쿼리를 만들고 원하는 데이터를 ?에 넣을 수 있다.
문자열을 다루는 함수들을 배웠다. 문자를 찾거나 교체하거나 앞 뒤 공백을 제거한다.
무조건 CHAR에는 VARCHAR만 있는게아니다. 메모리를 위해 VARCHAR에만 넣지말라고 하셨다.
잘 찾아서 써야한다.

 

배운점

 

MySQL 데이터 형식

 

1) 숫자 (정수, 실수 등의 숫자를 표현)
SMALLINT (2)
INT(INTEGER) (4)
BIGINT (8)
FLOAT (4) 소수점 아래 7자리까지 표현
DOUBLE (8) 15자리까지 표현
DECIMAL(m,d) m: 전체자릿수 d: 소숫점이하 자릿수

 

2) 문자
CHAR(n), CHAR 만쓰면 (1), CHARACTER: 고정길이
VARCHAR (1~ 65535) : 가변길이

 

TEXT 형식
TINYTEXT 1~255 : TEXT 데이터 값
TEXT 1~165535
MIDIUMTEXT
LONGTEXT 4G까지

 

BLOB 형식 - 사진, 동영상 파일, 대용량의 글자를 저장하기 위한 데이터타입

ENUM() 열거형 데이터 값
SET

 

3) 날짜/시간
DATE(3) YYYY-MM-DD 형식
DATETIME(8) YYYY-MM-DD HH:MM:SS

 

4) 지도/JSON 데이터 형식
GEOMETRY : 공간데이터 형식으로 선, 점, 다각형 같은 공간개체를 저장, 조작
JSON(JavaScript Object Notation)
{id: 'jack' , name = 'jack kim', age : 20 }
테이블 없음 이렇게 저장함

 

SQL 변수 사용

 

SET @변수이름 = 값; -- 변수의 선언 및 값 대입
SELECT @변수이름
select 는 print의미

 

set @myvar1 = 5;
set @myvar2 = 3;
set @myvar3 = 4.2;
set @myvar4 = '가수이름==>';

select @myvar1 + @myvar2;
select @myvar4, Name from usertbl where height>180;

 

 

 

 


PREPARE


쿼리 준비시키기 , 필요할때 ? 에 변수 넣어서 사용

 

set @myvar1 = 3;
prepare myQuery
from 'select name, height from usertbl order by height limit ?';
execute myQuery using @myVar1;

 

 


insert into 에 사용

prepare prpared_stmt from 'insert into employee values(?,?,?)';
set @name = 'ruby';
set @sal = 9000;
set @loc = 'jeju';
execute prpared_stmt using @name, @sal, @loc;
select * from employee;

 

쿼리를 변수로 사용


변수에 concat 사용

 

create table student(name varchar(30), age int , score int);
insert into student values('jimi',22,8);
set @table = 'student'; 
set @statment = concat('select * from ',@table); // from student

prepare pre_student from @statment; // from에 쿼리문 대입
execute pre_student;

 

제어 흐름 함수: 프로그램의 흐름 제어

 

IF(수식, 참, 거짓)

SELECT IF(100>200,'참','거짓');

 

IFNULL(수식1, 수식2)
수식1이 NULL이 아니면 수식 1이 반환, 수식 1이 NULL이면 수식 2가 반환
이거 많이 사용함!

select IFNULL(null,'null이구나!'),IFNULL(100,'NULL이 아니네');

 

NULLIF(수식1, 수식2)
수식1과 수식2가 같으면 NULL 반환한다.. 다르면 수식1 반환

select NULLIF(100,100), NULLIF(200,100);

 


CASE ~WHEN ~ ELSE ~ END
CASE 연산자 다중분기에서 사용되는 함수와 함께 사용한다.

SELECT CASE 11
WHEN 1 THEN '일'
WHEN 5 THEN '오'
WHEN 10 THEN '십'
ELSE '에라 모르겠다'
END AS 'CASE 연습';

 

문자열 ASCII(아스키코드), CHAR(숫자)
아스키문자 -> 숫자, 숫자 -> 문자

SELECT ASCII('A'),CHAR(65);

 


bIT_LENGTH(문자열), CHAR_LENGTH(문자열), LENGTH(문자열)
비트 길이, 문자길이, 바이트 길이
영어는 한개에 1바이트, 한글은 한개에 3바이트

SELECT bit_length('abc'), char_length('abc'),length('abc');
SELECT bit_length('가나다'), char_length('가나다'),length('가나다');

 

 


CONCAT(문자열1, 문자열2, ....), CONCAT_WS(구분자,문자열1,문자열2)
WS 사용하면 / 구분으로 concat됨

 

SELECT concat_ws('/','2024','02','21');

 


ELT(위치, 문자열1, 문자열2, ...)
원하는자리꺼 반환 시킬 수 있다. 이것도 많이 씀

SELECT ELT(2,'하나','둘','셋');

 

FIELD('찾을 문자열',문자열1,문자열2)
인덱스 리턴

SELECT field('둘','하나','셋','둘');

 


FIND_IN_SET(찾을 문자열, 문자열 리스트)

SELECT find_in_set('둘','둘');

 


INSTR
'세번째 인덱스에서 원하는 이 문자열이 시작된다'

SELECT INSTR('하나둘셋','둘');

 


LOCATE
INSTR과 리턴값 같다. 파라미터 순서만 다름, 둘 중에 하나만 기억하셈

SELECT LOCATE('둘','하나둘셋');

 

FORMAT (숫자, 소수점 자릿수)
4째자리까지 반올림

SELECT FORMAT(12345.1234567,4);

 


BIN(숫자), HEX(숫자), OCT(숫자) 2진수, 16진수 8진수

SELECT BIN(30), HEX(30), OCT(30);

 

INSERT()
3부터 4개 지우고, 이 문자를 넣겠다.

SELECT INSERT ('abcdefghi',3,4,'!!!!');

 


LEFT(), RIGHT()
왼쪽, 오른쪽 문자열의 길이만큼 반환

SELECT LEFT('abcdefghi',3);

 


UPPER(문자열), LOWER(문자열)
: 대소문자 변환

 

LPAD, RPAD

SELECT LPAD('자바 백엔드 개발자',15,'##');

 

LTRIM, RTRIM, TRIM() : 공백 제거

SELECT LTRIM('    SQL 프로그래밍'),RTRIM('SQL 프로그래밍    ');

 


앞뒤에 있는 해당 문자를 다 잘라내라, BOTH : 양쪽, LEADING: 앞, TAIL: 뒤

SELECT TRIM(' 안녕  '),TRIM(BOTH '^' FROM '^^ 재미있네요.^^');

 


REPEAT(문자열, 횟수)

SELECT REPEAT ('SQL', 10);

 


REPLACE(문자열, 원래 문자열, 바꿀문자열);

SELECT REPLACE('MySQL 문법 배우기','문법','저장 프로그램');

 

my.ini 열기
메모장 notepad my.ini 로 열어서 max_allowed_packet 이랑 secure-file-priv 수정

#The maximum size of one packet or any generated or intermediate string, or any parameter sent by the
#mysql_stmt_send_long_data() C API function.
max_allowed_packet=1024M

#Secure File Priv.
secure-file-priv="C:\datasource\movies"

 

 

 


서버 껐다킴

insert into movietbl values (1,'쉰들러 리스트','스티븐 스필버그','리암 니슨',
	load_file('C:/Movies_add/schindler.TXT'),load_file('C:/Movies_add/schindler.mp4'));
insert into movietbl values(2,'쇼생크 탈출','프랭크 다라본트', ' 팀 로빈슨',
load_file('C:/Movies_add/shawshank.txt'), load_file('C:/Movies_add/shawshank.mp4'));
insert into movietbl values(3,'라스트 모히칸','마이클 만', '다니엘 데이 루이스',
load_file('C:/Movies_add/mohican.txt'), load_file('C:/Movies_add/mohican.mp4'));

 

TEXT 파일로 내려받기

SELECT m_script from movietbl where m_id =1
into outfile 'C:/Movies_add/schindler_out.txt'
lines terminated by '\\n';

 

바이너리 파일로 영화클립 파일 다운로드

select m_film from movietbl where m_id = 3
into dumpfile 'C:/Movies_add/mohican_out.mp4';

 

피벗 (pivot)
열에 포함된 여러 값을 출력하고, 여러 열로 변환하여 테이블 반환 식을 회전하고 필요하면 집계까지 수행하는 작업

create table pivotTest(
name char(3),
season char(2),
amount int);

insert into pivotTest values ('ss1','여름',10);
insert into pivotTest values ('ss2','가을',10);
insert into pivotTest values ('ss3','겨울',10);
insert into pivotTest values ('ss4','봄',10);

select * from pivotTest;

select name,
sum(if(season='봄',amount,0)) as '봄',
sum(if(season='여름',amount,0)) as '여름',
sum(if(season='가을',amount,0)) as '가을',
sum(if(season='겨울',amount,0)) as '겨울',
sum(amount) as '합계' from pivotTest group by name;

 


JSON 데이터
웹과 모바일 응용 프로그램 등과 데이터를 교환하기 위한 개방형 표준 포맷이다. ( 속성 : 값 ) 독립적인 데이터 포멧이다.

select json_object('name',name,'height',height) as 'JSON 값' FROM usertbl where height >= 180;

 


json 변수 set 후 SELECT

set @json = '{
				"usertbl": [{"name":"임재범","height":182},{"name":"이승기","height":182},{"name":"성시경","height":182}]
    }';
    
select json_valid(@json) as json_valid;
select json_search(@json,'one','성시경') as json_serach;
select json_extract(@json,'$.usertbl[2].name') as json_extract;
select json_insert(@json,'$.usertbl[0].mDate','2024-01-21') as json_insert;-- 컬럼 추가
select json_replace(@json,'$.usertbl[0].name','신세계') as json_replace;
select json_remove(@json,'$.usertbl[0]') as json_remove;

 

json_valid

 

search
one 과 all 사용가능 , one은 저게 나오는 첫번째

 

칼럼추가

 

replace

 


[0] 삭제

 

 

회고

 

SQL에서 문자열을 다루고 , 자바에 있는 CASE 문 비슷한걸 배웠다. if문같은건 데이터를 뽑아오고 자바에서 처리해주면 되지 않을까 생각했지만 데이터를 잘 정제해야 속도면에서도 빠를 것이고 신뢰도를 높일 수 있다.
잘 외워두어야할 것 같다. 생각보다 많다.

 

txt 와 영상파일을 가져오고 파일쓰는 작업을 했다. 과정에서 ini 설정파일을 변경해서 패킷의 최대 용량을 1GB로 바꿔주고 secure_file_priv옵션으로 파일을 읽고 쓸 경로를 적어줬다.
이 과정을 거치니 여기저기서 워크밴치가 멈추는 에러가 발생했다. 원인은 정확히 모르지만 서버와 connect가 잘 안된듯싶다. 난 다시 제거하고 설치했다. sql 스크립트를 잘 저장해 두지않아 복구하는데 힘들었다. 저장을 잘하는 습관을 들여야겠다.

반응형