내가 보여주고 싶은 결과값
위와 같이 수강편람 테이블이 있다.
맨 우측 열에서 알 수 있듯이 나는 현재 수강인원도 출력하고 싶다.
그러나 과목코드, 강의명, 교사명, 정원은 subject 테이블에 있고, 현재 수강인원은 select count(*)를 해서 attend 테이블에서 가져와야한다.
1. 비조인 select / left outer join
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
--내가 보여주고 싶은 결과값: 수강편람(subject) 테이블에서 과목별 현재 수강인원 컬럼(attend 테이블을 이용)도 함께 출력하기
--결국 attend 테이블에서 subno별 count를 구한 컬럼이 붙어있도록 하는 것. (조인/비조인 방법)
--1. 비조인 select
--데이터가 많은 경우 조인을 하면 속도가 걸린다고 함
select s.subno, s.subname, s.teachername, s.cnt,
(select count(a.subno) from attend a where s.subno = a.subno) currentCnt
from subject s;
--2. 조인 left outer join
--일치하는 레코드가 없을 경우 빈 값으로라도 나온다
--그냥 join을 쓰면 수강신청 안된 나머지 강의들은 보이지 않음
select s.subno, s.subname, s.teachername, s.cnt, count(a.subno) currentCnt
from subject s
left outer join attend a
on s.subno = a.subno group by s.subno, s.subname, s.teachername, s.cnt;
|
cs |
2. 결과값을 페이징 처리하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
--3. 결과 값을 페이징 처리하기
--(1) 원래 페이지 구할때 sql문
select * from
(select aa.*, rownum rn from
(select * from subject order by subname) aa
where rownum<=5) where rn>=1;
--(2) 비조인 select 페이징 처리
select * from
(select s.subno, s.subname, s.teachername, s.cnt, (select count(a.subno) from attend a where s.subno = a.subno) currentCnt, rownum rn from
(select * from subject s order by subname) s
where rownum<=5) where rn>=1;
--(3) left outer join을 사용해서 페이징 구하기
select * from
(select aa.*, rownum rn from
(select s.subno, s.subname, s.teachername, s.cnt, count(a.subno) currentCnt
from subject s
left outer join attend a
on s.subno = a.subno group by s.subno, s.subname, s.teachername, s.cnt) aa
where rownum<=5) where rn>=1;
|
cs |
'Learning > SQL' 카테고리의 다른 글
namecard 완성하기 (0) | 2020.06.24 |
---|---|
PreparedStatement (0) | 2020.06.23 |
JDBC SELECT (0) | 2020.06.23 |
JDBC INSERT (0) | 2020.06.23 |
JDBC Test (0) | 2020.06.23 |