SELET, FROM, WHERE - join
위의 SQL문을 해석하자면,
instructor라는 relation에서 (from)
dept_name이라는 attribute의 값이 Comp.sci이고 salary라는 attribute의 값이 80000이상인 tuple들의 (where)
name이라는 attribute의 값을 모든 tuple에서 가져와라 (select)
가 됩니다.
반환되는 relation은 attribute가 name 하나이고 where 조건에 부합하는 tuple들의 집합일 것입니다.
여기서 지난번 살펴본 relation algebra와는 다르게 받아온 relation의 중복은 사라지지 않습니다.
sql은 실제 컴퓨터에서 실행되는 언어이기 때문에 중복처리에서 오는 비용을 부담하지 않고, 중복처리를 하기 위해선
select 뒤에 distinct라는 중복 제거문을 명시해야 합니다.
instructor table의 모든 attribute를 조회하고 싶을 땐 * 를 select의 인자로 주면 됩니다.
만약 from에서 table이 두개가 쓰였다면 두개의 table을 카티시안 곱을 수행한 결과 relation에 select를 수행하게 됩니다.
또한 from에서 여러개의 테이블을 적고 where에서 조건을 명시한다면 해당 조건에 맞는 tuple을 select 함으로써 두 테이블속에서 더 유의미한 relation을 추출할 수 있습니다.
이렇게 여러 테이블간 where절로 조건을 명시함으로써 관계가 있는 tuple을 찾아내는 것을 join이라고 볼 수 있습니다.
SQL에서 natural join 또한 가능합니다. 위의 sql문은 instructor table과 teaches table을 카티시안 곱하고,
중복을 제거하여 그 결과에서 name과 course_id attribute의 tuple들만 뽑아와 relation을 반환합니다.
또한 natural join은 모든 attribute에 대해 수행되기 때문에 join (table) using (attribute) 키워드를 사용하여 join할 attribute들을 지정할 수 있습니다.
Rename
rename은 relation 또는 attribute의 이름을 일시적으로 바꿀 수 있는 표현입니다. 해당 relation 또는 attribute 뒤에 as적음으로써 사용할 수 있습니다.
위에서 salary 속성을 12로 나누면 연봉에서 월급을 구한것인데 as를 이용하여 salary를 mothly_salary라는 이름으로 변경한 것을 볼 수 있습니다.
instuctor의 salary란 속성은 그대로지만 반환받은 위의 SQL문을 통해 반환받은 relation에서 salary는 12로 나눠지고 mothly_salary라는 새로운 이름을 가지고 있을 것입니다.
이 sql은 relation을 rename하고 있습니다. 보통 relation의 rename은
같은 relation안에서 존재하는 tuple을 기준으로 다른 tuple들과 비교하고 싶을 때 쓰입니다.
위 sql문은 교수 정보가 담겨있는 relation인 intructor안에서 dept_name(과 이름)이 컴퓨터공학인 교수들보다 더 많이 받는 교수들의 이름을 반환받습니다.
String
where에서 튜플의 속성값을 비교할 때 like를 사용해 다양한 조건을 만들어 낼 수 있습니다.
%는 그 자리에 다른 문자열 값이 올 수 있습니다.
만약 LEE% 라고 한다면 LEE로 시작하는 이름을 가진 tuple을 모두 조회할 것이고,
%LEE 라고 한다면 LEE로 끝나는 이름을 가진 tuple을 모두 조회합니다.
under score(_)도 문자열 조건을 만들어 내는데 사용됩니다.
%와 다르게 문자열이 아니라 하나의 다른 문자형을 대신한다고 생각하면 됩니다.
게시판 키워드 검색같은 검색 기능에 자주 사용되는 SQL문입니다.
SET
set operation은 SQL을 실행하면서 여러 개의 결과를 합쳐 보여주기 위해 사용됩니다.
대표적인 set operation으로 UNION, INTERSECT, EXCEPT 가 존재합니다.
기본적으로 set opertaion은 중복을 제거한 결과를 반환합니다.
UNION
UNION 연산을 사용하면 SQL을 실행한 결과의 합집합을 구할 수 있습니다.
위 SQL은 2009 가을 학기와 2010 봄 학기에 열린 모든 과목의 course_id를 가져오는 SQL입니다.
INTERSECT
INTERSECT 연산을 사용하면 SQL을 실행한 결과의 교집합을 구할 수 있습니다.
위 SQL은 2009 가을 학기와 2010 봄 학기에 모두 열린 과목의 course_id를 가져오는 SQL입니다.
EXCEPT
EXCEPT 연산을 사용하면 SQL을 실행한 결과의 차집합을 구할 수 있습니다.
위 SQL은 2009 가을 학기에 열린 과목 중 2010 봄 학기에 열리지 않은 과목의 course_id를 가져오는 SQL입니다.
ALL
ALL 키워드를 set operation 뒤에 붙여주면 중복된 결과 값을 삭제하지 않고 나타내줍니다.
'CS > DataBase' 카테고리의 다른 글
SQL(2) - Null value, Aggregate Function, Nested Sebqueries (0) | 2022.03.31 |
---|---|
Relational algebra (0) | 2022.03.31 |
Relation과 key (0) | 2022.03.28 |
데이터베이스 기본? (0) | 2022.03.28 |
데이터베이스만 할 수 있는 일 (0) | 2022.03.19 |