ORDER BY 절
- 사용자가 SELECT문에서 질의 결과의 순서를 명시하지 않으면 사용자에게 제시되는 순서가 정해져 있지 않다.
- ORDER BY절에서 하나 이상의 애트리뷰트 또는 표현식을 사용하여 검색 결과를 정렬할 수 있다.
- 기본 정렬 순서는 ASC(오름차순)이며 DESC를 사용하여 내림차순으로 지정할 수 있다.
- 널값은 오름차순에서 가장 마지막에 나타나고 내림차순에서는 가장 앞에 나타난다.
집단함수
- 검색된 여러 투플들의 집단에 적용되는 함수
- 1개의 애트리뷰트에 적용되어 단일 값을 반환한다.
- SELECT절 또는 HAVING절에만 사용할 수 있다.
- COUNT(*)를 제외하고는 널값을 제거한 후 남아 있는 값들에 대해서 집단 함수의 값을 구한다.
- COUNT(*)는 릴레이션의 모든 행들의 총 개수를 구하며 COUNT(att)는 해당 애트리뷰트의 널값이 아닌 값들의 개수를 구한다.
- DISTINCT가 집단 함수 앞에 사용되면 집단 함수가 적용되기 전에 먼저 중복을 제거한다.
- 집단 함수를 적용하지 않은 애트리뷰트는 SELECT절에서 기준 애트리뷰트로 사용하여야 질의문을 작성할 수 있다.
그룹화
- GROUP BY절에 사용된 애트리뷰트에 동일한 값을 갖는 투플들이 하나의 그룹으로 묶인다.
- 그룹화에 사용된 애트리뷰트르르 Grouping attribute라고 한다.
- SELECT절에는 집단 함수, 그룹화 애트리뷰트만 나타날 수 있다.
HAVING절
- 어떤 조건을 만족하는 그룹들에 대해서만 집단함수를 적용할 수 있다.
- 각 그룹마다 하나의 값을 갖는 애트리뷰트를 사용하여 각 그룹이 만족해야하는 조건을 명시한다.
- 그룹화 애트리뷰트에 같은 값을 갖는 투플들의 그룹에 대한 조건을 나타내고, 조건을 만족하는 그룹들만 질의 결과에 나타난다.
- HAVING절에 나타나는 애트리뷰트는 반드시 GROUP BY절에 나타나거나 집단함수에 포함되어야 한다.
SELECT DNO, AVG(SALARY) AS AVGSAL, MAX(SALARY) AS MAXSAL
FROM EMPLOYEE
GROUP BY DNO
HAVING AVG(SALARY) >= 250000;
집합 연산
- 합집합 호환성을 가지는 릴레이션에 한해서 적용할 수 있다.
- UNION / EXCEPT / INTERSECT / UNION ALL / EXCEPT ALL / INTERSECT ALL
- ALL이 있는 연산자는 중복을 제거하지 않기 때문에 중복을 제거하는 연산보다 연산 속도가 빠르다.
### 조인
- 2개 이상의 릴레이션으로부터 연관된 투플들을 결합한다.
- 일반적인 형식은 아래의 SELECT문과 같이 FROM절에 두 개 이상의 릴레이션들이
열거되고, 두 릴레이션에 속하는 애트리뷰트들을 비교하는 조인 조건이 WHERE절에 포함된다.
- 조인 조건은 두 릴레이션 사이에 속하는 애트리뷰트 값들을 비교 연산자로 연결한 것이다.
- 동등 조인이 가장 많이 사용된다.
SELF JOIN
- 한 릴레이션에 속하는 투플을 동일한 릴레이션에 속하는 투플들과 조인하는 것
- FROM 절에서 별칭을 통하여 서로 다른 2개의 릴레이션으로 표현한다.
중첩 질의 (Nested query)
- 질의의 WHERE 또는 FROM절에 다시 ‘(SELECT … FROM … WHERE …)’ 형태로 포함된 SELECT문 (괄호로 묶어서 표시함)
- 부질의(subquery)라고 한다
- 중첩 질의를 포함하는 질의를 외부 질의라고 부른다.
- INSERT, DELETE, UPDATE문에도 사용될 수 있다.
- 중첩 질의의 결과는 세 가지 경우가 있음
• 한 개의 스칼라값(단일 값)
• 한 개의 애트리뷰트로 이루어진 릴레이션
• 여러 애트리뷰트로 이루어진 릴레이션
1개의 스칼라값이 반환되는 경우
scala
- WHERE절에서 상수 또는 애트리뷰트가 사용될 위치에 나타난다.
한 개의 애트리뷰트로 이루어진 릴레이션이 반환되는 경우
- 중첩 질의의 결과로 한 개의 애트리뷰트로 이루어진 다수의 투플들이 반환될 수 있다.
- 외부 질의의 WHERE절에서 IN, ANY(SOME), ALL, EXISTS와 같은 연산자를 사용해야 한다.
• IN: 한 애트리뷰트가 값들의 집합에 속하는가를 테스트
• ANY: 한 애트리뷰트가 값들의 집합에 속하는 하나 이상의 값들과 어떤 관계를 갖는가를 테스트
• ALL: 한 애트리뷰트가 값들의 집합에 속하는 모든 값들과 어떤 관계를 갖는가를 테스트
• EXISTS: 중첩 질의의 결과가 빈 릴레이션인지 여부를 검사함
• 중첩 질의의 결과가 빈 릴레이션이 아니면 참이 되고, 그렇지 않으면 거짓
여러 애트리뷰트들로 이루어진 릴레이션이 반환되는 경우
- 단일 애트리뷰트들로 이루어진 릴레이션이 반환되는 경우와 마찬가지로 IN, ANY, ALL, EXISTS 중에 하나를 사용하여 프레디킷을 만들어 사용할 수 있다.
- IN, ANY, ALL을 사용하는 경우에는 결과 릴레이션과 호환되는 투플 구조를 갖는 투플을 사용해서 비교해야 한다.
- 중첩 질의의 WHERE절에 있는 프레디키트에서 외부 질의에 선언된 릴레이션의 일부 애트리뷰트를 참조하는 질의
- 중첩 질의의 수행 결과가 단일 값이든, 하나 이상의 애트리뷰트로 이루어진 릴레이션이든 외부 질의로 한 번만 결과를 반환하면 상관 중첩 질의가 아니다.
- 상관 중첩 질의에서는 외부 질의를 만족하는 각 투플이 구해진 후에 중첩 질의가 수행된다.
- 상관 중첩 질의는 외부 질의를 만족하는 투플 수만큼 여러 번 수행될 수 있다.
FROM절에 사용된 중첩 질의
- FROM절에 저장된 일반 테이블과 함께 중첩 질의를 사용할 수 있다.
- 중첩 질의는 테이블 이름이 없으므로 별칭을 사용하여 이름을 부여한다.