특정문자를 다른 문자로 바꾸기(REPLACE)

 

문자열에서 특정 문자만 다른 문자로 바꾸고자 하면 REPLACE 함수를 사용하시면 됩니다.

REPLACE( 문자열, 찾는 문자, [대체할 문자])

이때, 대체할 문자 를 생략하게 되면 해당 문자를 문자열에서 삭제합니다.

직원의 이름에서 알파벳 대문자 'A'를 소문자로 바꾸어 봅시다. 또, 아예 직원 이름에서 대문자 'A'를 삭제해 봅시다.

SELECT ENAME, REPLACE(ENAME,'A','a'), REPLACE(ENAME,'A')
FROM EMP;

 

※ 예제로 사용된 TABLE의 정보는 'SCOTT 계정 예제 Table(emp, dept, salgrade)'을 참고하시면 됩니다.

특정 문자의 위치 찾기(INSTR)

 

문자열 데이터 안에서 특정 문자의 위치를 찾고자 할때는 INSTR 함수를 사용하시면 됩니다.

INSTR( 대상 문자열 데이터, 위치를 찾으려는 부분 문자, [위치를 찾기 시작할 대상 문자열의 데이터 위치(기본값은 1)],
[시작위치에서 찾으려는 문자가 몇번째인지 지정(기본값은 1)])

INSTR함수의 사용을 예제로 살펴 봅시다. 

SELECT ENAME, INSTR(ENAME, 'L'), INSTR(ENAME, 'L', 4), INSTR(ENAME, 'L', 2, 2)
FROM EMP;
  • ENAME, INSTR(ENAME, 'L') : 문자열의 처음부터 알파벳 'L'을 찾아, 처음으로 'L' 이 나오는 위치를 구합니다.
  • INSTR(ENAME, 'L', 4) : 문자열의 네 번째부터 알파벳 'L'을 찾아, 처음으로 'L' 이 나오는 위치를 구합니다.
  • INSTR(ENAME, 'L', 2, 2) : : 문자열의 두 번째부터 알파벳 'L'을 찾아, 두 번째로 'L' 이 나오는 위치를 구합니다.

 

※ 예제로 사용된 TABLE의 정보는 'SCOTT 계정 예제 Table(emp, dept, salgrade)'을 참고하시면 됩니다.

 

문자열 일부를 추출하는 함수(SUBSTR)

 

단어에서 시작하는 첫 알파벳만 알고 싶거SUBSTR나, 전화번호에서 마지막 네자리 숫자만 알고 싶을때는 문자열 일부를 추출하는 함수인 SUBSTR를 사용합니다.

함수 설명
SUBSTR(문자열 데이터, 시작위치, [추출길이] ) - 문자열 데이터의 시작 위치부터 추출 길이 만큼의 문자열을 출력합니다.
- 시작위치가 음수인경우 문자열의 끝에서 부터 역산하여 위치를 찾아 해당 위치부터 추출 길이 만큼의 문자열을 출력합니다.
- 추출길이가 생략된 경우 문자열의 시작위치 부터 끝까지를 출력합니다.
이때, 시작위치가 음수이면 문자열의 끝에서 부터 역산한 위치부터 끝까지의 문자열을 출력합니다.  

 

 

SUBSTR 함수를 이용하여 다양하게 출력해 봅시다.

SELECT JOB,
    SUBSTR(JOB, 1, 2), SUBSTR(JOB, 3, 2), SUBSTR(JOB, 5), SUBSTR(JOB, -3, 2), SUBSTR(JOB, -5)
FROM EMP;
  • SUBSTR(JOB, 1, 2) : 문자열의 처음부터 2글자를 출력합니다.
  • SUBSTR(JOB, 3, 2) : 문자열의 처음에서 세 번째 글자부터 두 글자를 출력합니다.
  • SUBSTR(JOB, 5) : 문자열의 처음에서 다섯번째 글자부터 끝까지를 출력합니다.
  • SUBSTR(JOB, -3, 2) : 문자열의 끝에서 세번째 글자부터 두 글자를 출력합니다.
  • SUBSTR(JOB, -5) : 문자열의 끝에서 다섯번째 글자부터 끝까지를 출력합니다.

 

 

※ 예제로 사용된 TABLE의 정보는 'SCOTT 계정 예제 Table(emp, dept, salgrade)'을 참고하시면 됩니다.

문자열 길이를 구하는 함수(LENGTH, LENGTHB)

 

함수 설명
LENGTH (문자열) 문자열 길이를 반환합니다.
LENGTHB(문자열) 문자열의 길이를 바이트 단위로 구해서 반환합니다.

 

특정 컬럼에 있는 문자열의 길이는 LENGTH 함수로 구하실 수 있습니다. 사원정보 테이블에서 이름과 직책에 사용된 문자열 길이를 구해 봅시다.

SELECT ENAME, LENGTH(ENAME), JOB, LENGTH(JOB)
FROM EMP;

 

해당 함수를 이용하여 이름이 5글자 이상직 직원들의 이름과 이름의 길이를 출력해 봅시다.

SELECT ENAME, LENGTH(ENAME)
FROM EMP
WHERE LENGTH(ENAME) >= 5;

 

문자열의 길이를 구하는 다른 함수로는 LENGTHB 함수가 있습니다. 이 함수는 문자열 데이터의 길이를 바이트 수로 반환합니다. 영문의 경우에는 LENGTH, LENGTHB 어느 함수를 사용해도 결과가 같지만 한글은 다른 결과를 보여 줍니다. 

SELECT LENGTH('한글'), LENGTHB('한글')
FROM DUAL;

이 예제를 통해 보면 한글은 3바이트로 처리 됨을 알 수 있습니다(과거에는 2 바이트로 처리 됨).

 

 

※ 예제로 사용된 TABLE의 정보는 'SCOTT 계정 예제 Table(emp, dept, salgrade)'을 참고하시면 됩니다.

 

Do it! 오라클로 배우는 SQL 입문

Do it! 시리즈 / 이지훈 저자(글) / 이지스퍼블리싱 · 2025년 03월 05일 (1쇄 2018년 10월 30일)

SQLD, SQLP 책을 보다가 실습을 해볼까 하면서 만나게 된 책입니다. 아무 생각없이 가져 왔는데, Oracle 21c 버전이 반영되어 있어 지금 시점에서 실습 셋팅하기가 좋았습니다.

 

 

목차

  • 첫째마당 | 오라클과 데이터베이스
    01장 데이터베이스와 SQL
    __01-1 데이터와 데이터베이스, DBMS
    __01-2 데이터 모델
    __01-3 관계형 데이터베이스와 SQL
    __01장 되새김 문제

    02장 관계형 데이터베이스와 오라클 데이터베이스
    __02-1 관계형 데이터베이스의 테이블과 키
    __02-2 오라클 데이터베이스
    __02장 되새김 문제

    03장 오라클 데이터베이스와 실습 환경 설정
    __03-1 오라클 데이터베이스 설치하고 계정 설정하기
    __03-2 SQL Developer 설치하고 실행하기

    -----------------------------------------------------
    둘째마당 | 실무에서 자주 사용하는 SQL, SELECT문을 이용한 데이터 조회
    04장 SELECT문의 기본 형식
    __04-1 실습용 테이블 살펴보기
    __04-2 데이터를 조회하는 3가지 방법 — 셀렉션, 프로젝션, 조인
    __04-3 SQL의 기본 뼈대, SELECT절과 FROM절
    __04-4 중복 데이터를 삭제하는 DISTINCT
    __04-5 보기 좋게 별칭 설정하기
    __04-6 원하는 순서로 출력 데이터를 정렬하는 ORDER BY절
    __04장 되새김 문제

    05장 결과를 더 정확하고 다양하게 출력하는 WHERE절과 연산자
    __05-1 필요한 데이터만 쏙 출력하는 WHERE절
    __05-2 여러 개 조건식을 사용하는 AND, OR 연산자
    __05-3 연산자 종류와 활용 방법 알아보기
    __05장 되새김 문제

    06장 데이터 처리와 가공을 위한 오라클 함수
    __06-1 오라클 함수
    __06-2 문자 데이터를 가공하는 문자 함수
    __06-3 숫자 데이터를 연산하고 수치를 조정하는 숫자 함수
    __06-4 날짜 데이터를 다루는 날짜 함수
    __06-5 자료형을 변환하는 형 변환 함수
    __06-6 %00; 처리 함수
    __06-7 상황에 따라 다른 데이터를 반환하는 DECODE 함수와 CASE문
    __06장 되새김 문제

    07장 다중행 함수와 데이터 그룹화
    __07-1 하나의 열에 출력 결과를 담는 다중행 함수
    __07-2 결괏값을 원하는 열로 묶어 출력하는 GROUP BY절
    __07-3 만든 그룹을 조건별로 출력할 때 사용하는 HAVING절
    __07장 되새김 문제

    08장 여러 테이블을 하나의 테이블처럼 사용하는 조인
    __08-1 조인
    __08-2 조인 종류
    __08-3 표준 SQL 문법으로 배우는 조인
    __08장 되새김 문제

    09장 SQL 속 또 다른 SQL, 서브쿼리
    __09-1 서브쿼리
    __09-2 실행 결과가 하나인 단일행 서브쿼리
    __09-3 실행 결과가 여러 개인 다중행 서브쿼리
    __09-4 비교할 열이 여러 개인 다중열 서브쿼리
    __09-5 FROM절에 사용하는 서브쿼리와 WITH절
    __09-6 SELECT절에 사용하는 서브쿼리
    __09장 되새김 문제
    -----------------------------------------------------
    셋째마당 | 데이터를 조작, 정의하는 SQL 배우기
    10장 데이터를 추가, 수정, 삭제하는 데이터 조작어
    __10-1 테이블에 데이터를 추가하는 INSERT
    __10-2 테이블에서 데이터를 수정하는 UPDATE
    __10-3 테이블에서 데이터를 삭제하는 DELETE
    __10장 되새김 문제

    11장 트랜잭션 제어와 세션
    __11-1 하나의 단위로 데이터를 처리하는 트랜젝션
    __11-2 트랜잭션을 제어하는 명령어
    __11-3 세션과 읽기 일관성의 의미
    __11-4 수정 중인 데이터 접근을 막는 LOCK
    __11장 되새김 문제

    12장 데이터 정의어
    __12-1 객체를 생성, 변경, 삭제하는 데이터 정의어
    __12-2 테이블을 생성하는 CREATE
    __12-3 테이블을 변경하는 ALTER
    __12-4 테이블 이름을 변경하는 RENAME
    __12-5 테이블의 데이터를 삭제하는 TRUNCATE
    __12-6 테이블을 삭제하는 DROP
    __12장 되새김 문제

    13장 객체 종류
    __13-1 데이터베이스 관련 데이터를 저장한 데이터 사전
    __13-2 더 빠른 검색을 위한 인덱스
    __13-3 테이블처럼 사용하는 뷰
    __13-4 규칙에 따라 순번을 생성하는 시퀀스
    __13-5 공식 별칭을 지정하는 동의어
    __13장 되새김 문제

    14장 제약 조건
    __14-1 제약 조건 종류
    __14-2 빈 값을 허락하지 않는 NOT %00;
    __14-3 중복하지 않는 값 UNIQUE
    __14-4 유일하게 하나만 있는 값 PRIMARY KEY
    __14-5 다른 테이블과 관계를 맺는 FOREIGN KEY
    __14-6 데이터 형태와 범위를 정하는 CHECK
    __14-7 기본값을 정하는 DEFAULT
    __14장 되새김 문제
    -----------------------------------------------------
    부록 A | 사용자, 권한, 롤 관리
    __A-1 사용자 관리
    __A-2 권한 관리
    __A-3 롤 관리

    찾아보기

 

 

Oracle Database SCOTT 계정 삭제와 데이터 초기화

SCOTT 계정과 실습 데이터를 추가 하는 중 마음대로 되지 않아, 처음부터 다시 진행하려고 sys 계정에서 아래와 같이 진행하시면 SCOTT 계정이 초기화 됩니다.

 

ALTER SESSION SET "_oracle_script"=true;

이 명령은 현재 세션에 대해 Oracle 스크립트 모드를 활성화하는 데 사용됩니다. 이 모드를 사용하면 기본 모드에서 허용되지 않을 수 있는 특정 SQL 스크립트를 실행할 수 있습니다.

drop user scott cascade;

Oracle의 DROP USER 문은 데이터베이스에서 사용자를 제거하는 데 사용됩니다.

 

이제 처음부터 다시 진행하시면 됩니다.

 

자료 출처 : 'Do ti! 오라클로 배우는 SQL 입문' , 인터넷 검색

문자열 대소문자 변환 함수(UPPER, LOWER, INTCAP)

 

문자열 데이터를 가공하거나 문자열 데이터로 특정한 결과를 얻고자 할때 사용하는 함수입니다.

함수 설명
UPPER(문자열) 괄호 안 문자열 데이터를 모두 대문자로 변환하여 반환 합니다.
LOWER (문자열) 괄호 안 문자열 데이터를 모두 소문자로 변환하여 반환 합니다.
INITCAP(문자열) 괄호 안 문자열 데이터 중 첫번째 글자는 대문자로, 나머지 문자는 소문자로 변환하여 반환합니다. 

 

문자 함수에 대한 예제를 살펴 봅시다. 예제로 사용된 TABLE의 정보는 'SCOTT 계정 예제 Table(emp, dept, salgrade)'을 참고하시면 됩니다.

SELECT ENAME, UPPER(ENAME), LOWER(ENAME), INITCAP(ENAME)
FROM EMP;

 

해당 함수들은 문서의 비교나 특정 문자열을 찾는 경우, 해당 문자가 대문자로 쓰여 있던, 소문자로 쓰였있던, 섞어서 쓰여 있던 상관없이 검색이 가능합니다. 즉 내가 'Oracle' 이라는 단어를 검색하고 싶은데, 문서에는 "oracle", "ORACLE", "OrAcLe"와 같은 형식으로 쓰여 있는 경우 일반검색으로는 찾을 수 없지만, 문자를 모두 대문자나, 소문자로 치환하면 비교하여 찾는 것이 가능합니다.

 

자료 검색의 예로 이름이 'TH'로 끝나는 직원을 찾는 쿼리를 만들어 봅시다. (LIKE 연산자에 대해 궁금하신 부분은 'SQL 연산자 - LIKE 연산자' 부분을 참고하시면 됩니다.)

 

SELECT *
FROM EMP
WHERE UPPER(ENAME) LIKE UPPER('%th');

 

※ 예제로 사용된 TABLE의 정보는 'SCOTT 계정 예제 Table(emp, dept, salgrade)'을 참고하시면 됩니다.

 

'DataBase' 카테고리의 다른 글

[Book] 오라클로 배우는 SQL 입문  (4) 2025.07.31
[Oracle] SCOTT 계정 삭제와 데이터 초기화  (0) 2025.07.31
데이터 변경 시 유의 사항  (0) 2025.07.28
[ORACLE] ORACLE 함수  (1) 2025.07.28
SQL 연산자 - 집합 연산자  (0) 2025.07.26

 

데이터 변경 시 유의 사항

 

UPDATE문과 DELETE문은 테이블에 있는 데이터를 수정하거나 삭제하는 기능을 수행하고 있어, 작업에 위험성이 큰 명령어 입니다. 특히 민감한 데이터가 있는 테이블에 잘못된 작업을 실행한다면 큰 문제가 발생됩니다. 그러므로, UPDATE문과 DELETE문을 실행 할 때는 아래 사항들을 유의 하여 작업을 진행해야 합니다.

 

  • WHERE 조건 확인: UPDATE 문을 실행하기 전에는 반드시 WHERE 조건을 확인하여 의도한 데이터만 수정되도록 합니다.
    - WHERE 조건이 변경하고자 하는 행을 정확하게 선택하는지 SELECT문으로 먼저 조회하여 확인해 보는 습관이 필요합니다.
  • 백업: 중요한 데이터를 수정하기 전에는 데이터를 백업하여 복구할 수 있도록 준비합니다. 
    - ROLLBACK으로 복구가 가능한 부분도 있긴 합니다만, COMMIT해버린 자료에 대해서는 ROLLBACK 이 불가능 하니, 중요한 작업들은 백업 후 수행하는 습관을 꼭 들이시길 바랍니다. 그리고, 작업이 끝났으면, 확인 후 백업 파일을 지우는 습관도 같이 들여 두셔야 공간의 낭비 및 이후 작업의 혼선을 방지 할 수 있습니다.
  • 트랜잭션 활용: 여러 UPDATE 문을 실행하거나 작업의 원자성이 중요한 경우 트랜잭션을 사용하여 COMMIT 또는  ROLLBACK 할 수 있도록 합니다. 
    - COMMIT 시점을 잘 선택하여 필요한 시점에 ROLLBACK이 가능하도로 하는 것이 중요합니다.
  • 테스트 환경에서 검증: 실제 운영 환경에 적용하기 전에 개발 또는 테스트 환경에서 충분히 검증하여 예상치 못한 결과를 방지합니다.

이러한 유의사항을 준수하여 UPDATE 문과 DELETE문을 사용한다면 데이터베이스의 데이터를 안전하고 효과적으로 수정/삭제 하실 수 있습니다. 

ORACLE 함수(Function)

 

1. 함수(Function) 란

데이터베이스에서 이야기 하는 함수는 수학에서 일반적으로 이야기하는 함수와 동일합니다. 매개변수를 받아 특정 계산(작업)을 수행하고 결과를 반환하는 것을 말합니다.

함수(函數, function)는 수학에서 두 집합 사이의 관계를 설명하는 논리적 개념으로, 간단하게 정의역의 각 원소마다 공역의 원소를 오직 하나씩 대응되는 관계를 말한다.(나무위키)

 

 

2. Oracle 함수의 종류

오라클 함수는 함수를 제작하는 주체를 기준으로 오라클에서 기본으로 제공하는 내장함수(Built-in Function)와 사용자가 필요시 직접 정의한 사용자 정의 함수(User-definde Function)으로 나뉩니다.

내장함수는 입력 방식에 따라 데이터를 한 행씩 입력하고 처리하는 단일행 함수(Single-row Function)와 여러행을 입력받아 하나의 결로고 반환하는 다중행 함수(Multiple-row Function)로 나뉩니다.

주체기준 분류 입력방식에 따른 분류 함수분류 함수
내장함수
(Built-in Function)
단일행 함수
(Single-row Function)
문자함수 UPPER, LOWER, INTCAP
LENGTH, LENGTHB
SUBSTR
INSTR
REPLACE
LPAD, RPAD
TRIM, LTRIM, RTRIM
숫자함수 ROUND
TRUNC
CEIL, FLOOR
MOD
날짜함수 SYSDATE
ADD_MONTHS
MONTHS_BETWEEN
NEXT_DAY, LAST_DAY
ROUND, TRUNC
변환함수 TO_CHAR
TO_DATE
DECODE
NULL 
처리함수
NVL
NVL2
다중행 함수
(Multiple-row Function)
 집계함수 SUM
COUNT
MAX, MIN
AVG
사용자 정의 함수
(User-definde Function)
     

 

 

SQL 연산자 - 집합 연산자

두 개 이상의 SELECT문으로 조회한 결과를 하나의 결과로 연결하여 보여줄 때 사용 합니다. 이때 두 SELECT 문의 컬럼 갯수와 각 컬럼의 자료형, 순서가 일치해야 합니다. 서로 다른 타이블이나 컬럼에 대해서 수행이 가능 합니다. 이때 결과로 출력되는 컬럼명은 앞에 오는 SELECT문의 컬럼명이 사용 됩니다.

 

집합연산자들은 집합관계를 생각하시면 쉽게 이해하실 수 있습니다. 다음은 집합연산자 들에 대한 간략한 설명입니다. 

종류 설명 집합관계
UNION 두개이상의 SELECT문을 하나의 결과 값으로 출력합니다. 이때 중복값은 제외 합니다. A ∪ B(합집합)
UNION ALL 두개이상의 SELECT문을 하나의 결과 값으로 출력합니다. 이때 중복값은 제외하지 않습니다. A, B
MINUS 먼저 작성된 SELECT 문의 결과 값 중 다음 SELECT 문에 없는 결과 값만 출력 합니다. A - B(차집합) 
INTERSECT 먼저 작성된 SELECT 문과 다음 SELECT 문의 결과 값이 같은 것만 출력 합니다. A  B(교집합)

 

1. UNION 연산자

사원정보(EMP) 테이블에서 부서 번호(DEPTNO)가 10인 결과를 출력하는 SELECT문과 30인 결과를 출력하는 SELECT 문을 이용하여, 부서번호가 10 또는 30인 사원정보를 출력해 봅시다. EMP 테이블의 구조 예제로 사용된 TABLE의 정보는 'SCOTT 계정 예제 Table(emp, dept, salgrade)'을 참고하시면 됩니다.

SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 30;

이때 출력할 컬럼의 숫자가 다르거나, 출력할 열의 자료형이 다른 경우에는 오류가 발생하여 실행되지 않습니다.

 

데이터 형만 같다면, 컬럼명에 영향을 받지 않음도 테스트 해 봅시다. 사원정보 테이블에서 급여(SAL)와 급여외 수당(COMM)은 NUMBER로 유형이 동일합니다. 이 컬럼의 위치를 두번째 SELECT 문에서 바꾸어 보면 어떻게 될까요? 

SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT ENAME, COMM, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 30;

아래 보시는 결과과 같이 컬럼명은 첫번째 SELECT 문에 사용된 것이 그대로 사용 되었고, 결과 자료는 각 SELECT 문의 수행 결과가 그대로 연결되었습니다.

실 사용시에도 이런 경우에는 오류가 발생하지 않으니, 작성시 유의 하시기 바랍니다.

 

2. UNION ALL 연산자

사원정보(EMP) 테이블에서 부서 번호(DEPTNO)가 10인 SELECT 문 2개를 연결해 봅시다. 이때 UNION을 사용하면, 중복이 제거되어 SELECT 문 두개를 연결한 의미가 없습니다. 중복해서 2번 표현 되게 하려면 어떻게 해야 할까요? 

SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION ALL
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10;

 


3. MINUS 연산자

집합연산자를 이용하여 사원정보(EMP) 테이블에서 부서 번호(DEPTNO)가 10인 정보만 제외하고 출력하는 쿼리를 만들어봅시다. 

SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
MINUS
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10;

결과와 같이 첫 번째 SELECT문의 결과값에서 두 SELECT문의 결과값이 같은 데이터를 제외한 값들이 출력됩니다.

 

4. INTERSECT 연산자

두개의 SELECT 문에서 공통적인 결과 값을 갖는 데이터만 출력하려면 어떻게 하면 될까요? 

SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
INTERSECT
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10;

결과와 같이 첫 번째 SELECT문의 결과값과 두 SELECT문의 결과값이 같은 데이터들이 출력됩니다.

'DataBase' 카테고리의 다른 글

데이터 변경 시 유의 사항  (0) 2025.07.28
[ORACLE] ORACLE 함수  (1) 2025.07.28
SQL 연산자 - LIKE 연산자  (0) 2025.07.25
SQL 연산자 - BETWEEN ~ AND ~ 연산자  (1) 2025.07.24
SQL 연산자 - IN 연산자  (2) 2025.07.23

+ Recent posts