본문 바로가기
  • BLG-ZYNGIROK-모토-꿈꾸며-배우고-나누며-이루다
ICT/SQL

SQL 문법 | 데이터 조회 및 필터 | SUBQUERY

by dazwischen 2021. 8. 29. 15:48
반응형

SQL 문법 데이터 조회 및 필터 서브쿼리 SUBQUERY

01. 서브(SUB)는 메인(MAIN) 안에 있는 것 : SUBQUERY IN MAINQUERY

하나의 쿼리문 안에 또 다른 쿼리문이 삽입 되었을 때 그 쿼리문을 서브쿼리라고 한다. 

SELECT 	*
FROM	(	SELECT	COLUMN01, COLUMN02
			FROM	TABLE
    	)
 ;

FROM 절 안에 괄호로 싸여 있는 절이 SUBQUERY이다.

형태

-전체 서브쿼리는 괄호로 감싼다.

-서브쿼리가 메인쿼리보다 먼저 실행된다.

-서브쿼리는 자체로 하나의 메인쿼리로서 작동 가능하다.

-서브쿼리 내에서는 ORDER BY를 사용하지 않는다.

03. 결과에 따른 서브쿼리

단일 행 서브쿼리 SINGLE ROW SUBQUEYR 다중 행 서브쿼리 MULTIPLE ROW SUBQUERY
칼럼도 하나일 경우 스칼라 서브쿼리 SCALA SUBQUERY라고 부른다.
하나의 갑과 같기 때문에 단일행 비교연산자와 함께 쓰인다.
[ = | < | > | <= | >= | <> , != ]
여러 값이기 때문에 다중행 비교 연산자와 함께 쓰인다.
[IN, ALL, ANY, EXISTS, SOME]

EXAMPLE

스칼라 서브쿼리

2반의 14번 학생의 수학성적과 같은 수학성적을 갖는 1반 학생들의 이름을 알려주세요.

SELECT 		C1.NAME
FROM		CLASS01 C1
WHERE 		C1.MATHE = (	SELECT 	C2.MATHE
							FROM	CLASS02 C2
                           	WHERE 	C2.ID = '14'
                        )
;

다중행 서브쿼리

학교에서 지정한 동아리목록에서 활동하고 있는 학생들의 이름과 전화번호 그리고 동아리명을 알려주세요.

SELECT		S.NAME, S.TEL, S.CLUB
FROM		SCHOOL2021 S
WHERE		S.CLUB IN 	(SELECT	SC.CLUB
						 FROM 	SPECIAL_CLUB_LIST SC
                         )
;
다중 칼럼 서브쿼리 MULTI-COLUMN SUBQUERY   
단일 행일 경우 단일행 비교연산자를 사용할 수 있다.
[ = | < | > | <= | >= | <> , != ]
다중 행일 경우 다중행 비교 연산자를 사용 해야 한다.
[IN, ALL, ANY, EXISTS, SOME]

EXMPLE

학생들이 제출한 주관식 문제에서 수도와 나라를 올바르게 입력한 학생의 이름과 전화번호를 알려주세요.

SELECT		C.NAME, C.TEL
FROM		CLASS C
WHERE		C.CITY, C.COUNTRY IN	(SOL.CITY, SOL.COUNTRY
					 FROM	SOLUTION SOL
                                         )
 ;

04. 지금까지 배운 서브쿼리와 다른 서브쿼리 : 연관서브쿼리 CORRELATED SUBQUERY

지금까지 배운 것과는 다른 서브쿼리가 있다. 연관서브쿼리가 그것이다. 연관서브쿼리는 서브쿼리가 메인쿼리의 자료를 가져와서 이용하기 때문에 서로 연관 CORRELATED 되어 있다고 한다.

SELECT 	C1.COL01
FROM	TABLE C1
WHERE	<CONDITION USING C1.COL01>
;

형태 : 연관서브쿼리가 일반적인 서브쿼리와 다른 점

-서브쿼리는 자체로 하나의 메인쿼리로서 작동 가능하지 못한다.

<< 메인쿼리에서 추출한 데이터를 가져와서 사용하기 때문에 연관서브쿼리는 메인쿼리에 종속되어 있다. 따라서 독립적으로 작동이 불가능하다.

EXAMPLE

같은 부서의 평균 연봉보다 적은 연봉을 받는 사람들의 이름과 연봉을 알려주세요.

SELECT		EM.NAME, EM.SAL
FROM		EMPLOYEE EM
WHERE		EM.SAL < (SELECT AVG(SAL)
			  FROM EMPLOYEE EM2
                    	  WHERE EM2.DP_ID = EM.DP_ID
                      	  )
;

 

반응형

댓글