데이터베이스

DATABASE STEP 25 - PSEUDO

2023. 3. 22. 17:49
728x90

★ PSEUDO

  • 의사 컬럼, Pseudo Column
  • 실제 컬럼이 아닌데 컬럼처럼 행동하는 요소
  • rownum
    • 오라클 전용
    • row num > 행번호 > 레코드의 일련번호
    • from 절이 실행될 때 각 레코드에 일련번호를 할당한다.
    • where 절의 영향을 받으면 일련번호를 다시 정비한다. (reindexing)
    • rownum을 사용 > 서브 쿼리를 자주 사용한다.

 

■ 사용 ex)

  • ex1) rownum의 사용법
select 
    name, buseo, -- 컬럼(속성) > output > 객체의 특성에 따라 다른 값을 가진다. (개인 데이터)
    sysdate,        -- 함수        > output > 모든 레코드가 동일한 값을 가진다. (정적 데이터)
    substr(name,2), -- 함수       > input + output > 객체마다 다른 값을 가진다.
    '상수',             -- 상수      > output > 모든 레코드가 동일한 값을 가진다. (정적 데이터)
    rownum          -- 의사 컬럼 > output > 객체의 특성에 따라 다른 값을 가진다. (개인 데이터)
from tblInsa;

select name, buseo, rownum from tblInsa;
select name, buseo, rownum from tblInsa where rownum = 1; -- 위치로 검색
select name, buseo, rownum from tblInsa where rownum <= 5;
  • ex2) rownum의 응용
elect
    name, buseo, rownum
from tblInsa; --1. 이 시점의 데이터를 가지고 rownum이 이미 할당되어 있다.

select
    name, buseo, rownum       -- 3. 소비
from tblInsa                  -- 1. 생성(+rownum)
    where rownum = 1;          -- 2. 조건

select
    name, buseo, rownum       -- 3. 소비
from tblInsa                  -- 1. 생성(+rownum)
    where rownum = 3;          -- 2. 조건 : rownum을 조건으로 사용 > 반드시 1~조건 범위 > 조건에 포함!!(1부터 시작해야함)

 

■ 요구사항에 따른 문제

  • ex 1) 인구수가 가장 많은 나라 1~3등
select * from tblCountry;

-- 1. 원하는 정렬
select * from tblCountry where population is not null order by population desc;
select rownum from tblCountry where population is not null order by population desc;

-- 2. 위의 결과셋을 가지고 한번 더 rownum을 만들기 > from 절 실행
select * from (select * from tblCountry where population is not null order by population desc)
    where rownum <=3;
  • ex 2) tblInsa 테이블에서 급여가 3등인 사람은?
-- 1. 급여 순으로 정렬
select * from tblInsa order by basicpay desc;

-- 2. 원하는 순서대로 정렬 결과셋 > from 절 적용 > rownum을 다시 매긴다.
select * from (select * from tblInsa order by basicpay desc)
    where rownum <=3;
    
-- 3등인 사람을 찾는다.
-- 아래와 같이 사용하면, null값이 나온다.
select a.*, rownum from (select * from tblInsa order by basicpay desc) a where rownum = 3;

--3. 한번 더 서브쿼리 > rownum 고정 > 자유롭게 조건 사용!
select * from (select a.*, rownum as rnum from (select * from tblInsa order by basicpay desc) a)
    where rnum = 3;
  • ex 3) tblComedian 5번째로 뚱뚱한 사람은?
-- 1. 정렬
select * from tblComedian order by weight desc;

-- 2. 서브쿼리 > rownum 별칭
select a.*, rownum as rnum from (select * from tblComedian order by weight desc) a;

-- 3. 서브쿼리 >rownum 고정시키기 위해서
select * from (select a.*, rownum as rnum from (select * from tblComedian order by weight desc) a)
    where rnum = 5;
  • ex 4) tblInsa. 남자 급여(기본급+수당)을 (내림차순)순위대로 가져오시오. (이름, 부서, 직위, 급여, 순위 출력)
select name, buseo, jikwi, (basicpay+sudang) as "급여" from tblInsa where ssn like '%-1%' order by (basicpay+sudang) asc;

select a.*, rownum as "순위"
    from (select name, buseo, jikwi, (basicpay+sudang) as "급여" from tblInsa where ssn like '%-1%' order by (basicpay+sudang) asc) a;
  • ex 5) tblInsa. 여자 급여(기본급+수당)을 (오름차순)순위대로 가져오시오. (이름, 부서, 직위, 급여, 순위 출력)
select a.*, rownum as "순위"
    from (select name, buseo, jikwi, (basicpay+sudang) as "급여" from tblInsa where ssn like '%-2%' order by (basicpay+sudang) desc) a;
  • ex 6) tblInsa. 여자 인원수가 (가장 많은 부서 및 인원수) 가져오시오.
select * from tblInsa;

select buseo, count(*) as "여자 인원수" from tblInsa where ssn like '%-2%' group by buseo order by count(*) desc;

select a.*, rownum as rank from (select buseo, count(*) as "여자 인원수" from tblInsa where ssn like '%-2%' group by buseo order by count(*) desc) a;

select * from (select a.*, rownum as rank from (select buseo, count(*) as "여자 인원수" from tblInsa where ssn like '%-2%' group by buseo order by count(*) desc) a)
    where rank = 1;
  • ex 7) tblInsa. 지역별 인원수 (내림차순)순위를 가져오시오.(city, 인원수)
select * from tblInsa;

select city, count(*) as "지역별 인원수" from tblInsa group by city order by count(*) desc;

select a.*, rownum as "순위" from (select city, count(*) as "지역별 인원수" from tblInsa group by city order by count(*) desc) a;
  • ex 8) tblInsa. 부서별 인원수가 가장 많은 부서 및원수 출력.
select * from tblInsa;

select buseo, count(*) as "부서별 인원수" from tblInsa group by buseo order by count(*) desc;

select a.*, rownum as rank from (select buseo, count(*) as "부서별 인원수" from tblInsa group by buseo order by count(*) desc) a;

select * from (select a.*, rownum as rank from (select buseo, count(*) as "부서별 인원수" from tblInsa group by buseo order by count(*) desc) a)
    where rank = 1;
  • ex 9) tblInsa. 남자 급여(기본급+수당)을 (내림차순) 3~5등까지 가져오시오. (이름, 부서, 직위, 급여, 순위 출력)
select * from tblInsa;

select name, buseo, jikwi, (basicpay+sudang) as "급여" from tblInsa where ssn like '%-1%' order by (basicpay+sudang) desc;

select a.*, rownum as rank
    from (select name, buseo, jikwi, (basicpay+sudang) as "급여" from tblInsa where ssn like '%-1%' order by (basicpay+sudang) desc) a;
    
select * from (select a.*, rownum as rank
                 from (select name, buseo, jikwi, (basicpay+sudang) as "급여" from tblInsa where ssn like '%-1%' order by (basicpay+sudang) desc) a)
                    where rank between 3 and 5;
  • ex 10) tblInsa. 입사일이 빠른 순서로 5순위까지만 가져오시오.
select * from tblInsa;

select * from tblInsa order by ibsadate asc;

select a.*, rownum as rank from (select * from tblInsa order by ibsadate asc) a;

select * from (select a.*, rownum as rank from (select * from tblInsa order by ibsadate asc) a)
    where rank <= 5;
  • ex 11) tblhousekeeping. 지출 내역(가격 * 수량) 중 가장 많은 금액을 지출한 내역 3가지를 가져오시오.
select * from tblhousekeeping;

select item, (price*qty) as "지출 내역" from tblhousekeeping order by (price*qty) desc;

select a.*, rownum as rank from (select item, (price*qty) as "지출 내역" from tblhousekeeping order by (price*qty) desc) a;

select * from (select a.*, rownum as rank from (select item, (price*qty) as "지출 내역" from tblhousekeeping order by (price*qty) desc) a)
    where rank <= 3;
  • ex 12) tblinsa. 평균 급여 2위인 부서에 속한 직원들을 가져오시오.
select * from tblInsa;

select buseo, avg(basicpay) from tblInsa group by buseo order by avg(basicpay) desc;

select a.*, rownum as rank from (select buseo, avg(basicpay) from tblInsa group by buseo order by avg(basicpay) desc) a;

select buseo from (select a.*, rownum as rank from (select buseo, avg(basicpay) from tblInsa group by buseo order by avg(basicpay) desc) a)
    where rank = 2;
    
select * from tblInsa where buseo = (select buseo from (select a.*, rownum as rank from (select buseo, avg(basicpay) from tblInsa group by buseo order by avg(basicpay) desc) a)
    where rank = 2);
  • ex 13) tbltodo. 등록 후 가장 빠르게 완료한 할일을 순서대로 5개 가져오시오.
select * from tbltodo;

select title ,(completedate - adddate) as "완료까지" from tbltodo where completedate is not null order by (completedate - adddate) asc;

select a.*, rownum from (select title ,(completedate - adddate) as "완료까지" from tbltodo where completedate is not null order by (completedate - adddate) asc) a;

select * from (select a.*, rownum as rank from (select title ,(completedate - adddate) as "완료까지" from tbltodo where completedate is not null order by (completedate - adddate) asc) a)
    where rank <=5;
  • ex 14) tblinsa. 남자 직원 중에서 급여를 3번째로 많이 받는 직원과 9번째로 많이 받는 직원의 급여 차액은 얼마인가?
select * from tblInsa;

select a.*, rownum as rank
    from (select name, buseo, jikwi, (basicpay+sudang) as "급여" from tblInsa where ssn like '%-1%' order by (basicpay+sudang) desc) a;
    
select sum from (select a.*, rownum as rank
                    from (select name, buseo, jikwi, (basicpay+sudang) as sum from tblInsa where ssn like '%-1%' order by (basicpay+sudang) desc) a)
                        where rank in (3);

select * from (select a.*, rownum as rank
                    from (select name, buseo, jikwi, (basicpay+sudang) as sum from tblInsa where ssn like '%-1%' order by (basicpay+sudang) desc) a)
                        where rank in (9);

select name,buseo,jikwi,sum,rank,
(select sum from (select a.*, rownum as rank
                    from (select name, buseo, jikwi, (basicpay+sudang) as sum from tblInsa where ssn like '%-1%' order by (basicpay+sudang) desc) a)
                        where rank in (3) )
-
(select sum from (select a.*, rownum as rank
                    from (select name, buseo, jikwi, (basicpay+sudang) as sum from tblInsa where ssn like '%-1%' order by (basicpay+sudang) desc) a)
                        where rank in (9)) as "3위와 9위의 차"
from (select a.*, rownum as rank
                    from (select name, buseo, jikwi, (basicpay+sudang) as sum from tblInsa where ssn like '%-1%' order by (basicpay+sudang) desc) a)
                        where rank in (3,9);
728x90
저작자표시 비영리 변경금지 (새창열림)

'데이터베이스' 카테고리의 다른 글

DATABASE STEP 27 - WITH  (0) 2023.03.23
DATABASE STEP 26 - Rank  (0) 2023.03.23
DATABASE STEP 24 - ALTER  (0) 2023.03.22
DATABASE STEP 23 - UNION  (0) 2023.03.22
DATABASE STEP 22 - VIEW  (0) 2023.03.22
'데이터베이스' 카테고리의 다른 글
  • DATABASE STEP 27 - WITH
  • DATABASE STEP 26 - Rank
  • DATABASE STEP 24 - ALTER
  • DATABASE STEP 23 - UNION
IT의 큰손
IT의 큰손
IT계의 큰손이 되고 싶은 개린이의 Log 일지
Developer Story HouseIT계의 큰손이 되고 싶은 개린이의 Log 일지
IT의 큰손
Developer Story House
IT의 큰손
전체
오늘
어제
  • 분류 전체보기 (457)
    • 정보처리기사 필기 (18)
    • 정보처리기사 실기 (12)
    • 정보처리기사 통합 QUIZ (12)
    • 빅데이터 (11)
    • 안드로이드 (11)
    • 웹페이지 (108)
    • 자바 (49)
    • SQLD (3)
    • 백준 알고리즘 (76)
    • 데이터베이스 (41)
    • 깃허브 (2)
    • Library (14)
    • Server (31)
    • 크롤링&스크래핑 (3)
    • Spring (23)
    • Vue.js (13)
    • React (27)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Developer Stroy House

인기 글

태그

  • 데이터베이스
  • 알고리즘
  • 앱개발자
  • 프론트엔드
  • 정보처리기사
  • it
  • css
  • React
  • 백준
  • 자바
  • java
  • 웹개발자
  • 개발자
  • IT개발자
  • IT자격증공부
  • IT자격증
  • jsp
  • 정보보안전문가
  • JavaScript
  • 개발블로그
  • 정보처리기사필기
  • jquery
  • DB
  • 웹개발
  • 코딩테스트
  • 백엔드
  • html
  • ajax
  • DBA
  • 웹페이지

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
DATABASE STEP 25 - PSEUDO
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.