๐Ÿฆญ SUBQUERIES & SET OPERATORS

๋‚˜๋‚˜'s Brainยท2024๋…„ 7์›” 8์ผ

MariaDB

๋ชฉ๋ก ๋ณด๊ธฐ
7/15
post-thumbnail

๐Ÿ“ SUBQUERIES

๐Ÿ’ก SUBQUERY๋Š” ๋‹ค๋ฅธ ์ฟผ๋ฆฌ ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ์ด๋‹ค.
SUBQUERY์˜ ๊ฒฐ๊ณผ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ณต์žกํ•œ MAINQUERY๋ฅผ ์ž‘์„ฑํ•ด ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”– SUBQUERY ํ™œ์šฉ

โœ… ์„œ๋ธŒ์ฟผ๋ฆฌ์™€ ๋ฉ”์ธ ์ฟผ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ๋‹ค์ค‘์—ด ๊ฒฐ๊ณผ ์กฐํšŒ

โžก๏ธ ์„œ๋ธŒ์ฟผ๋ฆฌ

    SELECT
           category_code
      FROM tbl_menu
     WHERE menu_name = '๋ฏผํŠธ๋ฏธ์—ญ๊ตญ';

โžก๏ธ ๋ฉ”์ธ์ฟผ๋ฆฌ

    SELECT
           menu_code
         , menu_name
         , menu_price
         , category_code
         , orderable_status
      FROM tbl_menu;

โžก๏ธ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ๋ฉ”์ธ ์ฟผ๋ฆฌ

    SELECT                                                   
           menu_code                                         
         , menu_name                                         
         , menu_price                                        
         , category_code                                     
         , orderable_status                                  
      FROM tbl_menu                                          
     WHERE category_code = (SELECT category_code             
                              FROM tbl_menu                  
                             WHERE menu_name = '๋ฏผํŠธ๋ฏธ์—ญ๊ตญ');

โœ… SUBQUERY๋ฅผ ํ™œ์šฉํ•ด ๊ฐ€์žฅ ๋งŽ์€ ๋ฉ”๋‰ด๊ฐ€ ํฌํ•จ๋œ ์นดํ…Œ๊ณ ๋ฆฌ ์กฐํšŒ

โžก๏ธ ์„œ๋ธŒ์ฟผ๋ฆฌ

    SELECT
           COUNT(*) AS 'count'
      FROM tbl_menu
     GROUP BY category_code;

โžก๏ธ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ๋ฉ”์ธ ์ฟผ๋ฆฌ
FROM ์ ˆ์— ์“ฐ์ธ ์„œ๋ธŒ์ฟผ๋ฆฌ(derived table, ํŒŒ์ƒ ํ…Œ์ด๋ธ”)๋Š” ๋ฐ˜๋“œ์‹œ ์ž์‹ ์˜ ๋ณ„์นญ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
(feat. ์ด๋Ÿฌํ•œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ โ€˜์ธ๋ผ์ธ ๋ทฐโ€™๋ผ๊ณ  ํ•œ๋‹ค.)

    SELECT
           MAX(count)
      FROM (SELECT COUNT(*) AS 'count'
              FROM tbl_menu
             GROUP BY category_code) AS countmenu;

๐Ÿ”– ์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ

๋ฉ”์ธ ์ฟผ๋ฆฌ๊ฐ€ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฒฝ์šฐ ์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

โœ… SUBQUERY๋ฅผ ํ™œ์šฉํ•ด ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ‰๊ท  ๊ฐ€๊ฒฉ๋ณด๋‹ค ๋†’์€ ๊ฐ€๊ฒฉ์˜ ๋ฉ”๋‰ด ์กฐํšŒ

โžก๏ธ ์„œ๋ธŒ์ฟผ๋ฆฌ

    SELECT
           AVG(menu_price)
      FROM tbl_menu
     WHERE category_code = 4;

โžก๏ธ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ๋ฉ”์ธ ์ฟผ๋ฆฌ

    SELECT                                                   
           menu_code                                         
         , menu_name                                         
         , menu_price                                        
         , category_code                                     
         , orderable_status                                  
      FROM tbl_menu a     
                                         
     WHERE menu_price > (SELECT AVG(menu_price)
                           FROM tbl_menu                  
                          WHERE category_code = a.category_code);

๐Ÿ”– EXISTS

์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์„ ๋•Œ true ์•„๋‹ˆ๋ฉด false

โœ… EXISTS์™€ SUBQUERY๋ฅผ ํ™œ์šฉํ•œ ๋ฉ”๋‰ด๊ฐ€ ์žˆ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ ์กฐํšŒ

    SELECT
           category_name
      FROM tbl_category a
     WHERE EXISTS(SELECT 1
                    FROM tbl_menu b
                    WHERE b.category_code = a.category_code)
    	 ORDER BY 1;

ํŒŒ์ƒ ํ…Œ์ด๋ธ”๊ณผ ๋น„์Šทํ•œ ๊ฐœ๋…์ด๋ฉฐ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ์œ„ํ•ด ํŒŒ์ƒ ํ…Œ์ด๋ธ” ๋Œ€์‹  ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.


๐Ÿ”– CTE (Common Table Expressions)

FROM์ ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๋จ (JOIN์ผ ์‹œ JOIN ๊ตฌ๋ฌธ์—์„œ๋„ ๊ฐ€๋Šฅ)
์ธ๋ผ์ธ ๋ทฐ๋กœ ์“ฐ์ธ ์„œ๋ธŒ์ฟผ๋ฆฌ(FROM ์ ˆ์— ์“ฐ์ธ ์„œ๋ธŒ์ฟผ๋ฆฌ)๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๊ณ  ๋ฉ”์ธ์ฟผ๋ฆฌ๊ฐ€ ์‹ฌํ”Œํ•ด ์งˆ ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•

    WITH menucate AS (
        SELECT menu_name
             , category_name
          FROM tbl_menu a
          JOIN tbl_category b ON a.category_code = b.category_code
    )
    SELECT
           *
      FROM menucate
     ORDER BY menu_name;


๐Ÿ“ SET OPERATORS

๐Ÿ’ก SET ์—ฐ์‚ฐ์ž๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ SELECT๋ฌธ์˜ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ๊ฒฐํ•ฉํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
SET ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์˜ ์ปฌ๋Ÿผ์ด ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ”– UNION

๋‘ ๊ฐœ ์ด์ƒ์˜ SELECT ๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ค‘๋ณต๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•˜๋Š” SQL ์—ฐ์‚ฐ์ž์ด๋‹ค.

    SELECT
           menu_code
         , menu_name
         , menu_price
         , category_code
         , orderable_status
      FROM tbl_menu
     WHERE category_code = 10
     UNION
    SELECT
           menu_code
         , menu_name
         , menu_price
         , category_code
         , orderable_status
      FROM tbl_menu
     WHERE menu_price < 9000;

๐Ÿ”– UNION ALL

๋‘ ๊ฐœ ์ด์ƒ์˜ SELECT ๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉฐ ์ค‘๋ณต๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•˜๋Š” SQL ์—ฐ์‚ฐ์ž์ด๋‹ค.

    SELECT
           menu_code
         , menu_name
         , menu_price
         , category_code
         , orderable_status
      FROM tbl_menu
     WHERE category_code = 10
     UNION ALL
    SELECT
           menu_code
         , menu_name
         , menu_price
         , category_code
         , orderable_status
      FROM tbl_menu
     WHERE menu_price < 9000;

๐Ÿ”– INTERSECT

๋‘ SELECT ๋ฌธ์˜ ๊ฒฐ๊ณผ ์ค‘ ๊ณตํ†ต๋˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” SQL ์—ฐ์‚ฐ์ž์ด๋‹ค.
MySQL์€ ๋ณธ๋ž˜ ๊ธฐ๋ณธ์ ์œผ๋กœ INTERSECT๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
ํ•˜์ง€๋งŒ INNER JOIN ๋˜๋Š” IN ์—ฐ์‚ฐ์ž ํ™œ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค.

โœ… INNER JOIN ํ™œ์šฉ

    SELECT
           a.menu_code
         , a.menu_name
         , a.menu_price
         , a.category_code
         , a.orderable_status
      FROM tbl_menu a
     INNER JOIN (SELECT menu_code
                      , menu_name
                      , menu_price
                      , category_code
                      , orderable_status
                   FROM tbl_menu
                  WHERE menu_price < 9000) b ON (a.menu_code = b.menu_code)
     WHERE a.category_code = 10;

โœ… IN ์—ฐ์‚ฐ์ž ํ™œ์šฉ

    SELECT
           a.menu_code
         , a.menu_name
         , a.menu_price
         , a.category_code
         , a.orderable_status
      FROM tbl_menu a
     WHERE category_code = 10 
       AND menu_code IN (SELECT menu_code
                           FROM tbl_menu
                          WHERE menu_price < 9000);

๐Ÿ”– MINUS

์ฒซ ๋ฒˆ์งธ SELECT ๋ฌธ์˜ ๊ฒฐ๊ณผ์—์„œ ๋‘ ๋ฒˆ์งธ SELECT ๋ฌธ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” SQL ์—ฐ์‚ฐ์ž์ด๋‹ค.
MySQL์€ MINUS๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
ํ•˜์ง€๋งŒ LEFT JOIN์„ ํ™œ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค.

    SELECT
           a.menu_code
         , a.menu_name
         , a.menu_price
         , a.category_code
         , a.orderable_status
      FROM tbl_menu a
      LEFT JOIN (SELECT menu_code
                      , menu_name
                      , menu_price
                      , category_code
                      , orderable_status
                   FROM tbl_menu b
                  WHERE menu_price < 9000) b ON (a.menu_code = b.menu_code)
     WHERE a.category_code = 10
       AND b.menu_code IS NULL;

์‹คํ–‰๊ฒฐ๊ณผ

profile
"๋กœ์ปฌ์—์„  ๋ฌธ์ œ์—†์—ˆ๋Š”๋ฐโ€ฆ?"

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