레이블이 오라클강의인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오라클강의인 게시물을 표시합니다. 모든 게시물 표시

2021년 12월 11일 토요일

오라클TopN쿼리, 상위N명구하기, 오라클12 행제한구,인라인뷰, WITH구문, ROWNUM이용(오라클학원/ORACLE학원교육)

 

오라클TopN쿼리, 상위N명구하기, 오라클12 행제한구,인라인뷰, WITH구문, ROWNUM이용(오라클학원/ORACLE학원교육)

http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=703 


오라클TopN쿼리, 상위N명구하기, 오라클12 행제한구,인라인뷰, WITH구문, ROWNUM이용

오라클TopN쿼리, 상위N명구하기, 오라클12 행제한구,인라인뷰, WITH구문, ROWNUM이용ORACLE SQL급여 상위 N명 구하기실습 : ORACLE 19C실습데이터 : http://ojc.asia/bbs/board.php?bo_table=LecHINT&wr_id=117&page=7실습 ; 사

ojc.asia


https://youtu.be/32YaMykHAbc



https://www.youtube.com/watch?v=BVeBkyIWUrU&list=PLxU-iZCqT52Dlz0zGgFiq1mBz21arFUHS&index=33 


ORACLE SQL




급여 상위 N명 구하기


실습 : ORACLE 19C



실습데이터 : http://ojc.asia/bbs/board.php?bo_table=LecHINT&wr_id=117&page=7



실습 ; 사원테이블에서 급여 상위3명을 추출 하세요.


실습테이블 소개

-- 2000만건

SELECT * FROM MYEMP1;

 

-- 급여 컬럼에 생성된 인덱스 확인

SELECT   A.INDEX_NAME, A.COLUMN_NAME, B.VISIBILITY

 FROM     USER_IND_COLUMNS A, USER_INDEXES B

 WHERE  A.TABLE_NAME = 'MYEMP1'

 AND        A.INDEX_NAME = B.INDEX_NAME

 AND        A.COLUMN_NAME = 'SAL';


IDX_MYEMP1_SAL SAL VISIBLE


1. 인라인뷰 & ROWNUM 이용


-- 아래처럼 하지 마세요!
-- ORDER BY는 맨 나중에 실행됩니다.
SELECT ENAME, SAL
FROM   MYEMP1
WHERE  ROWNUM < 8
ORDER BY SAL DESC;

-- 2.5초 SAL 컬럼 인덱스를 이용못하고 MYEMP1 테이블 FULL SCAN함
SELECT *
FROM (
    SELECT ENAME, 
                   SAL
    FROM   MYEMP1
    ORDER BY SAL DESC
    ) T1
WHERE ROWNUM < 8;

-- 0초, WHERE절에 SAL 컬럼이 출현함에 따라 SAL 컬럼 인덱스를 이용함
SELECT *
FROM (
    SELECT ENAME, 
                   SAL
    FROM     MYEMP1
    WHERE  SAL > 0
    ORDER BY SAL DESC
    ) T1
WHERE ROWNUM < 8;

-- 0초, 힌트이용, ORDER BY 생략
-- SAL 컬럼 인덱스가 오름차순으로 생성되어 있어서 역순으로 스캔
SELECT *
FROM (
    SELECT /*+ INDEX_DESC(MYEMP1 IDX_MYEMP1_SAL) */ 
           ENAME, 
           SAL
    FROM   MYEMP1
    WHERE  SAL > 0
    ) T1
WHERE ROWNUM < 8;




2.ORACLE 12C 행제한구 이용



-- 2.5초 SAL 컬럼 인덱스를 이용못하고 MYEMP1 테이블 FULL SCAN함
-- 중복되는 급여가 있더라도 무조건 6개 자름
SELECT ENAME, SAL
FROM   MYEMP1
ORDER BY SAL DESC
FETCH FIRST 7 ROWS ONLY;

-- 0초, SAL 컬럼 인덱스를 이용함
-- 중복되는 급여가 있더라도 무조건 6개 자름
SELECT ENAME, SAL
FROM   MYEMP1
WHERE  SAL > 0
ORDER BY SAL DESC
FETCH FIRST 7 ROWS ONLY;

-- 0초, 오라클 힌트 이용, SAL 컬럼 인덱스를 이용함
-- ORDER BY절 생략(힌트구문 때문에 인덱스 영역에서 역순으로 이미 가져오니 생략됨)
SELECT /*+ INDEX_DESC(MYEMP1 IDX_MYEMP1_SAL) */ 
               ENAME, SAL
FROM   MYEMP1
WHERE  SAL > 0
FETCH FIRST 7 ROWS ONLY;

-- 0초, SAL 컬럼 인덱스를 이용함
-- 중복되는 급여가 있으면 모두 SELECT함
SELECT ENAME, SAL
FROM   MYEMP1
WHERE  SAL > 0
ORDER BY SAL DESC
FETCH FIRST 4 ROWS WITH TIES;



3.WITH구문과 ROWNUM 이용



-- 2.5초 SAL 컬럼 인덱스를 이용못하고 MYEMP1 테이블 FULL SCAN함
WITH A AS
  ( SELECT ENAME, SAL
    FROM   MYEMP1
    ORDER BY SAL DESC)
SELECT ENAME, SAL
FROM   A
WHERE  rownum <= 3;

-- 0초, WHERE절에 SAL 컬럼이 출현함에 따라 SAL 컬럼 인덱스를 이용함
WITH A AS
  ( SELECT ENAME, SAL
    FROM   MYEMP1
    WHERE  SAL > 0
    ORDER BY SAL DESC)
SELECT ENAME, SAL
FROM   A
WHERE  rownum <= 3;

-- 0초, 힌트이용, ORDER BY 생략
-- SAL 컬럼 인덱스가 오름차순으로 생성되어 있어서 역순으로 스캔
WITH A AS
  ( SELECT /*+ INDEX_DESC(MYEMP1 IDX_MYEMP1_SAL) */ 
           ENAME, SAL
    FROM   MYEMP1
    WHERE  SAL > 0 )
SELECT ENAME, SAL
FROM   A
WHERE  rownum <= 3;

 ​

#TopN쿼리, #상위N명쿼리, #오라클교육, #WITH구문, #인라인뷰, #행제한구문, #오라클강의, #오라클학원, #ORACLE교육, #ORACLE동영상, #SQL교육, #SQL학원, TopN쿼리, 상위N명쿼리, 오라클교육, WITH구문, 인라인뷰, 행제한구문, 오라클강의, 오라클학원, ORACLE교육, ORACLE동영상, SQL교육, SQL학원, 

2021년 11월 29일 월요일

오라클 테이블에서 중복레코드, 중복행을 제거하는 방법을 음성없이 영상으로 준비했습니다. 간단히 살펴보세요~ 오라클 중복레코드삭제(ROWID, PK, ROWNUM, EXISTS, 조인, NOT IN이용)

 

오라클 중복레코드삭제(ROWID, PK, ROWNUM, EXISTS, 조인, NOT IN이용)

 

오라클 테이블에서 중복레코드, 중복행을 제거하는 방법을 음성없이 영상으로 준비했습니다. 간단히 살펴보세요~ 오라클 중복레코드삭제(ROWID, PK, ROWNUM, EXISTS, 조인, NOT IN이용)


https://youtu.be/FNTNis91j2g

 

------------------------------------------------------------

-- 오라클에서 중복 레코드 삭제하는 방법

-- How to delete duplicate records in oracle table

------------------------------------------------------------


https://www.youtube.com/watch?v=HAN5QruWjxU&list=PLxU-iZCqT52Dlz0zGgFiq1mBz21arFUHS&index=23&t=143s 


-- 실습테이블 생성

drop table dup_test;

create table dup_test (

id number generated as identity,  -- Primary Key

name varchar2(100),

city   varchar2(100));


insert into dup_test (name, city) values ('가길동' , '서울');

insert into dup_test (name, city) values ('나길동' , '인천');

insert into dup_test (name, city) values ('다길동' , '대전');

insert into dup_test (name, city) values ('라길동' , '전주');

insert into dup_test (name, city) values ('바길동' , '부산');

insert into dup_test (name, city) values ('가길동' , '서울');  --중복

insert into dup_test (name, city) values ('나길동' , '인천');  --중복


commit;


select * from dup_test;


--1. 중복데이터 삭제 방법1(ROWID가 다르다는 것을 이용)

delete from dup_test a

where a.rowid > any (select b.rowid from dup_test b 

                          where a.name = b.name 

                          and a.city = b.city);


select * from dup_test;

rollback;  -- 삭제취소


-- 2. 중복데이터 삭제 방법2(주키, Primary Key가 다르다는 것을 이용)

delete from dup_test a

where a.id > (select min(b.id) from dup_test b 

                where a.name = b.name 

                and a.city = b.city);

                

select * from dup_test;

rollback;  -- 삭제취소              


-- 3. 중복데이터 삭제 방법3(중복되는 데이터의 ROWNUM을 이용)                

delete from dup_test a

where a.id in (select c.id

                 from (

                          select b.id, rownum rn

                          from dup_test b

                          where a.name = b.name 

                          and a.city = b.city

                        ) c

                where c.rn > 1

                 );

                 

select * from dup_test;

rollback;  -- 삭제취소


--4. 중복데이터 삭제 방법4(EXISTS 이용)      

delete from dup_test a

where EXISTS (select  1

                  from dup_test b

                  where a.name = b.name 

                  and a.city = b.city

                  group by b.name, b.city

                  having min(b.id) != a.id);


select * from dup_test;

rollback;  -- 삭제취소


--5. 중복데이터 삭제 방법4(JOIN을 이용)      

delete from dup_test a

where a.id in 

(

  select b.id

  from  dup_test b

  join   dup_test c on 

  (

    b.name = c.name 

    and b.city = c.city

    and b.id > c.id

  )

);


select * from dup_test;

rollback;  -- 삭제취소


--6. 중복데이터 삭제 방법6(NOT IN을 이용) 

delete from dup_test a

where (id, name, city) not in ( select min( id ), name, city 

                                     from dup_test 

                                     group by name, city );

                                     

select * from dup_test;

rollback;  -- 삭제취소

#중복레코드삭제#중복데이터삭제#중복행삭제#오라클동영상#ORACLE동영상#오라클교육#ORACLE교육#오라클강의#오라클강좌#오라클학원#ORACLE학원, 중복레코드삭제, 중복데이터삭제, 중복행삭제, 오라클동영상, ORACLE동영상, 오라클교육, ORACLE교육, 오라클강의, 오라클강좌, 오라클학원, ORACLE학원 

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...