7.2. Å×À̺í½Ä

Å×À̺í½ÄÀº, Å×À̺íÀ» °è»êÇϱâ À§ÇÑÀÇ °ÍÀÔ´Ï´Ù. Å×À̺í½Ä¿¡´Â FROM±¸°¡ Æ÷ÇԵǾî ÀÖ¾î ±× µÚ·Î ¿É¼ÇÀ¸·Î¼­ WHERE±¸, GROUP BY±¸, HAVING±¸¸¦ ºÙÀÏ ¼ö°¡ ÀÖ½À´Ï´Ù. ´Ü¼øÇÑ Å×À̺í½ÄÀº, ´ÜÁö µð½ºÅ©»óÀÇ À̸¥¹Ù ±âº» Å×À̺í·Î ºÒ¸®´Â Å×À̺íÀ» ÂüÁ¶ÇÒ »ÓÀÔ´Ï´Ù. ±×·¯³ª, ¿©·¯°¡Áö ¹æ¹ýÀ¸·Î ±âº» Å×À̺íÀ» ¼öÁ¤Çϰųª Á¶ÇÕÇϱâ À§Çؼ­º¸´Ù º¹ÀâÇÑ ½ÄÀ» »ç¿ëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

Å×À̺í½ÄÀÇ ¿É¼Ç WHERE±¸, GROUP BY±¸, ¹× HAVING±¸´Â, FROM±¸·Î ÆÄ»ýÇÑ Å×ÀÌºí¿¡ ´ëÇØ¼­ Â÷·ÊÂ÷·Ê·Î º¯È¯À» ½ÇÇàÇÏ´Â °æ·Î¸¦ ÁöÁ¤ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ º¯È¯¿¡ ÀÇÇØ °¡»ó Å×À̺íÀÌ 1°³ »ý¼ºµË´Ï´Ù. ±×¸®°í ÀÌ °¡»ó Å×À̺íÀÇ ÇàÀÌ ¼±Åà ¸®½ºÆ®¿¡°Ô °Ç³×Á® Äõ¸®ÀÇ Ãâ·ÂÇàÀÌ °è»êµË´Ï´Ù.

7.2.1. FROM±¸

FROM±¸ ´Â, Äĸ¶·Î ³ª´­ ¼ö ÀÖ¾ú´ø Å×À̺í ÂüÁ¶ ¸®½ºÆ®·Î ÁÖ¾îÁö´Â 1°³ÀÌ»óÀÇ Å×ÀÌºí¿¡¼­, 1°³ÀÇ Å×À̺íÀ» ÆÄ»ýÇÕ´Ï´Ù.

FROM 
table_reference
 [, 
table_reference
 [, ...]]

Å×À̺í ÂüÁ¶´Â, Å×À̺í¸í(½ºÅ°¸¶·Î ¼ö½ÄÇÒ ¼öµµ ÀÖ½À´Ï´Ù), ¶Ç´Â, ¼­ºêÄõ¸®, Å×ÀÌºí °áÇÕ, ±×·¯ÇÑ º¹ÀâÇÑ Á¶ÇÕ µî¿¡¼­ ÆÄ»ýµÈ Å×À̺íÀ» ÃëÇÒ ¼ö ÀÖ½À´Ï´Ù. FROM±¸¿¡ º¹¼öÀÇ Å×À̺í ÂüÁ¶°¡ ÀÖ´Â °æ¿ì, ±×°ÍµéÀº, WHERE±¸, GROUP BY±¸, ¹× HAVING±¸·Î º¯È¯ÇÒ ¼ö ÀÖ´Â Áß°£ÀûÀÎ °¡»ó Å×À̺íÀ» ¸¸µé±â À§Çؼ­ Å©·Î½º °áÇÕ(¾Æ·¡¸¦ ÂüÁ¶)µÇ¾î ÃÖÁ¾ÀûÀ¸·Î´Â ¸ðµç Å×À̺í½ÄÀÇ °á°ú°¡ µË´Ï´Ù.

Å×À̺í ÂüÁ¶·Î Å×À̺íÀÇ °è½Â °èÃþÀÇ ºÎ¸ð Å×À̺íÀÇ À̸§À» ÁöÁ¤Çϸé, Å×À̺í¸íÀÇ ¾Õ¿¡ ONLYŰ¿öµå°¡ ¾ø´Â °æ¿ì´Â, Å×À̺í ÂüÁ¶´Â ±× Å×ÀÌºí »Ó¸¸ÀÌ ¾Æ´Ï¶ó ±× ÀÚ³à Å×ÀÌºí¿¡ °è½ÂµÈ ¸ðµç ÇàÀ» »ý¼ºÇÕ´Ï´Ù. ±×·¯³ª, ÀÌ ÂüÁ¶´Â À̸§À» ÁöÁ¤ÇÑ Å×ÀÌºí¿¡ ³ªÅ¸³­ ¿­¸¸À» »ý¼ºÇØ, ÀÚ³à Å×À̺í·Î Ãß°¡µÈ ¿­Àº ¹«½ÃµË´Ï´Ù.

7.2.1.1. °áÇÕ Å×À̺í

°áÇÕ Å×À̺íÀº, 2°³ÀÇ(¿­¸Å ¶Ç´Â ÆÄ»ý) Å×ÀÌºí¿¡¼­, ÁöÁ¤ÇÑ °áÇÕ Á¾·ùÀÇ ±ÔÄ¢¿¡ µû¶ó ÆÄ»ýÇÑ Å×À̺íÀÔ´Ï´Ù. ³»ºÎ °áÇÕ, ¿ÜºÎ °áÇÕ, ¹× Å©·Î½º °áÇÕÀÌ »ç¿ë °¡´ÉÇÕ´Ï´Ù.

°áÇÕÀÇ Á¾·ù

Å©·Î½º °áÇÕ

T1
 CROSS JOIN 
T2

T1 ¿Í T2 ÀÇ ÇàÀÇ Á¶ÇÕ¿¡ ´ëÇØ¼­µµ, T1 ÀÇ ¸ðµç ¿­¿¡ °è¼ÓµÇ¾î, T2 ÀÇ ¸ðµç ¿­À» Æ÷ÇÔÇÑ ÇàÀÌ ÆÄ»ý Å×ÀÌºí¿¡ Æ÷ÇԵ˴ϴÙ. 2°³ÀÇ Å×À̺íÀÌ NÇà°ú MÇàÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù°í Çϸé, °áÇÕµÈ Å×À̺íÀÇ Çà¼ö´Â N¡¿MÇàÀÌ µË´Ï´Ù.

FROM T1 CROSS JOIN T2 ´Â FROM T1 , T2 ¿Í °°½À´Ï´Ù. ¶Ç(ÈļúÀÇ) FROM T1 INNER JOIN T2 ON TRUE¿Íµµ °°½À´Ï´Ù.

¼ö½Ä ÷ºÎ °áÇÕ

T1
 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN 
T2
 ON 
boolean_expression


T1
 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN 
T2
 USING ( 
join column list
 )

T1
 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN 
T2

INNER³ª OUTER´Â, »ý·« °¡´ÉÇÕ´Ï´Ù. INNER°¡ ±âº»°ªÀÌ µË´Ï´Ù. LEFT,RIGHT,FULL´Â, ¿ÜºÎ °áÇÕÀ» ÀǹÌÇÕ´Ï´Ù.

°áÇÕ Á¶°ÇÀº, ON±¸³ª USING±¸·Î ÁöÁ¤ÇÏ´ÂÁö, ¶Ç´Â NATURAL±â¼ú·Î ¾Ï¹¬ÀûÀ¸·Î ÁöÁ¤ÇÕ´Ï´Ù. °áÇÕ Á¶°ÇÀº, ÀÌÇÏ¿¡ ÀÚ¼¼ÇÏ°Ô ¼³¸íÇϵíÀÌ, µÎ °³ÀÇ ¼Ò½º°¡ µÇ´Â Å×À̺íÀÇ ¾î´À ÇàÀÌ"ÀÏÄ¡ÇÒÁö"¸¦ °áÁ¤ÇÕ´Ï´Ù.

ON±¸´Â °¡Àå ÀϹÝÀûÀÎ °áÇÕ Á¶°ÇÀ̸ç, WHERE±¸·Î »ç¿ëµÇ´Â °Í°ú °°Àº ºÒ¸®¾ð °ª Æò°¡½ÄÀÌ µË´Ï´Ù. ON½ÄÀÇ Æò°¡°¡ ÂüÀÌ µÇ´Â °æ¿ì, T1 ¹× T2 ÀÇ ´ëÀÀÇÏ´Â ÇàÀÌ ÀÏÄ¡ÇÕ´Ï´Ù.

USING´Â ¾à±â¹ýÀÔ´Ï´Ù. ±×°ÍÀº, °áÇÕ Å×À̺íÀÌ °øÅëÀ¸·Î °¡Áö´Â Äĸ¶·Î ´Ü¶ôÁö¾îÁø ·Ä¸íÀÇ ¸®½ºÆ®·ÎºÎÅÍ, °¢°¢ÀÇ ¿­ÀÇ Á¶ÇÕÀÇ µî°¡¼ºÀ» °áÇÕ Á¶°ÇÀ¸·Î¼­ Çü¼ºÇÕ´Ï´Ù. °Ô´Ù°¡, JOIN USINGÀÇ Ãâ·ÂÀº, ÀԷ¿­·Î µî°¡ ÆÇÁ¤µÈ ¿­ÀÇ Á¶ÇÕ¿¡ °¢°¢ ´ëÀÀÇÏ´Â 1¿­·Î, ±× ÈÄ¿¡ °¢ Å×À̺íÀÇ ´Ù¸¥ ¸ðµç ¿­ÀÌ °è¼ÓµË´Ï´Ù. Áï, USING (a, b, c)´Â ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c)¿Í µî°¡ÀÔ´Ï´Ù. ´Ù¸¸, ON¸¦ »ç¿ëÇßÀ» °æ¿ì´Â, °á°ú¿¡ ´ëÇØ a, b, c´Â °¢°¢ 2°³ÀÇ ¿­ÀÌ µË´Ï´Ù¸¸, USING¸¦ »ç¿ëÇÏ¸é °¢°¢ 1°³ÀÇ ¿­ÀÌ µÇ´Â ¿¹¿Ü°¡ ÀÖ½À´Ï´Ù.

¸¶Áö¸·À¸·Î, NATURAL´Â USINGÀÇ ¾à±â Çü½ÄÀÔ´Ï´Ù. 2°³ÀÇ ÀÔ·Â Å×À̺íÀÇ ¾çÂÊ ¸ðµÎ¿¡ Æ÷ÇԵǾî ÀÖ´Â ·Ä¸í¸¸À¸·Î ±¸¼ºµÇ´Â USING¸®½ºÆ®¸¦ Çü¼ºÇÕ´Ï´Ù. USING¿Í °°ÀÌ, ÀÌ·¯ÇÑ ¿­Àº Ãâ·Â Å×ÀÌºí¿¡ ÇÑ ¹ø¸¸ ³ªÅ¸³³´Ï´Ù.

¼ö½Ä ÷ºÎ °áÇÕ¿¡´Â ´ÙÀ½ÀÇ °ÍÀÌ ÀÖ½À´Ï´Ù.

INNER JOIN(³»ºÎ °áÇÕ)

T1ÀÇ Çà R1¿¡ ´ëÇØ¼­, T2¿¡ ´ëÇØ R1¿ÍÀÇ °áÇÕ Á¶°ÇÀ» ä¿ì°í ÀÖ´Â ÇàÀÌ, °áÇÕµÈ Å×ÀÌºí¿¡ Æ÷ÇԵ˴ϴÙ.

LEFT OUTER JOIN(¿ÞÂÊ ¹Ù±ùºÎ °áÇÕ)

¿ì¼±, ³»ºÎ °áÇÕÀ» ÇÕ´Ï´Ù. ±× ÈÄ, T2ÀÇ ¾î´À Çà°úÀÇ °áÇÕ Á¶°Çµµ ä¿ìÁö ¾Ê´Â T1ÀÇ °¢ Çà¿¡ ´ëÇØ¼­´Â, T2ÀÇ ¿­À» NULLÄ¡·Î¼­ °áÇÕÇÑ ÇàÀÌ Ãß°¡µË´Ï´Ù. µû¶ó¼­, ¿¬°áµÈ Å×À̺íÀº ¹«Á¶°Ç T1ÀÇ Çà °¢°¢ Àû¾îµµ 1°³ÀÇ ÇàÀÌ ÀÖ½À´Ï´Ù.

RIGHT OUTER JOIN(¿À¸¥ÂÊ ¿ÜºÎ °áÇÕ)

¿ì¼±, ³»ºÎ °áÇÕÀ» ÇÕ´Ï´Ù. ±× ÈÄ, T1ÀÇ ¾î´À ÇàÀÇ °áÇÕ Á¶°Çµµ ä¿ìÁö ¾Ê´Â T2ÀÇ °¢ Çà¿¡ ´ëÇØ¼­´Â, T1ÀÇ ¿­À» NULL°ªÀ¸·Î °áÇÕÇÑ ÇàÀÌ Ãß°¡µË´Ï´Ù. À̰ÍÀº ¿ÞÂÊ °áÇÕÀÇ ¹Ý´ëÀÔ´Ï´Ù. °á°úÀÇ Å×À̺íÀº, T2ÀÇ ÇàÀÌ ¹«Á¶°Ç µé¾î°©´Ï´Ù.

FULL OUTER JOIN(¿ÏÀü ¿ÜºÎ °áÇÕ)

¿ì¼±, ³»ºÎ °áÇÕÀ» ÇÕ´Ï´Ù. ±× ÈÄ, T2ÀÇ ¾î´À ÇàÀÇ °áÇÕ Á¶°Çµµ ä¿ìÁö ¾Ê´Â T1ÀÇ °¢ Çà¿¡ ´ëÇØ¼­´Â, T2ÀÇ ¿­À» NULL°ªÀ¸·Î °áÇÕÇÑ ÇàÀÌ Ãß°¡µË´Ï´Ù. °Ô´Ù°¡ T1ÀÇ ¾î´À Çà¿¡¼­µµ °áÇÕ Á¶°ÇÀ» ä¿ìÁö ¾Ê´Â T2ÀÇ °¢ Çà¿¡ ´ëÇØ¼­, T1ÀÇ ¿­À» NULL°ªÀ¸·Î °áÇÕÇÑ ÇàÀÌ Ãß°¡µË´Ï´Ù.

¸ðµç °áÇÕÀº, ¼­·Î ¿¬°á½ÃŰ°Å³ª ȤÀº Æ÷°¶ ¼ö°¡ ÀÖ½À´Ï´Ù. T1 ¿Í T2 ÀÇ ÇÑÂÊ, ȤÀº ¾çÂÊ ¸ðµÎ°¡, °áÇÕ Å×À̺íÀÌ µÇ´Â ÀÏÀÌ ÀÖ½À´Ï´Ù. °ýÈ£´Â °áÇÕÀÇ ¼ø¼­¸¦ Á¦¾îÇϱâ À§Çؼ­ JOIN±¸¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. °ýÈ£°¡ ¾ø´Â °æ¿ì, JOIN ±¸´Â ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î Æ÷°¸´Ï´Ù.

Á¤¸®¸¦ À§ÇØ, ÀÌÇÏÀÇ Å×À̺ít1

 num | name
-----+------
   1 | a
   2 | b
   3 | c

¹×, Å×À̺ít2

 num | value
-----+-------
   1 | xxx
   3 | yyy
   5 | zzz

¸¦ »óÁ¤Çϸé, ÀÌÇÏ¿Í °°ÀÌ ¿©·¯°¡Áö °áÇÕ¿¡ °üÇÑ °á°ú¸¦ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

=> SELECT * FROM t1 CROSS JOIN t2;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   1 | a    |   3 | yyy
   1 | a    |   5 | zzz
   2 | b    |   1 | xxx
   2 | b    |   3 | yyy
   2 | b    |   5 | zzz
   3 | c    |   1 | xxx
   3 | c    |   3 | yyy
   3 | c    |   5 | zzz
(9 rows)

=> SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   3 | c    |   3 | yyy
(2 rows)

=> SELECT * FROM t1 INNER JOIN t2 USING (num);
 num | name | value
-----+------+-------
   1 | a    | xxx
   3 | c    | yyy
(2 rows)

=> SELECT * FROM t1 NATURAL INNER JOIN t2;
 num | name | value
-----+------+-------
   1 | a    | xxx
   3 | c    | yyy
(2 rows)

=> SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   2 | b    |     |
   3 | c    |   3 | yyy
(3 rows)

=> SELECT * FROM t1 LEFT JOIN t2 USING (num);
 num | name | value
-----+------+-------
   1 | a    | xxx
   2 | b    |
   3 | c    | yyy
(3 rows)

=> SELECT * FROM t1 RIGHT JOIN t2 ON t1.num = t2.num;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   3 | c    |   3 | yyy
     |      |   5 | zzz
(3 rows)

=> SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   2 | b    |     |
   3 | c    |   3 | yyy
     |      |   5 | zzz
(4 rows)

ON·Î ÁöÁ¤µÇ´Â °áÇÕ Á¶°Ç¿¡´Â, °áÇÕ¿¡ Á÷Á¢ °ü°èÇÏÁö ¾Ê´Â Á¶°Çµµ Æ÷ÇÔÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. À̰ÍÀº ÀϺÎÀÇ Äõ¸®¿¡ ´ëÇØ Æí¸®ÇÕ´Ï´Ù¸¸, »ç¿ë ½Ã¿¡´Â ÁÖÀǰ¡ ÇÊ¿äÇÕ´Ï´Ù. ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

=> SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx';
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   2 | b    |     |
   3 | c    |     |
(3 rows)

7.2.1.2. Å×À̺í°ú ¿­ÀÇ º°¸í

Å×À̺íÀ̳ª º¹ÀâÇÑ Å×À̺í ÂüÁ¶´Â, Äõ¸®ÀÇ µÞÆíÀ¸·Î ÆÄ»ý Å×À̺íÀ» ÂüÁ¶Çϱâ À§Çؼ­ ÀϽÃÀûÀÎ À̸§À» ÁÙ ¼ö°¡ ÀÖ½À´Ï´Ù. À̰ÍÀ» Å×À̺íÀÇ º°¸íÀ̶ó°í ºÎ¸¨´Ï´Ù.

Å×À̺íÀÇ º°¸íÀ» ÀÛ¼ºÇÏ·Á¸é ÀÌÇÏ¿Í °°ÀÌ ÇÕ´Ï´Ù.

FROM 
table_reference
 AS 
alias

ȤÀº

FROM 
table_reference
 
alias

ASŰ¿öµå´Â ¾ø¾îµµ »ó°üÇÏÁö ¾Ê½À´Ï´Ù. alias ´Â ÀÓÀÇÀÇ ½Äº°ÀÚ°¡ µË´Ï´Ù.

Å×À̺íÀÇ º°¸íÀÇ ÀϹÝÀûÀÎ Àû¿ë¹ýÀº, ±ä Å×À̺í¸í¿¡ ´ÜÃàÇÑ ½Äº°ÀÚ¸¦ ÇÒ´çÇØ °áÇÕ±¸¸¦ Àб⠽±°Ô ÇÏ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

SELECT * FROM some_very_long_table_name s JOIN another_fairly_long_name a ON s.id = a.num;

º°¸íÀº, ÇöÀçÀÇ Äõ¸®·Î Å×À̺í ÂüÁ¶¸¦ ÇÒ ¶§ÀÇ »õ·Î¿î À̸§ÀÌ µË´Ï´Ù. ±× °æ¿ì´Â, ¿ø·¡ÀÇ À̸§À¸·Î Å×À̺íÀ» ÂüÁ¶ÇÒ ¼ö ¾ø°Ô µË´Ï´Ù. µû¶ó¼­,

SELECT * FROM my_table AS m WHERE my_table.a > 5;

´Â Ç¥ÁØ SQL¿¡ ÁذÅÇϰí ÀÖ½À´Ï´Ù. PostgreSQL¿¡¼­´Â, add_missing_from¼³Á¤ º¯¼ö°¡ off(À̰ÍÀÌ ±âº»°ªÀÔ´Ï´Ù)ÀÇ °æ¿ì¿¡ ¿¡·¯°¡ µË´Ï´Ù. onÀÇ °æ¿ì, FROM±¸¿¡ ³»ÀçÀû Å×À̺í ÂüÁ¶°¡ Ãß°¡µË´Ï´Ù. Áï, ´ÙÀ½°ú °°Àº Äõ¸®¸¦ ¾´ °ÍÀ¸·Î¼­ 󸮵˴ϴÙ.

SELECT * FROM my_table AS m, my_table AS my_table WHERE my_table.a > 5;

À̰ÍÀº Å©·Î½º °áÇÕÀÌ µË´Ï´Ù¸¸, Åë»ó À̰ÍÀº ¹Ù¶÷Á÷ÇÑ ÀÏÀÌ ¾Æ´Õ´Ï´Ù.

Å×À̺íÀÇ º°¸íÀº ÁַΠǥ±â¸¦ °£´ÜÇÏ°Ô Çϱâ À§Çؼ­ ÀÖ½À´Ï´Ù. ±×·¯³ª ´ÙÀ½°ú °°ÀÌ, 1°³ÀÇ Å×À̺íÀÌ ÀÚ±â ÀڽŰú °áÇÕÇÏ´Â °æ¿ì´Â, Çʼö°¡ µË´Ï´Ù.

SELECT * FROM people AS mother JOIN people AS child ON mother.id = child.mother_id;

°Ô´Ù°¡ Å×À̺í ÂüÁ¶°¡ ¼­ºêÄõ¸®ÀÇ °æ¿ì¿¡ º°¸íÀÌ ÇÊ¿äÇÏ°Ô µË´Ï´Ù (Section 7.2.1.3¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä).

°ýÈ£´Â, ¾Ö¸ÅÇÔÀ» ¾ø¾Ö±â À§Çؼ­ »ç¿ëµË´Ï´Ù. ´ÙÀ½ÀÇ ¿¹¿¡¼­´Â, ù ¹øÂ° ¸í·É¹®À¸·Î µÎ ¹øÂ° my_tableÀÇ ÀνºÅϽº¿¡ b¶ó´Â º°¸íÀ» ºÎ¿©Çϰí, ÇÑÆí, µÎ ¹øÂ° ¸í·É¹®¿¡¼­´Â °áÇÕ °á°ú¿¡ ´ëÇØ¼­ º°¸íÀ» ºÎ¿©Çϰí ÀÖ½À´Ï´Ù.

SELECT * FROM my_table AS a CROSS JOIN my_table AS b ...
SELECT * FROM (my_table AS a CROSS JOIN my_table) AS b ...

´ÙÀ½°ú °°Àº Çü½Ä¿¡¼­ Å×ÀÌºí º°¸íÀ» ºÙ¿©, Å×À̺í ÀڽŰú °°°Ô Å×À̺íÀÇ ¿­¿¡ ÀϽÃÀûÀÎ À̸§À» ºÙÀÏ ¼ö°¡ ÀÖ½À´Ï´Ù.

FROM 
table_reference
 [AS] 
alias
 ( 
column1
 [, 
column2
 [, ...]] )

¸¸¾à, ½ÇÁ¦ÀÇ Å×À̺íÀÌ °¡Áö´Â ¿­º¸´Ù ÀûÀº ¼öÀÇ ¿­ÀÇ º°¸íÀÌ ÁÖ¾îÁö´Â °æ¿ì, ³ª¸ÓÁöÀÇ ¿­Àº °³¸íµÇÁö ¾Ê½À´Ï´Ù. ÀÌ ±¸¹®Àº, Àڱ⠰áÇÕ È¤Àº ¼­ºêÄõ¸®·Î Ưº°È÷ µµ¿òÀÌ µË´Ï´Ù.

º°¸íÀÌ JOIN±¸ÀÇ °á°ú¿¡ Àû¿ëµÇ´Â °æ¿ì, ÀÌ·¯ÇÑ Çü½ÄÀÇ ¾î´À ÂÊÀ» »ç¿ëÇϸé, º°¸íÀº JOIN³»ÀÇ ¿ø·¡ÀÇ À̸§À» ¼û±é´Ï´Ù. ¿¹¸¦ µé¸é, ´ÙÀ½ÀÇ ¿¹ÀÇ ´ë·ÎÀÔ´Ï´Ù.

SELECT a.* FROM my_table AS a JOIN your_table AS b ON ...

(Àº)´Â À¯È¿ÇÑ SQLÀÔ´Ï´Ù¸¸,

SELECT a.* FROM (my_table AS a JOIN your_table AS b ON ...) AS c

´Â À¯È¿ÇÏÁö´Â ¾Ê½À´Ï´Ù. Å×À̺íÀÇ º°¸ía´Â, º°¸ícÀÇ ¿ÜÃø¿¡¼­´Â ÂüÁ¶ÇÒ ¼ö°¡ ¾ø½À´Ï´Ù.

7.2.1.3. ¼­ºêÄõ¸®(Subqueries)

ÆÄ»ý Å×À̺íÀ» ÁöÁ¤ÇÏ´Â ¼­ºêÄõ¸®´Â, °ýÈ£·Î µÑ·¯½Ò Çʿ䰡 ÀÖ½À´Ï´Ù. ¶Ç, ¹Ýµå½Ã Å×ÀÌºí º°¸íÀ» ÇÒ´çÇÒ ¼ö ÀÖ°í ÀÖÀ» Çʿ䰡 ÀÖ½À´Ï´Ù (Section 7.2.1.2¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä). ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

FROM (SELECT * FROM table1) AS alias_name

ÀÌ ¿¹´Â, FROM table1 AS alias_name¿Í °°½À´Ï´Ù. ÇÑÃþ ´õ Èï¹Ì·Î¿î ÄÉÀ̽º·Î¼­ ¼­ºêÄõ¸®°¡ ±×·ìÈ­³ª Áý°èÀ» Æ÷ÇÔÇϰí ÀÖ´Â °æ¿ì, ´Ü¼ø °áÇÕ¿¡ Á¤¸®ÇÒ ¼ö ¾ø½À´Ï´Ù.

¶Ç, ¼­ºêÄõ¸®¸¦ VALUES¸®½ºÆ®·Î ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

FROM (VALUES ('anne', 'smith'), ('bob', 'jones'), ('joe', 'blow'))
     AS names(first, last)

¹Ýº¹ÇÕ´Ï´Ù¸¸, Å×À̺íÀÇ º°¸íÀÌ ÇÊ¿äÇÕ´Ï´Ù. VALUES¸®½ºÆ®ÀÇ ¿­¿¡ º°¸íÀ» ºÎ¿©ÇÏ´Â °ÍÀº »ý·« ÇÒ ¼öµµ ÀÖ½À´Ï´Ù¸¸, ºÎ¿©ÇÏ´Â °ÍÀ» ±ÇÇÕ´Ï´Ù. Section 7.7¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä.

7.2.1.4. Å×À̺í ÇÔ¼ö

Å×À̺í ÇÔ¼ö´Â, ±âº» µ¥ÀÌÅÍÇü(½ºÄ®¶óÇü), ȤÀº º¹ÇÕ µ¥ÀÌÅÍÇü(Å×À̺íÇà)À¸·ÎºÎÅÍ µÇ´Â ÇàÀÇ ÁýÇÕÀ» »ý¼ºÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. À̰͵éÀº, Å×À̺í, ºä, Äõ¸®ÀÇ FROM±¸³»ÀÇ ¼­ºêÄõ¸®¿Í °°ÀÌ »ç¿ëµË´Ï´Ù. Å×À̺í ÇÔ¼ö·ÎºÎÅÍ µ¹·ÁÁÖ¾îÁö´Â ¿­Àº, Å×À̺í, ºä, ¼­ºêÄõ¸®¿­°ú °°Àº ¼ø¼­·Î, SELECT, JOIN, WHERE¾È¿¡ Æ÷ÇÔÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

Å×À̺í ÇÔ¼ö°¡ ±âº» µ¥ÀÌÅÍÇüÀ» µ¹·ÁÁÖ´Â °æ¿ì, ´ÜÀÏÀÇ °á°ú¿­¿¡´Â ÇÔ¼ö¸í¿¡ ¿¬°üµÈ À̸§À» ºÙÀÏ ¼ö ÀÖ½À´Ï´Ù. ÇÔ¼ö°¡ º¹ÇÕÇüÀ» µ¹·ÁÁÖ´Â °æ¿ì´Â, °á°ú¿­Àº ±× ÇüÅÂÀÇ °³°³ÀÇ ¼Ó¼º°ú °°Àº À̸§ÀÌ µË´Ï´Ù.

FROM±¸·Î Å×À̺í ÇÔ¼ö¿¡ º°¸íÀ» ºÙÀÏ ¼öµµ, º°¸íÀ» ºÙÀÌÁö ¾Ê°í ±×´ë·Î »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù. º°¸íÀ» ºÙÀÌÁö ¾Ê°í FROM±¸·Î ÇÔ¼ö¸¦ »ç¿ëÇßÀ» °æ¿ì, ÇÔ¼ö¸íÀÌ Ãâ·Â Å×À̺í¸íÀ¸·Î¼­ »ç¿ëµË´Ï´Ù.

ÀÌÇÏ¿¡ ¿©·¯ ¿¹¸¦ °¡¸®Åµ´Ï´Ù.

CREATE TABLE foo (fooid int, foosubid int, fooname text);

CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$
    SELECT * FROM foo WHERE fooid = $1;
$$ LANGUAGE SQL;

SELECT * FROM getfoo(1) AS t1;

SELECT * FROM foo
    WHERE foosubid IN (select foosubid from getfoo(foo.fooid) z
                           where z.fooid = foo.fooid);

CREATE VIEW vw_getfoo AS SELECT * FROM getfoo(1);

SELECT * FROM vw_getfoo;

È£Ãâ ¹æ¹ýÀ¸·Î ÀÀÇØ ´Ù¸¥ ¿­ÁýÇÕÀ» µ¹·ÁÁÖ´Â Å×À̺í ÇÔ¼ö¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ µµ¿òÀÌ µÇ´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù. À̰ÍÀ» Áö¿øÇÏ·Á¸é , Å×À̺í ÇÔ¼ö¸¦ record°¡»óÇüÀ» µ¹·ÁÁÖ´Â °ÍÀ̶ó°í ¼±¾ðÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ÇÔ¼ö¸¦ Äõ¸®·Î »ç¿ëÇÏ´Â °æ¿ì, ½Ã½ºÅÛÀÌ ±× Äõ¸®¸¦ ¾î¶»°Ô ÇØ¼®ÇØ °èȹÀ» ÀÛ¼ºÇϸé ÁÁÀº °ÍÀÎÁö ÆÇ´ÜÇÒ ¼ö ÀÖµµ·Ï, »óÁ¤ÇÑ Çà ±¸Á¶¸¦ Äõ¸® Àڽų»·Î ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. ´ÙÀ½ÀÇ ¿¹·Î »ý°¢ÇØ º¾½Ã´Ù.

SELECT *
    FROM dblink('dbname=mydb', 'select proname, prosrc from pg_proc')
      AS t1(proname name, prosrc text)
    WHERE proname LIKE 'bytea%';

dblinkÇÔ¼ö´Â ¿ø°Ý Äõ¸®¸¦ ½ÇÇàÇÕ´Ï´Ù(contrib/dblink¸¦ ÂüÁ¶). À̰ÍÀº ÀÓÀÇÀÇ Äõ¸®·Î »ç¿ëÇÒ ¼ö ÀÖµµ·Ï, record¸¦ µ¹·ÁÁÖ´Â °ÍÀ̶ó°í ¼±¾ðµÇ°í ÀÖ½À´Ï´Ù. ½ÇÁ¦ÀÇ ¿­ÁýÇÕÀº, ÆÄ¼­°¡ ¿¹¸¦ µé¸é *ÀÌ ¾î¶»°Ô Àü°³µÇ´ÂÁö¸¦ ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï È£ÃâÇÑ Äõ¸®³»¿¡¼­ ÁöÁ¤µÇÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù.

7.2.2. WHERE±¸

WHERE±¸ ÀÇ ±¸¹®Àº, ÀÌÇÏ¿Í °°½À´Ï´Ù.

WHERE 
search_condition

¿©±â¼­, search_condition ¿¡´Â booleanÇüÀ» µ¹·ÁÁÖ´Â ¾î¶² Æò°¡½Ä(Section 4.2¸¦ ÂüÁ¶)µµ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.

FROM±¸ÀÇ Ã³¸®°¡ ³¡³­ ÈÄ, ÆÄ»ýÇÑ °¡»ó Å×À̺íÀÇ °¢ ÇàÀº °Ë»ö Á¶°Ç°ú Á¶Çյ˴ϴÙ. Á¶°ÇÀÇ °á°ú°¡ ÂüÀÎ °æ¿ì, ±× ÇàÀº Ãâ·ÂµË´Ï´Ù. ±×·¸Áö ¾ÊÀº(Áï °á°ú°¡ °ÅÁþ ¶Ç´Â NULLÀÇ) °æ¿ì´Â, ±× ÇàÀº ¹ö·ÁÁý´Ï´Ù. ÀϹÝÀûÀ¸·Î °Ë»ö Á¶°ÇÀº, FROM±¸·Î »ý¼ºµÈ Å×À̺íÀÇ ¿­À» Àû¾îµµ ¸î °³ ÂüÁ¶ÇÕ´Ï´Ù. À̰ÍÀº Çʼö°¡ ¾Æ´Õ´Ï´Ù¸¸, ±×·¸°Ô ¾ÊÀ¸¸é WHERE±¸´Â ¿ÏÀüÈ÷ Àǹ̰¡ ¾ø¾îÁý´Ï´Ù.

Note: ³»ºÎ °áÇÕÀÇ °áÇÕ Á¶°ÇÀº, WHERE±¸¿¡¼­µµ JOIN±¸¿¡¼­µµ ±â¼úÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é, ÀÌÇÏÀÇ Å×À̺í½ÄÀº °°½À´Ï´Ù.

FROM a, b WHERE a.id = b.id AND b.val > 5

¹×

FROM a INNER JOIN b ON (a.id = b.id) WHERE b.val > 5

¶Ç, ÀÌÇÏ¿¡¼­µµ °°½À´Ï´Ù.

FROM a NATURAL JOIN b WHERE b.val > 5

¾î¶² °ÍÀ» »ç¿ëÇÒÁö´Â, ÁÖ·Î ½ºÅ¸ÀÏÀÇ ¹®Á¦ÀÔ´Ï´Ù. FROM±¸·Î JOIN±¸¹®À» »ç¿ëÇϸé, ¾Æ¸¶ ´Ù¸¥ Á¦Ç°¿¡ À̽ÄÇÒ ¼ö ¾øÀ» °ÍÀÔ´Ï´Ù. ¿ÜºÎ °áÇÕ¿¡ ´ëÇØ¼­´Â, FROM±¸ À̿ܿ¡ ¼±ÅÃÀÇ ¿©Áö´Â ¾ø½À´Ï´Ù. ¿ÜºÎ °áÇÕÀÇ ON±¸³ª USING±¸´Â, WHEREÁ¶°Ç°ú´Â µ¿ÀÏÇÏÁö ¾Ê½À´Ï´Ù . ¿Ö³ÄÇϸé, ÃÖÁ¾ °á°ú·ÎºÎÅÍ ÇàÀ» Á¦°ÅÇÏ¸é °°ÀÌ(ÀÏÄ¡ÇÏÁö ¾Ê´Â ÀÔ·ÂÇà¿¡ ´ëÇØ) ÇàÀÇ Ãß°¡µµ ½Ç½ÃÇϱ⠶§¹®ÀÔ´Ï´Ù.

WHERE±¸ÀÇ ¿¹¸¦ ÀÌÇÏ¿¡ ³ªÅ¸³À´Ï´Ù.

SELECT ... FROM fdt WHERE c1 > 5

SELECT ... FROM fdt WHERE c1 IN (1, 2, 3)

SELECT ... FROM fdt WHERE c1 IN (SELECT c1 FROM t2)

SELECT ... FROM fdt WHERE c1 IN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10)

SELECT ... FROM fdt WHERE c1 BETWEEN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10) AND 100

SELECT ... FROM fdt WHERE EXISTS (SELECT c1 FROM t2 WHERE c2 > fdt.c1)

fdt´Â, FROM±¸·ÎºÎÅÍ ÆÄ»ýÇÑ Å×À̺íÀÔ´Ï´Ù. WHERE±¸ÀÇ °Ë»ö Á¶°ÇÀ» ä¿ìÁö ¾Ê¾Ò´ø ÇàÀº, fdt·ÎºÎÅÍ »èÁ¦µË´Ï´Ù. Æò°¡½ÄÀ¸·Î¼­ÀÇ ½ºÄ®¶óºÎ¹®ÀÇÀÇ »ç¿ë¹ý¿¡ ÁÖ¸ñÇØ ÁÖ¼¼¿ä. ´Ù¸¥ Äõ¸®¿Í °°ÀÌ, ¼­ºêÄõ¸®´Â º¹ÀâÇÑ Å×À̺í½ÄÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¼­ºêÄõ¸® Áß¿¡¼­ ¾î¶»°Ô fdt°¡ ÂüÁ¶µÉÁöµµ ÁÖÀÇÇØ ÁÖ¼¼¿ä. c1¸¦ fdt.c1¿Í °°ÀÌ ¼ö½ÄÇÏ´Â °ÍÀº, c1°¡ ¼­ºêÄõ¸®ÀÇ ÀÔ·Â Å×ÀÌºí¿¡¼­ ÆÄ»ýÇÑ ·Ä¸íÀ̱⵵ ÇÒ ¶§¿¡¸¸ ÇÊ¿äÇÕ´Ï´Ù. ·Ä¸íÀÇ ¼ö½ÄÀº, ÇʼöÀÇ °æ¿ì°¡ ¾Æ´Ï¶óµµ, ¸íÈ®ÇÏ°Ô Çϱâ À§Çؼ­ µµ¿òÀÌ µË´Ï´Ù. ÀÌ ¿¹´Â, ¿ÜÃøÀÇ Äõ¸®ÀÇ ·Ä¸íÀÇ À¯È¿ ¹üÀ§¸¦, ¾î¶»°Ô ¾ÈÂÊÀÇ Äõ¸®±îÁö È®ÀåÇÏ´ÂÁö¸¦ ³ªÅ¸³À´Ï´Ù.

7.2.3. GROUP BY¿Í HAVING ±¸

WHEREÇÊÅ͸¦ ÅëÇÑ ÈÄ, ÆÄ»ýµÈ ÀÔ·Â Å×À̺íÀ» GROUP BY±¸·Î ±×·ìÈ­ ÇØ, ¶Ç, HAVING±¸¸¦ »ç¿ëÇØ ºÒÇÊ¿äÇÑ ±×·ìÀ» ¾ø¾Ù ¼ö°¡ ÀÖ½À´Ï´Ù.

SELECT 
select_list

    FROM ...
    [WHERE ...]
    GROUP BY 
grouping_column_reference
 [, 
grouping_column_reference

]...

GROUP BY±¸ ±¸´Â, Å×ÀÌºí³»¿¡¼­ ¼±ÅÃµÈ Àü ·Ä°ú °°Àº °ªÀ» °øÀ¯ÇÏ´Â ÇàÀ» Á¤¸®ÇØ ±×·ìÈ­ Çϱâ À§Çؼ­ »ç¿ëµË´Ï´Ù. ¿­ÀÇ ¿­°Å¼ø¼­´Â °ü°è ¾ø½À´Ï´Ù. À̰ÍÀº, °øÅëµÇ´Â °ªÀ» °¡Áö´Â ÇàÀ», ´ëÇ¥°¡ µÇ´Â 1°³ÀÇ ±×·ìÇà¿¡ Á¤¸®ÇÏ´Â È¿°ú°¡ ÀÖ½À´Ï´Ù. À̰Ϳ¡ ÀÇÇØ, Ãâ·ÂÀÇ ¿ëÀåµµ¸¦ ¹èÁ¦ÇØ, °Ô´Ù°¡ ¶Ç, ÀÌ·¯ÇÑ ±×·ì¿¡ Àû¿ëµÇ´Â Áý°èÀÌ °è»êµË´Ï´Ù. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

=> SELECT * FROM test1;
 x | y
---+---
 a | 3
 c | 2
 b | 5
 a | 1
(4 rows)

=> SELECT x FROM test1 GROUP BY x;
 x
---
 a
 b
 c
(3 rows)

µÎ ¹øÂ° Äõ¸®¿¡¼­´Â, SELECT * FROM test1 GROUP BY x¶ó°í ¾µ ¼ö ¾ø½À´Ï´Ù. °¢ ±×·ì¿¡ °ü·ÃÁöÀ» ¼ö ÀÖ´Â ¿­yÀÇ °ªÀÌ ¾ø±â ¶§¹®ÀÔ´Ï´Ù. ±×·ì ¸¶´Ù ´ÜÀÏÀÇ °ªÀ» °¡Áö¹Ç·Î, ¼±Åà ¸®½ºÆ®·Î GROUP BY·Î ÁöÁ¤ÇÑ ¿­À» ÂüÁ¶ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

ÀϹÝÀûÀ¸·Î, Å×À̺íÀÌ ±×·ìÈ­ µÇ°í ÀÖ´Â °æ¿ì, ±×·ìÈ­ ½Ã¿¡ »ç¿ëµÇÁö ¾ÊÀº ¿­À» Áý°è½Ä À̿ܿ¡´Â ÂüÁ¶ÇÒ ¼ö ¾ø½À´Ï´Ù. Áý°è½ÄÀÇ ¿¹´Â ÀÌÇÏ¿Í °°½À´Ï´Ù.

=> SELECT x, sum(y) FROM test1 GROUP BY x;
 x | sum
---+-----
 a |   4
 b |   5
 c |   2
(3 rows)

»ó±âµÈ sum() ´Â, ±×·ì Àüü¿¡ ´ëÇØ ´ÜÀÏÀÇ °ªÀ» °è»êÇÏ´Â Áý°è ÇÔ¼öÀÔ´Ï´Ù. »ç¿ë °¡´ÉÇÑ Áý°è ÇÔ¼öÀÇ »ó¼¼ÇÑ °Í¿¡ ´ëÇÏ¿©´Â, Section 9.15À» ÂüÁ¶ÇØ ÁÖ¼¼¿ä.

Tip: Áý°è½ÄÀ» »ç¿ëÇÏÁö ¾Ê´Â ±×·ìÈ­´Â, ·Ä³»ÀÇ Áߺ¹ ÇÏÁö ¾Ê´Â °ªÀÇ ÁýÇÕÀ» È¿À² ÁÁ°Ô °è»êÇÕ´Ï´Ù. À̰ÍÀº DISTINCT±¸ÀÇ »ç¿ë¿¡¼­µµ ½Ç½ÃÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù(Section 7.3.3¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä).

´Ù¸¥ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù. À̰ÍÀº °¢ Á¦Ç°ÀÇ ÃѸŻóÀ» °è»êÇÕ´Ï´Ù (ÀüÁ¦Ç°¿¡ ´ëÇÑ ÃѸŻóÀÌ ¾Æ´Õ´Ï´Ù).

SELECT product_id, p.name, (sum(s.units) * p.price) AS sales
    FROM products p LEFT JOIN sales s USING (product_id)
    GROUP BY product_id, p.name, p.price;

ÀÌ ¿¹¿¡¼­´Â, product_id¿­, p.name¿­, p.price¿­Àº ¹Ýµå½Ã GROUP BY±¸·Î ÁöÁ¤ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ¿Ö³ÄÇϸé, À̰͵éÀº Äõ¸® ¼±Åà ¸®½ºÆ® Áß¿¡¼­ »ç¿ëµÇ°í Àֱ⠶§¹®ÀÔ´Ï´Ù (products Å×À̺íÀ» ¾î´À Á¤µµ ¾ö¹ÐÇÏ°Ô ¼³Á¤ÇÒÁö¿¡ µû¶ó, À̸§ ¹× °¡°ÝÀ» ¿ÏÀüÇÏ°Ô product ID¿¡ ÀÇÁ¸½Ãų ¼öµµ Àֱ⠶§¹®¿¡, ÀÌ·ÐÀûÀ¸·Î´Â À̰͵éÀ» ±×·ìÈ­ ÇÒ Çʿ並 ¾ø¾Ö´Â Àϵµ °¡´ÉÇÕ´Ï´Ù. ±×·¯³ª, À̰ÍÀº ¾ÆÁ÷ ±¸ÇöµÇ°í ÀÖÁö ¾Ê½À´Ï´Ù). s.units¿­Àº GROUP BY·Î ÁöÁ¤ÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. À̰ÍÀº, Á¦Ç°¸¶´ÙÀÇ ¸Å»ó °è»êÀÇ Áý°è½Ä(sum(...))ÀÇ ¾È¿¡¼­¸¸ »ç¿ëµÇ±â ¶§¹®¿¡ÀÔ´Ï´Ù. ÀÌ Äõ¸®´Â, °¢ Á¦Ç°¿¡ ´ëÇØ¼­ Á¦Ç°ÀÇ ÀüÆÇ¸Å¿¡ °üÇÑ ÇÕ°èÇàÀÌ µ¹·ÁÁÖ¾îÁý´Ï´Ù.

¾ö¹ÐÇÑ SQL¿¡¼­´Â, GROUP BY´Â, ¼Ò½º Å×À̺íÀÇ ¿­¿¡ ÀÇÇØ¼­¸¸ ±×·ìÈ­ ÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸, PostgreSQL¿¡¼­´Â, ¼±Åà ¸®½ºÆ®ÀÇ ¿­¿¡ ÀÇÇÑ ±×·ìÈ­µµ ÇÒ ¼ö ÀÖµµ·Ï È®ÀåµÇ°í ÀÖ½À´Ï´Ù. ´Ü¼øÇÑ ·Ä¸í ´ë½Å¿¡, Æò°¡½Ä¿¡¼­ ±×·ìÈ­ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

GROUP BY±¸¸¦ »ç¿ëÇØ ±×·ìÈ­ µÈ Å×À̺í·Î ƯÁ¤ÀÇ ±×·ì¸¸ ÇÊ¿äÇÑ °æ¿ì, ±×·ìÈ­ µÈ Å×ÀÌºí¿¡¼­ ºÒÇÊ¿äÇÑ ±×·ìÀ» Á¦¿ÜÇϰí, WHERE±¸¿Í °°ÀÌ HAVING±¸¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ±¸¹®Àº ÀÌÇÏ¿Í °°½À´Ï´Ù.

SELECT 
select_list
 FROM ... [WHERE ...] GROUP BY ... HAVING 
boolean_expression

HAVING±¸³»ÀÇ ½ÄÀº, ±×·ìÈ­ µÈ ½Ä°ú ±×·ìÈ­ µÇÁö ¾ÊÀº ½Ä(ÀÌ °æ¿ì´Â Áý°è ÇÔ¼ö°¡ ÇÊ¿äÇÏ°Ô µË´Ï´Ù)ÀÇ ¾çÂÊ ¸ðµÎ¸¦ ÂüÁ¶ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING sum(y) > 3;
 x | sum
---+-----
 a |   4
 b |   5
(2 rows)

=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING x < 'c';
 x | sum
---+-----
 a |   4
 b |   5
(2 rows)

´ÙÀ½¿¡, º¸´Ù Çö½ÇÀûÀÎ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

SELECT product_id, p.name, (sum(s.units) * (p.price - p.cost)) AS profit
    FROM products p LEFT JOIN sales s USING (product_id)
    WHERE s.date > CURRENT_DATE - INTERVAL '4 weeks'
    GROUP BY product_id, p.name, p.price, p.cost
    HAVING sum(p.price * s.units) > 5000;

À§ÀÇ ¿¹·Î, WHERE±¸´Â, ±×·ìÈ­µÇ¾î ÀÖÁö ¾ÊÀº ¿­¿¡ ÀÇÇØ ÇàÀ» ¼±ÅÃÇϰí ÀÖ´Â (ÀÌ ½Ä¿¡¼­´Â ÃÖ±ÙÀÇ 4ÁÖ°£ÀÇ ¸Å»ó¸¸ÀÌ ½Ç·Î µË´Ï´Ù)°Í¿¡ ´ëÇØ, HAVING±¸´Â Ãâ·ÂÀ» ¸Å»ó°í°¡ 5000À» ³Ñ´Â ±×·ì¿¡ Á¦ÇÑÇϰí ÀÖ½À´Ï´Ù. Áý°è½ÄÀÌ, Äõ¸®³»¿¡¼­ Ç×»ó °°Àº Çʿ䰡 ¾ø´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä.