[데이터베이스 원리] 관계형 데이터베이스 표준 언어 SQL 및 관계형 데이터베이스 관리 시스템 SQL Server (5)

하위 쿼리.

우리가 때 WHERE포함 SELECT...FROM...WHERE...쿼리 블록 조항의 양식을 ,이 쿼리 블록은 하위 쿼리 또는 중첩 된 쿼리, 그리고 그것은 부모 쿼리라고 들어있는 외부 쿼리 문이라고합니다. 중첩 쿼리는 일련의 간단한 쿼리를 복잡한 쿼리로 구성하여 쿼리 기능을 향상시킬 수 있습니다. 하위 쿼리의 중첩 수준은 최대 255 수준에 도달 할 수 있습니다.
중첩 질의는 실행 중에 내부에서 외부로 처리되며, 각 하위 질의는 다음 수준의 상위 질의가 처리되기 전에 완료되며, 상위 질의는 하위 질의의 결과를 사용해야합니다.

일반 하위 쿼리.

일반 하위 쿼리의 실행 순서는 먼저 하위 쿼리를 실행 한 다음 하위 쿼리의 결과를 상위 쿼리의 쿼리 조건 값으로 사용하는 것입니다. 일반 하위 쿼리는 한 번만 실행되며 상위 쿼리에 포함 된 모든 레코드를 쿼리 결과와 비교하여 쿼리 결과 집합을 결정합니다.

  • [하나의 값을 리턴하는 일반 서브 쿼리] 서브 쿼리의 리턴 값이 1 인 경우 비교 연산자를 사용하여 상위 쿼리와 서브 쿼리를 연결할 수 있습니다.

[예제] Liu Wei 선생님과 같은 직함을 가진 선생님의 번호와 이름을 쿼리합니다.

SELECT TNo,TN
FROM T
WHERE Prof = (SELECT Prof FROM T WHERE TN='刘伟')

이 쿼리는 쿼리를 실행할 두 개의 쿼리 블록으로 나누는 것과 동일하며 첫 번째로 실행되는 것은 하위 쿼리입니다.

SELECT Prof 
FROM T 
WHERE TN = '刘伟'

하위 쿼리는 값, 즉 Liu Wei 교사의 제목 인 "강사"를 반환 한 다음이를 부모 쿼리의 조건으로 사용한 다음 부모 쿼리를 실행하여 교사의 번호와 교사 이름을 찾습니다.

  • [값 집합을 반환하는 일반 하위 쿼리] 하위 쿼리의 반환 값이 둘 이상이지만 집합이면 쿼리 조건을 표현하기 위해 비교 연산자를 직접 사용할 수 없지만 키워드 ANYALL.

[예] C5 과정을 가르치는 선생님의 이름을 쿼리합니다.

SELECT TN 
FROM T
WHERE TNo = ANY (SELECT TNo FROM TC WHERE CNo='C5')

먼저 하위 쿼리를 실행하여 C5 과정을 가르치는 교사의 교사 ID 집합을 찾은 다음 부모 쿼리를 실행합니다. TNo가 하위 쿼리의 결과 집합에있는 값과 같으면 교사가 과정을 가르치고 있음을 의미하고 해당 TN이 배치됩니다. 최종 쿼리 결과를 입력합니다. 물론이 쿼리는 다음을 연결하여 실현할 수도 있습니다.

SELECT TN
FROM T,TC
WHERE T.TNo=TC.TNo AND CNo='C5'

[예] 컴퓨터과의 교사보다 연봉이 높은 다른 부서의 교사의 이름과 연봉을 조회합니다.

SELECT TN,Sal
FROM T
WHERE Sal > ANY(
				   SELECT Sal FROM T WHERE Dept='计算机'
				 ) 
	  AND Dept!='计算机'

논리적 관점에서 컴퓨터 부서 교사의 급여보다 높으면 컴퓨터 부서 교사의 최소 급여보다 높기 만하면 다음 코드를 사용할 수 있습니다.

SELECT TN,Sal
FROM T
WHERE SaL > (SELECT MIN(Sal) FROM T WHERE Dept='计算机')
	  AND Dept!='计算机'

먼저 서브 쿼리와 MIN()함수를 이용하여 컴퓨터과 의 최소 ​​급여 x를 찾은 다음 부모 쿼리를 실행하여 컴퓨터 부서에 있지 않은 교사 중 급여가 x보다 높은 교사의 이름과 급여를 찾습니다.

[예시] C5 과정을 가르치는 선생님의 이름을 질의하고 키워드를 사용합니다 IN.

SELECT TN
FROM T
WHERE TNo IN(SELECT TNo FROM TC WHERE CNo='C5')

[예시] 컴퓨터과의 모든 교사보다 연봉이 높은 다른 부서의 교사의 이름과 급여를 조회합니다.

SELECT TN,Sal
FROM T
WHERE Sal >ALL(SELECT SAL FROM T WHERE Dept = '计算机')
	  AND Dept!='计算机'

MIN()라이브러리 기능 사용 와 같이 라이브러리 기능 사용하여 MAX()모든 컴퓨터 교사보다 높은 급여를 받을 수도 있습니다 .

SELECT TN,Sal
FROM T
WHERE Sal >(SELECT MAX(Sal) FROM T WHERE Dept='计算机')
	  AND Dept!='计算机'

관련 하위 쿼리.

이전의 모든 하위 쿼리는 일반 하위 쿼리이며 상위 쿼리가 하위 쿼리의 결과를 쿼리 조건으로 사용한다는 점을 제외하고는 이러한 하위 쿼리와 상위 쿼리간에 상호 작용이 없습니다. 그러나 부질의의 질의 조건은 부모 질의 테이블의 속성 값을 참조해야하는 경우가 있는데, 이러한 질의를 상관 부 질의라고합니다.
일반 하위 쿼리와 비교할 때 상관 하위 쿼리의 실행 순서는 훨씬 더 복잡합니다. 먼저 상위 쿼리 테이블에서 레코드의 첫 번째 행을 선택합니다. 내부 하위 쿼리는이 행의 관련 속성 값을 사용하여 쿼리 한 다음 상위 쿼리는 하위 쿼리에서 반환 된 결과를 기반으로이 행이 쿼리 조건을 충족하는지 여부를 결정합니다. 조건이 충족되면이 행을 상위 쿼리의 쿼리 결과 집합에 넣습니다. 상위 쿼리 테이블의 각 데이터 행이 처리 될 때까지이 프로세스를 반복하십시오. 여기에서 관련 하위 쿼리의 실행 횟수가 부모 쿼리 테이블의 행 수에 의해 결정된다는 것을 알 수 있습니다.

[예] C5 과정을 가르치지 않는 교사의 이름을 쿼리합니다.

SELECT DISTINCT TN
FROM T
WHERE 'C5'!=ALL(SELECT CNo FROM TC WHERE TNo=T.TNo)

!=ALL의 의미는 하위 쿼리 결과의 값과 같지 않으며 NOT IN대신 사용할 수도 있습니다 . 27 페이지의 관계 테이블을 기반으로이 상관 서브 쿼리의 프로세스를 설명합니다. 먼저 [T1, Li Li, Male, 47, Professor, 1500, 3000, Computer] 레코드 인 상위 관계 테이블 T에서 행을 선택한 다음 하위 쿼리를 입력하면 CNo 집합이 {C1, C4}입니다. C5는 포함되지 않으므로 레코드가 쿼리 조건을 충족하므로 TN 열에 투영합니다. 즉, 레코드 [Li Li]가 최종 결과 집합에 입력됩니다. 후속 프로세스는 동일합니다. 키워드를
사용 EXISTS하여 EXISTS존재를 나타내는 수량자인 관련 하위 쿼리를 수행 할 수도 있습니다 .이 키워드가있는 하위 쿼리는 결과를 반환하지 않지만 True 또는 False의 부울 값을 반환합니다.

[예시] C5 과정을 가르치는 선생님의 이름을 질의하고 EXISTS키워드를 사용 합니다.

SELECT TN
FROM T
WHERE EXISTS(SELECT * FROM TC WHERE TNo=T.TNo AND CNo='C5')

하위 쿼리의 TC 테이블에있는 행이 조건을 충족하면 상위 쿼리는 T 테이블의 튜플을 TN 열에 투영하고 결과 집합에 넣습니다.

[예] C5 과정을 가르치지 않은 교사의 이름을 쿼리하고 EXISTS키워드를 사용 합니다.

SELECT TN
FROM T
WHERE (NOT EXISTS(SELECT * FROM TC WHERE TNo=T.TNo AND CNo='C5'))

[예] 모든 과목을 수강 한 학생의 이름을 쿼리합니다.

SELECT SN
FROM S
WHERE NOT EXISTS
(
	SELECT *
	FROM C
	WHERE NOT EXISTS
	(
		SELECT *
		FROM SC
		WHERE SNo=S.SNo AND CNo=C.CNo
	)
)	 

모든 과정을 수강 한 학생은 다음과 같이 이해할 수 있습니다.이 학생 x의 경우 해당 과정 y가 없으며 과정 선택 테이블 SC에 <x, y> 조합에 대한 기록이 없습니다.
27 페이지 관계 표에 데이터가 추가되어 실제로 모든 과목을 수강 한 학생이 있음 표는 아래와 같습니다 .S1 학생이 7 개 과목을 모두 수강했습니다 :
여기에 사진 설명 삽입
실행 결과는 다음과 같습니다
여기에 사진 설명 삽입

추천

출처blog.csdn.net/weixin_44246009/article/details/108049756