: 하나의 sql문 안에 포함되어 있는 또 다른 sql문.
메인 쿼리가 서브쿼리를 포함하는 종속적인 관계이다.
: 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)
: 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 | 하나 이상의 행 검색하는 서브쿼리 |
❗ 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 |
+-----------+
| 강동원 |
+-----------+
mysql> select host from snl_show
-> WHERE host IN (SELECT name FROM celeb WHERE job_title like '%영화배우%');
+-----------+
| host |
+-----------+
| 강동원 |
| 차승원 |
+-----------+
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)
mysql> select name from celeb where name = ANY (SELECT host FROM snl_show);
+-----------+
| name |
+-----------+
| 강동원 |
| 유재석 |
| 차승원 |
| 이수현 |
+-----------+
4 rows in set (0.04 sec)
mysql> SELECT name FROM celeb
-> WHERE name = ALL (SELECT host FROM snl_show WHERE id=1);
+-----------+
| name |
+-----------+
| 강동원 |
+-----------+
1 row in set (0.04 sec)
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)