블로그 이미지
프리랜서 Mir.J의 노하우와 강의가 모여있는 블로그! 앞으로 열심히 활동하겠습니다. 잘부탁드리겠습니다 (__)/ Webma_Mir
Statistics Graph

카테고리

Mir (121)
설치및설정 (22)
WPF (2)
C# (21)
Java (50)
Java Method (1)
JSP (5)
Essay (0)
note (2)
Disign (1)
Ubuntu (3)
DevExpress (0)
DBMS (12)
Android (1)
Excel (0)

현 블로그는 모바일 환경이 아닌 PC환경에 최적화 되어있습니다.

 Mir의 운영환경

Chapter1에서는 sql의 기본문구를 배울것이다.

mysql을 한번이라도 해본사람이 있으면 다 알것이다.

select명령이나 desc등등 기본적인 테이블구조를 살피는 명령어들이다.

테이블에 무엇이 있는지 구조가 어떤지 알아야지 수정을 하든 삭제를 하든 할수 있는것이다.


그럼 scott로 접속을 하여 내가 사용할수 있는 테이블이 어떤것이 있는지 알아보자.


SELECT * FROM tab;


mysql에서는 테이블을 볼때 show table라는 SHOW명령어를 썼지만

오라클에서는 SELECT문으로 테이블을 출력한다.

 

tab이란 데이터 딕셔너리 테이블이라고 하는데 후에 자세히 설명하겠다.

지금은 그냥 table이라고만 알아두자!


앞으로 우리가 사용할 4개의 테이블이 보인다.



이제 각 테이블의 구조를 한번씩 살펴보자.


DESC 테이블명

4개의 테이블의 구조를 모두 살펴보았다. 

제일 왼쪽의 이름은 테이블의 속성, 즉 컬럼의 이름을 나타내며  중간 널? 과 유형은 그 컬럼의 속성을 나타내는 것이다.  하나씩 한번 살펴보자.


먼저 dept테이블을 살펴 보자.


dept테이블은  DEPTNO, DNAME, LOC라는 3개의 컬럼을 가지고 있으며 각 컬럼의 속성이 오른쪽에 나와있다.  예를 들어 DEPTNO는 NULL값을 허용하지 않으며 NUMBER(2)의 유형으로 정보가 저장된다.


여기서 잠시 오라클의 데이터형을 간단하게 짚고 넘어가보자.

----------------------------------------------------------------------------------

1. NUMBER 테이터 형   - 숫자 데이터를 저장하는 공간.


number(precision, scale)


precision은 소숫점을 포함한 전체 자리수를 의미하며 scale는 소수점 이하 자리수를 지정한다. 예를들어 12.234를 저장할려고 하면 precision은 5가 되겠고 scale는 3이 된다.


만약 scale값을 넣지 않은채 12.234를 저장하게 되면 자동으로 반올림하여 12가 저장된다.

그리고 number() 처럼 비워두게 되면 입력하는 값에 따라 자동으로 공간이 할당된다.


2.DATE 테이터 형  - 년,월,일,시,분,초 등의 날짜 및 시간 데이터를 저장하는 공간.


기본적으로 출력될때에  "YY/MM/DD" (년/월/일)로 출력되며

설정값을 정해주기에 따라 출력양식은 달라진다.


3.CHAR 데이터 형 - 고정적인 길이의 문자열을 저장하는 공간.


CHAR형은 문자열을 저장하는데 있어 가장 기본적인 테이터 형태이다.

주로 전화번호같이 길이가 정해져 있는 문자열을 저장하는데 많이 사용된다.


4.VARCHAR2 테이터 형 - 가변적인 길이의 문자열을 저장하는 공간.


VARCHAR2는 저장공간을 15로 주었을때 5의 값을 입력하면 자동적으로 5로 줄어든다.

그래서 저장공간의 낭비를 줄일수 있는데 데이터베이스 검색시에는 CHAR형보다 

느리기때문에 편차가 심한 데이터를 입력할때 많이 쓰이며 
편차가 작은 데이터는 CHAR형을 쓰는게 좋다.

----------------------------------------------------------------------------------


이외에도 데이터형은 더 있지만 자주 쓰는것이 저 4가지이다.

다시 돌아와서 dept 테이블을 보자.








위 그림에서 null값을 허용하지 않는다고 하는데 

null값이란 값이 정해지지 않은 속성이다.  값이 없는것도 아니고 값이 있는것도 아닌것으로

예를 들면 50번 부서는 회계부 이지만 아직 지역이 확정되지 않아 지역에는 

어떤값도 입력하지 않았다는것이다. 
혹 0이나 스페이스값(  )<-- (비어 있는거 처럼 보이지만 컴퓨터안에서는 스페이스값이 들어가있다.)을 null값이라고 생각하면 안된다.


DEPTNO컬럼을 해석해보면 널값을 허용하지 않고(NOT NULL)
정수형2자리수를 저장한다(NUMBER(2))
DNAME컬럼은 널값을 넣어도 되고 14글자의 가변적인 문자열이 저장된다.
그러면 LOC는 다들 해석이 될꺼라고 생각한다.

이번엔 emp테이블을 한번 보자.



EMPNO, ENAME, JOB등등 모두 위에서 말한것이다.
여기서 HIREDATE와 SAL만 짚고 넘어가보도록 하자.

HIREDATE는 유형이 DATE인데 방금 설명했듯이 날짜및 시간을 저장하는 데이터형이다.
SAL은 NUMBER(7,2)라고 되어있는데 소숫점 2번째자리까지 포함한 5자리수
즉 만단위(10000.00)의 형태를 가질수 있는것이다.



나머지 테이블 bonus와 salhrade는 각자 한번 해석해보기 바란다.



그럼 테이블의 구조를 알았으니 테이블에 저장되어 있는 정보를 조회해 보도록 하자.


SELECT (컬럼명) FROM (테이블명)


필자가 쓴 명령어를 살펴보자.


select * from emp;


select는 데이터베이스 내의 저장되어있는 테이블을 조회할때 사용하는 명령어이며

* ' 은 에스테리스크라고 불리어 지는데 테이블 내의 "모든(all)" 컬럼을 선택할때에

사용하는 하는 특수문자이다.


from emp -> emp로 부터

select * -> 출력하라 무엇을? ' * ' 모든 컬럼의 정보를..


자 그럼 "나는 잡다한 정보는 필요 없고 사원들의 월급만 조회해보고 싶다" 라고
생각하면 ' * ' 대신에 사원이름과 월급정보를 가지고 있는 컬럼만 출력하면 된다. 


SELECT ename, sal FROM emp;

  

이렇게 사원이름과 월급정보만 출력이 된다.



이번엔 같이 해보자 나는 사원이름(ENAME)과 부서(JOB)와 입사날짜(HIREDATE)를 알고 싶다.  어떻게 명령어를 쳐야 할까? 다들 한번씩 쳐보기로 하자.






이렇게 자신이 원하는 컬럼의 정보만 가져올수 있다.



그럼 이 정보를 가공시켜서 가져오는 방법을 알아보자.

가장 기본적으로 산술연산자를 사용하여 정보를 가공시킬수 있다.


자 위에서 직원별 월급을 출력하였었는데 그럼 직원별 연봉은 얼마나 될까?

월급에서 *12를 하면 연봉을 알수 있을것이다.


이것을 데이터베이스상에서 바로 가공하여 출력해보도록 하자.


SELECT ename, sla*12  FROM emp;


오른쪽은 그냥 월급을 출력한것이고 위쪽은 sal*12를 하여서 연봉을 출력한것이다.

위 컬럼명을 보면 sal에 *12를 했다는것이 바로 눈에 띈다.


이렇게 산술연산자를 사용하여 테이터를 가공하여 출력할수 있다.

이 방법을 이용하면 아래처럼 월급에서 세금을 계산하여 세금을 제외한 월급, 연봉도 한번에 출력할수 있다. (세금을 10%라고 가정)



이번엔 연봉에 보너스(COMM)까지 한번 더해보도록 하자.


SELECT ename, sal*12+comm FROM emp;


뭔가 이상하다. 14개의 행이 선택되었다고 하엿는데 출력된 값은 4개가 전부이다.


이유는 NULL값 때문이다. 

위에서 대충 설명했었는데 다시한번 null값을 정리해보자.


1. 0(zero)가 아니다.

2. 빈 공간도 아니다.

3. 미확정, 알수없는(unknown)값을 의미한다.

4. 어떤 값인지 알 수 없지만 어떤 값이 존재하고 있다.

5. ? 혹은 ∞(무한대)의 의미이다.

6. 연산, 할당,  비교가 불가능하다.


2 + ∞ = ∞ 가 되듯이

위 칼럼에서 연봉 + 보너스를 더하게 될때 보너스가 null값이면 연산후 값은  자동적으로 null값이 되어 버린다. 한번 눈으로 확인해보자.


SELECT ename, sal, comm, sal*12+comm FROM emp;
COMM이 null값일때 연산후 값도 null이 되는것이 보이는가?
어떤것이 null값인지 잘모르겠다면 널값을 다른이름으로 출력해보자.


SET NULL "내가 널값"
SELECT ename, sal, comm, sal*12+comm FROM emp;

널값이 확실히 보이는가?
SET NULL "내가널값" 
위 명령어는 null값에 "내가널값"이란 정보를 넣은것이 아니라
그냥 null값을 출력할때 비어있는 공간대신 "내가널값"이란 문자를 출력하게 만드는 명령어이다. "내가널값"대신에 다른 문구를 넣으면 그문구로 출력하게 된다. 
다시한번 말하지만 null값에 값을 넣은것이 아니라 출력시 문자로 변환하게 하는것이다.

자 null값이 확인 되었는가? comm에 null값이 있으면 sal*12+comm값도 null이 된다.

그럼 sal*12+comm은 연산할수가 없을까? 
아니다 null값이 있더라도 제대로 계산되는 명령어가 SQLplus명령어에 있다.
후에 배울테니 잠시 접어두고 넘어가자 남은 SQL의 기본 명령어는 얼마 안된다.

다시 명령어 set null " "(null값을 공란으로 표시해라)를 사용해서 원래 상태로 되돌려 놓고 진행하자.

이번엔 출력시켰을때 컬럼명을 바꿔보자 일명 별칭달기라고 하는데

이렇게 직원에 따른 연봉을 출력시켰을때 위의 출력된 컬럼 ENAME, SAL*12를 헤딩(heading)이라고 부른며 이 헤딩을 자기의 맘대로 바꿔서 출력시키는것을 별칭부여라고 한다.

SELECT (컬럼명) AS (별칭) ....
FROM (테이블명)

자 SAL*12란 헤딩은 언뜻보면 무슨뜻인지 잘모르겠다.
그러면 SAL*12를 연봉이라고 출력을 해보자.

SELECT  ename, sal*12 as "연봉" 
FROM  emp;
    
이전 출력물과 비교해보자. sal*12가 연봉이라고 바뀌어 출력되었다.

별칭부여는 as를 생략하고 그냥 스페이스값만 주고도 출력할수 있으며 
대/소문자나 공백문자, 특수문자를 표현하고 싶을땐 " "로 감싸주어야 한다.
한글은 당연히 " " 로 감싸주어야 한다.

그럼   ename = name
         job = 부서
         hiredate = 입사날짜
         empno = No.
로 바꾸어서 출력을 해보자.





한줄로 쓰기 너무 길어서 별칭을 하나 부여할때마다 엔터값을 주었다.
name는 그냥 쓰면 대문자로 나오기때문에 " "로 감싸 주었다.

이렇게 별칭부여를 사용하면 출력뒤 내가 무엇을 출력하였는지 정확하게 알수 있다.


이번엔 컬럼사이에 특정 값을 더해서 출력을 하는방법을 알아보자.
SELECT ename, '의 월급은', sal, '이다'
FROM emp;

컬럼명대신에 ('')홑따옴표로 감싼 임의의 글을 입력시켰을때
'의 월급은' 이라는 헤딩이 생기면서 입력시킨 문자열을 같이 출력하게 된다.
이렇게 ('')홑따옴표로 컬럼과 컬럼사이에 새로운 값을 넣을수 있다.

이것을 하나의 문자열처럼 보이게 출력할려면 연결연산자 (Concatenation 연산자)를 이용하면 되는데
컬럼 구분자를 (,)콤마 대신에 연결연산자(||)을 입력하면 하나의 문자열로 합쳐지게 된다.

SELECT ename|| '의 월급은'|| sal || '이다'
FROM emp;

재미있지 않은가?

필자는 재미있어서 이것저것 해보았다.
ename의 빛은 sal이다.
ename의 생일은 hiredate이다. 등등 ;


자 이제 마지막으로 DISTNCT 키워드를 사용해보자.
DISTNCT는 중복된 값을 제거하는 키워드인데 

예를 들어 부서번호를 한번 출력해보자. 일반적인 SELECT문으로 출력을 하면
 
이렇게 중복된값이라도 같이 출력이 된다.

하지만 내가 알고 싶은것은 부서번호가 몇번부터 몇번까지 있는지 알고싶다면 
DISTINCT예약어를 사용하는것이다.
SELECT DISTINCT deptno
FROM emp;


중복된 값을 제거하고나니 부서번호는 10, 20, 30의 3종류가 있다는것을 알수 있다.

한번더 이번엔 직급의 종류가 몇가지 있는지 같이 알아보자.


이회사는 총 5가지의 직급이 있다는것을 알수있다.

일반적인 select문으로는 몇가지 직업이 있는지 알아 내기 힘들지만
이렇게 DISTINCT를 사용하면 중복된 값을 제거하기때문에 쉽게 알아낼수 있는것이다.


자 마무리 정리를 해보자

SELECT - SQL의 가장 기본적인 명령어이다. 선택하여 출력한다라는 의미라고 알아두자.
DESC - 테이블 구성요소(컬럼)과 각 컬럼의 속성을 확인할수 있는 명령어이다.
NULL - ? 나 ∞를 의미한다. 대략적인 개념은 알고 있어야 된다.
   set null ' ' 널값을 출력할때 임의로 출력값을 변경할수 있는 명령어
산술연산자 - 컬럼값을 곱하거나 더하거나 연산할수 있다.
Concatenation - 컬럼을 하나의 문자열로 바꾸는 연산자 (||)의 이름
DISTINCT - 중복되는 값을 제거하는 명령어이다.



SQL의 기본적인 사항이니 명령어는 까먹더라도

이런 명령어가 있었다라는것은 기억해두어야한다.
그래야 후에 쓸일이 있으면 찾아서라도 쓰게 된다.






-------------------------------------------------------------------------------------------------------------------------------------------------------------------
본 블로그의 글을 퍼가실때 꼬릿말, 퍼가시는곳 주소를 꼭 남겨주세요.
출처 꼭 기재해주시고요. 상업적인 용도의 이용은 절대 금합니다. 
혹 프린트를 할 경우 블로그주소와 함께 프린트 해주세요.
허락을 맡지 않고 무단도용을 할경우 법적인 제제가 있을수도 있습니다.
(전 분명히 경고했습니다. 합의같은거 안합니다.)
그리고 혹 무단도용한것을 보신분은 신고해주시면 사례금 챙겨 드리겠습니다.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
⬇ 도움이 되셨다면 다음뷰 추천(아래 손가락 모양) 한번씩만 클릭해주세요 ^^ 추천은 저에게 힘이 됩니다~
Posted by Mir.J Webma_Mir

최근에 달린 댓글

최근에 받은 트랙백

글 보관함