효율적인 SQL을 만들고 활용하기 위해서는 데이터의 내부적인 구성을 이해하는 것이 좋다. ex) 숫자형, 문자형, 날짜형 등
일반적인 INT : 내부적으로 4바이트 차지
TINYINT : 1
SMALLINT : 2
BIGINT : 8
(127, 32767, 2147483647, 9000000000000000000)
효율적으로 낭비를 하지 않기 위해 어떤 정보를 넣을 지에 따라 다르게 정해줘야 한다.
ex) 보통 100 이하인 나이를 입력하는데 굳이 INT로 할 필요 없이 TINYINT로도 충분하다.
++ TINYINT같은 경우 -128에서 128인데 이를 0부터 255로 변경해서 사용 가능 : 이렇게 사용한다면 '키' 에 대한 정보도 원래라면 SMALLINT로 2바이트를 사용해야 하지만, 1바이트로 적용시킬 수 있다.
how? TINYINT -> TINYINT UNSIGNED
++ 연락처 같은 경우는 ex)12341234 왜 INT를 사용하지 않고, CHAR(8)로 사용할까?
: 숫자형은 더하기/빼기의 연산에 의미가 있거나, 크다/작다와 같은 순서에 의미가 있기에 전화번호 같은 경우에는 굳이 숫자로 하지 않고 CHAR로 이용하여 효율성을 높인다.
CREATE TABLE movie
(movie_id INT,
movie_title VARCHAR(30),
movie_director VARCHAR(20),
movie_star VARCHAR(20),
movie_script LONGTEXT, # 자막
movie_film LONGBLOB # 동영상
);
FLOAT : 4바이트
DOUBLE : 8바이트
DATE : 3바이트 날짜만 저장 : YYYY-MM-DD
TIME : 3 - 시간만 저장 : HH:MM:SS
DATETIME : 8 - 날짜 및 시간 저장 : YYYY-MM-DD HH:MM:SS 형식으로 사용
SET @변수이름 = 변수의 값 ; # 변수의 선언 및 값 대입
SELECT @변수이름 # 변수의 값 출력
하지만 이는 영구유지가 아닌, 임시로 저장되는 것!!
즉, 다른 사람이 접속하면 안 보인다.
따라서 변수는 임시의 값이며 잠시 사용하는 것이라 생각
변수에 값을 할당
SET @txt = '가수 이름==> ' ;
SET @height = 166;
변수를 이용한 구문
SELECT @txt , mem_name FROM member WHERE height > @height ;
여기서 문제 상황!!
SET @count = 3;
SELECT mem_name, height FROM member ORDER BY height LIMIT @count;
LIMIT을 걸기 위해 변수로 할당하고 구문을 작성했는데 에러가 발생
=> PREPARE 과 EXECUTE 이용!
SET @count = 3;
PREPARE mySQL FROM 'SELECT mem_name, height FROM member ORDER BY height LIMIT ?'; # 실행은 아직 아지 않고 준비만 해 놓는다.
EXECUTE mySQL USING @count; # 진짜로 실행해보자! 변수를 통해 USING으로 물음표를 채워넣고 실행
직접 함수를 사용해서 강제로 변화시키는 '명시적인 변환'
별도의 지시 없이 자연스럽게 변환되는 '암시적인 변환'
CAST ( 값 AS 데이터_형식 [ (길이) ])
CONVERT ( 값, 데이터_형식 [ (길이) ])
ex)
SELECT AVG(price) '평균 가격' FROM buy;
: 평균 가격이 142.9167일 때 이를 정수로 변환
# SIGNED : 부호가 있는 정수형
SELECT CAST(AVG(price) AS SIGNED) '평균 가격' FROM buy ;
또는
SELECT CONVERT(AVG(price) , SIGNED) '평균 가격' FROM buy ;
로 반올림
ex2) CONCAT을 통한 문자형 이어서 표현하기
SELECT num, CONCAT(CAST(price AS CHAR), 'X', CAST(amount AS CHAR) ,'=' ) AS '가격X수량', price*amount AS '구매액'
FROM buy ;
SELECT '100' + '200' ; -- 문자와 문자를 더함 (정수로 변환되서 연산됨)
: 300
SELECT CONCAT('100', '200'); -- 문자와 문자를 연결 (문자로 처리)
: 100200
SELECT CONCAT(100, '200'); -- 정수와 문자를 연결 (정수가 문자로 변환되서 처리)
: 100200
SELECT 1 > '2mega'; -- 정수인 2로 변환되어서 비교
: 0 (False)
SELECT 3 > '2MEGA'; -- 정수인 2로 변환되어서 비교
: 1 (True)
SELECT 0 = 'mega2'; -- 문자는 0으로 변환됨
: 0 = 0 이기에 True로 1이 나옴