35.2. ºä¿Í ·ê ½Ã½ºÅÛ

PostgreSQL¿¡ À־ÀÇ ºä´Â ·ê ½Ã½ºÅÛÀ» »ç¿ëÇØ ±¸ÇöµÇ°í ÀÖ½À´Ï´Ù. ½ÇÁ¦,

CREATE VIEW myview AS SELECT * FROM mytab;

°úÀÇ 2°³ÀÇ ¸í·ÉÀÇ »çÀÌ¿¡´Â ±âº»ÀûÀÎ Â÷ÀÌ´Â ¾ø½À´Ï´Ù.

CREATE TABLE myview (
same column list as mytab
);
CREATE RULE "_RETURN" AS ON SELECT TO myview DO INSTEAD
    SELECT * FROM mytab;

ÀÌ·¸°Ô ¸»ÇÏ´Â °ÍÀº, CREATE VIEW¸í·É¿¡ ÀÇÇØ ³»ºÎÀûÀ¸·Î ¿ÏÀüÈ÷ °°Àº ¸í·ÉÀ» Çϱ⠶§¹®ÀÔ´Ï´Ù. ±×·¯³ª ºÎÀÛ¿ëµµ ÀÖ½À´Ï´Ù. ±× ÇÑ °¡Áö´Â PostgreSQL½Ã½ºÅÛ ¸ñ·ÏÀÇ ºä¿¡ ´ëÇÑ Á¤º¸´Â Å×À̺íÀÇ Á¤º¸¿Í µ¿ÀÏÇØ¼­, ÆÄ¼­¿¡ À־µµ Å×À̺í°ú ºä´Â °°Àº °ÍÀÌ µÈ´Ù´Â °ÍÀÔ´Ï´Ù. À̰͵éÀº °°Àº °Í, Áï ¸±·¹À̼ÇÀÔ´Ï´Ù.

35.2.1. SELECT·êÀÇ È°µ¿

ºñ·Ï ¸í·ÉÀÌ INSERT, UPDATE, DELETEµîÀ̾, ON SELECT·êÀº ¸ðµç Äõ¸®¿¡ ´ëÇØ ¸¶Áö¸·¿¡ Àû¿ëµË´Ï´Ù. ±×¸®°í, ÀÌ ·êÀº ´Ù¸¥ ¸í·É Á¾·ùÀÇ ·ê°ú ´Ù¸¥ Àǹ̷ÐÀ» °¡Áö°í ÀÖ¾î, Ä÷ Æ®¸®¸¦ ½Å±Ô¿¡ »ý¼ºÇÏÁö ¾Ê°í, ±× °÷¿¡ ÀÖ´Â °ÍÀ» ¼öÁ¤ÇÕ´Ï´Ù. µû¶ó¼­ SELECT·êÀÌ Á¦ÀÏ Ã³À½¿¡ ±â¼úµÇÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù.

ÇöÀç·Î¼­´Â, ON SELECT·ê¿¡¼­´Â 1°³ÀÇ ¾×¼Ç ¹Û¿¡ Çã¿ëµÇÁö ¾Ê°í, ±×°ÍÀº INSTEADÀÎ ¹«Á¶°ÇÀÇ SELECT¾×¼ÇÀÌ ¾Æ´Ï¸é ¾ÈµË´Ï´Ù. ÀÌ Á¦¾àÀº, ÀϹÝÀÇ »ç¿ëÀÚ°¡ ¹«¾ùÀ» ÇØµµ, ·ê ½Ã½ºÅÛÀÌ °ß·ÚÇϱ⠶§¹®¿¡ ÇÊ¿äÇϰí, ON SELECTÀÇ ·êÀº ºä °°Àº µ¿ÀÛÀ¸·Î ÇÑÁ¤µË´Ï´Ù.

º»ÀåÀÇ ¿¹·Î¼­ µé°í ÀÖ´Â °ÍÀº, ¾à°£ÀÇ ¿¬»êÀ» ÇÏ´Â 2°³ÀÇ °áÇÕÀÇ ºä¿Í ´ÙÀ½¿¡ ÀÌ·¯ÇÑ ±â´ÉÀ» ÀÌ¿ëÇÏ´Â ¸î°³ÀÇ ºäÀÔ´Ï´Ù. ÃÖÁ¾ °á°ú°¡ ¾î¶°ÇÑ ¸¶¹ýÀÇ ±â´É¿¡ ÀÇÇØ ¸¶Ä¡ ½ÇÁ¦ Å×À̺í°ú °°ÀÌ ÇൿÇÏ´Â ºä°¡ µÇµµ·Ï, óÀ½ÀÇ 2°³ÀÇ ºä °¡¿îµ¥ Çϳª´Â, INSERT, UPDATE, DELETEÁ¶ÀÛ¿¡ ´ëÇÑ ·êÀ» ´ÙÀ½¿¡ Ãß°¡ÇÏ´Â °ÍÀ¸·Î Ä¿½ºÅ͸¶ÀÌÁî µË´Ï´Ù. óÀ½À¸·Î ¹è¿ì±â À§ÇÑ ¿¹·Î¼­´Â °áÄÚ °£´ÜÇÏÁö ¾Ê°í ¸ÕÀú ÁøÇàµÇ´Â °ÍÀ» ¾î·Æ°Ô ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¸¹Àº ´Ù¸¥ ¿¹¸¦ ²¨³» ¸Ó¸®¼ÓÀ» È¥¶õ½ÃŰ´Â °Í´Ùµµ, ¸ðµç ³íÁ¡À» ´Ü°è¸¶´Ù ÂÑ´Â 1°³ÀÇ ¿¹¸¦ µå´Â ÆíÀÌ ÁÁÀ» °ÍÀÔ´Ï´Ù.

ÀÌ ¿¹¿¡¼­´Â, 2°³ÀÇ Á¤¼ö·ÎºÎÅÍ ÀÛÀº °ªÀ» µ¹·ÁÁÖ´Â ¾à°£ÀÇ minÇÔ¼ö¸¦ ÇÊ¿ä·Î ÇÕ´Ï´Ù. ÇÔ¼öÀÇ »ý¼ºÀº ÀÌÇÏ¿Í °°ÀÌ ÇÕ´Ï´Ù.

CREATE FUNCTION min(integer, integer) RETURNS integer AS $$
    SELECT CASE WHEN $1 < $2 THEN $1 ELSE $2 END
$$ LANGUAGE SQL STRICT;

ÃÖÃÊÀÇ µÎ °³ÀÇ ·ê ½Ã½ºÅÛÀÇ ¼³¸í¿¡ ÇÊ¿ä·Î ÇÏ´Â ½ÇÁ¦ Å×À̺íÀ» ÀÌÇÏ¿¡ ³ªÅ¸³À´Ï´Ù.

CREATE TABLE shoe_data (
    shoename   text,         --  ÁÖŰ
    sh_avail   integer,        -- Àç°í
    slcolor    text,          -- °¡´ÉÇÑ ½Å¹ß²öÀÇ »ö
    slminlen   real,          -- ½Å¹ß²öÀÇ ÃÖ´Ü »çÀÌÁî
    slmaxlen   real,          -- ½Å¹ß²öÀÇ ÃÖÀå »çÀÌÁî
    slunit     text           -- ±æÀÌÀÇ ´ÜÀ§
);

CREATE TABLE shoelace_data (
    sl_name    text,          -- ÁÖŰ
    sl_avail   integer,       -- Àç°í
    sl_color   text,          -- ½Å¹ß²öÀÇ »ö
    sl_len     real,          -- ½Å¹ß²öÀÇ ±æÀÌ
    sl_unit    text           -- ±æÀÌÀÇ ´ÜÀ§
);

CREATE TABLE unit (
    un_name    text,          -- ÁÖ Å°
    un_fact    real           -- cm·Î º¯È¯ÇÏ´Â ÆÑÅÍ
);

º¸ÀÌ´Â °Íó·³, À̰͵éÀº ½Å¹ß°¡°ÔÀÇ µ¥ÀÌÅ͸¦ ³ªÅ¸³»°í ÀÖ½À´Ï´Ù.

ºä¸¦ ÀÌÇÏ¿Í °°ÀÌ ÀÛ¼ºÇÕ´Ï´Ù.

CREATE VIEW shoe AS
    SELECT sh.shoename,
           sh.sh_avail,
           sh.slcolor,
           sh.slminlen,
           sh.slminlen * un.un_fact AS slminlen_cm,
           sh.slmaxlen,
           sh.slmaxlen * un.un_fact AS slmaxlen_cm,
           sh.slunit
      FROM shoe_data sh, unit un
     WHERE sh.slunit = un.un_name;

CREATE VIEW shoelace AS
    SELECT s.sl_name,
           s.sl_avail,
           s.sl_color,
           s.sl_len,
           s.sl_unit,
           s.sl_len * u.un_fact AS sl_len_cm
      FROM shoelace_data s, unit u
     WHERE s.sl_unit = u.un_name;

CREATE VIEW shoe_ready AS
    SELECT rsh.shoename,
           rsh.sh_avail,
           rsl.sl_name,
           rsl.sl_avail,
           min(rsh.sh_avail, rsl.sl_avail) AS total_avail
      FROM shoe rsh, shoelace rsl
     WHERE rsl.sl_color = rsh.slcolor
       AND rsl.sl_len_cm >= rsh.slminlen_cm
       AND rsl.sl_len_cm <= rsh.slmaxlen_cm;

shoelaceºä(Áö±Ý ÀÖ´Â Á¦ÀÏ °£´ÜÇÑ ºä)¿ëÀÇ CREATE VIEW¸í·ÉÀº, shoelace¸±·¹À̼ÇÀ» Äõ¸® ¹üÀ§ Å×À̺í Áß¿¡¼­ shoelace¸±·¹À̼ÇÀÌ ÂüÁ¶µÉ ¶§´Â ¾ðÁ¦¶óµµ Àû¿ëµÇ¾î¾ß ÇÒ ÀçÀÛ¼º ·êÀÇ Á¸À縦 ³ªÅ¸³»´Â Ç׸ñÀ» pg_rewrite¿¡ ¸¸µì´Ï´Ù. ·êÀº ·ê Á¶°Ç(SELECT·êÀº ÇöÀç °¡Áú ¼ö ¾ø±â ¶§¹®¿¡, ºñSELECT·ê¿¡¼­ ´Ù·ì´Ï´Ù)À» °¡ÁöÁö ¾Ê´Â INSTEADÀÔ´Ï´Ù. ·ê Á¶°ÇÀº Äõ¸® Á¶°Ç°ú´Â ´Ù¸¥ °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä! ·ê µ¿ÀÛÀº Äõ¸® Á¶°ÇÀ» °¡Áö°í ÀÖ½À´Ï´Ù. ÀÌ ·ê µ¿ÀÛÀº, ºä ÀÛ¼º ¸í·É³»ÀÇ SELECT¸í·É¹®ÀÇ º¹»çÀÎ, 1°³ÀÇ Äõ¸® Æ®¸®ÀÔ´Ï´Ù.

Note: pg_rewriteÇ׸ñÀÇ NEW¿Í OLD (¿ª»çÀûÀÎ ÀÌÀ¯¿¡ ÀÇÇØ, Ãâ·Â¿ëÀÇ Äõ¸® Æ®¸®¿¡¼­, *NEW*³ª *CURRENT*¶ó´Â À̸§ÀÌ ºÙ¾î ÀÖ½À´Ï´Ù)¿¡ ´ëÇÑ 2°³ÀÇ Æ¯º°ÇÑ ¹üÀ§ Å×À̺í Ç׸ñÀº SELECT·ê °ú´Â °ü°è°¡ ¾ø½À´Ï´Ù.

±×·³ ¿©±â¼­ unit shoe_data, shoelace_data¿¡ µ¥ÀÌÅ͸¦ ³Ö¾î ºä¿¡ °£´ÜÇÑ Äõ¸®¸¦ ½Ç½ÃÇÕ´Ï´Ù.

INSERT INTO unit VALUES ('cm', 1.0);
INSERT INTO unit VALUES ('m', 100.0);
INSERT INTO unit VALUES ('inch', 2.54);

INSERT INTO shoe_data VALUES ('sh1', 2, 'black', 70.0, 90.0, 'cm');
INSERT INTO shoe_data VALUES ('sh2', 0, 'black', 30.0, 40.0, 'inch');
INSERT INTO shoe_data VALUES ('sh3', 4, 'brown', 50.0, 65.0, 'cm');
INSERT INTO shoe_data VALUES ('sh4', 3, 'brown', 40.0, 50.0, 'inch');

INSERT INTO shoelace_data VALUES ('sl1', 5, 'black', 80.0, 'cm');
INSERT INTO shoelace_data VALUES ('sl2', 6, 'black', 100.0, 'cm');
INSERT INTO shoelace_data VALUES ('sl3', 0, 'black', 35.0 , 'inch');
INSERT INTO shoelace_data VALUES ('sl4', 8, 'black', 40.0 , 'inch');
INSERT INTO shoelace_data VALUES ('sl5', 4, 'brown', 1.0 , 'm');
INSERT INTO shoelace_data VALUES ('sl6', 0, 'brown', 0.9 , 'm');
INSERT INTO shoelace_data VALUES ('sl7', 7, 'brown', 60 , 'cm');
INSERT INTO shoelace_data VALUES ('sl8', 1, 'brown', 40 , 'inch');

SELECT * FROM shoelace;

 sl_name   | sl_avail | sl_color | sl_len | sl_unit | sl_len_cm
-----------+----------+----------+--------+---------+-----------
 sl1       |        5 | black    |     80 | cm      |        80
 sl2       |        6 | black    |    100 | cm      |       100
 sl7       |        7 | brown    |     60 | cm      |        60
 sl3       |        0 | black    |     35 | inch    |      88.9
 sl4       |        8 | black    |     40 | inch    |     101.6
 sl8       |        1 | brown    |     40 | inch    |     101.6
 sl5       |        4 | brown    |      1 | m       |       100
 sl6       |        0 | brown    |    0.9 | m       |        90
(8 rows)

À̰ÍÀº, ºä¿¡ ´ëÇÑ °¡Àå °£´ÜÇÑ SELECTÀ̹ǷÎ, ÀÌ ±âȸ¿¡ ºä ·êÀÇ ±âº»À» ¼³¸íÇÕ´Ï´Ù. SELECT * FROM shoelace´Â ÆÄ¼­¿¡ ÀÇÇØ ó¸®µÇ¾î ´ÙÀ½ÀÇ Äõ¸® Æ®¸®°¡ »ý¼ºµË´Ï´Ù.

SELECT shoelace.sl_name, shoelace.sl_avail,
       shoelace.sl_color, shoelace.sl_len,
       shoelace.sl_unit, shoelace.sl_len_cm
  FROM shoelace shoelace;

ÀÌ Æ®¸®°¡ ·ê ½Ã½ºÅÛ¿¡ ÀüÇØÁý´Ï´Ù. ·ê ½Ã½ºÅÛÀº ¹üÀ§ Å×À̺íÀ» ÂüÁ¶ÇØ, ¸±·¹À̼ǿ¡ ´ëÇØ¼­ ·êÀÌ Á¸ÀçÇÏ´ÂÁö Á¶»çÇÕ´Ï´Ù. shoelace(Çö½ÃÁ¡¿¡¼­´Â À¯ÀÏÇÑ ºä)¿¡ ´ëÇÑ ¹üÀ§ Å×À̺í Ç׸ñÀ» ó¸®ÇÒ ¶§, Äõ¸® Æ®¸®·Î _RETURN·êÀ» °ËÃâÇÕ´Ï´Ù.

SELECT s.sl_name, s.sl_avail,
       s.sl_color, s.sl_len, s.sl_unit,
       s.sl_len * u.un_fact AS sl_len_cm
  FROM shoelace *OLD*, shoelace *NEW*,
       shoelace_data s, unit u
 WHERE s.sl_unit = u.un_name;

ºä¸¦ Àü°³Çϱâ À§Çؼ­, ÀçÀÛ¼ºÀº ´Ü¼øÇÏ°Ô ·êÀÇ µ¿ÀÛ Äõ¸® Æ®¸®¸¦ °¡Áö´Â ¼­ºêÄõ¸® ¹üÀ§ Å×À̺íÀÇ Ç׸ñÀ» ¸¸µé¾î, ºä¸¦ ÂüÁ¶Çϰí ÀÖ´ø º»·¡ ¹üÀ§ Å×À̺íÀ» ¿Å°Ü³õ½À´Ï´Ù. ÀçÀÛ¼ºµÈ °á°úÀÇ Äõ¸® Æ®¸®´Â, ÀÌÇÏ¿Í °°ÀÌ ÀÔ·ÂÇßÀ» °æ¿ì¿Í °ÅÀÇ °°½À´Ï´Ù.

SELECT shoelace.sl_name, shoelace.sl_avail,
       shoelace.sl_color, shoelace.sl_len,
       shoelace.sl_unit, shoelace.sl_len_cm
  FROM (SELECT s.sl_name,
               s.sl_avail,
               s.sl_color,
               s.sl_len,
               s.sl_unit,
               s.sl_len * u.un_fact AS sl_len_cm
          FROM shoelace_data s, unit u
         WHERE s.sl_unit = u.un_name) shoelace;

±×·¯³ª ÇÑ °¡ÁöÀÇ Â÷À̰¡ ÀÖ½À´Ï´Ù. ¼­ºêÄõ¸®ÀÇ ¹üÀ§ Å×À̺íÀÌ 2 °³ÀÇ Ãß°¡ Ç׸ñ shoelace *OLD*¿Í shoelace *NEW*¸¦ °¡Áö°í ÀÖ´Â °ÍÀÔ´Ï´Ù. ÀÌ·¯ÇÑ Ç׸ñÀº ¼­ºêÄõ¸®ÀÇ °áÇÕ Æ®¸®³ª ´ë»ó ¸®½ºÆ®·Î ÂüÁ¶µÇÁö ¾ÊÀ¸¹Ç·Î, Á÷Á¢ Äõ¸®¿¡¼­´Â »ç¿ëµÇÁö ¾Ê½À´Ï´Ù. ÀçÀÛ¼ºÀº ±×°ÍµéÀ» »ç¿ëÇØ, ºä¸¦ ÂüÁ¶ÇÑ ¹üÀ§ Å×À̺íÀÇ Ç׸ñ¿¡ ¿ø·¡ Á¸ÀçÇÑ Á¢±Ù±ÇÇÑ È®ÀÎ Á¤º¸¸¦ ÀúÀåÇÕ´Ï´Ù. ÀÌ ¹æ¹ýÀ¸·Î, ÀçÀÛ¼ºµÈ Äõ¸®¿¡¼­ Á÷Á¢ ºä¸¦ »ç¿ëÇϰí ÀÖÁö ¾Ê¾Æµµ, ÁýÇàÀÚ´Â »ç¿ëÀÚ°¡ ±× ºä¿¡ Á¢±ÙÇϱâ À§ÇÑ ¿Ã¹Ù¸¥ ±ÇÇÑÀ» °¡Áö°í ÀÖ´ÂÁö È®ÀÎÇÕ´Ï´Ù.

À̰ÍÀÌ ÃÖÃÊ·Î Àû¿ëµÇ´Â ·êÀÔ´Ï´Ù. ·ê ½Ã½ºÅÛÀº ÃÖ»óÁ¤µµÀÇ Äõ¸®ÀÇ ³ª¸ÓÁö(ÀÌ ¿¹¿¡¼­´Â ´õ ÀÌ»ó ¾ø½À´Ï´Ù)ÀÇ ¹üÀ§ Å×À̺íÀÇ Ç׸ñÀ» °è¼Ó üũÇÕ´Ï´Ù. ±×¸®°í ·ê ½Ã½ºÅÛÀº, Ãß°¡µÈ ¼­ºêÄõ¸®ÀÇ ¹üÀ§ Å×À̺í Ç׸ñÀÌ ºä¸¦ ÂüÁ¶ÇÒÁö¸¦ ¹Ýº¹ÀûÀ¸·Î È®ÀÎÇÕ´Ï´Ù (±×·¯³ª *OLD*³ª *NEW*´Â Àü°³ÇÏÁö ¾Ê½À´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é ¹«ÇÑ ¹Ýº¹ÀÌ µÇ¾î ¹ö¸³´Ï´Ù! ). ÀÌ ¿¹¿¡¼­´Â shoelace_data³ª unit¿ëÀÇ ÀçÀÛ¼º ·êÀº ¾ø½À´Ï´Ù. µû¶ó¼­, ÀçÀÛ¼ºÀÌ ¿Ï°áµÇ°í, »ó±â°¡ Ç÷¡³Ê¿¡°Ô °Ç³×Áö´Â ÃÖÁ¾ÀûÀÎ °á°ú°¡ µË´Ï´Ù.

±×·±µ¥, °¡°Ô¿¡ ³õ¿©Á® ÀÖ´Â ½Å¹ß²ö(ÀÇ »ö°ú »çÀÌÁî)¿¡ ÀÏÄ¡ÇÏ´Â ±¸µÎ°¡ °¡°Ô¿¡ ÀÖ´ÂÁö, ¿ÏÀüÇÏ°Ô ÀÏÄ¡ÇÏ´Â ½Å¹ß²öÀÇ Àç°í¼ö°¡ 2ÀÌ»ó ÀÖÀ»Áö ¾øÀ»Áö¸¦ ÆÄ¾ÇÇÏ´Â Äõ¸®¸¦ ½á º¾½Ã´Ù.

SELECT * FROM shoe_ready WHERE total_avail >= 2;

 shoename | sh_avail | sl_name | sl_avail | total_avail
----------+----------+---------+----------+-------------
 sh1      |        2 | sl1     |        5 |           2
 sh3      |        4 | sl7     |        7 |           4
(2 rows)

À̹ø ÆÄ¼­ÀÇ Ãâ·ÂÀº ÀÌÇÏÀÇ Äõ¸® Æ®¸®ÀÔ´Ï´Ù.

SELECT shoe_ready.shoename, shoe_ready.sh_avail,
       shoe_ready.sl_name, shoe_ready.sl_avail,
       shoe_ready.total_avail
  FROM shoe_ready shoe_ready
 WHERE shoe_ready.total_avail >= 2;

ÃÖÃÊ·Î Àû¿ëµÇ´Â ·êÀº shoe_readyºä¿ëÀÇ °ÍÀ¸·Î, Äõ¸® Æ®¸®¿¡ À־ÀÇ °á°ú´Â ÀÌÇϸ® °°ÀÌ µË´Ï´Ù.

SELECT shoe_ready.shoename, shoe_ready.sh_avail,
       shoe_ready.sl_name, shoe_ready.sl_avail,
       shoe_ready.total_avail
  FROM (SELECT rsh.shoename,
               rsh.sh_avail,
               rsl.sl_name,
               rsl.sl_avail,
               min(rsh.sh_avail, rsl.sl_avail) AS total_avail
          FROM shoe rsh, shoelace rsl
         WHERE rsl.sl_color = rsh.slcolor
           AND rsl.sl_len_cm >= rsh.slminlen_cm
           AND rsl.sl_len_cm <= rsh.slmaxlen_cm) shoe_ready
 WHERE shoe_ready.total_avail >= 2;

¸¶Âù°¡Áö·Î, shoe¿Íshoelace¿ëÀÇ ·êÀº ¼­ºêÄõ¸®ÀÇ ¹üÀ§ Å×À̺í·Î¼­ ´ë¿ëµÇ¾î 3 ·¹º§ÀÇ ÃÖÁ¾ Äõ¸® Æ®¸®·Î À̲ü´Ï´Ù.

SELECT shoe_ready.shoename, shoe_ready.sh_avail,
       shoe_ready.sl_name, shoe_ready.sl_avail,
       shoe_ready.total_avail
  FROM (SELECT rsh.shoename,
               rsh.sh_avail,
               rsl.sl_name,
               rsl.sl_avail,
               min(rsh.sh_avail, rsl.sl_avail) AS total_avail
          FROM (SELECT sh.shoename,
                       sh.sh_avail,
                       sh.slcolor,
                       sh.slminlen,
                       sh.slminlen * un.un_fact AS slminlen_cm,
                       sh.slmaxlen,
                       sh.slmaxlen * un.un_fact AS slmaxlen_cm,
                       sh.slunit
                  FROM shoe_data sh, unit un
                 WHERE sh.slunit = un.un_name) rsh,
               (SELECT s.sl_name,
                       s.sl_avail,
                       s.sl_color,
                       s.sl_len,
                       s.sl_unit,
                       s.sl_len * u.un_fact AS sl_len_cm
                  FROM shoelace_data s, unit u
                 WHERE s.sl_unit = u.un_name) rsl
         WHERE rsl.sl_color = rsh.slcolor
           AND rsl.sl_len_cm >= rsh.slminlen_cm
           AND rsl.sl_len_cm <= rsh.slmaxlen_cm) shoe_ready
 WHERE shoe_ready.total_avail > 2;

´ÙÀ½¿¡ Ç÷¡³Ê´Â ÀÌ Æ®¸®¸¦ 2 ·¹º§ÀÇ Äõ¸® Æ®¸®·Î ÁÙÀÔ´Ï´Ù. ¸Ç ¹ØÀÇ SELECT¸í·ÉÀº µû·Î µû·Î ó¸®ÇÒ Çʿ䰡 ¾ø±â ¶§¹®¿¡, 2¹øÂ°ÀÇ SELECT¿¡ "²ø¾î¿É´Ï´Ù". ±×·¯³ª 2¹øÂ°ÀÇ SELECT´Â Áý°è ÇÔ¼ö¸¦ °¡Áö±â ¶§¹®¿¡, Á¤Á¡À¸·ÎºÎÅÍ´Â ±¸º°µË´Ï´Ù. ¸¸¾à ±×°ÍµéÀ» ²ø¾î¿À°ÔµÇ¸é ¸Ç À§ÀÇ SELECTÀÇ µ¿ÀÛÀ» ¹Ù²Ù°Ô µÇ´Âµ¥, ±×°ÍÀ» ¿øÄ¡´Â ¾Ê½À´Ï´Ù. ±×·¯³ª, Äõ¸® Æ®¸®¸¦ ÁÙÀÌ´Â ÃÖÀûÈ­¸¦, ÀçÀÛ¼º ½Ã½ºÅÛ ÀÚ½ÅÀ¸·Î ÀǽÄÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù.

35.2.2. ºñSELECTºä ·ê ¸í·É¹®

Áö±Ý±îÁöÀÇ ºä ·êÀÇ ¼³¸í¿¡¼­´Â Äõ¸® Æ®¸®ÀÇ 2°¡Áö ¼¼ºÎ»çÇ׿¡ ´ëÇÏ¿© ´Ù·çÁö ¾Ê¾Ò½À´Ï´Ù. ±×°ÍµéÀº, ¸í·É ŸÀÔ°ú °á°ú ¸±·¹À̼ÇÀÔ´Ï´Ù. ½ÇÁ¦, ºä ·ê´Â ÀÌ·¯ÇÑ Á¤º¸¸¦ ÇÊ¿ä·Î ÇÏÁö ¾Ê½À´Ï´Ù.

SELECT¿Í ´Ù¸¥ ¸í·É¿¡ ´ëÇÑ Äõ¸® Æ®¸®ÀÇ »çÀÌ¿¡´Â Å« Â÷ÀÌ´Â ¾ø½À´Ï´Ù. ±×°ÍµéÀº ºÐ¸íÇÏ°Ô ´Ù¸¥ ¸í·ÉÇüÀ» °¡Áö°í ÀÖ¾î, SELECTÀÌ¿ÜÀÇ ¸í·É¿¡¼­, °á°ú ¸±·¹À̼ÇÀº °á°úÀÇ ÀúÀå¼Ò°¡ µÇ´Â ¹üÀ§ Å×À̺íÀÇ Ç׸ñÀ» Áö½ÃÇÕ´Ï´Ù. ±× À̿ܿ¡´Â ¿ÏÀüÈ÷ °°½À´Ï´Ù. µû¶ó¼­, a¿Í bÀÇ ¿­À» °¡Áö´Â Å×À̺ít1, t2¿¡ ´ëÇÑ ÀÌÇÏÀÇ 2°³ÀÇ ¸í·É¹®ÀÇ Äõ¸® Æ®¸®´Â, °ÅÀÇ °°½À´Ï´Ù.

SELECT t2.b FROM t1, t2 WHERE t1.a = t2.a;

UPDATE t1 SET b = t2.b FROM t2 WHERE t1.a = t2.a;

ÀÌÇÏ¿¡, ±¸Ã¼ÀûÀ¸·Î °¡¸®Åµ´Ï´Ù.

°á°úÀûÀ¸·Î, ¾çÂÊ ¸ðµÎÀÇ Äõ¸® Æ®¸®´Â ºñ½ÁÇÑ ½ÇÇà °èȹÀÌ µË´Ï´Ù. ±×°ÍµéÀº 2°³ÀÇ Å×À̺íÀÇ °áÇÕÀÔ´Ï´Ù. UPDATE¿¡¼­´Â t1·ÎºÎÅÍ ºüÁ® ÀÖ´Â ¿­Àº Ç÷¡³Ê¿¡ ÀÇÇØ ´ë»ó ¸®½ºÆ®¿¡ Ãß°¡µÇ¾î, ÃÖÁ¾ÀÇ Äõ¸® Æ®¸®´Â ÀÌÇÏ¿Í °°ÀÌ µË´Ï´Ù.

UPDATE t1 SET a = t1.a, b = t2.b FROM t2 WHERE t1.a = t2.a;

±×¸®°í, °áÇÕÀ» ½ÇÇàÇÑ ÁýÇàÀÚÀÇ

SELECT t1.a, t2.b FROM t1, t2 WHERE t1.a = t2.a;

°á°ú ÁýÇÕ°ú ¿ÏÀüÈ÷ °°Àº °á°ú ÁýÇÕÀ» ÀÛ¼ºÇÕ´Ï´Ù. ±×·¯³ª UPDATE¿¡ ¾à°£ÀÇ ¹®Á¦°¡ ÀÖ½À´Ï´Ù. ÁýÇàÀÚ´Â, °áÇÕÀÌ ½Ç½ÃÇϴ ó¸®ÀÇ °á°ú°¡ ¹«¾ùÀ» ÀǹÌÇϰí ÀÖ´ÂÁö °ü¿©ÇÏÁö ¾Ê½À´Ï´Ù. ÁýÇàÀÚ´Â ´ÜÁö °á°ú°¡ µÇ´Â ÇàÀÇ ÁýÇÕÀ» ÀÛ¼ºÇÒ »ÓÀÔ´Ï´Ù. Çϳª´Â SELECT¸í·É, ´Ù¸¥ Çϳª´Â UPDATE¸í·ÉÀÎ °ÍÀÇ Â÷ÀÌ´Â, ÁýÇàÀÚ¸¦ È£ÃâÇÏ´Â Ãø¿¡¼­ ´Ù·ç¾îÁý´Ï´Ù. È£Ãâ ÃøÀº(Äõ¸® Æ®¸®¸¦ º¸¸é), À̰ÍÀÌ UPDATEÀÎ °ÍÀ» ¾Ë°í ÀÖ¾î, ÀÌ °á°ú°¡ Å×À̺ít1¿¡ µé¾î°¡Áö ¾ÊÀ¸¸é ¾È µÇ´Â °ÍÀ» ¾Ë°í ÀÖ½À´Ï´Ù. ±×·¯³ª, ¾î¶² ÇàÀÌ »õ·Î¿î Çà¿¡ ÀÇÇØ ġȯµÇ¾î¾ß¸¸ ÇÏ´Â °ÍÀϱî¿ä?

ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ, UPDATE¹®(DELETE¹®ÀÇ °æ¿ìµµ ¸¶Âù°¡Áö)ÀÇ ´ë»ó ¸®½ºÆ®¿¡ ´Ù¸¥ Ç׸ñÀ» µ¡ºÙÀÏ ¼ö ÀÖ½À´Ï´Ù. ±×°ÍÀº, ÇöÀçÀÇ Å¸Ç® ID(CTID)ÀÔ´Ï´Ù. À̰ÍÀº ±× ÇàÀÇ ÆÄÀÏ ºí·Ï ¹øÈ£¿Í ºí·Ï »óÀÇ À§Ä¡¸¦ °¡Áö´Â ½Ã½ºÅÛ¿­ÀÔ´Ï´Ù. Å×À̺íÀ» ¾Ë°í ÀÖ´Â °æ¿ì, CTID¸¦ »ç¿ëÇØ, º»·¡ÀÇ t1ÇàÀ» ÃßÃâÇØ °»½ÅÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. CTID¸¦ ´ë»ó ¸®½ºÆ®¿¡ Ãß°¡Çϸé, Äõ¸®´Â ÀÌÇÏ¿Í °°ÀÌ µË´Ï´Ù.

SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;

±×·³, PostgreSQLÀÇ ´Ù¸¥ »ó¼¼ ¼³¸í¿¡ µé¾î°©´Ï´Ù. Å×À̺íÀÇ ÇàÀº µ¡¾²±âµÇÁö ¾ÊÀ¸¹Ç·Î, ROLLBACK󸮴 ºü¸¨´Ï´Ù. UPDATE¿¡¼­´Â, (CTID¸¦ ¾ø¾Ø ÈÄ) Å×ÀÌºí¿¡ »õ·Î¿î °á°úÇàÀÌ »ðÀԵǾî CTID°¡ Áö½ÃÇÏ´Â ¿À·¡µÈ ÇàÀÇ Çà Çì´õ ³»ÀÇ cmax¿Í xmaxÇ׸ñÀº ÇöÀçÀÇ ¸í·É Ä«¿îÅÍ¿Í ÇöÀçÀÇ Æ®·£Àè¼Ç ID·Î ¼³Á¤µË´Ï´Ù. ÀÌ¿Í °°ÀÌ ÇØ, ¿À·¡µÈ ÇàÀº ¼û°ÜÁ® Æ®·£Àè¼ÇÀÌ Ä¿¹ÔµÈ ÈÄ, Áø°øÃ»¼Ò±â(vacuum cleaner)¿¡ ÀÇÇØ ½ÇÁ¦·Î »èÁ¦ÇÒ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ·¯ÇÑ ¼¼ºÎ»çÇ×À» ÀüºÎ ÀÌÇØÇÒ ¼ö ÀÖÀ¸¸é, ¾î¶² ¸í·É¿¡ ´ëÇØ¼­µµ ¿ÏÀüÈ÷ ¶È°°ÀÌ ÇØ, ºäÀÇ ·êÀ» °£´ÜÇÏ°Ô Àû¿ëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. Â÷À̰¡ ¾ø½À´Ï´Ù.

35.2.3. PostgreSQL¿¡ À־ÀÇ ºäÀÇ ´É·Â

¿©±â±îÁö, ·ê ½Ã½ºÅÛÀÌ ¾î¶»°Ô ºäÀÇ Á¤ÀǸ¦ ¿ø·¡ÀÇ Äõ¸® Æ®¸®¿¡ ÅëÇÕÇÏ´ÂÁö¸¦ ÇØ¼³Çß½À´Ï´Ù. µÎ¹øÂ° ¿¹¿¡¼­´Â, 1°³ÀÇ ºä·ÎºÎÅÍÀÇ ´Ü¼øÇÑ SELECT¿¡ ÀÇÇØ, ÃÖÁ¾ÀûÀ¸·Î 4°³ÀÇ Å×À̺íÀ» °áÇÕÇÏ´Â Äõ¸® Æ®¸®°¡ »ý¼ºµÇ¾ú½À´Ï´Ù(unit´Â ´Ù¸¥ À̸§À¸·Î µÎ¹ø »ç¿ëµÇ¾ú½À´Ï´Ù).

ºä¸¦ ·ê ½Ã½ºÅÛÀ¸·Î ±¸ÇöÇÏ´Â ÀÌÁ¡Àº, ¾î´À Å×À̺íÀ» °Ë»öÇØ¾ßÇÒ °ÍÀΰ¡, ±×·¯ÇÑ Å×ÀÌºí°£ÀÇ °ü·Ã¼º, ºä·ÎºÎÅÍÀÇ Á¦¾à Á¶°Ç, º»·¡ÀÇ Äõ¸® Á¶°Ç¿¡ °üÇÑ Á¤º¸¸¦ ¸ðµÎ, Ç÷¡³Ê°¡ 1°³ÀÇ Äõ¸® Æ®¸®¾È¿¡ °¡Áö°í ÀÖ´Â °ÍÀÔ´Ï´Ù. º»·¡ÀÇ Äõ¸®°¡ ÀÌ¹Ì ºä¿¡ ´ëÇÑ °áÇÕÀÏ ¶§µµ °°½À´Ï´Ù. Ç÷¡³Ê´Â ¿©±â¼­ ¾î¶² °ÍÀÌ Äõ¸® ó¸®ÀÇ ÃÖÀû °æ·ÎÀÎÁö¸¦ °áÁ¤ÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. Ç÷¡³Ê´Â º¸°ü À¯ÁöÇÏ´Â Á¤º¸°¡ ¸¹À¸¸é ¸¹À»¼ö·Ï, º¸´Ù ÁÁÀº °áÁ¤À» ³»¸± ¼ö°¡ ÀÖ½À´Ï´Ù. ±×¸®°í PostgreSQL¿¡ ±¸ÇöµÇ°í ÀÖ´Â ·ê ½Ã½ºÅÛÀº, À̰ÍÀÌ Çö½ÃÁ¡¿¡¼­ Á¦°øµÇ°í ÀÖ´Â ¸ðµç Á¤º¸ÀÓÀ» º¸ÁõÇÕ´Ï´Ù.

35.2.4. ºäÀÇ °»½Å

ºä°¡ INSERT, UPDATE, DELETEµîÀÇ ´ë»ó ¸±·¹À̼ÇÀ¸·Î¼­ À̸§ÀÌ ºÙ¿©Á³À» °æ¿ì´Â ¾î¶»°Ô µÇ´Â °ÍÀϱî¿ä? À§¿¡¼­ ¼³¸íÇÑ °Í °°Àº ġȯÀ» ÇÑ ÈÄ¿¡, °á°ú ¸±·¹À̼ÇÀÌ ¼­ºêÄõ¸®ÀÇ ¹üÀ§ Å×À̺í Ç׸ñÀ» °¡¸®Å°´Â Äõ¸® Æ®¸®°¡ »ý±é´Ï´Ù. À̰ÍÀ» »ç¿ëÇÒ ¼ö ¾øÀ¸¹Ç·Î, ÀçÀÛ¼ºÀº ±×·¯ÇÑ °ÍÀÌ »ý¼ºµÈ °ÍÀ» ¾Ë¸é ¿¡·¯¸¦ ¹ß»ýÇÕ´Ï´Ù.

À̰ÍÀ» ¹Ù²Ù±â À§Çؼ­, ÀÌ·¯ÇÑ Á¾·ùÀÇ ¸í·ÉÀÇ µ¿ÀÛÀ» ¹Ù²Ù´Â ·êÀ» Á¤ÀÇÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×°ÍÀÌ ´ÙÀ½ ¼½¼ÇÀÇ ³íÁ¦°¡ µË´Ï´Ù.