익명 사용자
로그인하지 않음
계정 만들기
로그인
youngwiki
검색
Nested Subquery 문서 원본 보기
youngwiki
이름공간
문서
토론
더 보기
더 보기
문서 행위
읽기
원본 보기
역사
←
Nested Subquery
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다:
사용자
.
문서의 원본을 보거나 복사할 수 있습니다.
상위 문서: [[SQL]] ==개요== '''Subquery'''란, 다른 쿼리 안에 포함된 select-from-where 쿼리를 의미한다. 예를 들면 아래와 같다. <syntaxhighlight lang="sql"> select name from instructor where dept_name = (select dept_name from department where building = 'Watson'); </syntaxhighlight> 일반적인 SQL의 쿼리는 다음과 같은 형태를 가진다. <syntaxhighlight lang="sql"> select A1, A2, ..., An from r1, r2, ..., rm where P </syntaxhighlight> 이때, subquery는 select, from, where 절에서 사용될 수 있다. ===From 절에서의 Subquery=== ri 자리에 하나의 서브쿼리를 넣을 수 있으며, 마치 테이블처럼 다룰 수 있다. 이때 subquery에는 as 키워드를 사용하여 별칭 주는 것이 일반적이다. 이는 아래와 같이 사용된다. <syntaxhighlight lang="sql"> select * from (select * from instructor where salary > 50000) as high_paid; </syntaxhighlight> ===Where 절에서의 Subquery=== P 자리에 조건식을 쓸 수 있는데, 그 조건식 안에 서브쿼리를 넣을 수 있다. 이때 조건식은 다음과 같이 작성된다. <syntaxhighlight lang="sql"> B <operation> (subquery) </syntaxhighlight> 이때 B는 속성에 해당하며, <operation>은 비교 연산 (=, >, <, in, exists 등)에 해당한다. 이를 바탕으로 where 절에서 subquery는 아래와 같이 사용된다. <syntaxhighlight lang="sql"> select name from instructor where salary > (select avg(salary) from instructor); </syntaxhighlight> ===Select 절에서의 Subquery=== Ai 자리에 단일 값을 반환하는 서브쿼리를 넣을 수 있다. 이는 아래와 같이 사용된다. <syntaxhighlight lang="sql"> select name, (select count(*) from teaches where teaches.ID = instructor.ID) as um_courses from instructor; </syntaxhighlight> <syntaxhighlight lang="sql"> </syntaxhighlight> ==Set Membership== SQL은 튜플(값)이 어떤 relation(또는 집합)에 속하는지 여부를 검사하는 기능인 집합 멤버십('''set membership''')을 제공한다. '''in''' 연결자는 집합 멤버십을 테스트하는데 사용되며, 이 집합은 select 절이 생성한 값들의 모음이다. '''not in''' 연결자는 집합에 속하지 않음을 테스트하는 데 사용된다. 예를 들어, “2017년 가을 학기와 2018년 봄 학기 두 학기 모두에 개설된 과목들을 찾아라.”과 같은 쿼리를 두 집합의 교집합을 이용해 작성하였다. 하지만 이와는 in 연결자를 사용하는 방식으로도 같은 질의를 표현할 수 있다. 즉, 2017년 가을 학기에 개설된 과목 중, 2018년 봄 학기에 개설된 과목들의 집합에 속하는 과목들만 찾는 방식이다. 이는 다음과 같이 나타내어진다. <syntaxhighlight lang="sql"> select distinct course_id from section where semester = 'Fall' and year = 2017 and course_id in (select course_id from section where semester = 'Spring' and year = 2018); </syntaxhighlight> 이때 교집합 연산은 기본적으로 중복을 제거하므로, 교집합을 사용한 것과 동일한 결과를 얻기 위해서는 이 질의에서도 distinct 키워드를 사용해야 한다.<br> in 연산자와 비슷하게, not in 연산자도 유사한 방식으로 사용할 수 있다. 예를 들어 "2017년 가을 학기에는 개설되었지만, 2018년 봄 학기에는 개설되지 않은 과목들을 찾기"와 같은 질의를 생각해보자. 우리는 이 질의를 앞에서 except 연산을 사용하여 표현했었지만, 이 질의를 not in을 사용하여 표현하면 다음과 같다: <syntaxhighlight lang="sql"> select distinct course_id from section where semester = 'Fall' and year = 2017 and course_id not in (select course_id from section where semester = 'Spring' and year = 2018); </syntaxhighlight> 또한, in 및 not in 연산자는 열거형 집합(enumerated sets) 에도 사용할 수 있다. 예를 들어, 이름이 “Mozart”도 아니고 “Einstein”도 아닌 교수들을 찾는 쿼리는 다음과 같다: <syntaxhighlight lang="sql"> select distinct name from instructor where name not in ('Mozart', 'Einstein'); </syntaxhighlight> 앞선 예제들에서는 속성이 하나인 relation(one-attribute relation)에 대해서만 멤버십을 테스트했다. 하지만, SQL에서는 임의의 relation에 대해 멤버십을 테스트하는 것도 가능하다. 예를 들어, “ID가 110011인 교수가 가르친 과목 섹션을 수강한 학생들의 (중복 없는) 총 인원 수를 구하라.”와 같은 쿼리는 아래와 같이 나타내어진다. <syntaxhighlight lang="sql"> select count(distinct ID) from takes where (course_id, sec_id, semester, year) in (select course_id, sec_id, semester, year from teaches where teaches.ID = '10101'); </syntaxhighlight> ==Set Comparison== ===Some clause=== 중첩 서브쿼리가 집합을 비교하는 기능을 갖고 있음을 보여주는 예로, “급여가 생물학과(Biology department)의 어떤 교수보다도 더 높은 교수들의 이름을 찾아라.”라는 쿼리를 살펴보자. 이를 [[Additional Operation#Rename 연산|Rename 연산]]을 이용하면 아래와 같이 해결할 수 있다. <syntaxhighlight lang="sql"> select distinct T.name from instructor as T, instructor as S where T.salary > S.salary and S.dept_name = 'Biology'; </syntaxhighlight> 하지만 하지만 SQL은 위의 질의를 '''some''' 구문을 통해서 나타낼 수 있도록 한다. some은 "at least"와 같은 의미로 사용되며, 수식으로는 아래와 같이 나타낼 수 있다. F <compOp> some Relation <math>\Leftrightarrow</math> <math>\exists</math>t <math>\in</math> Relation s.t(F <compOp> t) where <compOp> can be <math><, \le, >, \ge, =, \ne</math> “greater than at least one(적어도 하나보다 크다)”라는 표현은 SQL에서 '''> some''' 구문을 통해서 나타낼 수 있다. 이때 <code>= some</code>은 <code>in</code>과 같은 의미이며, <code><> some</code> 은 <code>not in</code>과는 같지 않다. <code><></code>는 SQL에서 not equal을 의미하는 비교 연산자이다. 따라서 <code><> some</code>는 "x가 subquery 결과 중 어떤 값과라도 다르면 true"를 의미한다. some 구문을 통해 처음 제시된 코드를 아래와 같이 다시 작성할 수 있다. <syntaxhighlight lang="sql"> select name from instructor --아래의 subquery는 생물학과에 소속된 모든 교수들의 급여 값들의 집합을 생성한다. where salary > some (select salary from instructor where dept_name = 'Biology'); </syntaxhighlight> ===All clause=== '''All''' 구문은 '''some''' 구문의 반대의 의미를 가지고 있으며, 수식으로는 아래와 같이 나타낼 수 있다. F <compOp> all Relation <math>\Leftrightarrow</math> <math>\forall</math>t <math>\in</math> Relation s.t(F <compOp> t) where <compOp> can be <math><, \le, >, \ge, =, \ne</math> 이때 <code>= all</code>은 <code>in</code>과 같은 의미가 아니며, <code><> all</code> 은 <code>not in</code>과 같은 의미이다. 예를 들어서, “평균 급여가 가장 높은 학과들의 이름을 찾아라.”라는 쿼리는 아래와 같은 코드를 통해 나타낼 수 있다. <syntaxhighlight lang="sql"> select dept_name from instructor group by dept_name having avg(salary) >= all (select avg(salary) from instructor group by dept_name); </syntaxhighlight> <syntaxhighlight lang="sql"> </syntaxhighlight> ==각주== [[분류:데이터베이스 시스템]]
Nested Subquery
문서로 돌아갑니다.
둘러보기
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
위키 도구
위키 도구
특수 문서 목록
문서 도구
문서 도구
사용자 문서 도구
더 보기
여기를 가리키는 문서
가리키는 글의 최근 바뀜
문서 정보
문서 기록