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 |