<목차>
ㅇ 카테시안 곱
ㅇ 조인 사용할 때 규칙
- n-1개 조인조건
- 접두어로 소유한 테이블 이름 붙이기
ㅇ FROM절에 ALIAS
ㅇ 조인
ㅇ 카테시안 곱
- FROM 절에 여러 테이블을 선언할 때 조인조건을 생략하거나, 부적합한 경우
모든 경우의 수로 조합되어 출력돼
- 예) 질문 : 우리 회사에 근무하는 사원의 이름과 그 사원이 근무하는 부서이름을 출력하시오.
- 분석 : FROM절은 SELECT LIST절에 나열된 컬럼을 소유한 테이블을 나열해야 해
- 사원의 이름 -> 사원 테이블
- 근무하는 부서 이름 -> 부서 테이블
- 그래서 테이블 2개 다 그냥 적어주면?
조인조건이 없어서 모든 경우의 수가 나와
- 사원수107×부서수27=2889개의 행
ㅇ 데이터의 무결성이 깨진 상황
- 앞의 두 사람은 (departments의)d_id = (employees의)d_id
: ' d_id=d_id ' = 데이터 일치 = 무결성이 보장되었다
- 102번 사원은 d_id≠d_id
: 데이터 불일치 = 무결성이 깨져있다.
- 여러 테이블의 행을 매칭시켜 줄 때 무결성이 보장되어야 해
- 무결성을 보장하기 위한 조건 d.d_id = e.d_id (이게 조인조건이 되어야겠지)
ㅇ 조인 : 여러 개의 테이블에서 데이터를 검색하는 방법
- 테이블들의 데이터를 (행을) 하나로 연결
- 행 연결을 위해서는 무결성이 보장되어야 한다.
= 조건에 맞는 데이터로 행을 연결시켜서 무결성을 보장한다.
= 이 조건이 조인조건
ㅇ 조인을 사용할 때 규칙 2가지
- n개 테이블 조인하려면 n-1개의 조인조건을 WHERE절에 명시
- WHERE절이 먼저 실행돼서 조건에 맞는 데이터가 먼저 필터링 돼
- 조인시킬 테이블에 똑같은 이름의 컬럼이 있을 때
이를 셀렉트절에 명시할 때는 반드시 컬럼의 소유주인 테이블의 이름을 접두어로 명시
- 예)
- 이유
- last_name은 e에 있고 d에 없어, department_name은 e에 없고 d에 있어
(즉, 테이블의 고유한 컬럼이라서 헷갈리지 않아)
- department_id는 e와 d에 모두 있어
똑같은 컬럼 2개 있는데 나 어디 테이블에서 가져와야 해?? => 에러 나
- 파싱의 1단계 검증 때 에러 발생
- 근데 결국 접두어는 항상 붙이는 게 좋아
- 고유한 컬럼이라도 테이블들 다 뒤지는 작업을 하므로 접두어 붙여주면 그 테이블만 뒤지니까 성능 더 좋아져 (파싱)
- CF. 테이블 이름은 전문 용어로는 스키마
- 안 그래도 조인이 시스템의 성능을 떨어뜨리는데 그나마 성능 보장할 수 있도록 접두어 적극 권장
(성능 떨어뜨리는 기능 1정렬 2조인)
ㅇ FROM절에 ALIAS 사용하기
- 이 문장이 실행되는 동안만 임플로이는 e 디파트먼트는 d를 사용하겠다.
SELECT e.last_name, d.department_name, e.department_id
FROM employees e, departments d
WHERE e.department_id=d.department_id
- 현업에서 많이 쓰고, 가독성도 좋아
- FROM절의 ALIAS 기능은 간단해 보이지만, 실제로는 엄청난 기능들을 제공 (나중에 살펴볼 거야)
- 풀네임과 알리아스는 혼용에서 사용할 수 없다.
- 예) FROM절에 employees e 쓰면 employees를 다 e로 바꿔버린 거라서
elployees라는 테이블은 이 문장에서는 존재하지 않는 게 돼버려
- 즉, FROM절에 풀네임 썼으면 끝까지 풀네임, ALIAS 썼으면 끝까지 ALIAS
- 실행 순서가 프럼->웨어->셀렉트->오더바이 라서
웨어절에는 column에 알리아스 쓸 수 없었지만
프럼절에서 table에 알리아스 쓰는 것 가능
Q. SELECT절에 e.d_id 말고 d.d_id 써도 되나요??
A. 써도 돼! 그리고 결과는 똑같이 나와
다만, 코드상으로 봤을 때 (코드를 가지고 평가를 한다면) 기준에 맞춰서 써주는 게 좋겠지
- 내가 사원들을 나열하고 사원들이 근무하는 부서번호를 출력하고 싶으면 -> employees table
- 내가 회사에 존재하는 부서번호, 거기에 근무하는 사원들 이렇게 나열하고 싶으면 -> departments table
CF. 어떤 조인조건을 써야 할 지가 관건 ㅠㅠ
- 테이블 관계나 테이블 구조를 정확히 이해 못 하면 이거 자체가 어려워.
- 첫 프로젝트 때 직접 테이블을 만들기 때문에 구조 정확히 이해할 수 있을 거야~
CF. 성능적으로 보면 조인을 수행 안 할 수 있으면 안 하는 게 좋기는 해. 하지만 현업에서는 발생이 안 할래야 안 할 수 없어.
ㅇ 우리는 오라클 전용 조인 배울 거야
( SQL1999는 명령문을 수행한다는 차이만 있어서)