5. Áøº¸ÀûÀÎ POSTGRES SQL ÀÇ Æ¯Â¡

ÀÌÁ¦ ±âº»ÀûÀÎ µ¥ÀÌÅÍ °ü¸®¿Í´Â ±¸º°µÇ´Â POSTGRES ÀÇ Æ¯Â¡¿¡ ´ëÇØ¼­ ³íÀÇÇØ º¼ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ Æ¯Â¡¿¡´Â »ó¼Ó, ½Ã°£ ¿©Çà, ºñ¿øÀÚÈ­ µ¥ÀÌÅÍ °ªµé (array- ¿Í set-valued ¼Ó¼º) µîÀÌ ÀÖ´Ù. ÀÌÀå¿¡¼­ ³ª¿À´Â ¿¹´Â ±³Àç(tutorial) µð·ºÅ丮¿¡ 'advance.sql' ¿¡ ³ª¿ÍÀÖ´Ù. (À̰ÍÀ» ¾î¶»°Ô »ç¿ëÇÏ´Â Áö´Â ¾ÕÀåÀÇ ¼­·Ð ºÎºÐÀ» ÂüÁ¶ÇÏÀÚ.)

5.1 »ó¼Ó

µÎ°³ÀÇ Å¬·¡½º¸¦ ¸¸µé¾î º¸ÀÚ. 'capitals' Ŭ·¡½º´Â ÇϳªÀÇ µµ½Ã, ÁÖÀÇ ¼öµµ ¸¦ Æ÷ÇÔÇÑ´Ù. ÀÚ¿¬½º·´°Ô, 'capitals' Ŭ·¡½º´Â 'cities' ·ÎºÎÅÍ »ó¼Ó¹Þ¾Æ¾ß ÇÑ ´Ù.

   CREATE TABLE cities (
            name        text,
            population  float,
            altitude    int            -- (in ft)
   );
 
   CREATE TABLE capitals (
            state       char2
   ) INHERITS (cities);

ÀÌ °æ¿ì¿¡, 'capitals' ÀÇ ÀνºÅϽº´Â ±×ÀÇ ºÎ¸ð·ÎºÎÅÍ ¸ðµç ¼Ó¼º ('name', 'population', 'altitude') ¸¦ »ó¼Ó¹Þ´Â´Ù. ¼Ó¼º 'name' ÀÇ Å¸ÀÔÀº 'text' ÀÌ´Ù. 'text' ´Â °¡º¯ ±æÀÌÀÇ ¾Æ½ºÅ° ¹®ÀÚ¿­¿¡ »ç¿ëµÇ´Â POSTGRES ¿¡ ³»ÀåµÇ¾î Àִ ŸÀÔ ÀÌ´Ù. ¼Ó¼º 'population' ÀÇ Å¸ÀÔÀº 'float4' À̸ç, ÀÌ Å¸ÀÔÀº ´õºí Á¤¹ÐµµÀÇ ºÎµ¿¼Ò¼ö¿¡ »ç¿ëµÇ´Â POSTGRES ³»ÀåÇüÀÌ´Ù. ÁÖÀÇ ¼öµµ(state capitals)´Â ¶Ç´Ù¸¥ ¼Ó¼ºÀ¸·Î ÁÖ¸¦ ³ªÅ¸³»´Â 'state' ¸¦ °¡Áö°í ÀÖ´Ù. POSTGRES ¿¡¼­, ÇϳªÀÇ Å¬·¡ ½º´Â 0°³ ÀÌ»óÀÇ Å¬·¡½º·ÎºÎÅÍ »ó¼Ó¹ÞÀ» ¼ö ÀÖ°í,(ÁÖ4)ÇϳªÀÇ ÁúÀÇ´Â ¾î¶² Ŭ·¡½ºÀÇ ¸ðµç ÀνºÅϽº³ª À̰Ͱú ÇÔ²² ÀνºÅϽºÀÇ ÀÚ¼Õ±îÁö ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é, ¾Æ·¡ÀÇ ÁúÀÇ´Â °íµµ 500 ÇÇÆ® º¸´Ù ³ôÀº °÷¿¡ ÀÖ´Â µµ½Ã¸¦ °Ë»öÇÏ´Â °ÍÀÌ´Ù.

ÁÖ4) »ó¼Óü°è´Â ¹Ù·Î acyclic ±×·¡ÇÁÀÌ´Ù.

   SELECT name, altitude
   FROM cities
   WHERE altitude > 500;
 
 
   name     |altitude
   ---------+--------
   Las Vegas|    2174
   Mariposa |    1953
   (2 rows)

500 ÇÇÆ® ÀÌ»ó¿¡ ÀÖ´Â ¸ðµç µµ½Ã¸¦ ÁÖÀÇ ¼öµµ¸¦ Æ÷ÇÔÇÏ¿© ã°íÀÚ ÇÑ´Ù¸é, ÇØ´ç ÁúÀÇ´Â ´ÙÀ½°ú °°´Ù.

   SELECT c.name, c.altitude
   FROM cities* c
   WHERE c.altitude > 500;

°á°ú´Â ´ÙÀ½°ú °°´Ù.

   name     |altitude
   ---------+--------
   Las Vegas|    2174
   Mariposa |    1953
   Madison  |     845
   (3 rows)

'cities' ´ÙÀ½ÀÇ '*' ´Â 'cities' ¿Í 'cities' ¿¡¼­ »ó¼Ó¹ÞÀº ¸ðµç Ŭ·¡½º¸¦ ³ªÅ¸ ³½´Ù. ÀÌ¹Ì ¾Õ¿¡¼­ »ìÆìº» ¸¹Àº ¸í·É - select, update, delete - Àº 'alter' ¸í·É°ú À¯»çÇÑ ÀÌ·¯ÇÑ '*' Ç¥±â¸¦ Á¦°øÇÑ´Ù.

5.2 ½Ã°£ ¿©Çà

POSTGRES ´Â ½Ã°£ ¿©Çà¿¡ ´ëÇÑ Ç¥±â¹ýÀ» Áö¿øÇÑ´Ù. ÀÌ·¯ÇÑ Æ¯Â¡Àº »ç¿ëÀÚ·Î ÇÏ¿©±Ý ¿ª»çÀûÀÎ ÁúÀǸ¦ ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ¿¹¸¦ µé¸é, Mariposa µµ½ÃÀÇ ÇöÀçÀÇ Àα¸¸¦ °Ë»öÇÏ·Á¸é, ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

   SELECT * FROM cities WHERE name = 'Mariposa';
 
 
   name    |population|altitude
   --------+----------+--------
   Mariposa|      1320|    1953
   (1 row)
 

POSTGRES ´Â ÀÚµ¿ÀûÀ¸·Î ÇöÀç ½ËÁ¡¿¡¼­ÀÇ À¯È¿ÇÑ Mariposa µµ½ÃÀÇ ·¹Äڵ带 ãÀ» °ÍÀÌ´Ù. ¿©±â¿¡¼­ ½Ã°£¹üÀ§¸¦ ºÎ¿©ÇÒ ¼ö ÀÖ´Ù. Mariposa µµ½ÃÀÇ °ú°ÅÀÇ Àα¸¸¦ ¾Ë¾Æº¸·Á¸é,´ÙÀ½°ú °°ÀÌ ÁúÀÇÇÏ¸é µÈ´Ù.

 
   SELECT name, population
   FROM cities['epoch', 'now']
   WHERE name = 'Mariposa';

'epoch' ´Â ½Ã½ºÅÛ ½Ã°£ÀÇ ½ÃÀÛ½ËÁ¡À» ³ªÅ¸³½´Ù. (ÁÖ5) Áö±Ý±îÁöÀÇ ¸ðµç ¿¹Á¦¸¦ ½ÇÇà½ÃÄ×´Ù¸é, ÁúÀÇÀÇ °á°ú´Â ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.

ÁÖ5) UNIX ½Ã½ºÅÛ¿¡¼­´Â, ÀÌ ½ËÁ¡Àº Ç×»ó1970 GMT 1¿ù 1ÀÏ 00½ÃÀÌ´Ù.

   name    |population
   --------+----------
   Mariposa|      1200
   Mariposa|      1320
   (2 row)

½Ã°£¹üÀ§¿¡¼­ µðÆúÆ® ½ÃÀÛÁöÁ¡Àº ½Ã½ºÅÛÀÌ ½Ã°£À» Ç¥½ÃÇÒ ¼ö ÀÖ´Â ÃÖÃÊÀÇ ½Ã°¢À̸ç, µðÆúÆ® ³¡ÁöÁ¡Àº ÇöÀç ½Ã°¢ÀÌ´Ù. µû¶ó¼­, À§ÀÇ ½Ã°£¹üÀ§´Â "[,]." ¿Í °°ÀÌ ´ÜÃàÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ´Ù.

5.3 ¿øÀÚÈ­µÇÁö ¾ÊÀº °ª

°ü°èÇü ¸ðµ¨¿¡¼­ÀÇ °ü°èÀÇ ¼Ó¼ºÀº º¸Åë ¿øÀÚÈ­(atomic)µÈ´Ù´Â °ÍÀÌ´Ù. POSTGRES ¿¡´Â ÀÌ·¯ÇÑ Á¦ÇÑÀÌ ¾ø´Ù. ¼Ó¼ºÀº ÁúÀǾî·Î Á¢±ÙÇÒ ¼ö ÀÖ´Â º¸Á¶°ª(sub-values) À» °¡Áú ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é, ÇϳªÀÇ ¼Ó¼ºÀ» ±âº» ŸÀÔÀÇ ¹è¿­·Î ¸¸µé ¼ö ÀÖ ´Ù.

5.3.1 ¹è¿­

POSTGRES ¿¡¼­´Â ÇϳªÀÇ ÀνºÅϽºÀÇ ¼Ó¼ºÀº °íÁ¤±æÀÌ ¶Ç´Â °¡º¯±æÀÌÀÇ ´ÙÂ÷¿ø ¹è¿­ ·Î Á¤ÀÇ µÉ ¼ö ÀÖ´Ù. ¾î¶°ÇÑ ±âº»ÇüÀ̳ª »ç¿ëÀÚ Á¤ÀÇÇüÀÇ ¹è¿­µµ ¸¸µé ¼ö ÀÖ´Ù. ½Ç·Ê¸¦ º¸À̱â À§ÇØ, ¿©±â¼­´Â ¸ÕÀú ±âº»ÇüÀÇ ¹è¿­À» »ç¿ëÇÏ¿© Ŭ·¡½º¸¦ ¸¸µé¾î º¸ °Ú´Ù.

   CREATE TABLE SAL_EMP (
          name             text,
          pay_by_quarter   int4[],
          schedule         char16[][]
   );
 

À§ÀÇ ÁúÀÇ´Â SAL_EMP ·Î ºÒ¸®¿ì´Â Ŭ·¡½º¸¦, text ¹®ÀÚ¿­('name')°ú int4ÀÇ 1Â÷¿ø ¹è¿­('pay_by_quarter'), ±×¸®°í char16 ÀÇ 2Â÷¿ø ¹è¿­('schedule')ÀÇ ±¸¼ºÀ¸·Î »ý¼ºÇÑ´Ù. 'pay_by_quarter' ´Â »ç¿øµé¿¡°Ô Áö±ÞµÇ´Â 4µîºÐµÈ ±Þ·áÀ̸ç, 'schedule' ´Â »ç¿øµéÀÇ ÁÖ°£°èȹÀÌ´Ù. ÀÌÁ¦ µ¥ÀÌÅ͸¦ Á¶±Ý »ðÀÔÇØº¸ÀÚ. ¹è¿­¿¡ µ¥ÀÌÅ͸¦ Ãß°¡ÇÒ ¶§´Â, ÇØ´ç°ªÀº Áß°ýÈ£ »çÀÌ¿¡ ¿Í¾ß Çϰí, ÄÞ¸¶¿¡ ÀÇÇØ ±¸ºÐµÈ´Ù.

C ¸¦ ¾Ë°í ÀÖ´Ù¸é, ±¸Á¶Ã¼ÀÇ ÃʱâÈ­ ¹®¹ý°ú º°·Î ´Ù¸£Áö ¾Ê´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

   INSERT INTO SAL_EMP
        VALUES ('Bill',
                '{10000, 10000, 10000, 10000}',
                '{{"meeting", "lunch"}, {}}');
 
   INSERT INTO SAL_EMP
        VALUES ('Carol',
                '{20000, 25000, 25000, 25000}',
                '{{"talk", "consult"}, {"meeting"}}');

POSTGRES ¿¡¼­´Â ±âº»ÀûÀ¸·Î ¹è¿­¿¡¼­ ¹øÈ£¸¦ ºÙÀÏ ¶§ 1ºÎÅÍ ½ÃÀÛÇÑ´Ù. n °³ÀÇ ¿ø¼Ò¸¦ °¡Áø ¹è¿­Àº ¹è¿­[1] ¿¡¼­ ½ÃÀÛÇÏ¿© ¹è¿­[n]À¸·Î ³¡³­´Ù.

ÀÌÁ¦, SAL_EMP ¿¡ ¸î°³ÀÇ ÁúÀǸ¦ ´øÁ®º¸ÀÚ. ¸ÕÀú, ¾î´À ÇÑ ½ËÁ¡¿¡¼­ ¹è¿­Áß ÇϳªÀÇ ¿ø¼Ò¿¡ Á¢±ÙÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¸ÀÚ. ´ÙÀ½ÀÇ ÁúÀÇ´Â »ç¿øµé Áß ±Þ·áÀÇ µÎ¹øÂ° ¹è´ç±ÝÀÌ º¯°æµÈ »ç¶÷À» °Ë»öÇÑ´Ù.

   SELECT name
   FROM SAL_EMP
   WHERE SAL_EMP.pay_by_quarter[1] <>
         SAL_EMP.pay_by_quarter[2];
 
   name 
   -----
   Carol
   (1 row)

´ÙÀ½ÀÇ ÁúÀÇ´Â ¸ðµç »ç¿øµéÀÇ ±Þ·áÁß ¼¼¹øÂ° ¹è´ç±ÝÀ» º¸¿©ÁØ´Ù.

   SELECT SAL_EMP.pay_by_quarter[3] FROM SAL_EMP;
 
   pay_by_quarter
   --------------
            10000
            25000
   (2 rows)
 

POSTGRES ¿¡¼­´Â ¹è¿­ÀÇ Á¶°¢(slices), ¶Ç´Â º¸Á¶¹è¿­(subarrays)¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ ÁúÀÇ´Â Bill ÀÇ ÁÖ°£°èȹ¿¡¼­ óÀ½ µÎ¹øÂ°³¯ÀÇ Ã¹¹øÂ° ¾ÆÀÌÅÛÀ» °Ë»öÇÑ´Ù.

   SELECT SAL_EMP.schedule[1:2][1:1]
   FROM SAL_EMP
   WHERE SAL_EMP.name = 'Bill';
 
   schedule          
   ------------------
   {{"meeting"},{""}}
   (1 row)