안녕하세요 우기입니다. 너무너무 피곤한 하루지만 정신차리고 오라클이 무엇인지? 오라클에 대한 문법에 대해 정리를 조금 해볼까 합니다.
오라클이란?
오라클은 대표적인 관계형 데이터베이스 "관리시스템" (DBMS) 라고 하죠. 대규모 데이터를 저장하고 꺼내는데 많이 이용되며 Oracle Corporation이 직접 관리하고 유지보수하며 다양한 기업에서 솔루션으로 많이 이용하고 있다고 알고있으면 될 것 같습니다.
대체로 SQL을 사용하며 데이터를 관리하고 이용합니다. SQL이란? 데이터베이스에서 데이터를 추가,수정 삭제하고 검색하는데 사용되는 표준 쿼리 언어입니다. 이로인해 Oracle Database는 SQL을 기반으로 한 강력한 데이터 조작 기능을 제공한다고 들었습니다.
오라클의 장점과 단점
| 장점 | 단점 |
| Oracle은 대규모 데이터베이스 시스템에서도 우수한 성능과 확장성을 제공 높은 처리량과 대량의 데이터를 처리하는 데 특화되어 있으며, 수평 및 수직 확장을 지원하여 시스템 성능을 향상 |
Oracle은 상용 데이터베이스 소프트웨어로서 라이선스 비용이 높다. 또한 대규모 시스템에서는 하드웨어, 유지보수 및 지원 비용도 상당히 부담될 수 있다. |
| Oracle은 고가용성을 위한 다양한 기능을 제공하여 데이터베이스 서버의 장애를 최소화하고 데이터 손실을 방지한다. RAC(Real Application Clusters)과 같은 기능을 통해 서버 장애 시에도 데이터베이스에 지속적인 접근이 가능하다. |
Oracle 데이터베이스는 강력한 기능과 옵션이 많아서 설정 및 관리가 복잡할 수 있다. 초보 사용자나 소규모 애플리케이션에는 비용과 관리 부담이 크게 느껴질 수 있다. |
| 기업에서 중요한 비즈니스 데이터를 다루기 때문에 보안은 매우 중요하다. Oracle은 데이터 암호화, 접근 제어, 인증 기능 등 강력한 보안 기능을 제공하여 데이터의 무단 액세스를 방지한다. | Oracle은 고성능을 위해 상당한 컴퓨팅 자원을 필요로 하므로, 작은 규모의 애플리케이션에는 오버스펙으로 느껴질 수 있다. |
| Oracle은 데이터의 무결성을 유지하기 위해 다양한 제약 조건과 트랜잭션 관리를 지원한다. 이로 인해 데이터베이스 내의 데이터가 항상 일관되고 정확하게 유지된다. | Oracle은 라이선스 정책을 변경할 수 있으며, 이로 인해 라이선스 비용이 증가하거나 기존 사용자들이 새로운 정책에 적응해야 할 수도 있다. |
| Oracle은 다양한 운영 체제와 플랫폼에서 실행될 수 있다. Windows, Linux, UNIX 등의 운영 체제에서 사용할 수 있어 기업의 다양한 요구에 맞추어 구축할 수 있다. | 새로운 Oracle 버전으로 업그레이드하거나 다른 데이터베이스 시스템과의 상호 운용성을 유지하는 것이 어려울 수 있다. |
| Oracle은 SQL 표준을 준수하여 다른 데이터베이스와의 상호 운용성을 지원한다. 또한 다른 애플리케이션과의 통합을 위한 다양한 인터페이스와 API도 제공한다. | 오픈 소스 데이터베이스 시스템들이 성능과 기능 면에서 발전하면서, 기업들이 오픈 소스 대안을 검토하고 채택하는 경향이 늘고 있다. |
오라클의 기초 문법
-- 오라클 기본 문법
SELECT : 테이블에서 데이터 질의하는 키워드
FROM : 데이터를 조회하고 싶은 테이블의 이름을 정하는 키워드
WHERE : 데이터를 조회하는 조건을 적는 키워드
GRUOP BY : 특정 속성을 기준으로 그룹화 하여 검색할 때 속성 키워드
HAVING : 그룹 함수를 포함한 조건 키워드
ORDER BY : 정렬시 사용하는 키워드
-- 오라클 Query 실행 순서
1. FROM : 발췌 대상 테이블 참조
2. WHERE : 발췌 대상 데이터가 아닌 것은 제거
3. GROUP BY : 행들을 소그룹화 한다.
4. HAVING : 그룹핑된 값의 조건에 맞는 것만을 출력한다.
5. SELECT : 데이터 값을 출력/계산한다.
6. ORDER BY : 데이터를 정렬한다.
다 아실테지만 기본적으로 짚고 넘어가야 된다고 생각했습니다. 기초를 탄탄히!
오라클의 형 변환 함수

1. TO_CHAR
- 형식 : TO_CHAR(날짜 or 숫자, '원하는 형태')
- 기능 : 날짜 또는 숫자를 문자로 형 변환한다. 문자는 2번째 인자에서 지정한 형태로 출력된다.
- 2번째 인자인 형태는 아래와 같은 옵션들이 있다.
- 예시에서 SYSDATE(현재시각)은 2020년 2월 4일 오후 10시 49분 06초이다.
| 구분 | 형태 | 의미 | 예시 | 결과 |
| 년도 | YYYY | 연도. 4자리수로 표시. | TO_CHAR(SYSDATE, 'YYYY') | 2020 |
| YY | 연도. 끝 2자리수 표시. | TO_CHAR(SYSDATE, 'YY') | 20 | |
| YEAR | 연도의 영문 이름 전체 표시. | TO_CHAR(SYSDATE, 'YEAR') | TWENTY TWENTY | |
| 월 | MM | 월. 2자리수로 표시. | TO_CHAR(SYSDATE, 'MM') | 02 |
| MON | 월. | TO_CHAR(SYSDATE, 'MON') | 2월 | |
| MONTH | 월. | TO_CHAR(SYSDATE, 'MONTH') | 2월 | |
| 일 | DD | 일. 2자리수로 표시. | TO_CHAR(SYSDATE, 'DD') | 04 |
| DDTH | 몇번째 일인지. | TO_CHAR(SYSDATE, 'DDTH') | 04th | |
| 요일 | DAY | 요일. | TO_CHAR(SYSDATE, 'DAY') | 화요일 |
| DY | 요일. | TO_CHAR(SYSDATE, 'DY') | 화 | |
| D | 요일. | TO_CHAR(SYSDATE, 'D') | 3 (1:일, 2:월, ... 7:토) |
|
| 시간 | HH24 | 하루를 24시간으로 표시. | TO_CHAR(SYSDATE, 'HH24') | 22 |
| HH12 | 하루를 12시간으로 표시. | TO_CHAR(SYSDATE, 'HH12') | 10 (오전 10시, 저녁 10시 둘 다 10으로 표기됨) |
|
| HH | 상동 | TO_CHAR(SYSDATE, 'HH') | 10 (오전 10시, 저녁 10시 둘 다 10으로 표기됨) |
|
| MI | 분 | TO_CHAR(SYSDATE, 'MI') | 49 | |
| SS | 초 | TO_CHAR(SYSDATE, 'SS') | 06 | |
| 숫자 | 9 | 일반적인 숫자를 나타낸다. 9의 갯수만큼 자릿수 |
TO_CHAR(512,'9999') TO_CHAR(-512,'9999') |
512 (앞에 공백 2개 有) -512 (앞에 공백 1개 有) |
| 0 | 빈자리를 0으로 채움 | TO_CHAR(512,'00999') | 00512 | |
| $ | 앞에 $(달러) 표시를 붙인다. | TO_CHAR(512,'$9999') | $512 (앞에 공백 2개 有) | |
| L | 앞에 \(원) 표시를 붙인다. | TO_CHAR(512,'L9999') | ₩512 | |
| . | 소수점 이하를 표시 | TO_CHAR(512,'999.99') | 512.00 (앞에 공백 1개 有) | |
| , | 천단위 구분기호를 표시 | TO_CHAR(190512,'999,999') | 190,512 |
- 9로 포맷을 주면, 결과값의 자리수는 '9의 갯수+1'가 된다.
2. TO_NUMBER
- 형식 : TO_NUMBER(문자)
- 기능 : 숫자처럼 생겼지만 데이터형이 숫자가 아니라 문자인 데이터를 숫자 데이터형으로 바꿔준다.
SELECT TO_NUMBER('512') FROM DUAL; --결과: 512 (데이터형: 숫자)
3. TO_DATE
- 형식 : TO_DATE(문자)
- 기능 : 날짜처럼 생겼지만 데이터형이 날짜가 아니라 문자인 데이터를 날짜 데이터형으로 바꿔준다.
SELECT TO_DATE('2020/02/04') FROM DUAL; --결과:20/02/04 (데이터형: 날짜)
<데이터 타입>
- 참고로, 오라클에서 사용하는 데이터 타입은 아래와 같다. (오라클 11g 기준)
데이터 타입설명
| 데이터 타입 | 설명 |
| CHAR(n) | 문자열 저장. 고정길이의 문자 저장. 1~2000 Byte. 데이터 크기가 고정되어 있기 때문에, 실제로 들어오는 값이 데이터 크기보다 작다고 해도 고정된 크기 n만큼의 용량을 차지한다. |
| VARCHAR2(n) | 문자열 저장. 변하는 길이의 문자를 저장('가변형'이라고도 부름) 1~4000 Byte. 할당된 변수가 지정된 VARCHAR의 크기(n)보다 작을 경우 변수만큼의 공간만 차지한다. 그러므로, CHAR 보다 VARCHAR를 쓰는 게 저장용량을 더 절약할 수 있다. |
| NUMBER(p,s) | 숫자 저장. p: 전체 자리수. (1~38자리까지 가능) s : 소숫점 이하 자리수. -84~127자리까지 가능. |
| DATE | 날짜 저장. 총 7바이트. BC 4712.01.01 ~ AD 9999.12.31 까지 저장 가능. |
| LONG | 가변 길이의 문자 저장. 최대 2GB. |
| CLOB | 가변 길이의 문자 저장. 최대 4GB. '씨로브' 또는 '씨랍'으로 읽는다. |
| BLOB | 가변 길이의 바이너리 데이터 저장. 최대 4GB. |
| RAW(n) | 원시 이진 데이터. 최대 2,000바이트. |
| LONG RAW(n) | 원시 이진 데이터. 최대 2GB. |
| BFILE | 외부 파일에서 저장된 데이터. 최대 4GB. |
오라클의 WINDOW 절 함수 ( + GROUP BY랑 뭐가 다를까?)
흔히들 WINDOW 절 함수라고도 하죠. 정확힌 WINDOW FUNCTION이고 이는 분석 함수중에서 윈도우절을 사용하는 함수를 뜻합니다.
WINDOW FUNCTION 특징
- 행과 행간의 관계를 정의하는 함수
- 순위, 합계, 평균, 행 위치 등을 조작할 수 있다.
- GROUP BY 구문과 같이 사용할 수 없다. (중요)
- 중첩 사용은 불가능하지만, 서브쿼리에서 사용 가능하다.
WINDOW 함수 구조
|
구조
|
설명
|
|
|
ARGUMENTS(인수)
|
- 윈도우 함수에 따라서 0~N개의 인수 설정
|
|
|
PARTITION BY
|
- 전체 집합을 기준에 의해 소그룹으로 나누기
|
|
|
ORDER BY
|
- 어떤 항목에 대해 정렬하기
|
|
|
WINDOWING
|
- 행 기준 범위를 정하며, ROWS는 물리적 결과의 행 수 / RANGE는 논리적인 값에 의한 범위
|
|
기본 작성 방법과 실행 순서
|
SELECT WINDOW_FUNCTION (ARGUMENTS) OVER
( [PARTITION BY 칼럼]] [ORDER BY 절] [WINDOWING 절] ) FROM 테이블 명;
|
SELECT
emp_id,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rank
FROM employees;
이것은 제가 작성한 하나의 예시인데 한번 보겠습니다. 아무래도 실행 순서가 중요하다고 생각합니다. 실행순서를 보도록 해볼까요?
1. employees 에대한 Table 을 갖고오기 (FROM)
2-1. SELECT 에 대한 emp_id, department,salary 갖고오기 (SELECT)
2-2. RANK() OVER 함수에대한 실행문 시작 (RANK () OVER ~()), (2-1와 2-2는 동시에 진행하는것이므로 착각하지 않기)
3. department로 먼저 PARTITION BY를 진행하게됩니다. (department라는 데이터를 소그룹으로 나눈다는 뜻 )
4.그다음 RANK()를 진행하게됩니다 (department(=부서) 에 대해 각각 순위를 매기게됨) 이때, OVER 안에있는 ORDER BY SALARY를 기준으로 매기는겁니다.
5. order by salary 기준으로 desc(내림차순)을 진행하게됩니다.
WINDOW FUCNTION 종류
|
그룹 내 관련 함수 종류
|
함수명
|
설명
|
|
그룹 내 순위 함수
|
RANK
|
- 특정 항목에 대한 순위
- 특정 범위 내 순위를 구할 수 있고, 동일값에 대한 동일 순서를 부여
- 동점이면 같은 순위, 다음 순위를 건너뜀(1,1,1,1,5,5,7...) |
|
DENSE_RANK
|
- 동일 순위를 하나로 취급
- 동점이면 같은 순위, 다음 순위를 건너뛰지않음 (1,1,2,2,2,3....) |
|
|
ROW_NUMBER
|
- 동일 순위에 고유 순위 부여
- 동점 무시, 무조건 1~N등 부여 (ORDER BY 절에 지정한 컬럼들로 정렬한 순서로 매김) |
|
|
그룹 내 집계 관련 함수
|
SUM
|
- 누적값 출력
|
|
MAX
|
- 최대값 출력
|
|
|
MIN
|
- 최소값 출력
|
|
|
AVG
|
- 평균값 출력
|
|
|
COUNT
|
- 특정 수 출력
|
|
|
그룹 내 행 순서 관련 함수
|
FIRST_VALUE
|
- 파티션별 가장 처음에 나온 값
- MIN함수 같은 결과
|
|
LAST_VALUE
|
- 파티션별 가장 나중에 나온 값
- MAX함수 같은 결과
|
|
|
LAG
|
이전 행 출력
|
|
|
LEAD
|
- 윈도우에서 특정 위치 행 가져옴(기본값 1)
|
|
|
그룹 내 비율 관련 함수
|
CUME_DIST
|
- 파티션 전체 건수에서 현재 행보다 작거나 같은 건수에 대한 누적 백분율 조회
- 0과 1 사이의 값
|
|
PERCENT_RANK
|
- 윈도우세 가장 먼저 나오는 값을 0, 마지막 값은 1로 해서 값이 아닌 행의 순서별 백분율 조회
|
|
|
NTILE
|
- 파티션별로 전체 건수를 ARGUMENT값으로 N등분한 결과 조회
|
|
|
RATIO_TO_REPORT
|
- 파티션 내에 전체 SUM(칼럼)에 대한 행 별 칼럼 값의 백분율을 소수점까지 조회한다.
|
저희는 이렇게 오라클의 정의, 오라클의 장단점, 또한 오라클에서 어떤 함수가 잘 쓰이는지 대략적으로 공부해보았습니다.
다음엔 계층형 쿼리를 공부하고 EXIST, NOT EXIST 등 다양한 함수에서 학습을 진행해보도록 하겠습니다,
출처 : https://webstudynote.tistory.com/60,https://gent.tistory.com/640
'💻Computer Science > DB' 카테고리의 다른 글
| [DB] Oracle - Join의 이해 (0) | 2025.04.23 |
|---|---|
| [DB] Mybatis 기본 용어 정리 및 쓰임새 정리 (1) | 2025.04.14 |