본문 바로가기

Dev. Database/Oracle

(29)
ROWNJUM을 조건으로 사용할 때 ROWNUM을 조건에서 사용할 때는 항상
자기보다 작은 값 중 최대값 읽어오기 자기보다 작은 값 중 최대값을 읽어오려면 어떻게 해야 할까? 우선 생각나는 것은 셀프조인과 부등호 조인이다. 셀프 조인을 이용하여서 동일한 테이블에의 같은 값을 조회할 수 있을 것이고, 부등호 조인을 이용하여 조회된 값의 비교가 가능할 것이다. 자신의 사번보다 한 단계 빠른 직원의 사번과 성명을 조회하는 쿼리 (테이블 1개) 일자별 환산금액 조회 쿼리 (테이블 2개)
누계값 구하기 - 부등호 조인의 이용 데이터베이스를 관리하다 보면 COLUMN의 값과 함께 그 상위값들의 누계를 보고자 하는 경우가 발생한다.예를 들어 이런 식으로 말이다. 이러한 경우에는 쿼리문을 어떻게 작성해야 할까?여러가지 방법이 있겠지만, 오늘 소개하고자 하는 것은 부등호 조인을 이용하는 것이다.부등호 조인이란 말 그대로 테이블 간의 조인에 부등호를 사용하는 것이다. 위와 같이, 셀프 조인을 한 상태에서 부등호 조인을 조건으로 주면 다음과 같은 결과를 얻을 수 있다.
[오라클] OPTIMIZER 개요 및 구조 1. 개요 및 구조 옵티마이저(Optimizer)는 SQL을 가장 빠르고 효율적으로 수행할 최적(최저비용)의 처리경로를 생성해 주는 DBMS 내부의 핵심엔진이다. 사용자가 구조화된 질의언어(SQL)로 결과집합을 요구하면, 이를 생성하는데 필요한 처리경로는 DBMS에 내장된 옵티마이저가 자동으로 생성해준다. 옵티마이저가 생성한 SQL 처리경로를 실행계획(Execution Plan)이라고 부른다. 옵티마이저의 SQL 최적화 과정을 요약하면 다음과 같다.- 사용자가 던진 쿼리수행을 위해, 후보군이 될만한 실행계획을 찾는다.- 데이터 딕셔너리(Data Dictionary)에 미리 수집해 놓은 오브젝트 통계 및 시스템 통계정보를 이용해 각 실행계획의 예상비용을 산정한다.- 각 실행계획을 비교해서 최저비용을 갖는 ..
[오라클] 테이블 구조(스키마) 확인 오라클에서 테이블 구조(스키마)를 확인하는 방법에는 두 가지가 있다. 이 두 쿼리는 그냥 보기에는 사실 별 차이가 없다.WHERE 절이 TANME 이냐? TABLE_NAME 이냐? 하지만 결과도 별 차이가 없을까? - 첫번째 쿼리 결과 -- 두번째 쿼리 결과 - 사실 필자도 지금까지는 두 쿼리가 같은 결과를 도출한다고 생각해 왔는데... 오라클한테 제대로 한 방 먹은 기분이다 ㅋㅋ
CASE WHEN ~ THEN ~ ELSE END DECODE 문이 IF문이라면, CASE문은 SWITCH 문이다. [형식] CASE 컬럼명 | 표현식 WHEN 조건식1 THEN 결과1 WHEN 조건식2 THEN 결과2 ....... WHEN 조건식n THEN 결과n ELSE 결과 END [예제] SELECT CASE WHEN SALARY 70000000 THEN 'A' END AS SALARY, COUNT(*) AS CNTFROM TEMPGROUP BYCASE WHEN SALARY 70000000 THEN 'A' ENDORDER BY SALARY ASC ;
VIEW - 테이블을 비추는 창 VIEW라는 것은 쉽게 생각하면 테이블을 보기 위한 창문 정도로 생각하면 된다. 테이블을 방으로 생각하고 뷰를 그 방을 보는 창문으로 생각해보자. 창문을 통해 방안을 보면 방안의 모든 내용을 볼 수 없지만, 내가 보려고 하는 물건이 정해져 있다면 그것만 창의 시야 안에 갖다 놓으면 다른 것은 볼 필요가 없을 것이다. 오히려 방에 들어가서 직접 보고자 하는 물건을 찾는 것보다 미리 내가 지정한 것만을 창 앞에 가져다 놓고 그것만을 본다면 더 편리할 것이다. 테이블과 뷰도 같은 경우이다. 창문을 통해 본다는 것은 창문이 물건을 가지고 잇는 것이 아니고 방에 있는 물건이 창을 통해 비치는 것 뿐이다. 내가 그 방안을 보고자 해서 창문을 두들기면 창문은 그 순간의 방안의 모습을 비춰놓고 창을 닫는다. 그걸 우리..
서브쿼리 예제 /* 서브쿼리 */-- 1. SINGLE ROW : SELECT 결과가 단일행으로 이루어진다.SELECT EMP_ID, EMP_NAMEFROM TEMPWHERE SALARY = (SELECT MAX(SALARY) FROM TEMP); SELECT EMP_ID, EMP_NAME, SALARYFROM TEMPWHERE 1=1 AND SALARY >= (SELECT AVG(SALARY) FROM TEMP); SELECT EMP_ID, EMP_NAMEFROM TEMPWHERE DEPT_CODE IN (SELECT DEPT_CODE FROM TDEPT WHERE AREA = '인천') ; SELECT * FROM TCOM; SELECT * FROM TEMP; SELECT * FROM TDEPT; SELECT DE..