조인은 2개이상의 테이블을 참고하여 데이터값을 비교후 출력할 수 있게 하는 것이다. 먼저 등가조인(Equi join)과 비등가조인(Non Equi join) 두가지를 살펴보자. 등가조인은 조인 조건을 등호(=)를 사용해 나타내는 것이다. 비등가조인은 조인조건에 부등호(<=, >=)를 사용해 관계를 나타내는 것이다. 조인문의 갯수는 항상 (테이블의 갯수 - 1)개 이상 이다. 왜냐하면 모든 테이블은 연관성이 있기 때문이다. 테이블 명에 별명을 사용할수있다. 또한 SQL문이 실행될때는 테이블의 정보부터 읽은 후에 무언가를 실행하기 때문에 어느 테이블을 참고하라는지 알려주는 FROM부터 시작된다. SQL문은 터미널에 바로 적는 것이 아니라 메모장같은 파일에 문장을 적어놓고 그것을 실행하면서 수정하는 것이다. 터미널에 직접 입력하면 입력한 값을 확인하며 수정하기 어렵기 때문이다.
실습 전에 어제 그렸었던 조인 추상화를 그려본것을 첨삭한 그림을 보자.
먼저 DB에서 적혀있는 데이터 들을 읽기 쉬운 모국어로 고치는 것이 좋다. 그렇게 나온 모델을 논리모델이라고 한다. 또한 score테이블을 보면 sno와 cno 두개의 값을 동시에 비교해야 result를 식별할수있다. 이렇듯 pk는 하나가 아닌 두개가 될수있다. 또한 student테이블과 professor테이블을 적었던것은 잘못되었다. 왜냐하면 어느 한 부분도 데이터를 중복으로 가질수있기 때문이다. 마지막으로 테이블간 관계도를 상단에 표시한것처럼 적어 놓고 참고하면 좀더 관계를 이해할수있다.
8 실습
1. 송강 교수가 강의하는 과목을 검색한다.
2. 과목명에 화학이 포함된 과목을 강의하는 교수의 명단을 검색한다.
3. 학점이 2학점인 과목과 이를 강의하는 교수를 검색한다
4. 화학과 교수가 강의하는 과목을 검색한다.
5. 화학과 1학년 학생의 기말고사 성적을 검색한다.
6. 일반화학 과목의 기말고사 점수를 검색한다.
7. 화학과 1학년 학생의 일반화학 기말 고사 점수를 검색한다.
8. 화학과 1학년 학생이 수강하는 과목을 검색한다.
9. 일반화학 과목에서 평가 점수가 A인 학생의 명단을 검색한다.
10. 송강 교수가 강의하는 과목을 수강하는 학생의 기말고사 점수를 성적 순서로 검색한다.
11. 화학과 1학년 학생의 기말고사 성적을 학점(A, B, C, D, F)으로 검색한다.
12. 송강 교수가 강의하는 과목에서 평가 점수가 A인 학생의 명단을 과목명과 함께 검색한다.
13. 화학과 1학년 학생에게 강의하는 교수의 명단을 검색한다.
14. 양선호의 입사일보다 빨리 부임한 교수의 명단을 검색한다.
이번에 알아볼 조인은 자기참조조인과 외부조인이다. 그 전에 조인문을 만들기 위한 사전준비로는 관계도가 필요하다.
그리고 SQL문구성요소인 SELECT, FROM, WHERE 추가적으로는 ORDER BY까지 각각 항목을 적으며 채워주면 된다.
자기 참조 조인(self join)은 한 테이블 안의 데이터를 비교후 출력할때 사용한다. 이때 사용하는것이 alias명을 붙여주는것과 유사한 방법인데 FROM에 한 테이블의 alias명을 2개 적는것이다. 만약 1개만 적게 되면 SQL이 alias명으로 인식하는데 2개를 적어주게 되면 테이블을 2개로 복사한다.
외부조인(outer)조인은 데이터가 없는 값 즉 NULL값 마저 출력하게 하는것이다. 아래에 일반 조인문과 외부 조인문을 적어 비교해보자.
9 실습
1. 학생 중에 동명이인을 검색한다.
2. 전체 교수 명단과 교수가 담당하는 과목의 이름을 학과 순으로 검색한다.
3. 이번 학기에 등록된 모든 과목과 담당 교수를 학점 순으로 검색한다.
외부 조인은 전부 확인해야 하는 컬럼이 아닌 테이블에 (+)를 해주면 된다.
다시 말해 NULL값이 출력되도 되는 테이블에 (+)를 붙여준다.
4. 직원 중에 자신의 관리자보다 급여가 높은 사람의 급여 정보를 관리자 급여 정보와 같이 검색한다.
5. 교수의 정보와 교수가 담당하는 과목명을 검색한다.
6. 직원과 사수의 명단을 검색한다. 단 직원 명단은 모든 직원 명단이 출력되어야 한다.
자기참조조인과 외부조인을 같이 사용할때는 table에 사용한 alias명과 출력할 데이터의 관계를 정확하게 파악하고 출력해야 한다. 그렇지 않으면 위와 같은 불상사가 나타난다.
'교육 > SQL' 카테고리의 다른 글
Day 17 (SQL) (0) | 2019.12.10 |
---|---|
Day 16 (SQL) (0) | 2019.12.09 |
Day 15 (SQL) (0) | 2019.12.06 |
Day 13 (SQL) (0) | 2019.12.04 |
Day 12(SQL) (0) | 2019.12.03 |