자료의 조회

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


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

Leave a comment