오늘 작성할 내용은 서브쿼리입니다!
- 서브쿼리란 함수가 들어갈 위치에 그 위치에 맞는 결과를 출력하는 SQL문을 넣는 것을 의미합니다.
- 메인쿼리(Main Query): 서브쿼리를 품고있는 쿼리
- 서브쿼리(Sub Query): 메인쿼리 내부에 위치해 있는 쿼리
1) 서브쿼리의 위치에 따른 구분
| 순번 | 서브쿼리 종류 | 서브쿼리 설명 |
| 1 | 스칼라 서브쿼리(Scalar Sub Query) | SELECT문의 칼럼에 위치 |
| 2 | 인라인 뷰(InlineView) | FROM절의 테이블 입력 위치 |
| 3 | 중첩 서브쿼리(Nested Sub Query) | WHERE절과 HAVING절의 칼럼 또는 테이블에 위치 |
2) 메인쿼리의 칼럼 사용 여부에 따른 구분
| 순번 | 서브쿼리 종류 | 서브쿼리 설명 |
| 1 | 연관 서브쿼리(Correlated Sub Query) | 메인쿼리의 칼럼을 서브쿼리에서 사용함 |
| 2 | 비연관 서브쿼리(Un-Correlated Sub Query) | 메인쿼리의 칼럼을 서브쿼리에서 사용하지 않음 |
1. 스칼라 서브쿼리(Scalar Sub Query)
- SELECT문의 칼럼이 입력되는 위치에 들어가는 서브쿼리
- 스칼라 서브쿼리의 결과는 단 하나의 칼럼만을 결과로 가질수 있다

위의 테이블에서 'Club_Code'가 일치하는 'Club_Name' 칼럼을 불러오고 싶다면 스칼라 서브쿼리를 다음과 같이 작성하면 된다.
[SQL문]
SELECT Student_Code, Student_Name,
(SELECT Club_Name FROM Student_Club C
WHERE S.Culb_Code = C.Club_Code)
FROM Student_Name S

2. 인라인 뷰(Inline View)
- FROM 절 위치에 들어가는 서브쿼리
- 쿼리의 실행시 생성되는 동적 테이블
- 반복되는 구문을 하나의 인라인 뷰로 정의하여 별명을 부여함으로서 전체적인 코드의 가독성이 향상된다

학생들이 속해있는 클럽의 이름과 종목을 함꼐 조회하고 싶은 쿼리를 만들고 싶다면 인라인뷰를 활용해 다음과 같이 작성할 수 있다
[SQL문]
SELECT S.Student_Code, S.Student_Name, S.Club_Code, C.Club_Name, C.Sports
FROM Student_name S, (SELECT Club_Name, Sports FROM Student_Club) C
WHERE S.Club_Code = C. Club_Code;

3. 중첩 서브쿼리(Nested Sub Query)
- 쿼리 안에 다른 쿼리가 중첩되어 들어가는 경우
- WHERE절과 HAVING절에 위치함
- 반환하는 값의 형태가 하나가 아니다
| 순번 | 반환값 유형 | 반환값 설명 |
| 1 | 단일행(Single Row) | - 반환값이 1건 이하인 데이터 - >,<,>=,<=,<> 등 단일행 연산자의 연산 대상으로 사용 가능 |
| 2 | 다중행(Multi Row) | - 반환값이 2개 이상의 데이터인 경우 - IN, ALL, ANY, EXISTS, SOME 등 다중행 연산자의 대상으로 사용 가능 |
| 3 | 다중 칼럼(Multi Column) | - 반환되는 값이 여러 칼럼인 경우 - 여러 칼럼을 가진 테이블 형태 |

1) 단일행 예시: FANS이 평균보다 많은 학생들만 반환하는 결과를 알고 싶을때
[SQL문]
SELECT Student_Code, Student_Name, FANS
FROM Student_name
WHERE FANS >= (SELECT AVG(FANS) FROM Student_name);
SELECT AVG(FANS) FROM Student_name 의 결과는 1812.5 로 단일행이다

2) 다중행 예시: 2500명 이상의 FANS를 보유한 멤버가 있는 팀의 구성원들을 조회한다
[SQL문]
SELECT Student_Code, Student_Name, FANS
FROM Student_name
WHERE Club_Name IN (SELECT DISTINCT Club_Name
FROM Student_name
WHERE FANS >= 2500);
SELECT DISTINCT Club_Name FROM Student_name WHERE FANS >= 2500 의 결과는 Spurs와 Yankees 두개의 행이 나오는 다중행이다

3) 다중 칼럼 예시: 클럽별로 FANS수가 가장 많은 멤버를 조회한다
[SQL문]
SELECT Student_Code, Student_Name, FANS
FROM Student_name
WHERE (Student_Name, FANS) IN (SELECT Student_Name, MAX(FANS)
FROM Student_name
GROUP BY Club_Name);
SELECT Student_Name, MAX(FANS) FROM Student_name GROUP BY Club_Name의 결과는 Student_Name, MAX(FANS)로 구성된 테이블 형태입니다. 해당 테이블에 포함되어 있는 학생 이름만을 반환합니다.

뷰(View)란?
- 뷰는 인라인뷰의 반환 결과인 테이블을 이름을 별도의 부여하여, DBMS에 저장하여 테이블 참조를 가능하도록 해 놓은 것이다.
- 임시 또는 가상 테이블로서 해당 뷰를 참조할 때 동적으로 메모리에 생성된다
- CREATE VIEW 로 시갖하는 DDL 코드로 생성이 가능하다
- 삽입, 수정, 삭제에 제한이 있다
- 인덱스를 가질 수 없다
뷰의 특징
| 번호 | 특징 | 설명 |
| 1 | 편리성 | 복잡하고 긴 쿼리를 뷰로 만들어 놓으면 이후에 쿼리를 작성할 때 단순하게 작성이 가능하다. |
| 2 | 보안성 | 원래 테이블에서 노출이 되면 안되는 값의 칼럼을 제외하고 뷰를 생성하여 제공 가능하다. |
| 3 | 독립성 | 테이블의 구조가 변경되더라도 뷰가 변경되지 않는다면 뷰를 통해 접근하는 애플리케이션은 변경할 필요가 없다. |
테이블과 뷰의 차이
| 번호 | 유형 | 테이블 | 뷰 |
| 1 | 개념 | 정의된 데이터를 물리적으로 저장 | 실제 테이블을 참조하는 논리적인 가상의 테이블 |
| 2 | 데이터 저장 | 실제 데이터를 디스크에 저장 | 실제 데이터를 저장하고 있지 않음 |
| 3 | 생성 방식 | 정적 생성 | 동적 생성 |
| 4 | 인덱스 생성 | 인덱스 생성 가능 | 인덱스 생성 불가능 |
| 5 | 삽입/ 수정/ 삭제 | 제약 없음 | 제약 있음 |
| SQLD 공부 12일 차! (1) | 2025.06.10 |
|---|---|
| SQLD 공부 11일 차! (0) | 2025.06.09 |
| SQLD 공부 9일 차! (0) | 2025.06.05 |
| SQLD 공부 7일 차 (1) | 2025.06.04 |
| SQLD 공부 6일 차 (2) (3) | 2025.06.02 |