데이터베이스 조작 (8)
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.