본문 바로가기
Quality control (Univ. Study)/Database Design

SQL 실습 (2)

by 생각하는 이상훈 2023. 10. 20.
728x90

널 값을 포함한 비교

널 값의 세 가지 의미

• 첫째: Unknown value, 알려지지 않은 값 (존재하지만 알지 못하는)

• 둘째: Unavailable or withheld value, 이용할 수 없거나 보류해둔 값 (존재하지만 의도적으로 보류한)

• 셋째: Not applicable attribute, 적용할 수 없는 애트리뷰트 (이 투플에는 정의되지 않는)

 

ㅇ애트리뷰트의 값이 NULL인지 검사하는 연산자

• IS NULL / IS NOT NULL

 

상사가 없는 모든 종업원들의 이름을 검색하시오.

SELECT FNAME, LNAME
FROM EMPLOYEE
WHERE SUPER_SSN IS NULL;

SUPER_SSN = NULL과 같이 비교 연산자를 이용하여 NULL과 비교하는 것은 불가능하다.


Nested Query

중첩 질의는 다른 질의의 WHERE 절 내에 완전한 SELECT 질의가 나타나는 형태이다. 외부 질의와 내부 질의로 구분된다.

비교 연산자 IN은 외부 질의의 한 투플에 대하여, 이 투플이 임의의 투플 집합의 원소가 되는지 비교하는 연산이다. 집합에 있어서 원소 여부를 확인하는 ∈와 동일한 기능을 한다.

 

Q. 성이 ‘Smith’인 종업원(일반 직원 혹은 프로젝트를 담당하는 부서의 관리자)이 참여하는 프로젝트의 프로젝트 번호 목록을 작성하시오.

SELECT DISTINCT PNUMBER
FROM PROJECT
WHERE PNUMBER IN ( SELECT PNUMBER
				   FROM PROJECT, DEPARTMENT, EMPLOYEE
				   WHERE DNUM=DNUMBER AND MGR_SSN=SSN
					 AND LNAME=‘Smith’)
	OR
	PNUMBER IN ( SELECT PNO
				 FROM WORKS_ON, EMPLOYEE
				 WHERE ESSN=SSN AND LNAME=‘Smith’) ;

 

Q. SSN이 333445555인 사원이 일하는 프로젝트와 일한 시간의 조합이 동일한 사원의 SSN을 검색하라.

SELECT DISTINCT ESSN
FROM WORKS_ON
WHERE (PNO, HOURS) IN (SELECT PNO, HOURS
			FROM WORKS_ON
			WHERE ESSN=‘333445555’);

 

ㅇ = ALL 연산자 (집합에서 에 해당)

• 하나의 값 v가 집합 V내의 모든 값들과 같으면 참이 된다.

• ALL 앞에 = 대신 >, >=, <, <=를 사용할 수도 있다.

 

ㅇ= ANY(= SOME) 연산자 (집합에서 에 해당)

• 하나의 값 v가 집합 V내의 어떤 하나의 값과 같으면 참이 된다.

• ANY(SOME) 앞에 = 대신 >, >=, <, <=를 사용할 수도 있다.

 

Q. 5번 부서에 근무하는 모든 사원보다 급여가 많은 사원을 검색하라.

SELECT LNAME, FNAME
FROM EMPLOYEE
WHERE SALARY > ALL ( SELECT SALARY
		    FROM EMPLOYEE
		    WHERE DNO=5) ;

 

Q. 자신의 부양가족과 이름, 성별이 같은 종업원들의 이름을 검색하시오.

SELECT E.FNAME, E.LNAME
FROM EMPLOYEE AS E
WHERE E.SSN IN ( SELECT ESSN
			FROM DEPENDENT AS D
			WHERE E.FNAME=D.DEPENDENT_NAME AND E.SEX=D.SEX);

위와 같은 상관 중첩질의는 비중첩 질의로 변환할 수 있다. 중첩된 SELECT … FROM … WHERE… 블록과 “=“ 및 IN 비교 연산자를 이용해서 작성한 질의는 항상 단일 블록 질의로 변환할 수 있다.

SELECT E.FNAME, E.LNAME
FROM EMPLOYEE AS E, DEPENDENT AS D
WHERE E.SSN=D.ESSN AND E.FNAME=D.DEPENDENT_NAME AND E.SEX=D.SEX;

Exist

상관된 중첩질의에서 내부 질의의 결과가 공집합인가를 검사한다. EXISTS(Q): 질의 Q의 결과에 최소한 한 개의 투플이 있다면 참을 반환한다.

 

위에서 본 문제인 "자신의 부양가족과 이름, 성별이 같은 종업원들의 이름을 검색하시오."를 exist를 이용하면 아래와 같이 고칠 수 있다.

SELECT E.FNAME, E.LNAME
FROM EMPLOYEE AS E
WHERE EXISTS (SELECT *
		FROM DEPENDENT AS D
		WHERE E.SSN=D.ESSN AND E.SEX=D.SEX
		AND E.FNAME=D.DEPENDENT_NAME);

NOT EXIST 함수는 상관된 중첩질의에서 내부 질의의 결과가 공집합인가를 검사한다. NOT EXISTS(Q): 질의 Q의 결과에 투플이 없다면 참을 반환한다.

 

Q. 부양가족이 없는 종업원들의 이름을 검색하시오.

SELECT FNAME, LNAME
FROM EMPLOYEE
WHERE NOT EXISTS ( SELECT *
			FROM DEPENDENT
			WHERE SSN=ESSN) ;

 

Q. 부양가족이 적어도 한 명 이상 있는 관리자의 이름을 검색하라.

SELECT FNAME, LNAME
FROM EMPLOYEE
WHERE EXISTS ( SELECT *
		 FROM DEPENDENT
		 WHERE SSN=ESSN)
	  AND
	  EXISTS ( SELECT *
		 FROM DEPARTMENT
		 WHERE SSN=MGR_SSN) ;

 

Q. 5번 부서가 담당하는 “모든 프로젝트”에 근무하는 사원들의 이름을 검색하라.

각 사원에 대하여 그 사원이 근무하지 않는 5번 부서의 관리 프로젝트가 존재하지 않는 경우에 그 사원을 검색하라.

SELECT Fname, Lname
FROM Employee
WHERE NOT EXISTS ( (SELECT Pnumber
			FROM PROJECT
			WHERE Dno=5)
			EXCEPT (SELECT Pno
				FROM WORKS_ON
				WHERE Ssn= ESsn)

 

728x90

'Quality control (Univ. Study) > Database Design' 카테고리의 다른 글

Relation schema design protocol and Functional Dependencies  (1) 2023.10.31
Login page  (0) 2023.10.31
SQL 실습(1)  (1) 2023.10.20
SQL기초  (1) 2023.10.20
Relational Data Model  (0) 2023.10.20