SQL에서 상관 관계 서브 쿼리를 사용하는 방법
상관 관계 서브 쿼리는 외부 쿼리에 의존하는 SQL 서브 쿼리이며 행당 한 번 실행하고 외부 쿼리 열을 참조합니다. 2. 그것은 부서의 평균 급여를 초과하는 직원을 찾는 것과 같은 행 별 비교에 사용됩니다. 3. 구문에는 두 쿼리에서 부서 _id를 상관시키는 것처럼 외부 쿼리의 열을 참조하는 내부 쿼리가 포함됩니다. 4. 상관 된 하위 쿼리는 직원이없는 부서 식별과 같은 관련 기록을 확인하기 위해 존재하거나 존재하지 않는 경우에도 효과적입니다. 5. 반복적 인 실행으로 인해 대규모 데이터 세트에서 느려질 수 있으므로 Department_ID와 같은 상관 된 열을 색인화하는 것이 중요합니다. 6. 성능을 결합 또는 창 함수로 교체하여 성능을 향상시킬 수 있으며, 이는 결과를보다 효율적으로 계산합니다. 7. 최적의 쿼리 실행을 보장하기 위해 항상 인덱스가 있거나없는 대안 및 테스트 성능을 평가하십시오.
SQL의 상관 관계 서브 쿼리는 해당 값의 외부 쿼리에 의존하는 하위 쿼리입니다. 외부 쿼리로 처리 된 각 행에 대해 한 번 실행되므로 행으로 비교 또는 조회에 유용합니다. 독립적으로 실행되는 일반 하위 Queries와 달리 상관 된 하위 쿼리는 반복적으로 평가되며 (행당 최대) 외부 쿼리에서 열을 참조 할 수 있습니다.
상관 관계 하위 쿼리를 효과적으로 사용하는 방법은 다음과 같습니다.
상관 관계 서브 쿼리를 사용하는시기
상관 된 하위 쿼리는 기본 쿼리의 값을 관련 데이터 세트의 집계 또는 특정 조건과 비교해야 할 때 이상적입니다. 일반적인 사용 사례는 다음과 같습니다.
- 값이 그룹의 평균 위 또는 아래에있는 레코드를 찾습니다.
- 관련 레코드가 일치하지 않는 행을 식별합니다 (예 : 프로젝트가없는 직원).
- 각 행을 다른 테이블에서 동적으로 계산 된 값과 비교합니다.
기본 구문 및 예제
주요 기능은 내부 쿼리가 외부 쿼리에서 열을 참조한다는 것입니다.
outer_column을 선택하십시오 표 1 T1에서 여기서 조건 = ( Agregate_function (t2.column)을 선택하십시오. 표 2 T2에서 여기서 t2.related_id = t1.id );
예 : 부서의 평균 급여보다 더 많은 직원을 찾으십시오.
두 테이블을 가정하십시오.
-
employees
: ID, 이름, 급여, Department_ID -
departments
: ID, 이름
e.Name, e.salary, e.department_id를 선택하십시오 직원으로부터 e 여기서 e.salary> ( 선택 AVG (E2.Salary) 직원으로부터 E2 여기서 e2.department_id = e.department_id );
이 쿼리에서 :
- 외부 쿼리는 각 직원을 선택합니다.
- 하위 퀘스트는 해당 직원 부서의 평균 급여를 계산합니다.
- 하위 쿼리는 외부 쿼리에서
e.department_id
사용하여 직원 당 한 번 실행됩니다.
상관 된 하위 쿼리를 사용하여 존재합니다
가장 효율적인 용도 중 하나는 관련 레코드를 테스트하는 EXISTS
입니다.
예 : 직원이없는 부서를 찾으십시오
D.Name을 선택하십시오 부서에서 d 존재하지 않는 곳 ( 선택 1 직원으로부터 e 여기서 e.department_id = d.id );
이것은 각 부서를 점검하고 일치하는 직원이없는 경우에만 반환합니다. 하위 퀘스트는 d.id
통해 상관됩니다.
왜 사용이 EXISTS
?
- 한 번의 경기가 발견 되 자마자 중지됩니다 (효율적).
- 부울 조건에 이상적입니다 (존재/존재하지 않음).
성능 고려 사항
강력하지만 상관 관계가있는 하위 쿼리는 행당 한 번 실행할 수 있으므로 느리게 할 수 있습니다. 최적화 :
- 상관 관계 (예 :
department_id
)에 사용 된 열에서 적절한 인덱싱을 확인하십시오. - 가능한 경우
JOIN
S 또는 창 함수로 다시 쓰기를 고려하십시오.
창 함수를 사용하는 대안 (종종 더 빠른) :
이름, 급여, Department_id를 선택하십시오 에서 ( 선택 이름, 급여, 부서 _id, avg_dept_salary로 avg (Salary) Over (Decration_ID에 의한 파티션) 직원들로부터 ) e 급여> AVG_DEPT_SALARY;
이것은 반복되는 하위 쿼리를 피하고 일반적으로 대형 데이터 세트에서 더 잘 수행합니다.
기억해야 할 핵심 요점
- 상관 관계 서브 쿼리는 외부 쿼리에서 열을 참조합니다 .
- 외부 쿼리의 각 행에 대해 한 번 실행됩니다.
- 관련 데이터의 존재 / 부재를 확인하기 위해 사용
EXISTS
하거나NOT EXISTS
. - 시계 성능 - 큰 테이블에서는 상관 관계가있는 서브 쿼리가 느리게 될 수 있습니다.
- 항상 인덱스 유무에 관계없이 테스트하고
JOIN
S 또는 창 함수와 같은 대안을 고려하십시오.
기본적으로, 상관 된 하위 쿼리는 테이블을 가로 질러 저수준 비교를위한 유연한 도구이지만 신중하게 사용해야합니다.
위 내용은 SQL에서 상관 관계 서브 쿼리를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Stock Market GPT
더 현명한 결정을 위한 AI 기반 투자 연구

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

IN 연산자를 사용하여 열을 선택*Fromployeeswheredepartment_idin (1,2,3)과 같은 여러 값과 효율적으로 비교하십시오. 여러 값이 제외되면 NOTIN을 사용하지만 결과에 영향을 미치는 NULL에주의하십시오.

SoundEx 함수는 텍스트를 발음을 나타내는 4 자리 코드로 변환하고 첫 번째 문자에 3 자리를 추가하고 모음과 특정 문자를 무시하며, 유사한 발음을 가진 자음을 동일한 숫자로 맵핑하여 발음 기반 검색을 실현합니다. 예를 들어, Smith와 Smythe는 모두 S530을 생성하고 유사한 발음을 가진 이름은 Wheresoundex (last_name) = soundex ( 'Smith')를 통해 찾을 수 있습니다. 차이 함수와 결합하여 유사성 점수 0에서 4의 유사성 점수를 반환하고, 발음 닫기 결과를 필터링 할 수 있으며, 이는 철자 차이를 다루는 데 적합하지만 영어 이외의 이름에 영향을 미치며 성능 최적화에주의를 기울여야합니다.

UseCommentOncolumnoraltertablewithCommentTodocumentTables 및 ColumnsInsql; syntaxvariesBydbms - postgresqlandoracleUsecommenton, mysqlusescommentincreate/alterstatements 및 andcommentscanbeviewedviasystemtablikedinformation_schema, rantsuppport.

하위 쿼리는 다른 쿼리에 중첩 된 쿼리입니다. 그들은 간단한 일회성 계산에 적합하며, 선택,에서 또는 시점에 위치 할 수 있습니다. 2. CTE는 복잡한 쿼리의 가독성을 향상시키고 재귀 및 다중 참조를 지원하기 위해 조항으로 정의됩니다. 3. 하위 쿼리는 단일 사용에 적합하며 CTE는 명확한 구조, 재사용 또는 재귀가 필요한 시나리오에 더 적합합니다.

TogetThelastInsertedid, usedatabase-specificftions : mysqluseslast_insert_id (), postgresqlusesreturningclause, sqlserverusesscope_identity () oroutput, andsqliteuseslast_insert_rowid (); 항상 callcrightrightterafttoccuracy.

tofindorphaneDrecords, usealeftjoinornoTexoTexistStoIndItifyHildRecordsWithOutmatchingParentRecords.forexample, selecto, formorderSoleftJoincustomerscono.customer_id = c.customer_idwherec.customer_idullesturnsorderdonon-allinternon-allernon-allernon-allernon-allernon-allistomer

insqlserver, insqlserver, usealterdatabasewithmodifynifyjectingsingsetingsingsingsingsingsingsingsingsingsingsingsingsingsingsingsingsingle-usermode; inmysql, nodirectrenameisavailable, socreateanewdatabase, copydataviamysqldumporrenametable, thendroptheoldone; Inpostgresgresgresgresgresgresgresgresgresgresgresggresgresgresgresgresgres

themin () functionlerievesthesmallestvaluefromaspecifiedcolumn.useitinaSelectStatementwhowerGroupByClaUsestOfilterorGroupData, SuchASFindingThelowestSalary, 초기, OrfirstalPhabeticalName.
