공부 자료/SQL

SQL 문법 - 서브 쿼리(Sub Query)

뚜루뚜루세니 2021. 8. 12. 16:46
728x90

서브 쿼리(Sub Query)

서브 쿼리(Sub Query)는 SELECT문 안에 또 다른 SELECT문이 있는 명령어

 

SELECT절 서브 쿼리

select절 서브 쿼리는 SELECT 명령문 안에 SELECT 명령문이 있는 쿼리문 

JOIN보다 처리 속도가 늦기 때문에 사용을 기피하는 서브 쿼리 중 하나이다.

 

FROM절 서브 쿼리

FROM절 서브 쿼리는 FROM 명령문 안에 SELECT 명령문이 있는 쿼리문이다.

From 절 안에 테이블로 사용되는 서브퀴리이고, 열 이름 및 테이블 명을 지정해줘야 한다는 특징이 있다.

 

WHERE절 서브 쿼리

WHERE 절 서브 쿼리는 WHERE 명령문 안에 SELECT 명령문이 있는 쿼리문

where절 안에 리스트 형태로 사용할 수 있는 명령문이다.

 

위에서 설명한 세가지 서브 쿼리 중에서 분석에서 가장 많이 사용되는 서브 쿼리는 FROM 절 서브 쿼리이다.

이는 테이블 결합(JOIN)과 함께 사용된다는 특징을 가지고 있다.

*실습*

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
USE PRACTICE;
 
 
/***************SELECT절 서브 쿼리***************/
/* SELECT 명령문 안에 SELECT 명령문 */
 
SELECT  *
        ,(SELECT GENDER FROM CUSTOMER WHERE A.MEM_NO = MEM_NO) AS GENDER
  FROM  SALES AS A;
 
/* 확인 */
SELECT  *
  FROM  CUSTOMER
 WHERE  MEM_NO = '1000970';
 
/* SELECT절 서브 쿼리 vs 테이블 결합(JOIN) 처리 속도 비교 */
SELECT  A.*
        ,B.GENDER
  FROM  SALES AS A
  LEFT
  JOIN  CUSTOMER AS B
    ON  A.MEM_NO = B.MEM_NO;
 
 
/***************FROM절 서브 쿼리***************/
/* FROM 명령문 안에 SELECT 명령문 */
 
SELECT  *
  FROM  (
        SELECT  MEM_NO
                ,COUNT(ORDER_NO) AS 주문횟수
          FROM  SALES
         GROUP
            BY  MEM_NO
        )AS A;
 
/* FROM절 서브 쿼리: 열 및 테이블명 지정 */       
 
            
/***************WHERE절 서브 쿼리***************/
/* WHERE 명령문 안에 SELECT 명령문 */
 
/* 2019년도에 가입한 회원의 주문 횟수 구하기 */
SELECT  COUNT(ORDER_NO) AS 주문횟수
  FROM  SALES
 WHERE  MEM_NO IN (SELECT  MEM_NO FROM CUSTOMER WHERE YEAR(JOIN_DATE) = 2019);
 
/* YEAR: 날짜형 함수 / 연도 변환 */    
 
SELECT  *
        ,YEAR(JOIN_DATE)
  FROM  CUSTOMER;
 
 
/* WHERE절 서브 쿼리 vs 데이터 결합(JOIN) 결과 값 비교 */
SELECT  COUNT(A.ORDER_NO) AS 주문횟수
  FROM  SALES AS A
 INNER
  JOIN  CUSTOMER AS B
    ON  A.MEM_NO = B.MEM_NO
 WHERE  YEAR(B.JOIN_DATE) = 2019;
 
 
/***************서브 쿼리(Sub Query) + 테이블 결합(JOIN)***************/
/* 임시테이블 생성 */
CREATE TEMPORARY TABLE SALES_SUB_QUERY
SELECT  A.구매횟수
        ,B.*
  FROM  (
        SELECT  MEM_NO
                ,COUNT(ORDER_NO) AS 구매횟수
          FROM  SALES
         GROUP
            BY  MEM_NO
        )AS A
 INNER
  JOIN  CUSTOMER AS B
    ON  A.MEM_NO = B.MEM_NO;
 
/* 임시테이블 조회 */
SELECT * FROM SALES_SUB_QUERY;
 
/* 성별이 남성 조건으로 필터링하여 */
SELECT  *
  FROM  SALES_SUB_QUERY
 WHERE  GENDER = 'MAN';
 
 
/* 거주지역별로 구매횟수 집계 */
SELECT  ADDR
        ,SUM(구매횟수) AS 구매횟수
  FROM  SALES_SUB_QUERY
 WHERE  GENDER = 'MAN'
 GROUP
    BY  ADDR;
 
 
/* 구매횟수 100회 미만 조건으로 필터링 */
SELECT  ADDR
        ,SUM(구매횟수) AS 구매횟수
  FROM  SALES_SUB_QUERY
 WHERE  GENDER = 'MAN'
 GROUP
    BY  ADDR
HAVING  SUM(구매횟수) < 100;
 
 
/* 모든 열 조회 */
/* 구매횟수가 낮은 순으로 */
SELECT  ADDR
        ,SUM(구매횟수) AS 구매횟수
  FROM  SALES_SUB_QUERY
 WHERE  GENDER = 'MAN'
 GROUP
    BY  ADDR
HAVING  SUM(구매횟수) < 100
 ORDER
    BY  SUM(구매횟수) ASC; 
 
cs
 
 

FROM절 서브 쿼리(Sub Query) 명령어 작성법

FROM 절 서브 쿼리 명령어를 보기 좋게 작성하기 위해서는 SPACE 및 TAB 키보드를 잘 활용하는 것이 중요하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/***************FROM절 서브 쿼리(Sub Query) 작성법***************/
SELECT  A.구매횟수
        ,B.*
  FROM  (
        SELECT  MEM_NO
                ,COUNT(ORDER_NO) AS 구매횟수
          FROM  SALES
         GROUP
            BY  MEM_NO
        )AS A
 INNER
  JOIN  CUSTOMER AS B
    ON  A.MEM_NO = B.MEM_NO;
 
cs

 

 

 

728x90

'공부 자료 > SQL' 카테고리의 다른 글

[SQL] 관계 대수  (0) 2021.10.05
[SQL] 관계 데이터베이스  (0) 2021.10.05
SQL 문법 - 테이블 결합(JOIN)  (0) 2021.07.13
SQL 문법 - 데이터 조회(SELECT)  (0) 2021.07.05
트랜젝션 제어어(TCL)  (0) 2021.07.05