서론
오라클은 전 세계적으로 가장 널리 사용되는 DBMS 소프트웨어 이다. C, JAVA 등 해당 프로그래밍을 하려면 다들 자기만의 언어가 존재하고 익혀야 하는데 오라클 역시 DB에 저장되어있는 자료들을 불러올때 특정 언어를 사용해야 한다. 이것이 SQL(structured query language)이다. 오라클 사용자 입장에서 원하는 데이터들을 빠르게 불러오기 위해 SQL언어를 잘 다루어야 하는 것은 당연한 말이다. 가장 기본적인 데이터를 불러오는 연습을 해보자.
본론
SELECT 컬럼명 FROM 테이블명;
오라클 내부에는 나름대로 데이터들이 잘 적재되어 있는데 사람들이 이해하기 좋게 논리적으로 아래와 같은 형태로 데이터를 표시해 준다. 마치 엑셀에 저장되어 있는 학생들의 데이터처럼 생각해보면 쉽다.
파일 명 : 학생정보.xlsx
파일 내용:
학번 |
이름 |
키 |
몸무게 |
성별 |
|
1 |
12345 |
김이름 |
123 |
22 |
남 |
2 |
12346 |
나이름 |
165 |
21 |
여 |
엑셀에 위와 같이 데이터들이 적혀 있다고 가정했을때, 오라클에서는 논리적으로 학생정보를 테이블이라고 하고 학번, 이름, 키, 몸무게 등을 컬럼 그리고 행에 있는 정보들을 개체라고도 하지만 보통 그냥 똑같이 몇번째 행처럼 행이라고 부른다.
김이름이라는 데이터는 이름 컬럼에서 첫번째 행에 있다고 생각하면 된다. 이것을 이제 오라클 문법으로 써서 가져온다고 생각하면 아래와 같이 표현을 하면 된다.
SELECT 컬럼 FROM 테이블;
SELECT 이름 FROM 학생정보;
이름
-------
김이름
나이름
SELECT 선택할 것이다, FROM 학생정보 테이블에서 무엇을? 이름을.
SELECT 이후에 가져오고 싶은 컬럼명을 적고, FROM 이후에 어떤 테이블에서 가져올지를 적어주면 끝난다. 위와 같은 문장을 쿼리(Query)라고 하고 쿼리의 끝은 세미콜론(;)으로 구분 짓는다. 오라클에서 쿼리 문법들은 대소문자를 가리지 않는다. select 1 from dual; 이라해도 되고 SELECT 1 FROM dual; 이라 해도 되고 SelEct 1 fRom Dual; 이라 해도 된다. 그래도 한눈에 들어오기 좋게 통일해서 쓰는게 좋고 현업에서는 이러한 쿼리를 작성할 때 표준을 정해 그거에 맞게끔 작성해야 한다.
만약에 학번과 이름, 키까지 가져오고 싶다면 SELECT 학번, 이름, 키 FROM 학생정보; 와 같이 쿼리를 작성해주면 된다. 각 컬럼들은 콤마(,)로 구분하여 작성한다.
그리고 모든 컬럼들의 정보를 가져오고 싶다면 하나하나 다 써주어도 되지만 귀찮으니 아스타(*)를 써서 가져 올 수 있다. SELECT * FROM 학생정보;
보통 아스타는 all의 느낌을 가지고 있다.
AS (alias)
위와 같이 정상적으로 데이터를 가져 왔지만 표시를 할때 별칭을 통하여 다른 컬럼명으로 표시가 가능하다.
SELECT 이름 FROM 학생정보; 라면 결과 값 컬럼에 이름이라고 나와 있겠지만
SELECT 이름 AS "NAME" FROM 학생정보; 와 같이 이름대신에 NAME으로 표시가 가능하다.
보통 현재는 SELECT 절에 단순 컬럼명만 나열하였지만 나중에는 복잡한 함수들이 추가가 되어 문장이 길어지고 결과 컬럼의 내용이 흐트러지기 때문에 별칭을 반드시 사용해서 하는 편이다. 스터디 할때나 테스트를 해볼때는 귀찮으니 굳이 별칭을 잘 주지 않지만 현업에서는 반드시 별칭을 주어야 한다.
SELECT DECODE(A, 'ㅎㅎ', 1, 0) FROM AA; 이런 쿼리가 있다고 가정할 때 결과는
DECODE(A, 'ㅎㅎ', 1, 0)
-----------
1
같이 나오면 어떠한 컬럼 값인지 쿼리를 짠 본인만 알지 남들은 알 수가 없다. 따라서 별칭을 주어 처리를 해주어야 사용자 입장에서 어떠한 값인지 쉽게 구분이 가능하다.
오라클에서는 SELECT 이름 NAME FROM 학생정보; 와 같이 띄어쓰기만 하고 별칭을 줄 수도 있다. 하지만 명시적으로 AS를 붙여서 처리하는게 보기에 좋다.
만약 N A M E 으로 주고 싶다면 반드시 "" 양쪽에 쌍따옴표를 표시해 "N A M E" 이어야 된다.
DESC, DISTINCT
DESC는 테이블의 데이터형을 체크할때 쓰는 키워드 이다. 엑셀파일같은 경우에는 아무런 데이터들을 다 넣을 수가 있겠지만 오라클에서는 특정컬럼에는 특정 형태의 데이터만 담을 수 있다. 이건 애초에 테이블을 생성할때 명세한다.
일단 간단히 데이터형들은 3가지만 알고 있으면 된다. VARCHAR2 형, NUMBER 형, DATE형
VARCHAR2는 가변적인 크기를 제공하는 문자형이고, NUMBER는 숫자형, DATE는 날짜형이다.
VHARCHAR2는 문자형이기 때문에 데이터에 숫자나 문자 모두 들어갈 수가 있다. 데이터를 입력할때는 반드시 양쪽에 어퍼스트로피를 달아서 표시해야 한다. 자바나 c에서 문자형들은 "문자" 이렇게 했다면 오라클에서는 '문자' 와 같이 표시를 해야한다. 위에서 별칭쪽을 얘기 했을때 AS "별칭"으로 묶어주었는데 잘 구분해야 한다. 많이 헛갈린다.
NUMBER는 말그대로 숫자형, 숫자만 들어 갈 수 있다. 이 곳에 문자를 넣으려고 하거나 연산을 하면 데이터타입이 다르다며 오류를 내뱉는다.
DATE형 역시 특정 날짜 포맷으로만 데이터를 넣을 수가 있다. 당연히 그냥 날짜를 넣으려고 하거나 연산을 하면 오류가 발생한다.
따라서 위의 문제점들 때문에 DESC를 사용하여 테이블의 컬럼 데이터타입을 체크하기 위해 사용한다.
DESC 학생정보; 라고 치면 각 컬럼에 대한 데이터 타입을 확인 할 수 있는 것이다. 이렇게 미리 확인을 해야 추후에 쿼리를 짤 때 오류 발생이 적어진다.
DISTINCT는 중복된 값을 제거하고 출력하게 해준다. 위치는 SELECT 이후에 넣어 사용한다.
SELECT DISTINCT 이름 FROM 학생정보; 와 같이 사용한다.
이렇게 하면 이름값이 중복된 것들은 표시되지 않고 단 하나만 표시하게 된다. 이름 컬럼에 동일이름이 3명이 있다면 3명 모두 나오는게 아니라 1개만 나온다고 생각하면 된다.
주의 할점은 DISTINCT는 한 컬럼만 사용했을때는 크게 문제가 생기지 않지만 복수의 컬럼을 설정할때는 원하는 값을 얻지 못할 수도 있다.
SELECT DISTINCT 이름, 키 FROM 정보; 라고 작성하고 이름이 중복되면 한명만 표시되게 하고 그 사람의 키만 봐야지라고 하겠지만 실제 결과는 이름과 키 둘다 같은 값들만 제거되고 표시 된다. DISTINCT는 뒤에 나열한 컬럼의 모든 값들이 중복될때 만 제거 되고 표시 된다고 생각하면 된다.
연결연산자, 산술연산자
특정컬럼에 연산을 포함하여 표시를 할 수도 있다.
SELECT 이름 FROM 학생정보;
이름
-------
김이름
나이름
위와 같이 그냥 컬럼의 내용들을 가져오는 것이 아니라.
SELECT 이름 || ' 입니다.' AS "이름" FROM 학생정보;
이름
-------
김이름 입니다.
나이름 입니다.
SELECT 키 FROM 학생정보;
이름
-------
123
165
SELECT 키 + 10 AS "10cm 커진 키" FROM 학생정보;
10cm 커진 키
-------
133
175
키라는 컬럼은 숫자형일때 가정한 것이다. 만약 키 컬럼이 문자열이라면 정상적으로 계산이 되지 않지만 (산술 계산은 숫자형들끼리만 된다) 오라클에서는 묵시적 형변환이라고 해서 자동으로 문자형을 숫자형으로 변경 후 계산해서 보여준다.
결론
어쩌다 보니 내용이 너무 무거워 진 것 같다. 공부를 하면서 필자 나름대로 해석한 내용을 적은 것인데 필자의 블로그 내에 있는 오라클 관련 글들을 차례대로 읽으면 공부하시는데 꽤 도움이 될 것 같다. 초반에만 잘 이해를 해두면 추후에 쿼리 짤때 무난하게 짤 수 있는 것 같다.