본문 바로가기
Oracle

Oracle 의사컬럼, 연산자, 표현식, 조건식

by 요리하다그만둠 2022. 6. 16.

의사 칼럼(Pseudo-column)

테이블의 칼럼처럼 동작하지만 실제로 테이블에 저장되지 않는 칼럼을 말합니다.

SELECT 문에서는 의사 칼럼을 사용할 수 있지만, 의사컬럼 값을 INSERT, UPDATE.DELETE 할 수는 없습니다.

(NEXTVAL.CURRVAL도 의사 칼럼의 일종)

  • CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF, LEVEL
  • NEXTVAL, CURRVAL = 시퀀스에서 사용하는 의사 칼럼입니다.
  • ROWNUM < ROWID = ROWNM은 쿼리에서 반환되는 각 로우들에 대한 순서 값을 나타내는 의사 칼럼입니다,
SQL> SELECT ROWNUM, employee_id
  2  FROM employees;

 

테이블에 데이터가 많으면 SELECT만 하더라도 결과가 나올 때까지 시간이 많이 소요됩니다. 

예를 들어 sales 테이블에 어떤 컬럼이 있는지 보고 싶어 SELECT * FROM sales 문을 실행하면 전체 로우가 반환되며 결과를 보기까지 시간이 오래 걸립니다.(여러 가지 툴에서는 한 번에 몇 건만 화면에 출력하는 옵션이 있기는 하다) 이때 다음과 같이 ROWNUM이라는 의사컬럼을 사용하면 매우 편합니다.

SELECT ROWNUM, employee_id
FROM employees
WHERE ROWNUM < 5;

 

ROWID는 테이블에 저장된 각 로우가 저장된 주소 값을 가리키는 의사컬럼입니다.

각 로우를 식별하는 값이므로 ROWID는 유일한 값을 가집니다.

SELECT ROWNUM, employee_id, ROWID
FROM employees
WHERE ROWNUM < 5;

 

 

연산자

연산자(operator)는 연산을 수행합니다. 오라클은 다양한 연산자를 제공하고 있는데, 이들을 정리하면 다음과 같습니다.

 

수식 연산자

'+'와'-'는 연산 대상이 1개인 단항 연산자로 쓰일 때 각각 양수와 음수를 나타낸다. 또한 두 수의 연산, 즉 이항 연산자로 사용될 때는 각각 덧셈과 뺄셈 연산을 한다. 그리고 * 곱셈 / 나눗셈 연산을 합니다.

 

문자 연산자

'||'는 두 문자를 붙이는 (연결하는) 연산을 수행합니다. 다음 쿼리는 사원 테이블에서 "사번 - 사원명" 형태를 추철하는 SELECT 문입니다.

SELECT  문 입력

SELECT employee_id || '-' || emp_name AS employee_info
FROM employees
WHERE ROWNUM < 5;

결과

논리 연산자 : > , < ,>= , <= ,= , <> ,!= ,^=

논리 연산을 수행하는 연산자로 수학에서 사용하는 부등호와 쓰임새가 같습니다.

단 두 값이 같은지를 판단하는 등호 연산자(=)의 반대인 비 동등 연산자로서는 '<>', '!=', '^='가 있는데, 이 세 연산자의 사용 법과 반환 결과는 모두 같습니다. 또한 값을 비교할 때 숫자뿐만 아니라 문자와 날짜형도 비교 가능합니다.

 

집합 연산자 : UNION, UNION ALL, INTERSECT, MINUS

 

 

계층형 쿼리 연산자 : PRIOR, CONNECT_BY_ROOT

 

표현식

표현식이란 한 개 이상의 값과 연산자, sql 함수 등이 결합된 식입니다.

특정 조건에 따라 값을 변경해서 보이는 CASE 표현식 (흔히 CASE문이라고 한다)에 대해 알아보자

CASE WHER 조건1 THEN 값1
     WHEN 조건2 THEN 값2
...
     ELSE 기타 값 
END

사원 테이블에서 각 사원의 급여를 따라 5000 이하로 급여를 받은 사원은 C, 5000~15000은 B, 15000 이상은 A등급을 반환하는 쿼리를 작성해보겠습니다.

 

SELECT employee_id, salary,
    CASE WHEN salary <= 5000 THEN 'C등급'
         WHEN salary > 5000 AND salary <= 15000 THEN '등급'
         ELSE 'A등급'
         END AS salary_frade
         FROM employees

출력 결과

WHEN 다음에 조건을 기술하고 THEN 다음에는 앞에서 기술한 조건에 만족하면 실제 출력되는 값을 명시하고 있는데, 주의할 점은 THEN 이하 출력 값들의 데이터 타입을 반드시 일치시켜야 합니다.

 

조건식

조건 혹은 조건식은 한 개 이상의 표현식과 논리 연산자가 결합된 식으로 TRUE, FALSE UNKNOW 세 가지 타입을 반환한다. 지금까지 SQL문을 학습하면서 WHERE 절에서 사용했던 모든 조건이 바로 조건식에 포함됩니다.

 

비교 조건식

비교 조건식은 논리 연산자나 ANY, SOME, ALL 키워드로 비교하는 조건식을 말합니다.

 

ANY

SELECT employee_id, salary
FROM employees
WHERE salary = ANY(2000, 3000, 4000)
ORDER BY employee_id;

 

이 쿼리문은 급여가 2000이거나 3000, 4000인 사원을 추출하는 것입니다. ANY가 '아무것'이나 '하나'란 뜻이 있으므로 위 문장은 세 가지 값, 즉 급여가 2000, 3000, 4000 중 하나라도 일치하는 모든 사원을 추출한 것입니다.

따라서 ANY, OR 조건으로 변환이 가능하며 다음 문장과 같은 결과를 반환합니다.

 

OR

SELECT employee_id, salary
FROM employees
WHERE salary = 2000
OR salary = 3000
OR salary = 4000
ORDER BY employee_id;

 

반면에 ALL은 모든 조건을 동시에 만족해야 합니다. 

ALL 쿼리

SELECT employee_id, salary
FROM employees
WHERE salary = ALL(2000, 3000, 4000)
ORDER BY employee_id;

출력 결과..

문장에 급여가 2000,3000,4000 모두에 해당되는 사원을 조회하므로 조회되는 데이터가 없습니다.

한 사원의 급여는 한 가지 값만 가지고 있으므로 논리적으로 봐도 잘못된 쿼리입니다.

ANY와 반대로 ALL 조건식은 AND 조건으로 변환 가능합니다.

 

SOME

SOME 은 ANY와 동일하게 사용되며 동작합니다.

SELECT employee_id, salary
FROM employees
WHERE salary = SOME(2000, 3000, 4000)
ORDER BY employee_id

 

'Oracle' 카테고리의 다른 글

Oracle 숫자 함수  (0) 2022.06.21
Oracle 논리 조건식  (0) 2022.06.16
Oracle 그룹함수.연산자  (0) 2022.06.16
Oracle (UP.MERGE.DEL)  (0) 2022.06.15
Oracle (SELECT/INSERT)  (0) 2022.06.14