상세 컨텐츠

본문 제목

SQLD 공부 10일 차!

SQL과 데이터베이스

by 크앙크아앙 2025. 6. 8. 22:57

본문

오늘 작성할 내용은 서브쿼리입니다!


1. 서브쿼리

- 서브쿼리란 함수가 들어갈 위치에 그 위치에 맞는 결과를 출력하는 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 삽입/ 수정/ 삭제 제약 없음 제약 있음

 

'SQL과 데이터베이스' 카테고리의 다른 글

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

관련글 더보기