SQL - [Subquery]

์†”๋น„ยท2024๋…„ 1์›” 25์ผ
0

About Subquery


๐Ÿงท ์„ค๋ช…

  • ํ•˜๋‚˜์˜ SQL ๋ฌธ ์•ˆ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ SQL ๋ฌธ์„ ๋งํ•œ๋‹ค.
  • ๋ฉ”์ธ์ฟผ๋ฆฌ๊ฐ€ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ์ข…์†์ ์ธ ๊ด€๊ณ„์ด๋‹ค.
    • ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋ฉ”์ธ์ฟผ๋ฆฌ์˜ ์นผ๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ๋ฉ”์ธ์ฟผ๋ฆฌ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์นผ๋Ÿผ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

๐Ÿงท ์‚ฌ์šฉ์‹œ ์ฃผ์˜

  • Subquery ๋Š” ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์„œ ์‚ฌ์šฉ
  • ๋‹จ์ผ ํ–‰ ํ˜น์€ ๋ณต์ˆ˜ ํ–‰ ๋น„๊ต ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • subquery ์—์„œ๋Š” order by ๋ฅผ ์‚ฌ์šฉX

๐Ÿงท Subquery ์ข…๋ฅ˜

  • ์Šค์นด๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ (Scalar Subquery) - SELECT ์ ˆ์— ์‚ฌ์šฉ
  • ์ธ๋ผ์ธ ๋ทฐ (Inline View) - FROM ์ ˆ์— ์‚ฌ์šฉ
  • ์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ (Nested Subquery) - WHERE ์ ˆ์— ์‚ฌ์šฉ





์Šค์นด๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ (Scalar Subquery) - SELECT ์ ˆ


๐Ÿงท ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ



  • ์„œ์šธ์€ํ‰๊ฒฝ์ฐฐ์„œ์˜ ๊ฐ•๋„ ๊ฒ€๊ฑฐ ๊ฑด์ˆ˜์™€ ์„œ์šธ์‹œ ๊ฒฝ์ฐฐ์„œ ์ „์ฒด์˜ ํ‰๊ท  ๊ฐ•๋„ ๊ฒ€๊ฑฐ ๊ฑด์ˆ˜๋ฅผ ์กฐํšŒ
mysql> SELECT case_number,
    ->          ( SELECT avg(case_number)
    ->            FROM crime_status
    ->             WHERE crime_type LIKE '๊ฐ•๋„' AND status_type LIKE '๊ฒ€๊ฑฐ' ) as '์„œ์šธ์‹œ์ „์ฒด ๊ฐ•๋„ ๊ฒ€๊ฑฐ ํ‰๊ท '
    -> FROM crime_status
    -> WHERE police_station LIKE '์€ํ‰' AND crime_type LIKE '๊ฐ•๋„' AND status_type LIKE '๊ฒ€๊ฑฐ';
+-------------+--------------------------------------+
| case_number | ์„œ์šธ์‹œ์ „์ฒด ๊ฐ•๋„ ๊ฒ€๊ฑฐ ํ‰๊ท             |
+-------------+--------------------------------------+
|           1 |                               4.1935 |
+-------------+--------------------------------------+
1 row in set (0.15 sec)





์ธ๋ผ์ธ ๋ทฐ (Inline View) - FROM ์ ˆ


๐Ÿงท ์ธ๋ผ์ธ ๋ทฐ



  • ๊ฒฝ์ฐฐ์„œ ๋ณ„๋กœ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐœ์ƒํ•œ ๋ฒ”์ฃ„ ๊ฑด์ˆ˜์™€ ๋ฒ”์ฃ„ ์œ ํ˜•์„ ์กฐํšŒ
mysql> SELECT c.police_station, c.crime_type, c.case_number
    -> FROM crime_status c
    ->          ,(SELECT police_station, MAX(case_number) cnt
    ->            FROM crime_status
    ->            WHERE status_type LIKE '๋ฐœ์ƒ'
    ->            GROUP BY police_station) m
    -> WHERE c.police_station = m. police_station AND c.case_number = m.cnt;
+----------------+------------+-------------+
| police_station | crime_type | case_number |
+----------------+------------+-------------+
| ์ค‘๋ถ€           | ํญ๋ ฅ       |         997 |
| ์ข…๋กœ           | ํญ๋ ฅ       |         964 |
| ๋‚จ๋Œ€๋ฌธ         | ์ ˆ๋„       |         699 |
| ์„œ๋Œ€๋ฌธ         | ํญ๋ ฅ       |        1292 |
| ํ˜œํ™”           | ํญ๋ ฅ       |         747 |
| ์šฉ์‚ฐ           | ํญ๋ ฅ       |        1617 |
| ์„ฑ๋ถ           | ํญ๋ ฅ       |         672 |
| ๋™๋Œ€๋ฌธ         | ํญ๋ ฅ       |        1784 |
| ๋งˆํฌ           | ํญ๋ ฅ       |        1844 |
| ์˜๋“ฑํฌ         | ํญ๋ ฅ       |        2701 |
| ์„ฑ๋™           | ํญ๋ ฅ       |        1223 |
| ๋™์ž‘           | ํญ๋ ฅ       |        1631 |
| ๊ด‘์ง„           | ํญ๋ ฅ       |        1676 |
| ์„œ๋ถ€           | ํญ๋ ฅ       |         748 |
| ๊ฐ•๋ถ           | ํญ๋ ฅ       |        1817 |
| ๊ธˆ์ฒœ           | ํญ๋ ฅ       |        1471 |
| ์ค‘๋ž‘           | ํญ๋ ฅ       |        2022 |
| ๊ฐ•๋‚จ           | ํญ๋ ฅ       |        2283 |
| ๊ด€์•…           | ํญ๋ ฅ       |        2614 |
| ๊ฐ•์„œ           | ํญ๋ ฅ       |        2445 |
| ๊ฐ•๋™           | ํญ๋ ฅ       |        1942 |
| ์ข…์•”           | ํญ๋ ฅ       |         758 |
| ๊ตฌ๋กœ           | ํญ๋ ฅ       |        2204 |
| ์„œ์ดˆ           | ํญ๋ ฅ       |        1750 |
| ์–‘์ฒœ           | ํญ๋ ฅ       |        1582 |
| ์†กํŒŒ           | ํญ๋ ฅ       |        2675 |
| ๋…ธ์›           | ํญ๋ ฅ       |        2163 |
| ๋ฐฉ๋ฐฐ           | ํญ๋ ฅ       |         423 |
| ์€ํ‰           | ํญ๋ ฅ       |        1092 |
| ๋„๋ด‰           | ํญ๋ ฅ       |        1234 |
| ์ˆ˜์„œ           | ํญ๋ ฅ       |        1394 |
+----------------+------------+-------------+
31 rows in set (0.15 sec)

# ์ฐธ๊ณ 
mysql> SELECT police_station, MAX(case_number) cnt
    -> FROM crime_status
    -> WHERE status_type LIKE '๋ฐœ์ƒ'
    -> GROUP BY police_station;
+----------------+------+
| police_station | cnt  |
+----------------+------+
| ์ค‘๋ถ€           |  997 |
| ์ข…๋กœ           |  964 |
| ๋‚จ๋Œ€๋ฌธ         |  699 |
| ์„œ๋Œ€๋ฌธ         | 1292 |
| ํ˜œํ™”           |  747 |
| ์šฉ์‚ฐ           | 1617 |
| ์„ฑ๋ถ           |  672 |
| ๋™๋Œ€๋ฌธ         | 1784 |
| ๋งˆํฌ           | 1844 |
| ์˜๋“ฑํฌ         | 2701 |
| ์„ฑ๋™           | 1223 |
| ๋™์ž‘           | 1631 |
| ๊ด‘์ง„           | 1676 |
| ์„œ๋ถ€           |  748 |
| ๊ฐ•๋ถ           | 1817 |
| ๊ธˆ์ฒœ           | 1471 |
| ์ค‘๋ž‘           | 2022 |
| ๊ฐ•๋‚จ           | 2283 |
| ๊ด€์•…           | 2614 |
| ๊ฐ•์„œ           | 2445 |
| ๊ฐ•๋™           | 1942 |
| ์ข…์•”           |  758 |
| ๊ตฌ๋กœ           | 2204 |
| ์„œ์ดˆ           | 1750 |
| ์–‘์ฒœ           | 1582 |
| ์†กํŒŒ           | 2675 |
| ๋…ธ์›           | 2163 |
| ๋ฐฉ๋ฐฐ           |  423 |
| ์€ํ‰           | 1092 |
| ๋„๋ด‰           | 1234 |
| ์ˆ˜์„œ           | 1394 |
+----------------+------+
31 rows in set (0.15 sec)





์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ (Nested Subquery) - WHERE ์ ˆ


๐Ÿงท ์ธ๋ผ์ธ ๋ทฐ
โ€ข Single Row - ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ
โ€ข Multiple Row - ํ•˜๋‚˜ ์ด์ƒ์˜ ์—ด์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ
โ€ข Multiple Column - ํ•˜๋‚˜ ์ด์ƒ์˜ ํ–‰์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ




1. Single Row - ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ

์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋น„๊ต์—ฐ์‚ฐ์ž( =, >, >=, <, <=, <>, !=)์™€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ,
์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” ํ•œ ๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. (๋‘๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ์—๋Ÿฌ)

  • snl_show ํ…Œ์ด๋ธ”์—์„œ id๊ฐ€ 1์ธ ์…€๋Ÿฝ์˜ ์ด๋ฆ„ ์ถ”์ถœ
mysql> SELECT name FROM celeb
    -> WHERE name = ( SELECT host FROM snl_show WHERE id = 1);
+-----------+
| name      |
+-----------+
| ๊ฐ•๋™์›    |
+-----------+
1 row in set (0.15 sec)




2. Multiple Row - ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ

  • SNL์— ์ถœ์—ฐํ•œ ์˜ํ™”๋ฐฐ์šฐ ์กฐํšŒ
mysql> SELECT host
    -> FROM snl_show
    ->  WHERE host IN ( SELECT name FROM celeb WHERE job_title LIKE '%์˜ํ™”๋ฐฐ์šฐ%' );
+-----------+
| host      |
+-----------+
| ๊ฐ•๋™์›    |
| ์ฐจ์Šน์›    |
+-----------+
2 rows in set (0.15 sec)



๐ŸŒŸ EXIT

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— ๊ฐ’์ด ์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜

  • ๋ฒ”์ฃ„ ๊ฒ€๊ฑฐ ํ˜น์€ ๋ฐœ์ƒ ๊ฑด์ˆ˜๊ฐ€ 2000๊ฑด ๋ณด๋‹ค ํฐ ๊ฒฝ์ฐฐ์„œ ์กฐํšŒ
mysql> Select * from crime_status limit 3;
+------+----------------+------------+-------------+-------------+-----------------------+
| year | police_station | crime_type | status_type | case_number | reference             |
+------+----------------+------------+-------------+-------------+-----------------------+
| 2020 | ์ค‘๋ถ€           | ์‚ด์ธ       | ๋ฐœ์ƒ        |           1 | ์„œ์šธ์ค‘๋ถ€๊ฒฝ์ฐฐ์„œ        |
| 2020 | ์ค‘๋ถ€           | ์‚ด์ธ       | ๊ฒ€๊ฑฐ        |           1 | ์„œ์šธ์ค‘๋ถ€๊ฒฝ์ฐฐ์„œ        |
| 2020 | ์ค‘๋ถ€           | ๊ฐ•๋„       | ๋ฐœ์ƒ        |           3 | ์„œ์šธ์ค‘๋ถ€๊ฒฝ์ฐฐ์„œ        |
+------+----------------+------------+-------------+-------------+-----------------------+
3 rows in set (0.15 sec)

mysql> Select * from police_station limit 3;
+-----------------------+--------------------------------------------------+
| name                  | address                                          |
+-----------------------+--------------------------------------------------+
| ์„œ์šธ๊ฐ•๋‚จ๊ฒฝ์ฐฐ์„œ        | ์„œ์šธํŠน๋ณ„์‹œ ๊ฐ•๋‚จ๊ตฌ ํ…Œํ—ค๋ž€๋กœ 114๊ธธ 11              |
| ์„œ์šธ๊ฐ•๋™๊ฒฝ์ฐฐ์„œ        | ์„œ์šธํŠน๋ณ„์‹œ ๊ฐ•๋™๊ตฌ ์„ฑ๋‚ด๋กœ 33                      |
| ์„œ์šธ๊ฐ•๋ถ๊ฒฝ์ฐฐ์„œ        | ์„œ์šธํŠน๋ณ„์‹œ ๊ฐ•๋ถ๊ตฌ ์˜คํŒจ์‚ฐ๋กœ 406                   |
+-----------------------+--------------------------------------------------+

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.15 sec)



๐ŸŒŸ ANY

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘์— ์ตœ์†Œํ•œ ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋ฉด (๋น„๊ต์—ฐ์‚ฐ์ž ์‚ฌ์šฉ

  • SNL ์— ์ถœ์—ฐํ•œ ์ ์ด ์žˆ๋Š” ์—ฐ์˜ˆ์ธ ์ด๋ฆ„ ์กฐํšŒ
mysql> SELECT * FROM celeb LIMIT 3;
+----+-----------+------------+------+------+-------------------+--------------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE         | AGENCY                   |
+----+-----------+------------+------+------+-------------------+--------------------------+
|  1 | ์•„์ด์œ     | 1993-05-16 |   29 | F    | ๊ฐ€์ˆ˜, ํƒค๋ŸฐํŠธ      | EDAM์—”ํ„ฐํ…Œ์ด๋จผํŠธ         |
|  2 | ์ด๋ฏธ์ฃผ    | 1994-09-23 |   28 | F    | ๊ฐ€์ˆ˜              | ์šธ๋ฆผ์—”ํ„ฐํ…Œ์ด๋จผํŠธ         |
|  3 | ์†ก๊ฐ•      | 1994-04-23 |   28 | M    | ํƒค๋ŸฐํŠธ            | ๋‚˜๋ฌด์—‘ํ„ฐ์Šค               |
+----+-----------+------------+------+------+-------------------+--------------------------+
3 rows in set (0.15 sec)

mysql> SELECT  * FROM snl_show LIMIT 3;
+----+--------+---------+----------------+-----------+
| ID | SEASON | EPISODE | BROADCAST_DATE | HOST      |
+----+--------+---------+----------------+-----------+
|  1 |      8 |       7 | 2020-09-05     | ๊ฐ•๋™์›    |
|  2 |      8 |       8 | 2020-09-12     | ์œ ์žฌ์„    |
|  3 |      8 |       9 | 2020-09-19     | ์ฐจ์Šน์›    |
+----+--------+---------+----------------+-----------+
3 rows in set (0.15 sec)


mysql> SELECT name
    -> FROM celeb
    -> WHERE name = ANY ( SELECT host FROM snl_show ) ;
+-----------+
| name      |
+-----------+
| ๊ฐ•๋™์›    |
| ์œ ์žฌ์„    |
| ์ฐจ์Šน์›    |
| ์ด์ˆ˜ํ˜„    |
+-----------+
4 rows in set (0.15 sec)



๐ŸŒŸ ALL

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋ฉด (๋น„๊ต ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ)

  • snl_show์—์„œ id๊ฐ€ 1์ธ ์—ฐ์˜ˆ์ธ์˜ ์ด๋ฆ„
mysql> SELECT name FROM celeb
    -> WHERE name = ALL ( SELECT host FROM snl_show WHERE id = 1);
+-----------+
| name      |
+-----------+
| ๊ฐ•๋™์›    |
+-----------+
1 row in set (0.15 sec)




3. Multiple Column - ํ•˜๋‚˜ ์ด์ƒ์˜ ํ–‰์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ

์„œ๋ธŒ์ฟผ๋ฆฌ ๋‚ด์— ๋ฉ”์ธ์ฟผ๋ฆฌ ์ปฌ๋Ÿผ์ด ๊ฐ™์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ

  • ๊ฐ•๋™์›๊ณผ ์„ฑ๋ณ„, ์†Œ์†์‚ฌ๊ฐ€ ๊ฐ™์€ ์—ฐ์˜ˆ์ธ์˜ ์ด๋ฆ„, ์„ฑ๋ณ„, ์†Œ์†์‚ฌ๋ฅผ ์กฐํšŒ
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.15 sec)





์—ฐ์Šต๋ฌธ์ œ


  1. oil_price ํ…Œ์ด๋ธ”์—์„œ ์…€ํ”„์ฃผ์œ ์˜ ํ‰๊ท ๊ฐ€๊ฒฉ๊ณผ SK์—๋„ˆ์ง€์˜ ๊ฐ€์žฅ ๋น„์‹ผ ๊ฐ€๊ฒฉ์„ Scalar Subquery ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒ
mysql> SELECT * FROM oil_price LIMIT 3;
+------+----------------------+-------------------------------------------------+--------+--------+--------------------+--------------+
| ID   | ์ƒํ˜ธ                 | ์ฃผ์†Œ                                            | ๊ฐ€๊ฒฉ   | ์…€ํ”„   | ์ƒํ‘œ               | ๊ตฌ           |
+------+----------------------+-------------------------------------------------+--------+--------+--------------------+--------------+
|    1 | ํƒ€์ด๊ฑฐ์ฃผ์œ ์†Œ         | ์„œ์šธ ์€ํ‰๊ตฌ ์ˆ˜์ƒ‰๋กœ 188(์ค‘์‚ฐ๋™)                  |   1484 | N      | SK์—๋„ˆ์ง€           | ์€ํ‰๊ตฌ       |
|    2 | (์ฃผ)๋ช…์—ฐ์—๋„ˆ์ง€       | ์„œ์šธ ์€ํ‰๊ตฌ ์ˆ˜์ƒ‰๋กœ 236(์ˆ˜์ƒ‰๋™)                  |   1485 | Y      | ํ˜„๋Œ€์˜ค์ผ๋ฑ…ํฌ       | ์€ํ‰๊ตฌ       |
|    3 | ์„ฑ๋ฝ์ฃผ์œ ์†Œ           | ์„œ์šธ ์˜๋“ฑํฌ๊ตฌ ๊ฐ€๋งˆ์‚ฐ๋กœ 414(์‹ ๊ธธ๋™)              |   1498 | Y      | S-OIL              | ์˜๋“ฑํฌ๊ตฌ     |
+------+----------------------+-------------------------------------------------+--------+--------+--------------------+--------------+
3 rows in set (0.00 sec)

mysql> SELECT AVG(๊ฐ€๊ฒฉ) AS '์…€ํ”„์ฃผ์œ ์†Œ ํ‰๊ท ', (SELECT MAX(๊ฐ€๊ฒฉ) FROM oil_price WHERE ์ƒํ‘œ LIKE 'SK์—๋„ˆ์ง€') AS 'SK MAX ๊ฐ€๊ฒฉ'
    -> FROM oil_price
    -> WHERE ์…€ํ”„ = 'Y';
+------------------------+---------------+
| ์…€ํ”„์ฃผ์œ ์†Œ ํ‰๊ท         | SK MAX ๊ฐ€๊ฒฉ   |
+------------------------+---------------+
|              1517.6000 |          2160 |
+------------------------+---------------+
1 row in set (0.02 sec)

  1. ๐Ÿšฉ oil_price ํ…Œ์ด๋ธ”์—์„œ ์ƒํ‘œ๋ณ„๋กœ ๊ฐ€์žฅ ๋น„์‹ผ ๊ฐ€๊ฒฉ๊ณผ ์ƒํ˜ธ๋ฅผ Inline View ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒํ•˜์„ธ์š”.
mysql> SELECT a.์ƒํ˜ธ, a.์ƒํ‘œ, b.max_price
    -> FROM oil_price a, ( SELECT ์ƒํ‘œ, MAX(๊ฐ€๊ฒฉ) as max_price FROM oil_price GROUP BY ์ƒํ‘œ) b
    -> WHERE a.์ƒํ‘œ = b.์ƒํ‘œ AND a.๊ฐ€๊ฒฉ = b.max_price;
+-------------------+--------------------+-----------+
| ์ƒํ˜ธ              | ์ƒํ‘œ               | max_price |
+-------------------+--------------------+-----------+
| (์ฃผ)MS์ฃผ์œ ์†Œ      | ํ˜„๋Œ€์˜ค์ผ๋ฑ…ํฌ       |      1498 |
| ์Œ๋ฌธ์ฃผ์œ ์†Œ        | S-OIL              |      1509 |
| ๋‰ด์„œ์šธ(๊ฐ•๋‚จ)      | SK์—๋„ˆ์ง€           |      2160 |
| ์‹ ๊ธธ์ฃผ์œ ์†Œ        | GS์นผํ…์Šค           |      1498 |
+-------------------+--------------------+-----------+
4 rows in set (0.01 sec)

  1. ํ‰๊ท ๊ฐ€๊ฒฉ ๋ณด๋‹ค ๋†’์€ ์ฃผ์œ ์†Œ ์ƒํ˜ธ์™€ ๊ฐ€๊ฒฉ์„ Nested Subquery ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒํ•˜์„ธ์š”.
mysql> SELECT ์ƒํ˜ธ, ๊ฐ€๊ฒฉ
    -> FROM oil_price
    -> WHERE ๊ฐ€๊ฒฉ > (SELECT AVG(๊ฐ€๊ฒฉ) FROM oil_price);
+--------------------+--------+
| ์ƒํ˜ธ               | ๊ฐ€๊ฒฉ   |
+--------------------+--------+
| 21์„ธ๊ธฐ์ฃผ์œ ์†Œ       |   1598 |
| ์‚ดํ”ผ์žฌ์ฃผ์œ ์†Œ       |   1635 |
| ๋‰ด์„œ์šธ(๊ฐ•๋‚จ)       |   2160 |
+--------------------+--------+
3 rows in set (0.00 sec)

  1. 3๋ฒˆ์—์„œ ์กฐํšŒํ•œ ์ฃผ์œ ์†Œ์—์„œ ์ฃผ์œ ํ•œ ์—ฐ์˜ˆ์ธ์˜ ์ด๋ฆ„๊ณผ ์ฃผ์œ ์†Œ, ์ฃผ์œ ์ผ์„ Nested Subquery ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒํ•˜์„ธ์š”. (refueling ํ…Œ์ด๋ธ”)
mysql> SELECT ์ด๋ฆ„, ์ฃผ์œ ์†Œ, ์ฃผ์œ ์ผ
    -> FROM refueling
    -> WHERE ์ฃผ์œ ์†Œ IN (SELECT ์ƒํ˜ธ FROM oil_price WHERE ๊ฐ€๊ฒฉ > (SELECT AVG(๊ฐ€๊ฒฉ) FROM oil_price));
+-----------+-------------------+------------+
| ์ด๋ฆ„      | ์ฃผ์œ ์†Œ            | ์ฃผ์œ ์ผ     |
+-----------+-------------------+------------+
| ์œ ์žฌ์„    | ๋‰ด์„œ์šธ(๊ฐ•๋‚จ)      | 2021-10-01 |
| ์ด๋ฏธ์ฃผ    | ๋‰ด์„œ์šธ(๊ฐ•๋‚จ)      | 2021-10-01 |
| ์œ ์žฌ์„    | ๋‰ด์„œ์šธ(๊ฐ•๋‚จ)      | 2021-10-03 |
| ์•„์ด์œ     | ๋‰ด์„œ์šธ(๊ฐ•๋‚จ)      | 2021-10-14 |
| ์•„์ด์œ     | ๋‰ด์„œ์šธ(๊ฐ•๋‚จ)      | 2021-10-14 |
| ์œ ์žฌ์„    | ๋‰ด์„œ์šธ(๊ฐ•๋‚จ)      | 2021-10-16 |
+-----------+-------------------+------------+
6 rows in set (0.00 sec)

  1. refueling ํ…Œ์ด๋ธ”๊ณผ oil_price ํ…Œ์ด๋ธ”์—์„œ 10๋งŒ์› ์ด์ƒ ์ฃผ์œ ํ•œ ์—ฐ์˜ˆ์ธ ์ด๋ฆ„, ์ƒํ˜ธ, ์ƒํ‘œ, ์ฃผ์œ  ๊ธˆ์•ก, ๊ฐ€๊ฒฉ์„
    Inline View ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒํ•˜์„ธ์š”.
mysql> SELECT r.์ด๋ฆ„, o.์ƒํ˜ธ, o.์ƒํ‘œ, r.๊ธˆ์•ก, o.๊ฐ€๊ฒฉ
    -> FROM refueling r ,
    -> ( SELECT ์ƒํ˜ธ, ๊ฐ€๊ฒฉ, ์ƒํ‘œ FROM oil_price ) o
    -> WHERE r.๊ธˆ์•ก >= 100000 AND r.์ฃผ์œ ์†Œ = o.์ƒํ˜ธ ;
+-----------+--------------------+-------------+--------+--------+
| ์ด๋ฆ„      | ์ƒํ˜ธ               | ์ƒํ‘œ        | ๊ธˆ์•ก   | ๊ฐ€๊ฒฉ   |
+-----------+--------------------+-------------+--------+--------+
| ์ด์ƒ์ˆœ    | ํƒ€์ด๊ฑฐ์ฃผ์œ ์†Œ       | SK์—๋„ˆ์ง€    | 140000 |   1484 |
| ์œ ์žฌ์„    | ๋‰ด์„œ์šธ(๊ฐ•๋‚จ)       | SK์—๋„ˆ์ง€    | 110000 |   2160 |
| ์•„์ด์œ     | ๋‰ด์„œ์šธ(๊ฐ•๋‚จ)       | SK์—๋„ˆ์ง€    | 120000 |   2160 |
| ์•„์ด์œ     | ๋‰ด์„œ์šธ(๊ฐ•๋‚จ)       | SK์—๋„ˆ์ง€    | 150000 |   2160 |
| ์ด๋ฏธ์ฃผ    | ๋‰ด์„œ์šธ(๊ฐ•๋‚จ)       | SK์—๋„ˆ์ง€    | 120000 |   2160 |
+-----------+--------------------+-------------+--------+--------+
5 rows in set (0.00 sec)


Daily Study Note

0๊ฐœ์˜ ๋Œ“๊ธ€