SELECT 연산을 사용하다 보면, 테이블은 다른데 애트리뷰트 명은 동일한 경우가 있습니다.
ex) EMPLOYEE의 DNUMBER 애트리뷰트와 DEPARTMENT의 DNUMBER 애트리뷰트
이런 경우 점(.)을 이용하여 애트리뷰트를 구분합니다.
SELECT EMPLOYEE.NAME, ADDRESS
FROM EMPLOYEE, DEPARTMENT
WHERE DEPARTMENT.NAME='Research' AND DEPARTMENT.DNUMBER=EMPLOYEE.DNUMBER
같은 릴레이션을 두 번 참조하는 경우 (상사-부하 관계 등) 별명(alias)을 이용하여 두 릴레이션이 서로 다른 것처럼 정의합니다.
SELECT E.NAME, S.NAME
FROM EMPLOYEE E, EMPLOYEE S
WHERE E.SUPERSSN = S.SSN
위의 SQL문에서는 같은 EMPLOYEE 릴레이션이지만 E(부하), S(상사)를 정의하여 사용하고 있습니다.
예시에서는 EMPLOYEE E로 정의했지만 EMPLOYEE AS E 이렇게 AS 키워드를 이용해도 됩니다.
AS 키워드를 이용하여 애트리뷰트 이름을 임시적으로 변경할 수도 있습니다.
ex) EMPLOYEE AS E(N, SSN, BD, ADDR) 등…
WHERE절을 생략할 수도 있습니다. 이 경우 아무런 조건이 없다는 것을 의미합니다.
따라서, FROM에서 지정한 릴레이션의 모든 튜플들이 선택됩니다.
SELECT SSN
FROM EMPLOYEE
위 SQL문은 EMPLOYEE의 모든 SSN을 선택하는 구문입니다.
SELECT SSN, DNAME
FROM EMPLOYEE, DEPARTMENT
위 SQL문은 EMPLOYEE의 SSN과 DEPARTMENT의 DNAME의 모든 조합을 선택하는 구문입니다. (카티션 곱 연산 수행)
‘*’ 을 이용하여 모든 애트리뷰트를 선택할 수 있습니다.
SELECT *
FROM EMPLOYEE
WHERE DNO=5
DNO=5인 튜플의 모든 애트리뷰트를 선택합니다.
SELECT *
FROM EMPLOYEE, DEPARTMENT
EMPLOYEE와 DEPARTMENT의 카티션 곱 연산을 수행합니다.
SELECT 연산을 수행하면 중복되는 튜플이 출력될 수 있습니다.
연산 결과에서 중복되는 튜플을 제거하려면 DISTINCT 키워드를 사용합니다.
SELECT DISTINCT SALARY
FROM EMPLOYEE
UNION, EXCEPT, INTERSECT 키워드를 통해 집합 연산을 수행합니다.
차례대로 합집합, 차집합, 교집합 연산입니다.
(SELECT PNUMBER
FROM PROJECT, DEPARTMENT, EMPLOYEE
WHERE DNUM=DNUMBER AND MGRSSN=SSN AND NAME='Smith')
UNION
(SELECT PNUMBER
FROM PROJECT, WORKS_ON, EMPLOYEE
WHERE PNUMBER=PNO AND ESSN=SSN AND NAME='Smith')
해당 SQL문은 일반직원 / 부서장 상관없이 이름이 ‘Smith’인 직원이 속해 있는 프로젝트 번호를 출력합니다.
DB에 있는 특정 조건들로 값을 먼저 빼낸 다음, 이것을 이용해 비교하는 경우가 있습니다.
이 때는 중첩 질의(nested query)를 사용하여 표현합니다.
SELECT DISTINCT PNUMBER
FROM PROJECT
WHERE PNUMBER IN (SELECT PNUMBER
FROM PROJECT, DEPARTMENT, EMPLOYEE
WHERE DNUM=DNUMBER AND MGRSSN=SSN AND NAME='Smith'
OR
PNUMBER IN (SELECT PNO
FROM WORKS_ON, EMPLOYEE
WHERE ESSN=SSN AND NAME='Smith')
IN() 연산자 안에 SELECT 연산이 또 들어가 있는 것을 확인할 수 있습니다.
IN 말고도 ANY(SOME), ALL 연산자가 존재합니다.
- IN : 외부 연산 결과가 IN() 연산 결과의 원소가 되는지 비교하는 연산입니다.
- ANY(SOME) : IN과 같은 역할을 수행합니다. 다만 IN과의 차이점은 앞에 비교 연산자가 오는 것입니다.
- =ANY (=SOME)
- =, >, >=, <, <=, <> 이용 가능
- ALL : 외부 연산 결과가 ALL() 내의 결과와 같은지 비교하는 연산입니다. 이것도 마찬가지로 앞에 비교 연산자를 적어야 합니다.
중첩 질의의 결과가 비어있는지 검사하기 위해 EXISTS 키워드를 사용합니다.
SELECT E.NAME
FROM EMPLOYEE E
WHERE EXISTS (SELECT *
FROM DEPENDENT
WHERE E.SSN=ESSN AND E.NAME=DEPENDENT_NAME)
EXISTS() 연산 결과에 튜플이 존재한다면 True, 존재하지 않는다면 False를 반환합니다.
SELECT NAME
FROM EMPLOYEE
WHERE NOT EXISTS(SELECT*
FROM DEPENDENT
WHERE SSN=ESSN)
NOT EXISTS()은 반대가 됩니다.
추가적으로, 중복된 튜플이 있는지 검사하기 위해 UNIQUE()를 사용하기도 합니다.
이때까지 본 키워드 안의 괄호에는 SQL문 뿐만 아니라 명시적 집합도 사용할 수 있습니다.
SELECT DISTINCT ESSN
FROM WORKS_ON
WHERE PNO IN(1,2,3)
위 SQL문은 1, 2, 3번 프로젝트에서 일하는 모든 직원들의 사번을 출력합니다.
애트리뷰트 값이 NULL인지 비교하려면, IS나 IS NOT 키워드를 사용해야 합니다. (NULL 정의로 인해 ‘=’ 연산을 사용할 수 없습니다.)
SELECT NAME
FROM EMPLOYEE
WHERE SUPERSSN IS NULL
위 SQL문은 상사가 없는 직원의 이름을 출력합니다.
'Database' 카테고리의 다른 글
[Database] SQL(3) | DML – INSERT, DELETE, UPDATE (0) | 2025.04.30 |
---|---|
[Database] SQL(2) | DML – SELECT(3) (0) | 2025.04.29 |
[Database] SQL(2) | DML – SELECT(1) (0) | 2025.04.29 |
[Database] SQL(1) | DDL (0) | 2025.04.29 |
[Database] 관계 데이터 모델과 관계 데이터베이스 제약조건 (0) | 2025.04.29 |
댓글