데이터베이스 조작 (8)

1. 페이지 별 검색 Oracle 페이지 별 키워드: rownum MySql 의 페이지 별 키워드: limit
1), rownum: 위 열 은 데이터베이스 시트 에 존재 하지 않 지만 그 어떠한 표 에 도 존재 합 니 다.이 필드 의 수 치 는 검색 어의 기록 수 에 달 려 있다.rownum 은 조회 한 기록 데 이 터 를 번호 로 처리 하고 번 호 는 1 부터 시작 합 니 다.
    rownum   sql,            。

    --rownum     *    。
    select *,rownum from emp;

    --rownum    
    select empno,ename,hiredate,sal,deptno,rownum
    from emp;

    --  rownum <=     
    --   10   
    select empno,ename,hiredate,sal,deptno,rownum
    from emp
    where rownum <= 10;

    --    5   
    --       5   :1~5
    select empno,ename,hiredate,sal,deptno,rownum
    from emp
    where rownum >= 1 and rownum <= 5;

    --       5   :6~10
    select empno,ename,hiredate,sal,deptno,rownum
    from emp
    where rownum >= 6 and rownum <= 10;


결론: rownum 조 회 를 처음 할 때 rownum 을 사용 하여 판단 보다 큰 것 을 권장 하지 않 습 니 다. 그렇지 않 으 면 기대 효과 에 이 르 지 못 할 수 있 습 니 다.예 를 들 어 위의 첫 페이지 는 데이터 가 있 고 두 번 째 페이지 는 데이터 가 없다.
원인: rownum 은 기본적으로 1 부터 시작 하고 rownum 의 번 호 는 증가 전제 조건 에 따라 다음 데 이 터 를 조회 할 수 있 습 니 다.데 이 터 를 조회 해 야 rownum 의 자체 증가 가 있 습 니 다.한편, 검색 어 에서 where 조건 에서 요구 하면 rownum > = 6 입 니 다. 여 기 는 모순 관계 가 있 습 니 다. rownum 은 1 부터 rownum > = 6 을 하려 면 rownum 을 먼저 6 으로 늘 려 야 합 니 다.그래서 where rownum > = 6 의 조건 은 영원히 만족 할 수 없습니다.
    :     rownum     ?
   ,   。

--   
select empno,ename,hiredate,sal,deptno,temp.num
from(
    --   
    select empno,ename,hiredate,sal,deptno,
            rownum num --**** rownum   
    from emp
) temp
where temp.num >= 6 and temp.num <= 10;

2), 페이지 별로 정렬 해 야 합 니 다. 부서 별로 정렬 해 야 합 니 다. 왜냐하면 select ruwnum 의 실행 순 서 는 orderby 이전에 조회 한 데 이 터 를 가 져 올 수 있 습 니 다. 먼저 번 호 를 매 긴 다음 에 정렬 합 니 다.정렬 의 결과, 예 를 들 어 번호 순서 가 복잡 해 질 수 있 고 고정 번호 안의 결과 데이터 에 대해 작은 범위 의 정렬 을 할 뿐이다.진정한 의미 의 정렬 도 이 루어 질 수 없다.
결론: 정렬 은 반드시 번호 전에 완성 해 야 한다.
마지막 페이지 sql 은 다음 과 같은 순서 로 정렬 하고 번호, 마지막 페이지 를 나 누 어야 합 니 다.
--    
select empno,ename,hiredate,sal,deptno,num
from(
    --   
    select empno,ename,hiredate,sal,deptno,
            rownum num --**** rownum   
    from (
    --   
        select * from emp order by deptno
    )
    --where rownum <= 10   --         。
)
where num >= 6 and num <= 10;--        

3), 페이지 매개 변수 a, pageSize: 페이지 마다 항목 수 (기록 수) 즉 한 페이지 에 몇 개의 데 이 터 를 표시 합 니까?
b. pageNum: 페이지 수 는 몇 페이지 로 조회 해 야 합 니까?
예: 페이지 당 5 조 1 페이지 표시: 1 ~ 5 2 페이지: 6 ~ 10 3 페이지: 11 ~ 15... 100 페이지: 496 ~ 50 해당 페이지 의 기록 수 는 rownum 시작 위치: (pageNum - 1) * pageSize + 1
rownum 종료 위치: pageNum * pageSize;
4), 최종 페이지 sql
    --    
    select empno,ename,hiredate,sal,deptno,num
    from(
        --   
        select empno,ename,hiredate,sal,deptno,
                rownum num --**** rownum   
        from (
        --   
            select * from emp order by deptno
        )
    )
    where num >= ((pageNum - 1) * pageSize + 1) 
    and num <= (pageNum * pageSize);

2. 고급 함수 1), decode 함 수 는 switch - case 와 유사 한 효 과 를 실현 할 수 있 습 니 다.
  :
decode(   ,
    search1,result1,
    search2,result2,
    ...
    searchN,resultN,  --    default,    
    [default]
)

    decode  ,      :
①、  
        
    --  job        
    select job,count(*) from emp
    group by job;

    -- MANAGER ANALYST   vip ,
    --       other 
    --    vip other    。
    select decode(job,
        'MANAGER','vip',
        'ANALYST','vip',
        'other'
    )   ,count(*) from emp
    group by 
    decode(job,
        'MANAGER','vip',
        'ANALYST','vip',
        'other'
    );

②、  
    --   、  、job  
    select * from emp
    order by job;--       ASIIC     

    --   ,               。
    PRESIDENT
    MANAGER
    ANALYST
    CLERK
    SALESMAN

     select * from emp
     order by 
    decode(job,
        'PRESIDENT',1,
        'MANAGER',2,
        'ANALYST',3,
        'CLERK',4,
        5
    );

2), case - when 함 수 는 decode 효과 와 일치 하지만 문법 이 복잡 하 므 로 decode 를 사용 하 는 것 을 권장 합 니 다.
      :

        case    
        when search1 then result1
        when search2 then result2
        ...
        when searchN then resultN
        else resultN+1
        end;

    --   ,               。
        PRESIDENT
        MANAGER
        ANALYST
        CLERK
        SALESMAN
         
         select * from emp
         order by 
        (case job
            when 'PRESIDENT' then 1
            when 'MANAGER' then 2
            when 'ANALYST' then 3 
            when 'CLERK' then 4
            else 5
        end);

        

    decode(   ,
        search1,result1,
        search2,result2,
        ...
        searchN,resultN,  --    default,    
        [default]
    )

3) 、 정렬 함 수 는 직원 정 보 를 조회 하고 부서 별로 그룹 을 나 누 며 임금 순 서 를 매 긴 다.select * from emp group by deptno order by sal; 어 떡 하지??위의 그룹 내 정렬 된 sql 에 대해 서 는 고급 정렬 함수 로 직접 구현 할 수 있 습 니 다.정렬 결과 에 따라 다음 과 같이 나 뉜 다.
    ①、  (  )       
        row_number

          :row_number() --       
          --     
          over( 
            partition by   1 --   1  
            order by   2     --   2  
          )

         :      ,      ,      。
        select empno,ename,hiredate,sal,deptno,
            (row_number() --       
            --     
            over( 
                partition by deptno --   1  
                order by sal     --   2  
            ))      
        from emp;

    ②、  (  )       
        dense_rank
          :dense_rank() --       
          --     
          over( 
            partition by   1 --   1  
            order by   2     --   2  
          )

         :      ,      ,      。
        select empno,ename,hiredate,sal,deptno,
            (dense_rank() --       
            --     
            over( 
                partition by deptno --   1  
                order by sal     --   2  
            ))        
        from emp;
    

    ③、  (  )        
        rank
          :rank() --        
          --     
          over( 
            partition by   1 --   1  
            order by   2     --   2  
          )

         :      ,      ,      。
        select empno,ename,hiredate,sal,deptno,
            (rank() --        
            --     
            over( 
                partition by deptno --   1  
                order by sal     --   2  
            ))         
        from emp;

        


2. 고급 함수 1), 분기 함수 decode 분기 효과.정렬, 그룹 구성 을 실현 합 니 다.
case - when 은 decode 함수 와 기능 이 같 습 니 다.
2) 、 정렬 함수 rownumber (): 그룹 내 연속 및 유일.rank (): 팀 내 불 연속 이 유일 하지 않 습 니 다.dense_rank (): 팀 내 연속 이 유일 하지 않 습 니 다.
정규 수업: 1, 고급 함수 1), 분기 함수 2), 정렬 함수 3), 집합 작업
    ①、  
        union:        
        --  15   
        select * from emp --       15
        union
        select * from leader;--      6
        
        union all:       
        --  21   
        select * from emp --       15
        union all
        select * from leader;--      6

    ②、  
        intersect
        --  6   
        select * from emp --       15
        intersect
        select * from leader;--      6

    ③、  
        minus
          1     2
            --  9   
        select * from emp --      15
        minus
        select * from leader;--      6
    
          2     1
        --  0   
        select * from leader--      6
        minus
        select * from emp;--      15

좋은 웹페이지 즐겨찾기