oracle - 자료의 조회

자료의 조회

  • 데이터베이스의 넓은 영역 중 주로 자료의 검색과 관련된 부분을 할 예정이다.
  • 자료검색을 위한 가장 기본적인 부분을 다루게 되며, 가장 주요한 부분이라도 말할 수 있다.


SELECT문의 구조

  • 자료의 조작을 위하여 필요한 DML은 크게 4가지로 나뉜다.
    1. 자료의 입력을 목적으로 한 INSERT문
    2. 자료의 조회를 목적으로 한 SELECT문
    3. 자료의 수정을 목적으로 한 UPDATE문
    4. 자료의 삭제를 목적으로 한 DELETE문


  • 이 중에서 가장 많은 빈도로 사용되는 부분이 자료의 조회를 위한 SELECT문이다.
  • SELECT를 위하여 반드시 기술되어야 하는 절이 SELECT와 FROM이다.
    • 즉, 어떤 테이블에서 어떤컬럼을 읽어 올 것인가는 반드시 기술 되어야 하는 필수 사항이다.
  • 그 뒤에 기술될 수 있는 문장은 다음과 같다.
    • 자료에 조건을 부여하여 제한을 주는 WHERE절
    • GROUP함수를 사용하여 자료를 GROUP지를 때 필요한 GROUP BY 절
    • GROUP지은 결과에 조건을 부여하여 제한을 주는 HAVING절
    • 마지막으로 도출된 결과를 정렬할 수 있는 ORDER BY 절
    • 이 4가지는 각각 기술 될 수도 있고 안될수도 있다.
  • 단 HAVING절을 GROUP BY 절이 있을 경우만 사용한다.


실습 테이블 작성

  • 실습용 테이블을 생성한다.
    • 프로그램은 아무거나 써도 상관은 없다.
    • 나는 아날로그맛을 좋아하기에 바로 cmd에서 갈긴다.



  • SET LINESIZE 200 : 한 화면에 표시되는 SQL 명령문의 출력 결과에 대한 행의 크기 (기본은 80이다.)
  • SET TIMING ON : SQL 명령문을 실행하는데 소요된 시간을 출력하기 위한 시스템 변수
  • SERVEROUTPUT : PL/SQL문 실행 시 DBMS_OUTPUT.PUT_LINE()으로 로그를 남길 경우 SERVEROUTPUT 설정을 ON으로 지정해야 로그가 정상적으로 출력 된다.


  • 실행과 설정을 다 했으면 테이블을 생성해준다.


CREATE TABLE TEMP (
 EMP_ID      NUMBER NOT NULL PRIMARY KEY,
 EMP_NAME    VARCHAR2(10) NOT NULL,
 BIRTH_DATE  DATE,
 DEPT_CODE   VARCHAR2(06) NOT NULL,
 EMP_TYPE    VARCHAR2(04),
 USE_YN      VARCHAR2(01) NOT NULL,
 TEL         VARCHAR2(15),
 HOBBY       VARCHAR2(30),
 SALARY      NUMBER,
 LEV         VARCHAR2(04)
);


CREATE TABLE TDEPT (
 DEPT_CODE   VARCHAR2(06) NOT NULL PRIMARY KEY,
 DEPT_NAME   VARCHAR2(20) NOT NULL,
 PARENT_DEPT VARCHAR2(06) NOT NULL,
 USE_YN      VARCHAR2(01) NOT NULL,
 AREA        VARCHAR2(10),
 BOSS_ID     NUMBER
);


  • 데이터도 넣어준다.


INSERT INTO TEMP VALUES (19970101,'김길동',TO_DATE('19740125','YYYYMMDD'),'AA0001','정규','Y','','등산',100000000,'부장');
INSERT INTO TEMP VALUES (19960101,'홍길동',TO_DATE('19730322','YYYYMMDD'),'AB0001','정규','Y','','낚시',72000000,'과장');
INSERT INTO TEMP VALUES (19970201,'박문수',TO_DATE('19750415','YYYYMMDD'),'AC0001','정규','Y','','바둑',50000000,'과장');
INSERT INTO TEMP VALUES (19930331,'정도령',TO_DATE('19760525','YYYYMMDD'),'BA0001','정규','Y','','노래',70000000,'차장');
INSERT INTO TEMP VALUES (19950303,'이순신',TO_DATE('19730615','YYYYMMDD'),'BB0001','정규','Y','','',56000000,'대리');
INSERT INTO TEMP VALUES (19966102,'지문덕',TO_DATE('19720705','YYYYMMDD'),'BC0001','정규','Y','','',45000000,'과장');
INSERT INTO TEMP VALUES (19930402,'강감찬',TO_DATE('19720815','YYYYMMDD'),'CA0001','정규','Y','','',64000000,'차장');
INSERT INTO TEMP VALUES (19960303,'설까치',TO_DATE('19710925','YYYYMMDD'),'CB0001','정규','Y','','',35000000,'사원');
INSERT INTO TEMP VALUES (19970112,'연흥부',TO_DATE('19761105','YYYYMMDD'),'CC0001','정규','Y','','',45000000,'대리');
INSERT INTO TEMP VALUES (19960212,'배뱅이',TO_DATE('19721215','YYYYMMDD'),'CD0001','정규','Y','','',39000000,'과장');
--
INSERT INTO TDEPT VALUES ('AA0001','경영지원','AA0001','Y','서울',19940101);
INSERT INTO TDEPT VALUES ('AB0001','재무','AA0001','Y','서울',19960101);
INSERT INTO TDEPT VALUES ('AC0001','총무','AA0001','Y','서울',19970201);
INSERT INTO TDEPT VALUES ('BA0001','기술지원','BA0001','Y','인천',19930301);
INSERT INTO TDEPT VALUES ('BB0001','H/W지원','BA0001','Y','인천',19950303);
INSERT INTO TDEPT VALUES ('BC0001','S/W지원','BA0001','Y','인천',19966102);
INSERT INTO TDEPT VALUES ('CA0001','영업','CA0001','Y','본사',19930402);
INSERT INTO TDEPT VALUES ('CB0001','영업기획','CA0001','Y','본사',19950103);
INSERT INTO TDEPT VALUES ('CC0001','영업1','CA0001','Y','본사',19970112);
INSERT INTO TDEPT VALUES ('CD0001','영업2','CA0001','Y','본사',19960212);
--
COMMIT;


  • DESC TEMP; 를 입력하여 테이블의 구조를 살펴보겠다.


 Column Name        Null?      Type

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

      EMP_ID          NOT NULL   NUMBER

      EMP_NAME      NOT NULL   VARCHAR2(10)

      BIRTH_DATE                  DATE

      DEPT_CODE      NOT NULL   VARCHAR2(6)

      EMP_TYPE                    VARCHAR2(4)

      USE_YN          NOT NULL   VARCHAR2(1)

      TEL                           VARCHAR2(15)

      HOBBY                        VARCHAR2(30)

      SALARY                       NUMBER

      LEV                           VARCHAR2(4)


  • TEMP테이블은 사원정보를 포함하고 있다.
  • 컬럼 순서대로 사번,성명,생일,소속부서,채용종류,재직여부,전화번호,취미,연봉,직급등의 정보를 포함하고 있다.
  • 자료의 유일성을 보장하는 PRIMARY KEY는 EMP_ID이다.


Column Name         Null?         Type

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

      DEPT_CODE       NOT NULL   VARCHAR2(6)

      DEPT_NAME       NOT NULL   VARCHAR2(20)

      PARENT_DEPT     NOT NULL   VARCHAR2(6)

      USE_YN           NOT NULL   VARCHAR2(1)

      AREA                          VARCHAR2(10)

      BOSS_ID                       NUMBER


  • TDEPT데이블은 부서정보를 포함하고 있다.
  • 컬럼 순서대로 부서코드, 부서명, 상위부서, 사용여부, 근무지역, 부서장 사번을 각각 포함하고 있다.
  • 사원테이블에서 사용하는 부서에 대한 상세정보를 부서 테이블이 가지고 있다.
  • 자료의 유일성을 보장하는 PRIMARY KEY는 DEPT_CODE로 했다.


쿼리 실행

  • SELECT 와 FROM 만을 사용하여 쿼리를 만들어 본다.


SELECT EMP_ID FROM TEMP;



DML과 DDL

  • DML이란?
    • DML이란 Data Manipulation Language의 약어로 SELECT, INSERT, DELETE, UPDATE 문장을 통틀어 칭한다. 즉 DATA를 삽입, 삭제, 수정, 조회 등의 목적으로 다루기 위하여 사용하는 명령어이다.
  • DDL이란?
    • OBJECT 의 생성, 삭제, 변경을 목적으로 하는 언어인 CREATE, DROP, ALTER 등의 명령어가 여기에 해당 한고 반면에 사용자에게 부여된 권한을 정의하는 문장을 DDL이라 한다.


SELECT에서 산술연산

  • DML을 이용하여 계산기의 기본 기능인 산술 연산을 할 수 있다.
    • 숫자와 NUMBER형 컬럼을 이용한 연산 시 연산순서와 연산부호는 계산기와 동일하다.
  • +더하기
  • -빼기
  • *곱하기
  • /나누기
  • ()괄호


연봉을 이용하여 월 급여 계산

  • TEMP 테이블에서 SALARY를 이용하여 월 급여를 알아보는 쿼리를 짜보자.
  • 월 급여는 연봉을 18로 나누어 홀수달에는 연봉의 1/18이 지급되고 짝수달에는 연봉의 2/18이 지급된다고 가정했을 때 홀수 달과 짝수 달에 받을 금액을 SELECT 해보자.


SELECT EMP_NAME, 
	   SALARY/18, 
	   SALARY*2/18 
FROM TEMP;


 EMP_NAME     SALARY/18   SALARY*2/1

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

             김길동       5555555.56   11111111.1

             홍길동       4000000       8000000

             박문수       2777777.78   5555555.56

             정도령       3888888.89   7777777.78

             이순신       3111111.11   6222222.22

             지문덕       2500000       5000000

             강감찬       3555555.56   7111111.11

             설까치       1944444.44   3888888.89

             연흥부       2500000       5000000

             배뱅이       2166666.67   4333333.33