| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 7. Äõ¸® | Fast Forward | Next |
Å×À̺í½ÄÀº, Å×À̺íÀ» °è»êÇϱâ À§ÇÑÀÇ °ÍÀÔ´Ï´Ù. Å×À̺í½Ä¿¡´Â FROM±¸°¡ Æ÷ÇԵǾî ÀÖ¾î ±× µÚ·Î ¿É¼ÇÀ¸·Î¼ WHERE±¸, GROUP BY±¸, HAVING±¸¸¦ ºÙÀÏ ¼ö°¡ ÀÖ½À´Ï´Ù. ´Ü¼øÇÑ Å×À̺í½ÄÀº, ´ÜÁö µð½ºÅ©»óÀÇ À̸¥¹Ù ±âº» Å×À̺í·Î ºÒ¸®´Â Å×À̺íÀ» ÂüÁ¶ÇÒ »ÓÀÔ´Ï´Ù. ±×·¯³ª, ¿©·¯°¡Áö ¹æ¹ýÀ¸·Î ±âº» Å×À̺íÀ» ¼öÁ¤Çϰųª Á¶ÇÕÇϱâ À§Çؼº¸´Ù º¹ÀâÇÑ ½ÄÀ» »ç¿ëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.
Å×À̺í½ÄÀÇ ¿É¼Ç WHERE±¸, GROUP BY±¸, ¹× HAVING±¸´Â, FROM±¸·Î ÆÄ»ýÇÑ Å×ÀÌºí¿¡ ´ëÇØ¼ Â÷·ÊÂ÷·Ê·Î º¯È¯À» ½ÇÇàÇÏ´Â °æ·Î¸¦ ÁöÁ¤ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ º¯È¯¿¡ ÀÇÇØ °¡»ó Å×À̺íÀÌ 1°³ »ý¼ºµË´Ï´Ù. ±×¸®°í ÀÌ °¡»ó Å×À̺íÀÇ ÇàÀÌ ¼±Åà ¸®½ºÆ®¿¡°Ô °Ç³×Á® Äõ¸®ÀÇ Ãâ·ÂÇàÀÌ °è»êµË´Ï´Ù.
FROM±¸ ´Â, Äĸ¶·Î ³ª´ ¼ö ÀÖ¾ú´ø Å×À̺í ÂüÁ¶ ¸®½ºÆ®·Î ÁÖ¾îÁö´Â 1°³ÀÌ»óÀÇ Å×ÀÌºí¿¡¼, 1°³ÀÇ Å×À̺íÀ» ÆÄ»ýÇÕ´Ï´Ù.
FROM
table_reference
[,
table_reference
[, ...]]
Å×À̺í ÂüÁ¶´Â, Å×À̺í¸í(½ºÅ°¸¶·Î ¼ö½ÄÇÒ ¼öµµ ÀÖ½À´Ï´Ù), ¶Ç´Â, ¼ºêÄõ¸®, Å×ÀÌºí °áÇÕ, ±×·¯ÇÑ º¹ÀâÇÑ Á¶ÇÕ µî¿¡¼ ÆÄ»ýµÈ Å×À̺íÀ» ÃëÇÒ ¼ö ÀÖ½À´Ï´Ù. FROM±¸¿¡ º¹¼öÀÇ Å×À̺í ÂüÁ¶°¡ ÀÖ´Â °æ¿ì, ±×°ÍµéÀº, WHERE±¸, GROUP BY±¸, ¹× HAVING±¸·Î º¯È¯ÇÒ ¼ö ÀÖ´Â Áß°£ÀûÀÎ °¡»ó Å×À̺íÀ» ¸¸µé±â À§Çؼ Å©·Î½º °áÇÕ(¾Æ·¡¸¦ ÂüÁ¶)µÇ¾î ÃÖÁ¾ÀûÀ¸·Î´Â ¸ðµç Å×À̺í½ÄÀÇ °á°ú°¡ µË´Ï´Ù.
Å×À̺í ÂüÁ¶·Î Å×À̺íÀÇ °è½Â °èÃþÀÇ ºÎ¸ð Å×À̺íÀÇ À̸§À» ÁöÁ¤Çϸé, Å×À̺í¸íÀÇ ¾Õ¿¡ ONLYŰ¿öµå°¡ ¾ø´Â °æ¿ì´Â, Å×À̺í ÂüÁ¶´Â ±× Å×ÀÌºí »Ó¸¸ÀÌ ¾Æ´Ï¶ó ±× ÀÚ³à Å×ÀÌºí¿¡ °è½ÂµÈ ¸ðµç ÇàÀ» »ý¼ºÇÕ´Ï´Ù. ±×·¯³ª, ÀÌ ÂüÁ¶´Â À̸§À» ÁöÁ¤ÇÑ Å×ÀÌºí¿¡ ³ªÅ¸³ ¿¸¸À» »ý¼ºÇØ, ÀÚ³à Å×À̺í·Î Ãß°¡µÈ ¿Àº ¹«½ÃµË´Ï´Ù.
°áÇÕ Å×À̺íÀº, 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¿Í °°ÀÌ, ÀÌ·¯ÇÑ ¿Àº Ãâ·Â Å×ÀÌºí¿¡ ÇÑ ¹ø¸¸ ³ªÅ¸³³´Ï´Ù.
¼ö½Ä ÷ºÎ °áÇÕ¿¡´Â ´ÙÀ½ÀÇ °ÍÀÌ ÀÖ½À´Ï´Ù.
T1ÀÇ Çà R1¿¡ ´ëÇØ¼, T2¿¡ ´ëÇØ R1¿ÍÀÇ °áÇÕ Á¶°ÇÀ» ä¿ì°í ÀÖ´Â ÇàÀÌ, °áÇÕµÈ Å×ÀÌºí¿¡ Æ÷ÇԵ˴ϴÙ.
¿ì¼±, ³»ºÎ °áÇÕÀ» ÇÕ´Ï´Ù. ±× ÈÄ, T2ÀÇ ¾î´À Çà°úÀÇ °áÇÕ Á¶°Çµµ ä¿ìÁö ¾Ê´Â T1ÀÇ °¢ Çà¿¡ ´ëÇØ¼´Â, T2ÀÇ ¿À» NULLÄ¡·Î¼ °áÇÕÇÑ ÇàÀÌ Ãß°¡µË´Ï´Ù. µû¶ó¼, ¿¬°áµÈ Å×À̺íÀº ¹«Á¶°Ç T1ÀÇ Çà °¢°¢ Àû¾îµµ 1°³ÀÇ ÇàÀÌ ÀÖ½À´Ï´Ù.
¿ì¼±, ³»ºÎ °áÇÕÀ» ÇÕ´Ï´Ù. ±× ÈÄ, T1ÀÇ ¾î´À ÇàÀÇ °áÇÕ Á¶°Çµµ ä¿ìÁö ¾Ê´Â T2ÀÇ °¢ Çà¿¡ ´ëÇØ¼´Â, T1ÀÇ ¿À» NULL°ªÀ¸·Î °áÇÕÇÑ ÇàÀÌ Ãß°¡µË´Ï´Ù. À̰ÍÀº ¿ÞÂÊ °áÇÕÀÇ ¹Ý´ëÀÔ´Ï´Ù. °á°úÀÇ Å×À̺íÀº, T2ÀÇ ÇàÀÌ ¹«Á¶°Ç µé¾î°©´Ï´Ù.
¿ì¼±, ³»ºÎ °áÇÕÀ» ÇÕ´Ï´Ù. ±× ÈÄ, 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)
Å×À̺íÀ̳ª º¹ÀâÇÑ Å×À̺í ÂüÁ¶´Â, Äõ¸®ÀÇ µÞÆíÀ¸·Î ÆÄ»ý Å×À̺íÀ» ÂüÁ¶Çϱâ À§Çؼ ÀϽÃÀûÀÎ À̸§À» ÁÙ ¼ö°¡ ÀÖ½À´Ï´Ù. À̰ÍÀ» Å×À̺íÀÇ º°¸íÀ̶ó°í ºÎ¸¨´Ï´Ù.
Å×À̺íÀÇ º°¸íÀ» ÀÛ¼ºÇÏ·Á¸é ÀÌÇÏ¿Í °°ÀÌ ÇÕ´Ï´Ù.
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ÀÇ ¿ÜÃø¿¡¼´Â ÂüÁ¶ÇÒ ¼ö°¡ ¾ø½À´Ï´Ù.
ÆÄ»ý Å×À̺íÀ» ÁöÁ¤ÇÏ´Â ¼ºêÄõ¸®´Â, °ýÈ£·Î µÑ·¯½Ò Çʿ䰡 ÀÖ½À´Ï´Ù. ¶Ç, ¹Ýµå½Ã Å×ÀÌºí º°¸íÀ» ÇÒ´çÇÒ ¼ö ÀÖ°í ÀÖÀ» Çʿ䰡 ÀÖ½À´Ï´Ù (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¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä.
Å×À̺í ÇÔ¼ö´Â, ±âº» µ¥ÀÌÅÍÇü(½ºÄ®¶óÇü), ȤÀº º¹ÇÕ µ¥ÀÌÅÍÇü(Å×À̺íÇà)À¸·ÎºÎÅÍ µÇ´Â ÇàÀÇ ÁýÇÕÀ» »ý¼ºÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. À̰͵éÀº, Å×À̺í, ºä, Äõ¸®ÀÇ 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¸¦ µ¹·ÁÁÖ´Â °ÍÀ̶ó°í ¼±¾ðµÇ°í ÀÖ½À´Ï´Ù. ½ÇÁ¦ÀÇ ¿ÁýÇÕÀº, ÆÄ¼°¡ ¿¹¸¦ µé¸é *ÀÌ ¾î¶»°Ô Àü°³µÇ´ÂÁö¸¦ ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï È£ÃâÇÑ Äõ¸®³»¿¡¼ ÁöÁ¤µÇÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù.
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°¡ ¼ºêÄõ¸®ÀÇ ÀÔ·Â Å×ÀÌºí¿¡¼ ÆÄ»ýÇÑ ·Ä¸íÀ̱⵵ ÇÒ ¶§¿¡¸¸ ÇÊ¿äÇÕ´Ï´Ù. ·Ä¸íÀÇ ¼ö½ÄÀº, ÇʼöÀÇ °æ¿ì°¡ ¾Æ´Ï¶óµµ, ¸íÈ®ÇÏ°Ô Çϱâ À§Çؼ µµ¿òÀÌ µË´Ï´Ù. ÀÌ ¿¹´Â, ¿ÜÃøÀÇ Äõ¸®ÀÇ ·Ä¸íÀÇ À¯È¿ ¹üÀ§¸¦, ¾î¶»°Ô ¾ÈÂÊÀÇ Äõ¸®±îÁö È®ÀåÇÏ´ÂÁö¸¦ ³ªÅ¸³À´Ï´Ù.
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À» ³Ñ´Â ±×·ì¿¡ Á¦ÇÑÇϰí ÀÖ½À´Ï´Ù. Áý°è½ÄÀÌ, Äõ¸®³»¿¡¼ Ç×»ó °°Àº Çʿ䰡 ¾ø´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä.