ÀÚü Á¶ÀÎ(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¸¦ »ç¿ëÇÏ¸é °¢ µð·ºÅ͸®ÀÇ Àüü
°æ·Î¸¦ º¸¿©Áְųª ±×·¡ÇÈ ÇüÅ·ΠÃâ·ÂÇÒ ¼öµµ ÀÖ´Ù.
Áö±Ý±îÁö ¾Ë¾Æº» Á¶ÀÎ ¹®¹ýÀº 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º°·Î Å« Â÷ÀÌ ¾øÀÌ Àß Á¤ºñµÇ¾î
ÀÖ´Ù. Áö±ÝÀº Àß »ç¿ëÇÏÁö ¾Ê°í ±ÇÀåÇÏÁöµµ ¾Ê´Â ÀÌ·± ±¸Çü ¹®¹ýÀ» ±»ÀÌ ¼Ò°³ÇÏ´Â ÀÌÀ¯´Â ¾ÆÁ÷µµ ÀÌ·±
½ÄÀ¸·Î ÀÛ¼ºµÈ Äõ¸®°¡ ³²¾Æ Àֱ⠶§¹®ÀÌ´Ù. ¿À·¡µÈ Äõ¸®¹®¿¡¼ ÀÌ·± ±¸¹®À» ¸¸³ª¸é Ç¥ÁØ ±¸¹®À¸·Î ¹Ù²Ü
¼ö ÀÖ¾î¾ß ÇÑ´Ù.