9. È®Àå SQL : ¿¬»êÀÚ

POSTGRES ´Â ¿ÞÂÊ, ¿À¸¥ÂÊ ´ÜÀÏ ¿¬»êÀÚ¿Í ¹ÙÀ̳ʸ® ¿¬»êÀÚ¸¦ Á¦°øÇÑ´Ù. ¿¬»êÀÚ´Â ¼­·Î ´Ù¸¥ ¼ýÀÚ³ª ÇüÀÇ ¸Å°³ÀÎÀÚ¿¡ °úÁß ÀûÀçµÇ°Å³ª Àç»ç¿ëµÉ ¼ö ÀÖ´Ù. ¿¬»êÀÚ°¡ ¾Ö¸ÅÇÑ À§Ä¡¿¡ ÀÖ´Ù¸é ½Ã½ºÅÛÀº ¿Ã¹Ù¸¥ ¿¬»êÀÚ¸¦ °áÁ¤ÇÒ ¼ö ¾øÀ¸ ¸ç, ¿¡·¯¸¦ ¹ÝȯÇÑ´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡, ¾î´À ¿¬»êÀÚ¸¦ »ç¿ëÇÒ °ÍÀÎÁö ÀÌÇØ¸¦ µ½ ±â À§ÇØ ¿ÞÂÊ/¿À¸¥ÂÊ ÇÇ¿¬»êÀÚ¸¦ Çüº¯È¯ ÇÒ ¼ö ÀÖ´Ù.

µÎ°³ÀÇ complex ¸â¹ö¸¦ ´õÇÏ´Â ¿¬»êÀÚ¸¦ ¸¸µå·Á¸é ¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µÈ´Ù. ¸ÕÀú »õ·Î¿î Çü¿¡ ÇÊ¿äÇÑ ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ±×¸®°í ³ª¼­, ÇØ´ç ¿¬»êÀÚ¸¦ À̵é ÇÔ ¼ö¿Í ÇÔ²² ¸¸µé¸é µÈ´Ù.

    CREATE FUNCTION complex_add(complex, complex) RETURNS complex AS '$PWD/obj/complex.so' LANGUAGE 'c';
    CREATE OPERATOR + ( leftarg = complex, rightarg = complex, procedure = complex_add, commutator = + );

sfunc2 ¸¸ Á¤ÀÇÇÑ´Ù¸é, °¢°¢ÀÇ ÀνºÅϽº¿¡¼­ ¼Ó¼º°ª°ú´Â µ¶¸³ÀûÀ¸·Î ¼öÇàµÇ´Â ÇÔ¼ö ·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. "Count" ´Â ÀÌ·¯ÇÑ aggregate Á¾·ùÀÇ ´ëÇ¥ÀûÀÎ °æ¿ìÀÌ´Ù. "Count" ´Â 0¿¡¼­ ½ÃÀ۵ǰí, °¢°¢ÀÇ ÀνºÅϽº¸¶´Ù ÇÕ°è¿¡ 1ÀÌ ´õÇØÁö¸ç ÀνºÅϽºÀÇ °ªÀº ¹«½ÃµÈ´Ù. ¿©±â¼­´Â POSTGRES ³»Àå ·çÆ¾ÀÎ int4inc ¸¦ »ç¿ëÇÑ´Ù. ÀÌ ·çƾÀº ÇØ´ç ÀÎÀÚÀÇ °ªÀ» Çϳª Áõ°¡½ÃŲ´Ù.

   CREATE AGGREGATE my_count (sfunc2 = int4inc, -- add one
                              basetype = int4, stype2 = int4,
                              initcond2 = '0'
                             );
   
   SELECT my_count(*) as emp_count from EMP;
 
 
   emp_count
   ---------
           4

"Average" ´Â ÇÕ°è¿Í Ƚ¼ö, µÑ´Ù °è»êÇÏ´Â ÇÔ¼ö¸¦ ÇÊ¿ä·Î ÇÏ´Â aggregate ÀÇ ¿¹ÀÌ ´Ù. ¸ðµç ÀνºÅϽº°¡ ó¸®µÇ°í ³ª¸é, aggregate ¿¡¼­ ¸¶Áö¸· ÀÀ´äÀ¸·Î Çհ踦 Ƚ ¼ö·Î ³ª´«´Ù. ÀÌÀü¿¡ »ç¿ëÇß´ø int4pl °ú int4inc ¿Í ¸¶Âù°¡Áö·Î int4div ´Â POSTGRES ÀÇ Á¤¼ö ³ª´°¼À ·çƾÀ̸ç, Çհ踦 Ƚ¼ö·Î ³ª´« °á°ú¸¦ °è»êÇÑ´Ù.

   CREATE AGGREGATE my_average (sfunc1 = int4pl,  -- sum
                                basetype = int4,
                                stype1 = int4,
                                sfunc2 = int4inc, -- count
                                stype2 = int4,
 
          finalfunc = int4div, -- division
                                initcond1 = '0',
                                initcond1 = '0'
                               );
 
   SELECT my_average(salary) as emp_average FROM EMP;
 
 
   emp_average
   ------------
          1640