Java 38: 데이터베이스 2 (Oracle)
그룹 별 그룹
--
select count(job) from emp group by job;
--
select count(coutn(job)) from emp group by job;
--
select max(sal) from emp group by job;
--
select min(sal) from emp group by job;
--
select avg(sal) from emp group by job;
--
select max(avg(sal)) from emp group by job;
사용 having 조건 부 필터 그룹
select job,count(job) from emp group by job having count(job)>=3;
where 는 group by 전에 사용 합 니 다.
select job,count(job) from emp where sal>1000 group by job having count(job)>=3;
decode 함수
decode(value1 if1 then1 if2 then2 ... else)
decode (조건, 값 1, 반환 값 1, 값 2, 반환 값 2,... 값 n, 반환 값 n, 부족 값)
value 1 = if1 이 then 1 로 돌아 오 면
그렇지 않 으 면 value 1 = if2 가 then 2 로 돌아 가면
기본 반환 값 은 else 입 니 다.
select decode(sal,1600,' ',5000,' ',' ') from emp;
-- job ID 30
select job,count(decode(DEPTNO,30,1,null)) deptno from emp group by(job);
-- CLERK
select deptno,count(decode(job,'CLERK',1,null)) counts from emp group by(deptno);
-- CLERK
select deptno,avg(decode(job,'CLERK',sal,null)) CLERK_AVG_SAL from emp group by(deptno);
insert into emp values(8000,'lmdtx','CLERK',8080,to_date('1980/09/09','yyyy/mm/dd'),30000,null,null);
insert into emp values(8880,'dsy','CLERK',8980,to_date('1982/02/02','yyyy/mm/dd'),3000,null,null);
표 의 연관 성
외부 키 는 한 표 에 다른 표 에 대응 하 는 메 인 키 를 저장 하고 있다.
연결 표
1 · 피리 칼 적 emp 표 에서 deptno 가 비어 있 는 조회 가 되 지 않 습 니 다.
--emp * dept
select * from emp,dept;
--
select * from emp,dept where emp.deptno=dept.deptno;
select * from emp e.dept d where e.deptno=d.deptno;
2 · 내부 연결 이 결 과 는 피리 칼 의 적 용 된 조건 후의 결과 와 같다.
inner join 은 join 과 마찬가지 로 기본 값 은 내부 연결 입 니 다.
join...on...
from emp e inner join dept d on e.deptno=d.deptno
두 표 의 외 키 이름 은 다른 표 의 메 인 키 이름과 같다.
from emp inner join dept using(deptno)
select * from emp e inner join dept d on e.deptno=d.deptno;
select * from emp inner join dept using(deptno);
3 · 외부 연결
1. 왼쪽 외 련 (왼쪽 표 의 데 이 터 는 모두 있어 야 하고 없 는 곳 은 null 을 보충 해 야 합 니 다)
from emp left outer join dept using(deptno)
select * from emp left outer join dept on emp.deptno=dept.deptno;
select ename,nvl(dname,' ') from emp2 left outer join dept2 using(deptno);
2 · 우 외연
select * from emp right outer join dept using(deptno);
--
select dname,count(empno) num
from emp2 right join dept2 Using(deptno)
group by dname
order by num desc;
3 · 전 외 련 (모두 있 음)
emp full outer join dept
select * from emp full outer join dept using(deptno);
--
select nvl(dname,' '),count(empno)
from emp2 full outer join dept2 using(deptno)
group by dname
order by dname;
select nvl(dname,' ') ,decode(count(empno),0,' ',count(empno))
from emp2 full outer join dept2 using(deptno)
group by dname
order by dname;
4 · 자가 접속
select e1.ename,e2.ename from emp2 e1 inner join emp2 e2 on e1.mgr=e2.empno;
select e1.ename, e2.ename from emp2 e1 left join emp2 e2 on e1.mgr = e2.empno;
select nvl(e1.ename,' ') , e2.ename MGR from emp2 e1 right join emp2 e2 on e1.mgr=e2.empno;
select e2.ename,decode(count(e1.ename),0,' ',count(e1.ename))from emp2 e1 right join emp2 e2 on e1.mgr=e2.empno group by e2.ename
하위 조회
where ,
select e1.ename from emp2 e1 inner join emp2 e2 on e1.mgr=e2.empno where e2.ename='KING';
select distinct dname from emp2 e1 join dept2 d2 ON e1.deptno= d2.deptno where e1.ename like '%S%';
select dname from dept2 where deptno in(select deptno from emp2 where ename like '%S%');
Any () 임의의 하나
모든 () 소유
select ename,job,sal from emp2 where sal>all(select DISTINCT sal from emp2 where job='MANAGER') and job<>'MANAGER';
select ename job,sal from emp2 where sal>any(select distinct sal from emp2 where job='CLERK') and job<>'CLERK';
exists 는 뒤의 하위 조회 가 줄 이 있 는 지 없 는 지 판단 하 는 데 사 용 됩 니 다. true 는 false 입 니 다.
select ename from emp2 e1 where EXISTS(select 1 from emp2 e2 where e2.mgr= e1.empno);
select ename from emp2 e1 where not exists(select 1 from emp2 e2 where e2.mgr=e1.empno);
3 in (1,2,3) true
3 in (1,2,null) false
5 not in (1,2,3) true
5 not in (1,2,null) false
5 in (1,2,null) false
5 not in (null) false
5in (null) false
not in 의 하위 조회 에서 null 값 이 나타 날 수 없습니다.
where 의 다 열 조회
select e.ename,e.sal, d.deptno,d.dname from emp2 e inner join dept2 d on e.deptno= d.deptno where (e.deptno,e.sal) in (select deptno,min(sal) from emp2 where deptno is not null group by deptno);
select * from emp2 where (deptno,sal)in (select deptno,min(sal) from emp2 where deptno is not null group by deptno);
select deptno,min(sal) from emp2 where deptno is not null group by deptno;
쓰다
from emp where deptno is not null group by deptno having avg(sal)
select max(avg(sal)) from emp2 group by deptno;
select deptno,round(avg(sal)) from emp2 where deptno is not null group by deptno HAVING avg(sal)
select dname,deptno from emp2 join dept2 using(deptno) where deptno is not null group by deptno,dname having avg(sal)=(select max(avg(sal)) from emp2 group by deptno);
페이지 를 나누다
위조 하여 열거 하 다select empno,ename,rownum from emp2 order by ename;
select * from emp2 where rownum<=10;
select * from (select empno,ename, rownum n from emp2 where rownum<=10) where n>5 and n<=10
select * from (select empno,ename, rownum n from emp2 ) where n>5 and n<=10
select * from (select empno,ename, rownum n from emp2 where rownum<=10) where n>5
select * from (select empno,ename,sal, rownum n from (select * from emp2 order by sal) where rownum <=10) where n>5;
내 연 보기 (Inner View)
바로 select 후의 결 과 를 표 로 삼 는 것 이다.select ename ,job ,emp_num from emp2 join(select deptno d,count(empno) emp_num from emp2 inner join dept2 using(deptno) group by deptno) on deptno=d where job='MANAGER';
select ename ,job ,dname ,deptno ,emp_num from emp2 inner join(select deptno d,count(empno) emp_num,dname from emp2 inner join dept2 using(deptno) group by deptno, dname) on deptno=d where job='MANAGER'
group by 여러 열 그룹
이 두 열 은 모두 부서 에 대한 유일한 표지 로 서 조별 에 영향 을 주지 않 는 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.