SQL -Subquery

Jungmin·2022년 11월 11일
1

SQL

목록 보기
16/17

⏹ Subquery

: 하나의 sql문 안에 포함되어 있는 또 다른 sql문.
메인 쿼리가 서브쿼리를 포함하는 종속적인 관계이다.

  • 서브쿼리는 메인쿼리 컬럼 사용 ⭕
  • 메인쿼리는 서브쿼리 컬럼 사용 ❌

Subquery 사용 시 주의

  • 서브쿼리는 괄호로 묶어서 사용
  • 단일 행 혹은 복수 행 비교 연산자와 함께 사용가능
  • 서브 쿼리에서는 order by 사용 ❌

Subquery 종류

  • Scalar Subquery : SELECT절에 사용
  • Inline View : FROM 절에 사용
  • 중첩 서브쿼리 (Nested subquery) : WHERE절에 사용

Scalar subquery

: SELECT절에 사용하는 서브쿼리로, 결과는 하나의 컬럼이어야 한다.
SELECT COL1, (SELECT COL2 FROM table2 WHERE 조건) FROM table1 WHERE 조건;

❔ 서울은평경찰서 강도검거 건수와 서울시 경찰서 전체의 평균 강도검거 건수 조회
mysql> SELECT case_number,
    ->          (SELECT avg(case_number)
    ->          FROM crime_status
    ->          WHERE crime_type like '강도' AND status_type like '검거') avg 
    -> FROM crime_status
    -> WHERE police_station like '은평' AND crime_type like '강도' AND status_type like '검거';
+-------------+--------+
| case_number | avg    |
+-------------+--------+
|           1 | 4.1935 |
+-------------+--------+
1 row in set (0.04 sec)

Inline View

: FROM절에 사용하는 서브쿼리로, 메인쿼리에서는 인라인뷰에서 조회한 컬럼만 사용 가능.
SELECT a.column, b.column FROM table1 a, (SELECT column1, column2 FROM table2) b WHERE 조건;

❔ 경찰서 별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회
mysql> SELECT c.police_station, c.crime_type, c.case_number  
    -> FROM crime_status c, 
    ->          (SELECT police_station, max(case_number) count
    ->          FROM crime_status
    ->          WHERE status_type like '발생'
    ->          GROUP BY police_station) m
    -> WHERE c.police_station = m.police_station
    ->  AND c.case_number = m.count;
+----------------+------------+-------------+
| police_station | crime_type | case_number |
+----------------+------------+-------------+
| 중부           | 폭력       |         997 |
| 종로           | 폭력       |         964 |
| 남대문         | 절도       |         699 |
| 서대문         | 폭력       |        1292 |
...
| 도봉           | 폭력       |        1234 |
| 수서           | 폭력       |        1394 |
+----------------+------------+-------------+

중첩 서브쿼리

: WHERE절에서 사용하는 서브쿼리

종류설명
Single Row하나의 열 검색하는 서브쿼리
Multiple Row하나 이상의 열 검색하는 서브쿼리
Multiple Column하나 이상의 행 검색하는 서브쿼리

🔹 Single Row : 서브쿼리가 비교연산자 (=,>,>=,<,<=,<>,!=)와 사용되는 경우, 서브쿼리 검색결과는 한 개의 결과값을 가져와야 한다. (두개 이상인 경우 에러)

SELECT name FROM celeb WHERE name = (SELECT host FROM snl_show);
--> 에러 발생 (한개 이상의 결과)

mysql> SELECT name FROM celeb WHERE name = (SELECT host FROM snl_show WHERE id =1);
+-----------+
| name      |
+-----------+
| 강동원    |
+-----------+

🔹 Multiple Row

  • Multiple Row- IN : 서브쿼리 결과 중에 포함 될때
❔ snl에 출연한 영화배우 조회
mysql> select host from snl_show 
    -> WHERE host IN (SELECT name FROM celeb WHERE job_title like '%영화배우%');
+-----------+
| host      |
+-----------+
| 강동원    |
| 차승원    |
+-----------+
  • Multiple Row- EXISTS : 서브쿼리 결과에 값이 있으면 반환
❔ 범죄검거 혹은 발생 건수가 2000건보다 큰 경찰서 조회
mysql> select name from police_station p 
	 > where exists (SELECT police_station FROM crime_status c 
     > WHERE p.name = c.reference AND case_number > 2000);
+--------------------------+
| name                     |
+--------------------------+
| 서울강남경찰서           |
| 서울강서경찰서           |
| 서울관악경찰서           |
| 서울구로경찰서           |
| 서울노원경찰서           |
| 서울송파경찰서           |
| 서울영등포경찰서         |
| 서울중랑경찰서           |
+--------------------------+
8 rows in set (0.04 sec)
  • Multiple Row- ANY : 서브쿼리 결과 중 최소 하나라도 만족 할 때 (비교연산자 사용)
❔ snl에 출연한 적 있는 연예인 조회
mysql> select name from celeb where name = ANY (SELECT host FROM snl_show);
+-----------+
| name      |
+-----------+
| 강동원    |
| 유재석    |
| 차승원    |
| 이수현    |
+-----------+
4 rows in set (0.04 sec)
  • Multiple Row- ALL :서브쿼리 결과를 모두 만족 (비교 연산자 사용)
mysql> SELECT name FROM celeb
    -> WHERE name = ALL (SELECT host FROM snl_show WHERE id=1);
+-----------+
| name      |
+-----------+
| 강동원    |
+-----------+
1 row in set (0.04 sec)
  • Multiple Column Subquery : 서브쿼리 내 메인쿼리 컬럼이 같이 사용되는 경우
mysql> select name, sex, agency from celeb
    -> where (sex, agency) IN (SELECT sex, agency FROM celeb WHERE name='강동원');
+-----------+------+----------------------+
| name      | sex  | agency               |
+-----------+------+----------------------+
| 강동원    | M    | YG엔터테이먼트       |
| 차승원    | M    | YG엔터테이먼트       |
+-----------+------+----------------------+
2 rows in set (0.04 sec)
profile
데이터분석 스터디노트🧐✍️

0개의 댓글