이 글에서는 University Database가 사용된다.
검색 질의문을 작성할 때 기본적으로 SELECT... FROM... WHERE 절로 구성되어 있다. 이런 기본 틀 안에 또 다른 SQL문이 들어갈 수 있다.
서브 쿼리는 또 다른 연산자를 만들기 위해서 사용한다. 해당하는 연산자로는 in과 not in이 있다.
서브 쿼리의 결과는 Relation(=Table)이다. tuple을 원소로 가지는 Set이 된다.
Some, All과 같은 Set Comparison도 사용 가능하게 해 준다. 이제부터 자세히 알아보자.
Single-row Subquery(Scalar Subquery)
서브쿼리의 결과로 tuple과 column을 하나만 가지는 서브 쿼리를 말한다. 스칼라 서브쿼리는 다음과 같이 하나의 값처럼 사용할 수 있다.
ex1) 교수번호(pID)가 10인 교수의 연봉과 동일한 연봉을 받는 교수의 이름.
SELECT name
FROM professor
WHERE salary = (SELECT salary FROM professor WHERE pID = '10')
and pID <> '10'
ex2) CS학과에서 가장 높은 연봉을 받는 교수의 이름
SELECT name
FROM professor
WHERE salary = (SELECT MAX(salary)
FROM professor
WHERE deptName = 'CS');
위 SQL문의 salary = (SELECT...)에서 하나는 왼쪽은 값(value)이고, 하나는 tuple의 집합(Set)이므로 원래는 같다(=)라고 비교할 수 없다. 하지만 지금과 같이 집합에 값이 하나만 존재할 경우는 특수한 경우로 비교할 수 있다는 것을 기억해두자. 이것을 Single-row Subquery 또는 Scalar Subquery라고 한다.
IN, NOT IN Operation
IN과 NOT IN은 집합 안에 값이 속하는지 속하지 않는지를 따지는 연산자이다.
SELECT name, salary
FROM professor
WHERE pID in (10, 21, 22);
pID 속성 값이 (10, 21, 22)중 하나에 속하면 참이다. 동일한 쿼리로 다음과 같이 작성할 수 있다.
SELECT name, salary
FROM professor
WHERE pID = 10 OR pID = 21 OR pID = 22;
비교 연산자(Comparison Operation)
기존에는 값과 값을 비교하는 것은 가능했지만 값과 집합을 비교하는 것은 불가능했다. 하지만 SQL에서는 서브 쿼리와 특수한 비교 연산자 some, any, all, in 등을 사용하여 값과 집합을 비교하는 것을 지원한다.
- (1 > 2): false
- (3 > all {2, 3}): false
- (3 > some {2, 3}): true
- (3 > any {2, 3}): true // any ≡ some
some 은 해당 집합에 있는 원소 중 하나라도 연산을 만족하면 참이다.
- (5 < some {0, 5, 6}): 5라는 값이 {0, 5, 6} 집합에 있는 값 중 하나라도 작으면 참이다. true
- (5 < some {0, 5}): 5라는 값이 0, 5중 무엇보다도 작지 않으므로 거짓이다. false
- (5 = some {0, 5}): 5와 같은 값인 5가 하나 있으므로 참이다. true
(= some) 은 in과 동일한 의미를 가진다. 하지만 (≠ some)은 not in과 같지는 않다.
all은 해당 집합에 있는 원소가 모두 조건을 만족해야 참이다.
- (5 < all {0, 5, 6}): 0, 5, 6이 모두 5보다 크지 않으므로 거짓이다. false
- (5 < all {6, 7}): 집합에 있는 원소가 모두 5보다 크므로 참이다. true
- (5 = all {4, 5}): 모든 원소가 5와 값이 같지 않으므로 거짓이다. false
- (5 ≠ all {6, 7}): 모든 원소가 5와 값이 같지 않으므로 참이다. true
(≠ all)은 not in과 동일한 역할을 한다. 하지만 (= all)은 in과 같지는 않다.
'데이터베이스' 카테고리의 다른 글
SQL11: FROM절의 서브쿼리, lateral, with절, 스칼라 서브쿼리 (0) | 2021.12.24 |
---|---|
SQL10: Correlation Subqueries (0) | 2021.12.24 |
SQL8: Joined Relations (0) | 2021.12.23 |
SQL7: Aggregation Function(집계함수), Group By, Having (0) | 2021.12.23 |
SQL6: Null Values (0) | 2021.12.23 |