SELECT문에 있어서
WHERE id=9 와 같은 조건문을 selection condition이라고 부른다.
name, position과 같은 attribute를 projection attribute라고 부른다.
위 예제를 풀기 위해서는 아래의 2개의 테이블이 이용된다.
임직원의 id,이름과 직군 -> employee 테이블
project 2002를 leading하고 있는 임직원id -> project 테이블
SQL의 실행 흐름
1. projcet 테이블에서 id가 2002인 tuple을 찾는다.
2. 그 tuple에서 leader_id값을 읽는다.
3. leader_id는 foreign key로서 employ.id를 참조하고 있으므로, leader_id로 employee 테이블에 O(1)의 시간 복잡도로
접근
4. 최종적으로 employee 테이블에서 우리가 관심있어 하는 attribute인 {id, name, position}을 가져 오면 된다.
( 위 실행 흐름은 설명하기 쉽게 하기 위해 간략히 설명을 한 것이고, 아래에서 제대로된 흐름을 설명을 하겠다.)
아래의 3가지를 숙지하자
1. WHERE(....)에 의해서, 1개 이상의 tuple이 생성이 된다.
2. (1)에서 생성된 각각의 tuple들은 WHERE뒤에 condition을 충족하는 tuple이여야 한다.
3. WHERE뒤에는 selectin conditon(선택 조건)과 join conditon(연결 조건)으로 구성이 된다.
여기에서의 selection conditon(선택 조건)은 "프로젝트의 id(= project.id)가 2002"인 tuple이고
그 tuple의 leader_id와 값이 employe.id와 같으면, 해당 employee의 tuple과 연결를 한다.
Q. 만약 project.leader_id가 foreign key로서 employee.id를 참조하지 않았다면???
A. project 테이블에 있는 모든 leader_id를 하나하나씩 employee.id와 비교해야만 한다.
이때 시간 복잡도는 O(N^2)이다.
Q.왜 id와 name앞에 employee, project 테이블 명을 명시를 해야 하는가??
A.만약 Projection attribute 부분에 그냥 "SELECT id, name, position"이라고 적어 주게 되면 이 {id, name}이 employee의
attribute인지 , project의 attribute인지를 구분하지 못하여 에러가 난다.
SELECT와 관련된 키워드
1. AS
AS를 이용함으로써 "PROJECT", "EMPLOYEE"를 일일이 타이핑하지 않아도 되게 되었다.
attribute에도 AS 키워드를 사용하여 결과값이 출력됐을 때, COLUMN명을 바꿔 줄 수가 있다.(아래 참조)
AS는 아래와 같이 생략도 가능하다.
2. DISTINCT
먼저 위 예제를 풀기 위해서 어떠한 TABLE들이 필요한지 아래에서 알아 보자.
우리가 알고 싶은 것은
a.디자이너인 사람이 누구인지(EMPLOYEE 테이블)
b.그 사람의 프로젝트id와 프로젝트 이름이 무엇인지(PROJECT 테이블)
이다.
Q. 그럼 EMPLOYEE 테이블과 PROJECT 테이블만을 가지고 SQL문을 작성하면 되는가??
A. NOPE!!! EMPLOYEE테이블과 PROJECT 테이블 사이에는 직접적인 참조 관계가 없다.
고로, WORKS_ON 테이블을 징검다리 삼아서 , EMPLOYEE테이블과 PROJECT 테이블을 join해 줘야 한다.
총 3개의 table, 즉 EMPLOYEE, WORKS_ON, PROJECT table이 필요하게 된다.
SQL문을 작성하여 실행을 시킨 결과이다.
그러나 한 가지 거슬리는 것이 있다.
"2003 홈페이지 UI 개선"이라는 tuple이 2개로 중복 출력이 되었다.
이러한 중복된 tuple을 제거하기 위하여 DISTINCT를 사용한다.(아래 참조)
3. LIKE
SQL문을 작성하기 이전에 '%' 문자가 SQL에서 의미하는 바를 학습하고 가자.
'%' : 0개 이상의 문자열
'\%' : %를 0개 이상의 문자열이 아닌, 본연의 문자로서의 %를 의미
'\_' : '_'를 특별한 기능을 하는 문자가 아닌, 본연의 언더바로서의 '_'을 의미
escape 문자 : %, _ 와 같이 특별한 의미를 가지는 문자가 있을 때, 특별한 의미로서가 아니라 문자 본연의 의미를 가지도
록 하는 문자(여기서 escape문자는 백슬러시 '\'이다.)
5. asterisk( = * )
ex) SELECT * FROM EMPLOYEE