김갱환
맨땅에 코딩
김갱환
전체 방문자
오늘
어제
  • 분류 전체보기 (239)
    • ⁂ 맨땅에 코딩 (11)
      • : Story (3)
      • : MiniProject 'MyWeb' (1)
      • : Final Project (5)
      • : Josa-Moa 한국어 조사 처리 프로젝트 (1)
    • —————Frontend——————————————.. (0)
    • ⁂ HTML (10)
      • : 기본 익히기 (10)
    • ⁂ CSS (15)
      • : 기본 익히기 (15)
    • ⁂ Java Script (32)
      • : 기본 익히기 (28)
      • : 자바스크립트 라이브러리 (1)
      • : 연습 문제 (3)
    • ⁂ jQuery (11)
      • : 기본 익히기 (11)
    • ⁂ Bootstrap (3)
      • : 기본 익히기 (3)
    • ⁂ TailWind CSS (1)
    • ⁂ AJAX (5)
      • : 기본 익히기 (5)
    • ⁂ Vue.js (3)
      • : 기본 익히기 (3)
    • —————DB : Data Base————————.. (0)
    • ⁂ Oracle DB (27)
      • : 기본 익히기 (24)
      • : 연습 문제 (3)
    • ⁂ MyBatis Framework (15)
      • : 기본 익히기 (15)
    • —————Backend———————————————.. (0)
    • ⁂ Java (62)
      • : 기본 익히기 (42)
      • : JDBC - Java DataBase Conn.. (4)
      • : Crawling (2)
      • : 독학으로 공부하기(과거) (11)
      • : 연습문제 (3)
    • ——————Web————————————————— (0)
    • ⁂ JSP (28)
      • : 기본 익히기 (28)
    • ⁂ Spring FrameWork (15)
      • : Legacy Project (1)
      • : 기본 익히기(Boot 기반) (14)
    • ——————————————————————— (0)
    • ⁂ Error Note (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 코딩공부 #코딩 #자바 #자바독학 #자바공부 #개발자 #프론트앤드 #백앤드 #풀스택
  • http에러메세지
  • ErrorPage
  • 풀스택
  • 자바
  • 백앤드
  • httperror
  • 코딩공부 #자바공부
  • 코딩
  • 프론트앤드
  • 자바공부
  • 비트연산자 #코딩공부 #자바공부 #코딩 #자바 #프로그래밍 #개발자
  • 연산자 #기본연산자 #코딩 #자바 #독학 #자바공부 #자바연산자
  • HTML공부
  • 코딩 #코딩공부 #프론트앤드 #백앤드 #풀스택개발자
  • 객체지향프로그래밍
  • 코딩 #코딩공부 #상수 #리터럴 #형변환 #개발자 #자바 #자바공부 #자바독학
  • web.xml수정
  • 개발자
  • 코딩공부

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김갱환

맨땅에 코딩

⁂ Oracle DB/: 연습 문제

[Oracle] Join 연습문제

2022. 8. 26. 15:01

1. 테이블 생성

 

1. 테이블 생성
----------------------------- 학생테이블
create table tb_student(
   hakno    char(5)     not null            -- 학번
  ,uname    varchar(20) not null            -- 이름
  ,email    varchar(20) unique              -- 이메일
  ,address  varchar(20) not null            -- 주소
  ,phone    varchar(20)                     -- 전화번호
  ,regdt    date        default sysdate     -- 등록일
  ,primary key(hakno)                       -- 기본키
);

drop table tb_student;
delete table tb_student;

----------------------------- 과목테이블
create table tb_gwamok(
   gcode    char(4)      not null           -- 과목코드 (p:프로그램교과목, d:디자인교과목)
  ,gname    varchar(20)  not null           -- 과목이름
  ,ghakjum  number(2)    default 1          -- 학점
  ,regdt    date         default sysdate    -- 등록일    
  ,primary key(gcode)                       -- 기본키
);

drop table tb_gwamok;

----------------------------- 수강테이블
create table tb_sugang(
   sno    number(3)  not null               -- 일련번호
  ,hakno  char(5)    not null               -- 학번
  ,gcode  char(4)    not null               -- 과목코드
  ,primary key(sno)                         -- 기본키
);

drop table tb_sugang;


2. 수강테이블 시퀀스 생성
create sequence sugang_seq;

drop sequence sugang_seq;


3. 행추가

----------------------------- tb_student테이블에 행 추가하기
insert into tb_student(hakno,uname,address,phone,email)
values('g1001','홍길동','서울','111-5558','11@naver.com');

insert into tb_student(hakno,uname,address,phone,email)
values('g1002','홍길동','제주','787-8877','33@daum.net');

insert into tb_student(hakno,uname,address,phone,email)
values('g1003','개나리','서울','554-9632','77@naver.com');

insert into tb_student(hakno,uname,address,phone,email)
values('g1004','홍길동','부산','555-8844','88@daum.net');

insert into tb_student(hakno,uname,address,phone,email)
values('g1005','진달래','서울','544-6996','33@nate.com');

insert into tb_student(hakno,uname,address,phone,email)
values('g1006','개나리','제주','777-1000','66@naver.com');


----------------------------- tb_gwamok테이블에 행 추가하기
insert into tb_gwamok(gcode,gname,ghakjum) values('p001','JAVA',3);
insert into tb_gwamok(gcode,gname,ghakjum) values('p002','Oracle',3);
insert into tb_gwamok(gcode,gname,ghakjum) values('p003','JSP',2);
insert into tb_gwamok(gcode,gname,ghakjum) values('d001','HTML',1);
insert into tb_gwamok(gcode,gname,ghakjum) values('d002','포토샵',5);
insert into tb_gwamok(gcode,gname,ghakjum) values('d003','일러스트',3);
insert into tb_gwamok(gcode,gname,ghakjum) values('d004','CSS',1);
insert into tb_gwamok(gcode,gname,ghakjum) values('p004','Python',3);
insert into tb_gwamok(gcode,gname,ghakjum) values('p005','AJAX',2);


----------------------------- tb_sugang테이블에 행 추가하기
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1001','p001');
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1002','p002');
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1002','p001');
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1002','p003');
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1001','p003');
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1001','p004');
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1005','p001');
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1005','d001');
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1005','d002');
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1005','d003');
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1001','d001');
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1001','p002');
insert into tb_sugang(sno,hakno,gcode) values(sugang_seq.nextval,'g1006','p001');
/////////////////////////////////////////////////////////////////////////////////

commit;

-- tb_student 테이블 전체 레코드 갯수
select count(*) from tb_student;    -- 6

-- tb_gwamok 테이블 전체 레코드 갯수
select count(*) from tb_gwamok;    -- 9

-- tb_sugang 테이블 전체 레코드 갯수
select count(*) from tb_sugang;    -- 13
/////////////////////////////////////////////////////////////////////////////////

 

 

2. 문제

 

문1)수강신청을 한 학생들 중에서 '제주'에 사는 학생들만 학번, 이름, 주소를 조회하시오

 

문2) 지역별로 수강신청 인원수, 지역을 조회하시오 서울 2명 제주 1명

 

문3) 과목별 수강 신청 인원수, 과목코드, 과목명를 조회하시오 d001 HTML 2명 d002 포토샵 1명 p001 OOP 2명

 

문4) 학번별 수강신청과목의 총학점을 학번별순으로 조회하시오 g1001 홍길동 9학점 g1002 홍길동 6학점 g1005 진달래 9학점

 

문5) 학번 g1001이 수강신청한 과목을 과목코드별로 조회하시오 g1001 p001 OOP g1001 p003 JSP g1001 d001 HTML

 

문6)수강신청을 한 학생들의 학번, 이름 조회

 

문7)수강신청을 하지 않은 학생들의 학번, 이름 조회

 

 

3. 풀이

 

눌러서 확인하세요 
문1)수강신청을 한 학생들 중에서 '제주'에 사는 학생들만 학번, 이름, 주소를 조회하시오

select SU.hakno, uname, address
from tb_sugang SU join tb_student ST
on SU.hakno = ST.hakno and ST.address = '제주';


-- AA 별칭 만들기
select AA.hakno, AA.uname, AA.address
from (
        select SU.hakno, uname, address
        from tb_sugang SU join tb_student ST
        on SU.hakno = ST.hakno
    ) AA
where AA.address = '제주';


-- AA 별칭 생략하기
select hakno, uname, address
from (
        select SU.hakno, uname, address
        from tb_sugang SU join tb_student ST
        on SU.hakno = ST.hakno
    ) AA
where AA.address = '제주';


-- 칼럼명이 노출되었을 때는 *을 쓸 수 있다.
select *
from (
        select SU.hakno, uname, address
        from tb_sugang SU join tb_student ST
        on SU.hakno = ST.hakno
    ) AA
where AA.address = '제주';


문2) 지역별로 수강신청 인원수, 지역을 조회하시오
     서울 2명
     제주 2명  

select AA.address, count(*) || '명'
from(
    select SU.hakno, address
    from tb_sugang SU join tb_student ST
    on SU.hakno = ST.hakno
    group by SU.hakno, address
     ) AA
group by AA.address;    

select ST.address, count(distinct(ST.hakno))
from tb_sugang SU join tb_student ST
on SU.hakno=ST.hakno
group by address;


-- 1) 수강테이블 조회
select * from tb_sugang;


-- 2) 수강 신청한 학생들의 명단(학번)
select hakno from tb_sugang order by hakno;
select distinct(hakno) from tb_sugang order by hakno;
select hakno from tb_sugang group by hakno order by hakno;


-- 3) 

select AA.hakno, ST.address
from (
        select hakno from tb_sugang group by hakno order by hakno
    ) AA join tb_student ST
on AA.hakno = ST.hakno;


-- 3)의 결과를 BB 테이블로 만든 후 주소별 그룹 후 행 갯수 구하기

select BB.address, count(*) || '명'
from (
        select AA.hakno, ST.address
        from (
                select hakno from tb_sugang group by hakno order by hakno
            ) AA join tb_student ST
        on AA.hakno = ST.hakno
    ) BB
group by BB.address;


문3) 과목별 수강 신청 인원수, 과목코드, 과목명를 조회하시오 
     d001 HTML   2명 
     d002 포토샵   1명
     p001 OOP    2명
     
select SU.gcode, gname, count(*) || '명'
from tb_sugang SU join tb_gwamok GW
on SU.gcode = GW.gcode
group by SU.gcode, gname
order by SU.gcode;
     
     
문4) 학번별 수강신청과목의 총학점을 학번별순으로 조회하시오
     g1001  홍길동  9학점
     g1002  홍길동  6학점
     g1005  진달래  9학점

select SU.hakno, uname, sum(ghakjum) || '학점'
from tb_sugang SU join tb_student ST
on SU.hakno = ST.hakno join tb_gwamok GW
on SU.gcode = GW.gcode
group by SU.hakno, uname
order by SU.hakno;


문5) 학번 g1001이 수강신청한 과목을 과목코드별로 조회하시오
     g1001  p001  OOP
     g1001  p003  JSP  
     g1001  d001  HTML

-- 논리적 테이블 AA 만들어서 SQL문 사용하기
select AA.*
from(     
    select SU.hakno, SU.gcode, gname
    from tb_sugang SU join tb_student ST
    on SU.hakno = ST.hakno join tb_gwamok GW
    on SU.gcode = GW.gcode
    ) AA
where hakno = 'g1001'
order by gcode; 
        
-- where 조건절 사용하기
select SU.hakno, SU.gcode, gname
from tb_sugang SU join tb_student ST
on SU.hakno = ST.hakno join tb_gwamok GW
on SU.gcode = GW.gcode
where SU.hakno = 'g1001'
order by SU.gcode; 

-- and로 on 조건절에 추가하기
select SU.hakno, SU.gcode, gname
from tb_sugang SU join tb_student ST
on SU.hakno = ST.hakno join tb_gwamok GW
on SU.gcode = GW.gcode and SU.hakno = 'g1001'
order by SU.gcode;


문6)수강신청을 한 학생들의 학번, 이름 조회

-- 논리적 테이블 AA 만들어서 SQL문 사용하기
select *
from (
    select SU.hakno, uname
    from tb_sugang SU join tb_student ST
    on SU.hakno = ST.hakno join tb_gwamok GW
    on SU.gcode = GW.gcode
    ) AA
group by hakno, uname
order by hakno;

-- group by 직접 사용하기
select SU.hakno, uname -- count(uname) 됌
from tb_sugang SU join tb_student ST
on SU.hakno = ST.hakno join tb_gwamok GW
on SU.gcode = GW.gcode
group by SU.hakno, uname
order by SU.hakno;

-- distinct
select distinct(SU.hakno), uname -- count(uname) 안됌
from tb_sugang SU join tb_student ST
on SU.hakno = ST.hakno join tb_gwamok GW
on SU.gcode = GW.gcode
order by SU.hakno;


문7)수강신청을 하지 않은 학생들의 학번, 이름 조회

select ST.hakno, ST.uname
from (
    select SU.hakno, uname
    from tb_sugang SU join tb_student ST
    on SU.hakno = ST.hakno join tb_gwamok GW
    on SU.gcode = GW.gcode
    ) AA -- 수강신청한 학생
    right join tb_student ST -- 전체 학생
on AA.hakno = ST.hakno
where AA.hakno is null -- 수강신청한 학생의 코드와 전체 학생 코드 중 겹치는 게 있으면 null로 만들어라
                       -- 전체 학생 중 수강신청한 학생을 제외한 값만 남는다(수강신청 안한 학생)
order by ST.hakno;
저작자표시 비영리 동일조건 (새창열림)

'⁂ Oracle DB > : 연습 문제' 카테고리의 다른 글

[Oracle] Paging까지 배운 후 연습 문제  (0) 2022.08.29
[Oracle] SQL문 연습문제(문제와 풀이)  (0) 2022.08.24
    '⁂ Oracle DB/: 연습 문제' 카테고리의 다른 글
    • [Oracle] Paging까지 배운 후 연습 문제
    • [Oracle] SQL문 연습문제(문제와 풀이)
    김갱환
    김갱환
    코딩의 코자도 모르는 이의 공부 기록장

    티스토리툴바