- 문제:
- 모든 멤버의 번호와 이름을 출력
- 단 학생의 경우 재직여부도 출력
select mno, name
from memb;
select mno, name, work
from memb natural join stnt;
select mno, name, work
from memb join stnt using(mno);
select memb.mno, name, work
from memb, stnt
where memb.mno=stnt.mno;
select memb.mno, name, work
from memb inner join stnt on memb.mno=stnt.mno;
select memb.mno, name, work
from memb join stnt on memb.mno=stnt.mno;
select m.mno, name, work
from memb m join stnt s on m.mno=s.mno;
안타깝게도 위의 SQL문은 학생 목록만 출력한다.
- memb테이블의 데이터와 stnt 테이블의 데이터를
연결할 때 mno가 같은 데이터만 연결하여 추출하기 때문이다.
select m.mno, name, work
from memb m left outer join stnt s on m.mno=s.mno;
다음의 결과가 출력될 수 있도록 수강 신청 데이터를 출력(수강신청번호, 강의명, 학생명, 재직여부, 수강신청일, 강의실명, 매니저명, 직위)
※ 1단계: 수강신청 데이터를 출력
select la.lano, la.lno, la.mno, la.rdt
from lect_appl la;
※ 2단계: 수강신청한 학생의 번호 대신 이름을 출력
select la.lano, la.lno, m.name, la.rdt
from lect_appl la
inner join memb m on la.mno=m.mno;
※ 3단계: 수강 신청한 학생의 재직 여부 출력
=> inner join 에서 inner는 생략 가능
select la.lano, la.lno, m.name, s.work, la.rdt
from lect_appl la
join memb m on la.mno=m.mno
join stnt s on la.mno=s.mno;
※ 4단계: 수강신청한 강의 번호 대신 강의명을 출력
select la.lano, l.titl, m.name, s.work, la.rdt, l.rno
from lect_appl la
join memb m on la.mno=m.mno
join stnt s on la.mno=s.mno
join lect l on la.lno=l.lno;
※ 5단계: 강의실 이름을 출력한다.
=> 강의실 번호는 lect 테이블 데이터에 있다.
=> 강의실 이름은 room 테이블 데이터에 있다.
select la.lano, l.titl, m.name, s.work, la.rdt, r.name, l.mno
from lect_appl la
join memb m on la.mno=m.mno
join stnt s on la.mno=s.mno
join lect l on la.lno=l.lno
left outer join room r on l.rno=r.rno;
=> left 제외
※ 6단계: 매니저 이름을 출력
=> 매니저 번호는 lect 테이블에 있다.
=> 매니저 이름은 memb 테이블에 있다.
select
la.lano,
l.titl,
m.name member_name,
s.work,
la.rdt,
r.name room_name,
m2.name manager_name
from lect_appl la
join memb m on la.mno=m.mno
join stnt s on la.mno=s.mno
join lect l on la.lno=l.lno
left outer join room r on l.rno=r.rno
left outer join memb m2 on l.mno=m2.mno;
※ 7단계: 매니저의 직위 출력
=> 매니저 번호는 lect 테이블 있다.
=> 매니저 직위는 mgr 테이블에 있다.
select
la.lano,
l.titl,
m.name snm,
s.work,
la.rdt,
r.name rnm,
m2.name mnm,
mr.posi
from lect_appl la
join memb m on la.mno=m.mno
join stnt s on la.mno=s.mno
join lect l on la.lno=l.lno
left outer join room r on l.rno=r.rno
left outer join memb m2 on l.mno=m2.mno
left outer join mgr mr on l.mno=mr.mno; (추가적)
- 문제:
- 다음의 결과가 출력될 수 있도록 수강 신청 데이터를 출력(수강신청번호, 강의명, 학생명, 재직여부, 수강신청일, 강의실명, 매니저명, 직위)
※ 1단계: 수강신청 데이터를 출력
select la.lano, la.lno, la.mno, la.rdt
from lect_appl la;
※ 2단계: 수강신청한 학생의 번호 대신 이름을 출력
select la.lano, la.lno, m.name, la.rdt
from lect_appl la
inner join memb m on la.mno=m.mno;
※ 3단계: 수강 신청한 학생의 재직 여부 출력
=> inner join 에서 inner는 생략 가능
select la.lano, la.lno, m.name, s.work, la.rdt
from lect_appl la
join memb m on la.mno=m.mno
join stnt s on la.mno=s.mno;
※ 4단계: 수강신청한 강의 번호 대신 강의명을 출력
select la.lano, l.titl, m.name, s.work, la.rdt, l.rno
from lect_appl la
join memb m on la.mno=m.mno
join stnt s on la.mno=s.mno
join lect l on la.lno=l.lno;
※ 5단계: 강의실 이름을 출력한다.
=> 강의실 번호는 lect 테이블 데이터에 있다.
=> 강의실 이름은 room 테이블 데이터에 있다.
select la.lano, l.titl, m.name, s.work, la.rdt, r.name, l.mno
from lect_appl la
join memb m on la.mno=m.mno
join stnt s on la.mno=s.mno
join lect l on la.lno=l.lno
left outer join room r on l.rno=r.rno;
※ 6단계: 매니저 이름을 출력
=> 매니저 번호는 lect 테이블에 있다.
=> 매니저 이름은 memb 테이블에 있다.
select
la.lano,
l.titl,
m.name member_name,
s.work,
la.rdt,
r.name room_name,
m2.name manager_name
from lect_appl la
join memb m on la.mno=m.mno
join stnt s on la.mno=s.mno
join lect l on la.lno=l.lno
left outer join room r on l.rno=r.rno
left outer join memb m2 on l.mno=m2.mno;
※ 7단계: 매니저의 직위 출력
=> 매니저 번호는 lect 테이블 있다.
=> 매니저 직위는 mgr 테이블에 있다.
select
la.lano,
l.titl,
m.name snm,
s.work,
la.rdt,
r.name rnm,
m2.name mnm,
mr.posi
from lect_appl la
join memb m on la.mno=m.mno
join stnt s on la.mno=s.mno
join lect l on la.lno=l.lno
left outer join room r on l.rno=r.rno
left outer join memb m2 on l.mno=m2.mno
left outer join mgr mr on l.mno=mr.mno;
테이블 구성
가상 ERD 실습 코드와 동일
mysql> desc lect_appl;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| lano | int | NO | PRI | NULL | auto_increment |
| lno | int | NO | MUL | NULL | |
| mno | int | NO | MUL | NULL | |
| rdt | datetime | NO | | NULL | |
| stat | int | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> desc memb;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| mno | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | MUL | NULL | |
| tel | varchar(20) | NO | | NULL | |
| email | varchar(40) | NO | UNI | NULL | |
| pwd | varchar(100) | NO | | NULL | |
| phot | varchar(255) | YES | | NULL | |
| ano | int | YES | MUL | NULL | |
| det_addr | varchar(255) | YES | | NULL | |
| finl_edu | varchar(50) | YES | | NULL | |
| maj | varchar(50) | YES | | NULL | |
| sch_nm | varchar(50) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)
mysql> desc stnt;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| mno | int | NO | PRI | NULL | |
| work | char(1) | NO | | NULL | |
| acc_no | varchar(20) | YES | MUL | NULL | |
| bank | varchar(50) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> desc room;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| rno | int | NO | PRI | NULL | auto_increment |
| loc | varchar(50) | NO | MUL | NULL | |
| name | varchar(50) | NO | | NULL | |
| qnty | int | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> desc lect;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| lno | int | NO | PRI | NULL | auto_increment |
| titl | varchar(255) | NO | MUL | NULL | |
| sdt | date | NO | | NULL | |
| edt | date | NO | | NULL | |
| qnty | int | NO | | NULL | |
| pric | int | NO | | NULL | |
| nat_sup | char(1) | NO | | NULL | |
| sup_typ | varchar(50) | NO | | NULL | |
| dsct | text | NO | | NULL | |
| rno | int | YES | MUL | NULL | |
| mno | int | YES | MUL | NULL | |
+---------+--------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)
아주 유익한 내용이네요!