10-4.Á¶ÀÎ °í±Þ

1.ÀÚü Á¶ÀÎ

ÀÚü Á¶ÀÎ(Self Join)Àº Á¶ÀÎ Å×À̺íÀÌ ÀÚ±â ÀÚ½ÅÀÌ´Ù. Ưº°ÇÑ ¹®¹ýÀÌ µû·Î ¾ø°í ³»ºÎ Á¶ÀÎ ¹®¹ýÀ» »ç¿ëÇÑ´Ù. ÇÑ Å×À̺íÀ» Á¶ÀÎÇÏ´Â °ÍÀÌ Àǹ̰¡ ÀÖÀ¸·Á¸é Å×ÀÌºí ³»ÀÇ Çʵ峢¸® ÂüÁ¶ °ü°è¿©¾ß ÇÑ´Ù. Áï, ÇÑ Çʵ尡 ´Ù¸¥ Çʵ带 ÂüÁ¶ÇÏ´Â 1:nÀÇ ÀÚ±â ÂüÁ¶ °ü°è°¡ Àִ Ư¼öÇÑ Å×ÀÌºí¿¡¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ Á¶°Ç¿¡ ¸Â´Â °£´ÜÇÑ ¿¹Á¦ Å×À̺íÀ» ¸¸µé¾î º¸ÀÚ.

 

CREATE TABLE tDirectory

(

     id INT PRIMARY KEY,

     name VARCHAR(20) NOT NULL,

     parent INT NOT NULL

);

 

INSERT INTO tDirectory (id, Name, parent) VALUES (1, 'Root', 0);

INSERT INTO tDirectory (id, Name, parent) VALUES (2, 'Data', 1);

INSERT INTO tDirectory (id, Name, parent) VALUES (3, 'Program', 1);

INSERT INTO tDirectory (id, name, parent) VALUES (4, 'Sound', 2);

INSERT INTO tDirectory (id, name, parent) VALUES (5, 'Picture', 2);

INSERT INTO tDirectory (id, name, parent) VALUES (6, 'Game', 3);

INSERT INTO tDirectory (id, name, parent) VALUES (7, 'StartCraft', 6);

 

ÀÌ Å×À̺íÀº µð·ºÅ͸® ±¸Á¶¸¦ Ç¥ÇöÇϴµ¥ id´Â µð·ºÅ͸®ÀÇ °íÀ¯ ¹øÈ£ÀÌ°í nameÀº µð·ºÅ͸®ÀÇ À̸§ÀÌ´Ù. µð·ºÅ͸®³¢¸®´Â °èÃþ ±¸Á¶¸¦ ÀÌ·ç¹Ç·Î ºÎ¸ð°¡ ÀÖ¾î¾ß ÇÑ´Ù. parent Çʵå´Â ºÎ¸ð Çʵ尡 ´©±¸Àΰ¡¸¦ °¡¸®Å°¸ç 0ÀÏ °æ¿ì ·çÆ®ÀÌ´Ù.

1¹ø Root°¡ ÃÖ»óÀ§ÀÌ°í 1¹ø¿¡ ¼ÓÇÑ ÀÚ½ÄÀ¸·Î Data¿Í ProgramÀÌ ÀÖ´Ù. Sound, Picture µð·ºÅ͸®´Â 2¹ø µð·ºÅ͸®ÀÎ Data¸¦ ºÎ¸ð·Î °¡Áö°í GameÀº 3¹ø µð·ºÅ͸®ÀÎ Program¿¡ ¼ÓÇϸç StarCraft¸¦ ÀÚ½Ä µð·ºÅ͸®·Î °¡Áø´Ù. °èÃþÀûÀÎ ±¸Á¶¸¦ Æò¸éÀûÀÎ Å×À̺í·Î Ç¥ÇöÇÒ ¶§ ÀÌ·± ¹æ½ÄÀ» ÈçÈ÷ »ç¿ëÇÑ´Ù.

ÀÌ Å×ÀÌºí¿¡¼­ id¿Í parent´Â µÑ ´Ù µð·ºÅ͸® ¹øÈ£ÀÌµÇ parent°¡ id¸¦ ÂüÁ¶ÇÑ´Ù. Áï ÀÚ½ÅÀÇ ºÎ¸ð°¡ ´©±¸ÀÎÁö Å×ÀÌºí ³»ÀÇ ´Ù¸¥ ·¹Äڵ忡 ´ëÇÑ ÂüÁ¶·Î Ç¥ÇöÇÑ´Ù. ÀÌ·± °æ¿ì¿¡ ÀÚü Á¶ÀÎÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº ºÎ¸ð µð·ºÅ͸®¿Í ±× ÀÚ½Ä µð·ºÅ͸® ¸ñ·ÏÀ» Ãâ·ÂÇÑ´Ù.

 

SELECT A.name ºÎ¸ð, B.name ÀÚ½Ä FROM tDirectory A

INNER JOIN tDirectory B ON A.id = B.parent;

JOIN ¾çÂÊÀÇ Å×À̺íÀÌ °°Áö¸¸ ³í¸®ÀûÀ¸·Î ´Ù¸¥ Å×À̺í·Î Ãë±ÞÇϱâ À§ÇØ ¹Ýµå½Ã º°¸íÀ» ÁöÁ¤ÇØ¾ß ÇÑ´Ù. º°¸íÀ» ÁÖÁö ¾ÊÀ¸¸é tDirectory JOIN tDirectory ±¸¹®Àº ¼º¸³ÇÏÁö ¾Ê´Â´Ù. °¢ ·¹ÄÚµåÀÇ ºÎ¸ð, ÀÚ½Ä °ü°è¸¦ °á°ú¼ÂÀ¸·Î Á¤¸®ÇÏ¿© Ãâ·ÂÇÑ´Ù. Àß ÀÌÇصÇÁö ¾ÊÀ¸¸é Á¶ÀÎ Á¶°ÇÀ» Á¦°ÅÇÑ Å©·Î½º Á¶ÀÎÀ» ¸ÕÀú »ý°¢ÇØ º¸ÀÚ.

 

SELECT A.name ºÎ¸ð, A.id, B.name, B.parent ÀÚ½Ä FROM tDirectory A CROSS JOIN tDirectory B;

 

ÃÑ 49°³ÀÇ ³í¸®°öÀ» »ý¼ºÇÑ´Ù. ÀÌ Áß ºÎ¸ðÀÇ id¿Í ÀÚ½ÄÀÇ parent°¡ ÀÏÄ¡ÇÏ´Â Çุ °ñ¶ó³»¸é µÈ´Ù. ±× Á¶°ÇÀÌ ¹Ù·Î ON A.id = B.parentÀÌ´Ù.

Root´Â ºÎ¸ð°¡ ¾ø°í Data¿Í ProgramÀº ºÎ¸ð°¡ ÀÖ´Ù. ºÎ¸ð°¡ ÀÖ´Â Çุ Ãß·Á³»¸é °èÃþµµ°¡ µÈ´Ù. Àç±ÍÀû CTE¸¦ »ç¿ëÇÏ¸é °¢ µð·ºÅ͸®ÀÇ Àüü °æ·Î¸¦ º¸¿©Áְųª ±×·¡ÇÈ ÇüÅ·ΠÃâ·ÂÇÒ ¼öµµ ÀÖ´Ù.

2.±¸Çü Á¶ÀÎ

Áö±Ý±îÁö ¾Ë¾Æº» Á¶ÀÎ ¹®¹ýÀº ANSI¿¡¼­ Á¦Á¤ÇÑ Ç¥ÁØ SQLÀÌ´Ù. Áö±ÝÀº ¸ðµç DBMS°¡ Ç¥ÁØ ±¸¹®À» Àß Áö¿øÇÏÁö¸¸ Ç¥ÁØÀÌ µµÀԵDZâ Àü¿¡´Â °¢ DBMS¸¶´Ù Á¶ÀÎ ¹®¹ýÀÌ ´Þ¶ú´Ù. ³»ºÎ Á¶ÀÎÀº ´Ü¼ø Á¶ÀÎ ÈÄ WHERE Àý¿¡ Á¶°ÇÀ» ÁöÁ¤ÇÏ´Â Çü½ÄÀ¸·Î »ç¿ëÇß´Ù.

 

SELECT * FROM tCar, tMaker WHERE tCar.maker = tMaker.maker;

 

°£ÆíÇؼ­ ¾ÆÁ÷±îÁöµµ ¿©ÀüÈ÷ »ç¿ëÇÏ¸ç ¸ðµç DBMS°¡ ´Ù Áö¿øÇÑ´Ù. Ç¥ÁØÀº ÀÌ ±¸¹®À» CROSS JOINÀ¸·Î Á¤ÀÇÇÏ¿© °ø½ÄÈ­ÇßÁö¸¸ ±ÇÀåÇÏÁö´Â ¾Ê´Â´Ù. Áö±ÝÀº µÎ Å×À̺íÀ» INNER JOIN ¾çÂÊ¿¡ Àû°í ON Àý¿¡ Á¶ÀÎ Á¶°ÇÀ» Àû´Â ³»ºÎ Á¶ÀÎÀ» »ç¿ëÇÏ´Â °ÍÀÌ Á¤¼®ÀÌ´Ù.

 

SELECT * FROM tCar INNER JOIN tMaker ON tCar.maker = tMaker.maker;

 

¿ÜºÎ Á¶ÀÎÀº ¿¹Àü Çü½ÄÀÌ Á» º¹ÀâÇÏ°í DBMS¸¶´Ù ±¸¹®µµ Á¶±Ý¾¿ ´Þ¶ú´Ù. Ç¥ÁØÀÇ ¿ÜºÎ Á¶ÀÎÀº LEFT, RIGHT, FULL·Î ¹æÇâÀ» ÁöÁ¤ÇÏ°í ON Àý¿¡ Á¶ÀÎ Á¶°ÇÀ» ÁöÁ¤ÇÑ´Ù.

 

SELECT * FROM tCar LEFT OUTER JOIN tMaker ON tCar.maker = tMaker.maker;

 

¿À¶óŬÀº ¿ÜºÎ Á¶ÀÎÀ» ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù. µ¥ÀÌÅÍ°¡ ÀûÀº ÂÊ, Áï ºÎÅ×ÀÌºí¿¡ (+) ±âÈ£¸¦ ºÙÀδÙ. ÀÌ ±âÈ£´Â Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ÇàÀ» ã¾Æ ÁÖÅ×ÀÌºí¿¡ µ¡ºÙ¿© Ãâ·ÂÇ϶ó´Â ¶æÀÌ´Ù. ´ÙÀ½Àº °¢°¢ ¿ÞÂÊ ¿ÜºÎ Á¶ÀÎ, ¿À¸¥ÂÊ ¿ÜºÎ Á¶ÀÎÀÌ´Ù.

 

SELECT * FROM tCar, tMaker WHERE tCar.maker = tMaker.maker(+);

SELECT * FROM tCar, tMaker WHERE tCar.maker(+) = tMaker.maker;

 

¿À¶óŬÀº ¾ÆÁ÷±îÁöµµ ÀÌ ¹®¹ýÀ» Áö¿øÇÏÁö¸¸ ±ÇÀåÇÏÁö´Â ¾Ê´Â´Ù. SQL Server´Â ¿ÜºÎ Á¶ÀÎÀ» ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇß¾ú´Ù. ´Ü¼ø Á¶ÀÎ ±¸¹®°ú °°µÇ WHERE Àý¿¡¼­ *= ¿¬»êÀÚ·Î ¿ÞÂÊ ¿ÜºÎ Á¶ÀÎÀ» Ç¥±âÇÏ°í =* ¿¬»êÀÚ·Î ¿À¸¥ÂÊ ¿ÜºÎ Á¶ÀÎÀ» Ç¥±âÇÑ´Ù. * ±âÈ£°¡ ÀÖ´Â ÂÊÀÌ ÁÖÅ×À̺íÀÌ´Ù.

 

SELECT * FROM tCar, tMaker WHERE tCar.maker *= tMaker.maker;

 

±âÈ£·Î µÇ¾î ÀÖ¾î ª°í °£´ÜÇÏ´Ù. ±×·¯³ª Ç¥ÁØÀÌ ¾Æ´Ï¾î¼­ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®µµ ±ÇÀåÇÏÁö ¾Ê´Â´Ù. Çѵ¿¾È ¿É¼ÇÀ» Á¶Á¤Çؾ߸¸ ¾µ ¼ö ÀÖ´Â »óÅ¿´´Ù°¡ ÃֽŠSQL Server 2019¿¡¼­´Â ¾Æ¿¹ ¿¡·¯ ó¸®ÇÏ¿© Áö±ÝÀº ¿ÏÀüÈ÷ Æó±âÇÏ¿´´Ù.

¿À¶óŬ°ú SQL ServerÀÇ ¹®¹ýÀº ¸ðµÎ Ç¥ÁØ ÀÌÀü¿¡ ¸¸µé¾îÁø °ÍÀ̾ ¿¹Àü Á¶ÀÎ ¹®¹ýÀÌ ¾ÆÁ÷ ³²¾Æ ÀÖ´Ù. µÑ ´Ù FULL OUTER JOINÀº Áö¿øÇÏÁö ¾Ê´Â´Ù. ÆòÀÌÇÑ ¿µ¾î ±¸¹®À» ÁöÇâÇÏ´Â SQL¿¡ *=À̳ª (+) °°Àº ±âÈ£´Â ¾î¿ï¸®Áö ¾Ê´Â´Ù. MariaDB´Â ´Ü¼ø Á¶Àΰú ³»ºÎ, ¿ÜºÎ Á¶Àθ¸ Áö¿øÇÑ´Ù.

Ç¥ÁØÀÌ Àß Á¤¸³µÈ ´ö¿¡ Á¶ÀÎÀº DBMSº°·Î Å« Â÷ÀÌ ¾øÀÌ Àß Á¤ºñµÇ¾î ÀÖ´Ù. Áö±ÝÀº Àß »ç¿ëÇÏÁö ¾Ê°í ±ÇÀåÇÏÁöµµ ¾Ê´Â ÀÌ·± ±¸Çü ¹®¹ýÀ» ±»ÀÌ ¼Ò°³ÇÏ´Â ÀÌÀ¯´Â ¾ÆÁ÷µµ ÀÌ·± ½ÄÀ¸·Î ÀÛ¼ºµÈ Äõ¸®°¡ ³²¾Æ Àֱ⠶§¹®ÀÌ´Ù. ¿À·¡µÈ Äõ¸®¹®¿¡¼­ ÀÌ·± ±¸¹®À» ¸¸³ª¸é Ç¥ÁØ ±¸¹®À¸·Î ¹Ù²Ü ¼ö ÀÖ¾î¾ß ÇÑ´Ù.