티스토리 뷰
Chapter 04. SQL 고급 문법
04-1. MySQL의 데이터 형식
데이터 형식
정수형
정수형은 소수점이 없는 숫자, 인원 수, 가격, 수령 등에 사용된다.
또한, java의 데이터 형식과 이름은 다르지만 대칭된다.
java | 데이터 형식 | 바이트 수 | 숫자 범위 |
byte | tinyint | 1 | -128 ~ 127 |
short | smallint | 2 | -32,768 ~ 32,767 |
int | int | 4 | 약 -21억 ~ +21억 |
long | bigint | 8 | 약 -900경 ~ +900경 |
만약, 범위에 초과하는 값을 insert했을 경우 'out of range'라는 오류가 나타난다.
자바의 데이터와 비슷하지만 다른점이 존재한다.
만약 tinyint를 사용시 127을 넘는 범위를 가지고 있는 경우가 있다.
smallint를 사용하면 되지만 범위가 과도하게 많기때문에 tinyint를 사용하고자한다.
이런 경우 unsigned 예약어를 사용할 수 있다.
unsigned 예약어는 값의 범위가 0부터 시작되도록 하는 예약어이다.
tinyint는 -128 ~ 127 의 범위를 가지고 있지만 tinyint unsigned는 0 ~ 255 의 범위를 가지고 있다.
즉, 0부터 시작하게 하는 대신 -(마이너스)의 값들을 +의 값들로 만들어 사용하는 것이다.
총 256개를 표현하도록 한다.
문자형
문자형은 글자를 저장하기 위해 사용한다.
입력할 최대 글자의 개수를 지정해야한다.
데이터 형식 | 바이트 수 |
char(개수) | 1~255 |
varchar(개수) | 1~16383 |
char과 varchar는 차이점이 있다.
char과 varcahr 두개가 '5'라는 같은 개수를 지정해줬다고 한다.
하지만 입력 수가 3글자로 2자리 공간이 남는다.
이때 char는 고정적인 자릿수이므로 2자리 공간을 낭비하게 된다.
하지만 varchar는 가변적인 길이의 문자형으로 3글자를 저장할 경우 3자리만 사용한다.
대량의 데이터 형식
char과 varchar로는 표현하지 못하는 데이터가 존재한다.
char(256) 또는 varchar(16384)와 같이 표현할 경우 column length too big이라는 열의 길이가 너무 크다는 설정 오류가 발생한다.
그렇기 때문에 더 큰 데이터를 저장하려면 다른 형식을 사용한다.
데이터 형식 | 바이트 수 | |
text 형식 | text | 1~65535 |
longtext | 1~4294967295 | |
blob 형식 | blob | 1~65535 |
longblob | 1~4294967295 |
따라 동영상 혹은 사진과 같이 더욱 큰 크기의 데이터를 저장할 시 위와 같은 데이터 형식을 사용한다.
실수형
실수형은 소수점이 있는 숫자를 저장할 때 사용한다.
자바와 일치한 데이터 형식을 가진다.
데이터 형식 | 바이트 수 | 섦여 |
float | 4 | 소수점 아래 7자리까지 표현 |
double | 8 | 소수점 아래 15자리까지 표현 |
날짜형
날짜형은 날짜 및 시간을 저장할 때 사용한다.
데이터 형식 | 바이트 수 | 설명 |
date | 3 | 날짜만 저장, YYYY-MM-DD 형식으로 사용 |
time | 3 | 시간만 저장, HH:MM:SS 형식으로 사용 |
datetime | 8 | 날짜 및 시간을 저장, YYYY-MM-DD HH:MM:SS 형식으로 사용 |
date는 날짜만 저장하고, time은 시간만 저장한다.
두가지다 표현하여 저장하고자 하면 datetime을 사용한다.
변수의 사용
SQL에서도 변수를 사용할 수 있다.
SQL에서의 변수 선언와 대입은 아래와 같은 방식을 사용한다.
set @변수이름 = 변수의 값;
select @변수이름;
@와 이름 사이 공백이 있으면 안된다.
(워크벤치를 재시작할때까지는 유지되지만 종료하면 없어진다. 영구적인것이 아니다.)
@mavar1 ,2 의 변수에 set을 사용하여 값을 넣어주었다.
set @myvar1 =5;
set @myvar2 = 4.25;
@myvar1의 값을 조회
select @myvar1;
이전에 변수에 설정해둔 값이 출력된것을 볼 수 있다.
변수값 두개를 더해주었다.
select @myvar1 + @myvar2;
변수에 가수 이름이라는 문자열을 저장하고
height 에는 166이라는 값을 저장했다.
그 후 원하는 형태로의 조회를 위해 txt변수의 문자열을 출력하고 mem_name 을 출력하는데 조건식으로 height의 크기가 변수 height의 길이보다 크도록 하였다. height>166과 같은 뜻이다.
set @txt='가수 이름==> ' ;
set @height = 166;
select @txt, mem_name from member where height > @height;
원하는 형태로의 출력을 볼 수 있다.
데이터 형 변환
문자형을 정수형으로 바꾸거나 정수형을 문자형으로 바꾸는 것을 형 변환이라고 한다.
형변환에는 명시적인 변환 , 암시적인 변환 두가지가 존재한다.
함수를 이용한 명시적인 변환
데이터 형식을 변환하는 함수는 cast() , convert() 가 있다.
cast (값 as 데이터형식 [(길이)])
convert (값, 데이터형식[(길이)])
price의 평균값을 구하는 sql문이다.
이때 순서가 중요한데 price를 먼저 조회한 후 avg (집계함수)를 구하므로 price 전체의 평균을 구한다.
select avg(price) as "평균 가격" from buy;
위 sql문의 결과이다.
평균을 구했으므로 실수값이 나온다.
가격 값이므로 실수보다는 보통 정수로 표기를 한다.
그렇기 때문에 정수로 형변환을 한다.
select cast(avg(price) as signed) "평균 가격" from buy;
select convert(avg(price), signed) "평균 가격" from buy;
형변환을 함과 동시에 자동으로 올림을 하여 다음과 같이 값이 표기된다.
날짜 형변환
select cast('2022$12$12' as date);
select cast('2022/12/12' as date);
select cast('2022%12%12' as date);
select cast('2022@12@12' as date);
중간에 어떠한 문자를 사용하든 date로 형변환을 하면 동일한 값을 표기한다.
날짜 데이터를 convert()에 파라미터로 들어가는 형식으로 형변환을 했다.
select convert('2022/12/12',date) "날짜";
sql 결과를 원하는 형태로 표현을 할 수 있다.
가격과 수량을 곱한 구매액을 표기하는 sql문을 작성했다.
java에서는 +를 사용하여 원하는 형태로 출력했지만 sql에서는 concat을 사용하여 문자를 더 해 출력해야한다.
그러므로 모두 문자로 형변환을 해야한다.
select num, concat(cast(price as char), 'X' ,convert(amount, char),'=') '가격X수량', price*amount '구매액' from buy;
암시적인 변환 (=자동형변환)
암시적인 형변환은 cast() 또는 convert()를 사용하지 않고도 자동으로 형변환을 하는 것이다.
다음과 같이 문자 + 문자이면 자동으로 형변환이되어 300을 출력한다.
select '100'+'200';
다음과 같이 문자 100과 200에 concat을 사용한다면 concat은 문자를 더해주는 것이므로 100200이라는 문자가 출력된다.
select concat('100','200');
다음 sql문은 concat을 사용했으므로 100이 자동으로 문자로 형변환되어 100200이라는 문자가 출력된다.
select concat(100,'200');
다음과 같이 정수 100와 문자 200을 더하는 것과 같이 작성된 sql문은 200이 정수로 자동 형변환되어 300이라는 값을 출력한다.
select 100+'200';
'코딩 > SQL' 카테고리의 다른 글
[13주 3일차] SQL 고급 문법 : 조인 (1) | 2024.01.03 |
---|---|
[13주 3일차] SQL 기본 문법 (1) | 2024.01.03 |
[13주 2일차] SQL 기본 문법 (0) | 2024.01.02 |
NULL관련 함수(NVL, NULLIF, COALESCE) (0) | 2023.10.29 |
SQLD 노랭이 87번 문제(p.94) /다시 업로드 예정/ (0) | 2023.10.29 |
- Total
- Today
- Yesterday