본문 바로가기

Learning/SQL

수강편람 테이블에서 과목별 현재 수강인원도 함께 출력하기

내가 보여주고 싶은 결과값

위와 같이 수강편람 테이블이 있다.

맨 우측 열에서 알 수 있듯이 나는 현재 수강인원도 출력하고 싶다.

그러나 과목코드, 강의명, 교사명, 정원은 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<=5where 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<=5where 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<=5where 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