DB - SQL

DB 기본기 익히기 (2) : SPOOL, FUNCTION, 형변환, 제어문

TerianP 2022. 2. 12.
728x90

1. DB 접속하기

  • 다양한 방법으로 DB 접속이 가능하나 현재는 오라클DB에서 제공하는 sqlplus 를 사용함
  • cmd - sqlplus dbID/dbPasswd

 

2. WHERE 조건절

  • WHERE 조건절에는 여러 연산자가 오는데 이때 비교나 논리 연산자가 아닌 다른 연산자들은 앞이나 뒤에 NOT 을 붙여주면 반대를 구할 수 있다.
    • BETWEEN 작은값 AND 큰값, NOT BETWEEN
    • IS NULL, IS NOT NULL
    • IN ( ~), NOT IN (~)
    • LIKE, NOT LIKE % _

3. SQL 내용 저장하기

1) SAVE

  • 내가 작성했던 가장 마지막 SQL 문장을 파일로 저장하기 위해서 사용하는 명령어
  • 아래 명령어로 저장이 가능하며, 저장되는 위치는 C:\Users\[사용자명] 이 기본 위치
    • 이는 기본적으로 CMD 를 열었을 때의 위치가 C:\Users\[사용자명] 이기 때문이라고 생각한다.
  • 만일 SQLPLUS 를 cmd에서 위치를 바꿔 특정 위치에서 실행한다면 그 위치에 파일이 저장된다.
  • 저장 시 위치를 지정해준다면 해당 위치에 파일이 저장된다.
  • 만일 해당 위치에 동일한 파일 명의 sql 파일이 존재한다면 기본적으로 replace 덮어쓰기를 수행한다. 혹은 save [파일명] replace 로 덮어쓰기 명령을 사용할 수 있다.
SAVE [파일명]
save E:\\app\\[파일명] => E 드라이브 app 폴더 안에 해당 파일명으로 저장
SAVE [파일명] REPLACE => 해당 파일명으로 덮어쓰기
  • 아래 명령어를 사용해서 save 로 저장되어있던 SQL 파일 안의 내용을 실행할 수 있다.
@[파일명].sql

 

2) SPOOL

  • SAVE 와는 다르게 전체 명령어와 명령어로 확인된 QUERY 결과를 저장하는 명령어
  • 저장 위치에 대해서는 기존 SAVE 명령어와 동일하게 자신이 지정해 줄 수 있으며 기본 위치는 cmd 의 위치라고 생각하면 됨.
  • 만약 spool off 없이 cmd 를 닫아버린다면, spool 이 어디까지 저장되는지는 미지수 꼭 spool off 를 해주자
SPOOL [파일명] => 기본확장자는 LST
SPOOL [파일명].[확장자명]

SPOOL 명령어만 단독으로 사용한다면 스풀 사용 여부를 확인 할 수 있다.

##################################

SQL> -- 지금부터 모든 사용하는 모든 명령어는 b1.lst 로 저장된다.
SQL> SELECT * FROM DEPT;

    DEPTNO DNAME          LOC                                                   
---------- -------------- -------------                                         
        10 ACCOUNTING     NEW YORK                                              
        20 RESEARCH       DALLAS                                                
        30 SALES          CHICAGO                                               
        40 OPERATIONS     BOSTON                                                

SQL> SELECT * FROM EMP;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO                
---------- ---------- --------- ---------- -------- ---------- ---------- ----------                
      7369 SMITH      CLERK           7902 80/12/17        800                    20                
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30                
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30                
      7566 JONES      MANAGER         7839 81/04/02       2975                    20                
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30                
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30                
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10                
      7788 SCOTT      ANALYST         7566 87/04/19       3000                    20                
      7839 KING       PRESIDENT            81/11/17       5000                    10                
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30                
      7876 ADAMS      CLERK           7788 87/05/23       1100                    20                

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO                
---------- ---------- --------- ---------- -------- ---------- ---------- ----------                
      7900 JAMES      CLERK           7698 81/12/03        950                    30                
      7902 FORD       ANALYST         7566 81/12/03       3000                    20                
      7934 MILLER     CLERK           7782 82/01/23       1300                    10                

14 개의 행이 선택되었습니다.

SQL> SELECT * FROM DEEPT;
SELECT * FROM DEEPT
              *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다 

SQL> -- SPOOL 사용여부는 그냥 SPOOL 명령어 사용
SQL> -- 저장완료는 SPOOL OFF
SQL> SPOOL OFF

 

3) 시간 관련

  • 시간을 확인하기 위한 명령어
set time on : 말 그대로 현재 시간이 프롬프트에 출력됨
10:03:13 SQL> => 프롬프트에 이런 식으로 출력된다

set timing on
경   과: 00:00:00.00 => query 조회 시간이 출력됨

 

4. Function 함수

  • SQL 을 다룰 때 보다 쉽게 다루기 위해서 미리 짜여진 일종의 프로그램 => JAVA 메서드
  • 함수명(컬럼) ⇒ 결과 출력
  • SQL 함수는 크게 2 가지

1) single row function : 각 행마다 실행되는 함수

  • UPPER : 대문자로만 컬럼 내용 출력
  • LOWER : 소문자로
  • INITCAP : 맨 앞 글자만 대문자
  • NVL("컬럼명", "지정값") : NULL 이 아닌 경우 컬럼 내용을 출력하고, NULL 인 경우 지정값을 출력함
  • SUBSTR(컬럼명, 숫자 범위) : 컬럼의 내용을 숫자 범위만큼 잘라서 출력
SQL> SELECT SUBSTR(ENAME, 1, 3) , SUBSTR(ENAME, 3) FROM EMP;

SUBSTR SUBSTR(ENAME,3)
------ ----------------
SMI    ITH
ALL    LEN
WAR    RD
JON    NES
MAR    RTIN
BLA    AKE
CLA    ARK
SCO    OTT
KIN    NG
TUR    RNER
ADA    AMS
  • INSTR(컬럼명, ‘글자’) : 해당 글자가 몇 번째에 위치해있는지 출력
  • LENGTH(컬럼명) : 컬럼 내용이 몇 글자인지 출력
  • RPAD, LPAD(컬럼명, 숫자, ‘기호’) : 숫자 만큼의 범위에서 컬럼 값의 길이만큼을 빼고 나머지는 기호로 채우기
  • ROUND(숫자, 숫자) : 반올림
  • TRUNC(숫자, 숫자) : 소숫점 자르기
SQL> SELECT ROUND(45.129, 2), TRUNC(49.129, 2) FROM DUAL;

ROUND(45.129,2) TRUNC(49.129,2)
--------------- ---------------
          45.13           49.12
  • MOD(숫자, 숫자) : 앞의 숫자를 뒤에 숫자로 나눴을 때 나머지 값 출력
  • 날짜와 관련된 함수
    • MONTHS_BETWEEN(날짜, 날짜) : 날짜와 날짜 사이 일 수
    • ADD_MONTHS(날짜, 숫자) : 해당 날짜로부터 숫자 만큼 뒤
    • NEXT_DAY(날짜, 요일) : 해당 날짜의 다음 요일이 몇 일 언제인지
    • LAST_DAY(날짜) : 날짜 에 해당하는 달의 마지막 날

2) 함수의 중첩

  • 함수는 단순히 한개만 사용가능한 것이 아니라 다른 프로그래밍 언어와 비슷하게 함수 안에 함수 사용이 - 중첩이 - 가능하다.
  • 대표적으로 아래와 같이 응용 가능
SQL> SELECT ENAME AS 사원명, HIREDATE AS 입사일,  NEXT_DAY(ADD_MONTHS(HIREDATE,6), '금') AS "6개월후금" FROM EMP;

사원명     입사일   6개월후금요일
---------- -------- --------
SMITH      80/12/17 81/06/19

SQL> SELECT ENAME AS "사원명", HIREDATE AS "입사일", TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE), 0) AS "근속월" FROM EMP;

사원명     입사일       근속월
---------- -------- ----------
SMITH      80/12/17        493

 

3) 형 변환

  • SQL 은 기본적인 암시적 형변환 - 자동 형변환? - 을 지원한다.
    • 문자열 컬럼에 숫자를 넣어서 찾을 때 암시적으로 숫자 → 문자로 변환하여 검색한다.
    • NUMBER ↔ CHAR : 자동 형변환 가능
  • 물론 암시적 형변환이 아닌 명시적으로 함수를 통해서 형변환을 시켜 검색해야하는 경우도 있음
    • TO_변환하고자하는형(원래값, 형식) : TO_CHAR(), TO_NUMBER(), TO_DATE()
      • 이때 형식이란 원래값이 어떤 형식으로 되어있는지를 의미함→ DATE 라면 YYYY/MM/DD
    • 만약 월급 숫자 → 문자로 변환한다면 다음 형식을 따르게 된다.
      • 이때 999 로 해둔 것은 일의 자리 숫자 중 가장 큰 숫자 9 를 넣어줌으로써 숫자가 있으면 그 숫자를 출력한다는 의미가 된다.
    SQL> SELECT ENAME, TO_CHAR(SAL, '$999,999.99') FROM EMP;
    
    ENAME      TO_CHAR(SAL,
    ---------- ------------
    SMITH           $800.00
    

5. SQL 제어문 : IF , CASE

  • SQL 에서는 제어문과 변수 모두 없음!!

1) DECODE 라는 함수를 통해서 IF문을 대신 할 수 있다 ⇒ 함수

DECODE('컬럼내용1', '컬럼1과 동일하면', ',컬럼1과 다르면'
'컬럼내용2', '컬럼2과 동일하면 실행', '컬럼2와 다르면 실행',
--------)

#################

SQL> SELECT ENAME, JOB, SAL, COMM, DECODE(JOB,'MANAGER',SAL*1.1,
  2  'CLERK', SAL*1.05,
  3  SAL) AS "연봉인상" FROM EMP;

ENAME      JOB              SAL       COMM   연봉인상
---------- --------- ---------- ---------- ----------
SMITH      CLERK            800                   840
ALLEN      SALESMAN        1600        300       1600
JONES      MANAGER         2975                3272.5

 

2) ELSE 문 사용하여 SQL 문 제어에 활용할 수 있다 ⇒ 얘는 함수 X

CASE WHEN [조건문1]
WHEN [조건문2]
ELSE
[조건문3]
END [별칭]

##########################

SQL> SELECT ENAME, JOB SAL,
  2  CASE WHEN JOB = 'MANAGER' THEN SAL*1.1
  3  ELSE SAL
  4  END AS "월급향상"
  5  FROM EMP;

ENAME      SAL         월급향상
---------- --------- ----------
SMITH      CLERK            800
ALLEN      SALESMAN        1600

 

 

댓글