초반에 오라클 실습을 하다보면 이게 무슨 기능인지, 결과값은 뭐가 나오는지 메모해둬야 하는 경우가 생깁니다.
자바에서는 이럴 때 // 어쩌구저쩌구 이렇게 주석을 썼는데요, 오라클에서는 -- 어쩌구저쩌구 이렇게 쓰면 됩니다.
여러 문장을 주석 처리할 경우에는 자바에서와 마찬가지로 /* ...... */을 쓰면 됩니다.
명령어 학습에 앞서, 오라클에서는 어떠한 자료형을 쓰는지 알아보겠습니다.
대표적으로 자바에서 쓰는 자료형과 비교되는 모습입니다.
JAVA | ORACLE |
int | INTEGER, NUMBER |
double | NUMBER |
String | VARCHAR2, CHAR, LONG |
Date | DATE |
우리가 자바에서 숫자 정수형을 표현할 때 int를 썼다면 오라클에서는 INTEGER, NUMBER를 사용합니다. 뭐가 다른 특징이 있는 것인지는 추후에 설명하도록 하겠습니다. 이처럼 자바와 동일한 자료형을 쓰는 것이 아니라 차이가 있다는 점을 눈여겨보고 넘어가면 좋겠습니다.
먼저 자료형 구조를 실습하기 위해서 테이블을 생성해보겠습니다. 만드는 기본적인 구조는 다음과 같습니다.
CREATE TABLE 테이블명(
컬럼명 1 자료형,
컬럼명 2 자료형,
..
);
마지막 괄호 다음에 세미콜론(;)을 꼭 붙여줘야 합니다!
문자열 자료형인 CHAR로 실습을 해보겠습니다.
CREATE TABLE tb_char(
COL1 CHAR(10 BYTE),
COL2 CHAR(10 CHAR),
COL3 CHAR(10)
);
tb_char라는 이름을 가진 테이블을 만들어주겠습니다(create). 컬럼은 COL1, COL2, COL3 총 3개로 잡고 각각의 자료형은 다 다르게 잡아주겠습니다. 마지막 COL3은 왜 자료형이 없나요? 할수도 있는데 BYTE/CHAR는 생략이 가능합니다. 대신 그런 경우에는 default타입인 BYTE형태로 들어가게 됩니다. 또한 컬럼의 길이는 1에서 255BYTES 까지의 DATA를 저장할 수 있습니다.
실제로 실행을 해보기 위해서는 이 테이블에 값을 넣어줘야 하는데요, 값을 넣을 때는 다음과 같이 합니다.
INSERT INTO 테이블명(컬럼명, 컬럼명,,,)
VALUES(값, 값,,,)
그리고 모든 값을 확인하기 위해서는 SELECT * FROM 해당테이블명을 해주면 됩니다.
INSERT INTO tb_char(COL1, COL2, COL3)
VALUES('ABC', 'ABC', 'ABC'); --영문 한 문자 : 1byte
INSERT INTO tb_char(COL1, COL2, COL3)
VALUES('가', '나', '다'); -- 한글 한 문자 : 3byte
INSERT INTO tb_char(COL1, COL2, COL3)
VALUES('가나', '가나', '가나');
INSERT INTO tb_char(COL1, COL2, COL3)
VALUES('가나다', '가나다', '가나다');
SELECT * FROM tb_char;
이렇게 입력을 마치고 SELECT함수를 통해 확인을 해보면 다음과 같은 결과가 뜹니다.
COL1에 ABC, 가, 가나, 가나다가 제대로 잘 입력되었고 나머지 컬럼에도 잘 입력되었음을 확인할 수 있습니다.
INSERT를 총 4번 했으니 행이 4개가 나왔네요! 이 행은 훗날 튜플이라고 부를것입니다.
SELECT COL1, COL2, COL3, LENGTHB(COL1), LENGTHB(COL2), LENGTHB(COL3)
FROM tb_char;
전체를 하나의 표로 불러오는것에 그치지 않고 만약 각각의 길이(Length)까지 궁금하다면 어떻게 해야 할까요? 오라클에서는 LENGTHB(컬럼명)을 통해서 해당 컬럼의 문자열의 길이를 Byte단위로 반환해줍니다.
뭔가 차이점이 보이시나요? COL1과 COL3에는 아무 문제 없이 10BYTE가 나왔습니다. 우리가 초반에 테이블을 만들 때 10 BYTE와 10(BYTE)로 넣어줬기 때문이죠. 10 CHAR로 넣어준 COL2는 ABC는 10이 나오는데 나머지 한글이 입력된 곳은 왜 2씩 증가하고 있는 것일까요? 힌트는 영문자 하나는 1byte지만 한글 한 문자는 3byte라는 점입니다.
CHAR : 10 BYTE 11111 11111
가(3 BYTE) + 9 BYTE = 12
가나(6 BYTE) + 8 BYTE = 14
가나다(9 BYTE) + 7 BYTE = 16
우리가 처음 테이블을 만들 때 길이를 10으로 정의해줬습니다. CHAR 자료형은 FIXED LENGTH CHARACTER STRING을 저장합니다. 즉 고정길이자료형으로 정의된 길이의 값 10을 고수한다는 점이죠. 그러면 CHAR로 정의된 자료형의 컬럼은 영어, 한글에 관계없이 총 10글자를 입력할 수 있다는 점입니다. 그러면 '가'는 하나에 3byte이니까, 총 10글자 중에 한 글자를 써먹은 셈이 되고 총 byte는 12byte가 되는 것입니다.
풀어서 설명하자면 영화관에 10개의 좌석을 예매해서 자리를 잡아놨습니다.
○○○○○ ○○○○○
A B C
ABC는 각각 1byte이기 때문에 무리없이 길이에 변화를 주지 않고 잘 착석했습니다.
한글은 상황이 좀 다릅니다;;
●○○○○ ○○○○○
가
●●○○○ ○○○○○
가나
●●●○○ ○○○○○
가나다
그런데 '가'라는 녀석은 덩치가 큽니다. 한 자리를 차지한 것은 맞는데, 이 '가'의 크기가 3byte입니다. 그래도 나머지 9자리는 여전히 남아있습니다. 그러면 총 차지하고 있는 자리는 12byte가 되겠죠. 이번에는 '가나'가 왔습니다. 얘네는 둘이라서 두배로 6byte입니다. 두 명 자리인데 6byte가 차지하네요, 나머지 남은 자리는 8byte로 총 바이트는 14바이트가 됩니다. '가나다'는 셋입니다. 세배라서 9byte입니다. 그럼에도 불구하고 실제로 차지한 자리는 세 자리이기 때문에 7자리가 남아서 총 16byte가 됩니다. 이 모든 일의 원인은 CHAR 자료형이 입력한 글자수와는 상관 없이 고정된 길이의 문자열만 사용하기 때문입니다. 그렇다면 이것과 반대되는 자료형도 있지 않을까요?
CREATE TABLE TB_VARCHAR(
COL1 VARCHAR2(10 BYTE),
COL2 VARCHAR2(10 CHAR),
COL3 VARCHAR2(10)
);
INSERT INTO tb_varchar(COL1, COL2, COL3)
VALUES('ABC', 'ABC', 'ABC');
INSERT INTO tb_varchar(COL1, COL2, COL3)
VALUES('가나다', '가나다', '가나다');
SELECT COL1, COL2, COL3, LENGTHB(COL1), LENGTHB(COL2), LENGTHB(COL3)
FROM tb_varchar;
이번에는 VARCHAR2 자료형으로 구성된 컬럼으로 테이블을 만들어보겠습니다. (VARCHAR도 있나요? 왜 2가 붙었나요?할 수 있겠으나 이는 사용하는 DBMS가 무엇이냐에 따라 다르게 부르는 것일뿐입니다. ms-sql에서는 VARCHAR라고 쓰고 오라클에서는 VARCHAR2라고 씁니다.)자료형만 바뀌었을 뿐 나머지는 CHAR형과 동일합니다. 입력값은 좀 다르게 줘볼게요, 'ABC'와 '가나다'를 모든 컬럼에 동일하게 줬습니다. SELECT함수를 실행한 결과는 어떨까요?
이번에는 테이블을 만들때 길이를 10으로 하자고 했음에도 불구하고 다른 숫자가 튀어나옵니다. 이는 VARCHAR2가 가변길이자료형이기 때문입니다. 따라서 ABC는 각 1byte이므로 3이 나오는 것이고 가나다는 3byte씩 9가 나오는 것이죠. CHAR에서는 주어진 자료형의 길이가 10이기 때문에 단 한 글자를 입력하더라도 10이 나왔습니다. 그러나 VARCHAR2에서는 사이즈를 아무리 크게 잡아주더라도 사용자가 실제 입력한 글자의 크기까지만 기억공간을 잡는 것을 확인할 수 있습니다.
CREATE TABLE TB_LONG(
COL1 LONG
--COL2 LONG 테이블 하나에 LONG형은 하나의 컬럼만 가능
);
INSERT INTO tb_long(COL1)
VALUES('ABCDE');
SELECT * FROM tb_long;
문자열 자료형의 가장 마지막인 LONG형입니다. LONG형은 최대 2GB까지 저장이 가능한 가변길이문자형입니다. 특징으로는 LONG테이블 하나에 LONG형을 집어넣으려면 단 하나의 컬럼만 허용된다는 점입니다. 따라서 하나의 LONG형 값을 넣어서 출력을 해보면 다음과 같은 귀여운 결과값이 나옵니다.
'Oracle SQL > 기초 SQL' 카테고리의 다른 글
SQL SELECT문으로 이것저것 다 해보기(2) / 비교연산자 (0) | 2021.05.26 |
---|---|
SQL SELECT문으로 이것저것 다 해보기(1) (0) | 2021.05.26 |
Dual table을 활용하여 알아보는 SQL SELECT 함수 (0) | 2021.05.25 |
오라클 기본 자료형(숫자, 날짜) (0) | 2021.05.25 |
오라클 버전 11 기본 세팅(hr/scott 데모계정) (0) | 2021.05.25 |