카테고리 없음

Oracle DB (4일차)

kim_a_kyung 2025. 7. 8. 10:24

 
tab과 dict의 차이점은?
 
dict            
모든 데이터 딕셔너리 뷰 목록
-> 다른 딕셔너리 뷰의 이름과 설명
tab
현재 사용자가 접근 가능한 특정 객체 조회(테이블, 뷰 등) 목록
-> 객체의 이름과 유형
 
set pagesize (크기)는 한 페이지에 몇 줄을 보여줄건지를 조정하는 명령어이다. 

set pagesize 40

 
 

where like (col명) like ‘IT%'

 

where like col명 like ‘IT_’

는 비슷하면서도 다르다.
 
%는 *과 같이 뒤에 어떤 것들이 오던 상관없지만
_는 단하나의 문자를 뜻한다. 하나의 문자의 형태는 상관없다.

 
위처럼 where 후에 and나 or 조건에 대해서 추가할 수 있다 .
 

연산식과 별칭 설정

우선 연산식에 관해서 알아보자.
우리는 select ~ from ~문을 사용하다보면 column에 대해서 그대로가 아니라 형태를 변환해서 사용해야하는 경우가 존재한다.
 
 예를 들어서 현재 col중에 first_name과 last_name이 존재한다면 이를 합쳐서 한꺼번에 name으로 사용할 수 있다
|| : 문자열을 합쳐주는 연산자

select LAST_NAME||FIRST_NAME from EMPLOYEES;

 
그러면 아래와 같은 화면이 나온다

 
이름이 합쳐져서 출력은 원하는 형태로 되었지만 위의 해당 col의 이름이 보기 좋지않다
그럴 때 사용하는 것이 바로 별칭 사용이다. 
 
여러가지 방식이 존재하지만 가장 보편적인 방식으로 실습해보자

select LAST_NAME||FIRST_NAME as FNAME
from EMPLOYEES

 
as (별칭)으로 사용한다. 
 
이렇게 하게된다면 

 
이런 식으로 별칭이 만들어져서 col이 생성되서 출력되게 된다.
 
여러 col에 대해서 별칭을 만들어서 출력할 수도 있다.   

select  DEPARTMENT_ID as DNO, 
	  FIRST_NAME as NAME, 
	  JOB_ID as JOB, 
  	  SALARY as YEAR_SAL, 
	  COMMISSION_PCT as INCEN
from EMPLOYEES;
where COMMISSION_PCT is NOT NULL
order by COMMISSION_PC asc, SALARY desc

 
위와 달리 여기에서는 각 col에 대해서 별칭을 지정했다.
그리고 추가적인 조건이  2개 붙었다. 
 
where COMMISSION_PCT is NOT NULL
    : 조건문, COMMISSION_PCT가 빈 값이 아니어야한다.
order by COMMISSION_PCT asc, SALARY desc
    : 정렬, COMMISSION_PCT가 오름차순, SALARY가 내림차순으로 정렬한다

 
위와 같은 화면으로 출력되는걸 확인했으면 이제 order by절에 대해서 잠시 보충하고 가자. 
 
ORDER BY절
 
우리가 보통 select를 통해서 데이터를 조회하게 된다면 이는 데이터가 만들어진 상태 그대로 조회하게된다. 
그러나 데이터를 정렬해서 출력할 일이 생긴다.
 
그럴 때 사용하는 것이 바로 ORDER BY절이다. 

order by [정렬하려는 col이름(여러 개 지정 가능)] [정렬 옵션];

 
위와 같은 형태로 사용한다. 
정렬 옵션은 두 가지가 존재한다.
ASC : ascending, 오름차순
DESC : descending, 내림차순
 
동시에 사용할 때는 ,(콤마)를 통해 구분해주면 된다. 
 
예)

order by COL1 asc, COL2, desc;

 
 
이렇게 정렬을 여러 번 사용된다면, 적은 순서대로 정렬이 우선 적용된다. 
즉 위와 같은 경우에는 col1에 대해서 오름차순을 적용하고, col1에서 동일한 값에 대해서 col2의 값을 비교해서 내림차순으로 정리한다. 
 
그리고 위에서는 order by에서도 col명을 그대로 사용했지만
실제로는 order by에서는 별칭을 사용해도 된다!
(where에서는 별칭이 허용되지않는다)
 

select  DEPARTMENT_ID as DNO, 
	  FIRST_NAME as NAME, 
	  JOB_ID as JOB, 
  	  SALARY as YEAR_SAL, 
	  COMMISSION_PCT as INCEN
from EMPLOYEES;
where COMMISSION_PCT is NOT NULL
order by COMMISSION_PC asc, SALARY desc
select  DEPARTMENT_ID as DNO, 
	  FIRST_NAME as NAME, 
	  JOB_ID as JOB, 
  	  SALARY as YEAR_SAL, 
	  COMMISSION_PCT as INCEN
from EMPLOYEES;
where COMMISSION_PCT is NOT NULL
order by INCEN asc, YEAR_SAL desc

 
즉, 위 두 sql 명령어는 같은 결과를 출력해준다는 것이다. 
 
 
자 이제 또 다시 예시를 살피기 전에 다른 연산자에 대해서 알아보자.
우리는 별칭을 설명하면서 || 연산자를 살펴보았다. 
 
이는 문자열에서 적용되는 연산자이다. 
그렇다면 숫자인 경우에도 적용되는 연산자들이 존재한다. 
 
가장 간단하게는 우리가 아는 +, -, * 등이 sql 구문에서 적용된다.

SELECT department_id AS DNO,
       first_name AS NAME,
       job_id AS JOB,
       salary *12 *1350 AS YEAR_SAL,
       commission_pct AS COMM
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY commission_pct asc, salary desc

 
여기서 salary *12 *1350 as YEAR_SAL이라는 구문이 눈에 들어올 것이다. 
이는 salary column에 대하여 *12*1350한 값을 YEAR_SAL라는 명칭의 col에 정리하는 것이다. 
 
login.sql에 관해서는 21.c에서는 자동으로 설정되지않기에, 일단 넘어가고 나중에 더 알아보겟다. 

-> 환경변수에서 설정만 해주면 됨!
 

spool @@@.txt

.
.
.

spool off

 
을 통해서 입력되는 값들이 전부 저장할 수 있다. 

 
 

CREATE 문

오라클 데이터베이스객체를 생성할 때 사용하는 명령어입니다. 

CREATE TABLE user.tabe_name(
	col1_name col1_자료형
    col2_name col2_자료형
    ...
    coln_name, coln_자료형
    );

 
: user 계정 소유의 table_name 테이블을 생성한다
 
usesr(계정 이름)을 생략한다면 현재 접속한 계정 소유의 테이블을 만들어준다. 
 
 
이제 기존 테이블 열 구조와 데이터를 복사하는 새 테이블을 생성해보자.

CREATE TABLE (테이블명)
	as select * from (복사할 테이블명);

 
이런식으로 테이블들 전체를 복사하기도 하고
 
아래와 같이 where을 이용해서 일부만 복사해서 할 수도 있습니다. 

CREATE TABLE (테이블명)
	as select * from (복사할 테이블 명)
    where (col명) = 30;		// 조건문

 
 
혹은 열구조만 복사하여 새 테이블을 생성할 수 있습니다. 

CREATE TABLE (테이블명)
	as select col1, col2, col3, col4
    from (복사할 테이블명)
    where 1 <> 1;
    // 숫자 1과 숫자 1이 다른 값인가(1 <> 1)의 결과값은 항상 false이므로 
    // 모든 결과 행이 출력대상에서 제외되어서 행이 저장되지않습니다.

 
 
예)

위처럼 col들을 가져와서 새로운 별칭을 부여해서 생성하는 것도 가능하다.
 
 
이제 트랙직션에 대해서 알아보자
 

트랙직션(transaction)

더 이상 분할할 수 없는 최소 수행단위입니다. 
하나의 작업 또는 밀접하게 연관된 작업을 수행하는 한 개 이상의 데이터 명령어(DML)로 이루어집니다. 
 
이걸 잘 이해하기 위해서는 Oracle의 Architecture(아키텍처, 구조)부터 잘 이해하고 넘어가야합니다. 
Oracle은 Instance(메모리)와 Database(HDD)로 이루어져있습니다. 

여기서 보면 작은 동그라미로 User Processer가 존재합니다.
이것이 바로 우리가 직접적으로 관여하는 부분입니다!
 
즉, 요약하면 아래와 같은 형태라는 걸 알 수 있습니다.  
-------------------------------------------------
[ 사용자 프로세스 ]
        ↓
[ 인스턴스 ]  ←→  [ 데이터베이스 (파일) ]
--------------------------------------------------
 
인스턴스에서 사용자 프로세스로부터 변경 사항들을 전달 받습니다. 
그 후 , 이를 저장하고 있다가 database로 전달합니다.
 
 
이때, 전달되는 변경사항들을 하나의 트랙직션으로 볼 수 있습니다. 
 
그러면 어떻게 전달이 되는가?  방법과 경우가 여러개 있습니다. 
전에 SQL 명령어에 대해서 설명하는 적이 있습니다. 
 
SQL 명령어
1)    DQL : 질문하는 것
-      Select 만 존재함
2)    DDL : 정의하는 것
-      Create, ALTER, DROP
3)    DML : 조작하는 것
-      INSERT, UPDATE, DELATE
4)    DCL : 제어하는 것
5)    TCL : tranzation을 컨트롤함
 
자 그러면  만약 위에서 실제로 트랜잭션이 일어날 수 있는 것들에 대해서 생각해봅시다. 

실제로 일어나는 것은 TCL과 DDL에서 입니다.
그 외에는 DB에 실제로 반영이 되기 위해서는 TCL의 commit을 통해야만 가능 합니다

즉 방법에는
1) 변경사항 후 TCL의 commit 명령
2) DDL 명령
이 존재합니다.

 

예를 들어서 봅시다. 

아무리 많이 insert를 하더라도 이는 인스턴스에서 일어나는 형태기에 커밋되지않는 이상 변경되지않습니다. 

insert를 한 번만 하더라도 커밋되었다면 이는 하나의 트랜잭션이라고 볼 것이다. 

 

추가적으로 중요한 사항이 하나 있습니다. 

DDL 명령들은 각자 개별적으로 트랜잭션으로 취급합니다. 

만약 전에 다른 명령을이 쌍혀있고 커밋되지않은 상태라면, 이 값들을 커밋해버리고 

DDL 명령을 개별적인 트랜잭션으로 취급하려 실행하고 DB에 반영시킵니다. 

 
 

Q)

 

정답 : 10