|
 |
|
|
 |
 | (2005-03-05 [11:34], Hit : 28762) |
 |
MySQL Table Join ±âÃÊ |
|
|
|
SQL(Structured Query Language)ÀÇ °¡Àå Å« Ư¡ ÁßÀÇ Çϳª´Â ¿©·¯°³ÀÇ Å×À̺íÀ» ¿¬°á½ÃÄÑ µ¥ÀÌÅ͸¦ °Ë»öÇϰųª Á¶ÀÛÇÒ ¼ö ÀÖ´Â ±â´ÉÀÌ´Ù. À̰ÍÀº µ¥ÀÌÅ͸¦ ½±°í ºü¸£°Ô °Ë»öÇÏ°í ºÒÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ ÁÙ¿©ÁÖ´Â ÀåÁ¡ÀÌ ÀÖ´Ù. ´Ù¸¥ SQL ¾ð¾î¿Í ¸¶Âù °¡Áö·Î MySQLµµ join¸í·É¾î·Î ÀÌ ¿¬»êÀ» ¼öÇàÇÑ´Ù.°£´ÜÈ÷ ¸»Çϸé joinÀº µÎ°³ ÀÌ»óÀÇ Å×À̺í·ÎºÎÅÍ ÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ ¿¬°áÇØ ÇϳªÀÇ Æ÷°ýÀûÀÎ ±¸Á¶·Î °áÇÕ½ÃŰ´Â ¿¬»êÀÌ´Ù.¿¹¸¦ µé¾î, ÇÑ ÄÄÇ»ÅÍ Á¦Á¶¾÷ÀÚ°¡ ÀÚ½ÅÀÇ µ¥ÀÌÅ͸¦ ´É·üÀûÀ¸·Î °ü¸®Çϱâ À§ÇÑ µ¥ÀÌÅͺ£À̽º°¡ ÇÊ¿äÇÏ´Ù°í ÇÏÀÚ. ÀÌ µ¥ÀÌÅ͵éÀº ÁÖ¹®, °í°´, »ý»ê°ú °°Àº ¾î¶² Àϰü¼ºÀÖ´Â °³³ä°ú °ü·ÃµÈ °¢°¢ÀÇ µ¥ÀÌÅ͵éÀÌ ¸ð¿© ´Ù¾çÇÏ°í °£°áÇÑ Å×À̺íµéÀ» ÀÌ·ê °ÍÀÌ´Ù. Å×À̺íÀ» »ý¼ºÇÑ ÈÄ¿¡´Â, ´Ù¾çÇÑ ¿¹¸¦ µé¾î µ¥ÀÌÅͺ£À̽º¿¡¼ °¡Àå ¸¹ÀÌ »ç¿ëµÇ´Â joinÀÇ Á¶ÀÛ¹ý¿¡ ´ëÇØ ¼³¸íÇϰڴÙ.ù¹øÂ° Å×À̺íÀº Á¦Á¶¾÷ÀÚ°¡ ºÐ·ùÇÑ ´Ù¾çÇÑ Å¸ÀÔÀÇ PCµéÀÇ µ¥ÀÌÅÍ·Î ±¸¼ºµÉ °ÍÀÌ´Ù. ---------------------------------------------- mysql> create table pcs ( -> pid INT, // product id -> spec char(3), -> os char(10), -> ram INT, -> hd char(4) -> ); -----------------------------------------------µÎ¹øÂ° Å×À̺íÀº Á¦Á¶¾÷ÀÚÀÇ ´Ù¾çÇÑ °í°´µé¿¡ °üÇÑ µ¥ÀÌÅÍ·Î ÀÌ·ç¾îÁú °ÍÀÌ´Ù. ----------------------------------------------- mysql> create table clients ( -> name char(25), -> cid char(8), // client id -> email char(25), -> tel char(10) -> ); -----------------------------------------------¼¼¹øÂ° Å×À̺íÀº ÁÖ¹® Á¤º¸¿¡ °üÇÑ µ¥ÀÌŸ¸¦ Æ÷ÇÔÇÒ °ÍÀÌ´Ù. ----------------------------------------------- mysql> create table orders ( -> order_date date, -> pid INT, -> cid char(8) -> ); -----------------------------------------------¡ß¡ß ÀÚ·á(Data) »ðÀÔÇϱⰢ°¢ÀÇ Å×ÀÌºí¿¡ ¾Æ·¡¿Í °°ÀÌ ÀڷḦ »ðÀÔÇØ º¸ÀÚ. ¡Ù pcs (Å×À̺í1) +------+------+-------+------+------+ | pid | spec | os | ram | hd | +------+------+-------+------+------+ | 1 | 386 | Linux | 64 | 3.1 | | 2 | 386 | Linux | 128 | 4.2 | | 3 | 486 | WinNT | 64 | 3.1 | | 4 | 586 | Linux | 128 | 4.2 | | 5 | 586 | Win98 | 128 | 6.4 | +------+------+-------+------+------+[»ðÀÔ¹æ¹ý] ----------------------------------------------------------- mysql> INSERT INTO pcs (pid, spec, os, ram, hd) -> VALUES (1, '386', 'Linux', 64, '3.1'); -----------------------------------------------------------¡Ù clients (Å×À̺í2) +--------+---------+---------------------------+------------+ | name | cid | email | tel | +--------+---------+---------------------------+------------+ | ¿øÁÖÈñ | wjh-042 | haremoon@won.hongik.ac.kr | 123-456-78 | | È«±æµ¿ | hgd-043 | honggd@won.hongik.ac.kr | 421-555-34 | | ÀÌ»Ú´Ï | pty-042 | pretty@won.hongik.ac.kr | 459-555-32 | | ¸ø³ÀÌ | ugy-043 | ugly@won.hongik.ac.kr | 439-555-88 | +--------+---------+---------------------------+------------+[»ðÀÔ¹æ¹ý] ----------------------------------------------------------- mysql> INSERT INTO clients (name, cid, email, tel) -> VALUES ('¿øÁÖÈñ', 'wjh-042', -> 'haremoon@won.hongik.ac.kr', '123-456-7890'); -----------------------------------------------------------¡Ù orders (Å×À̺í3) +------------+------+---------+ | order_date | pid | cid | +------------+------+---------+ | 1999-12-05 | 2 | wjh-042 | | 1999-12-04 | 3 | hgd-043 | | 1999-12-04 | 1 | wjh-042 | | 1999-12-05 | 2 | wjh-042 | | 1999-12-12 | 5 | ugy-043 | | 1999-12-05 | 5 | pty-042 | +------------+------+---------+[»ðÀÔ¹æ¹ý] ----------------------------------------------------------- mysql> INSERT INTO orders (order_date, pid, cid) -> VALUES ('1999-12-05', 2, 'wjh-042'); -----------------------------------------------------------ÀÚ, ÀÌÁ¦ºÎÅÍ ¸¸µé¾îÁø 3°³ÀÇ Å×À̺í·ÎºÎÅÍ ÇÊ¿äÇÑ µ¥ÀÌÅ͸¸À» ÃßÃâÇØ °áÇÕÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. ¸¸ÀÏ ´ç½ÅÀÇ »ó»ç°¡ ƯÁ¤ÇÑ ³¯¿¡ ƯÁ¤ÇÑ PC¸¦ ÁÖ¹®ÇÑ ¸ðµç °í°´ÀÇ À̸ÞÀÏ ¸ñ·ÏÀ» ¿øÇÑ´Ù°í ÇÏÀÚ! ¶Ç´Â ƯÁ¤ÇÑ °í°´¿¡ ÀÇÇØ ÀÛ¼ºµÈ ÁÖ¹®¼¿¡ ÀÖ´Â RAMÀÇ ¾çÀ» º¸°í¹Þ±â¸¦ ¿øÇÑ´Ù°í ÇÏÀÚ. ÀÌ·¯ÇÑ ¸ðµç ÀϵéÀº ´Ù¾çÇÑ join¹®¿¡ ÀÇÇØ ½±°Ô ¼öÇàµÉ ¼ö ÀÖ´Ù. ¸¸µé¾îÁø Å×À̺íÀ» »ç¿ëÇØ ù¹øÂ° join¹®À» »ý¼ºÇغ¸°í ÀÛ¼ºÇغ¸ÀÚ.¡ß¡ß The Cross JoinCross JoinÀº °¡Àå ±âº»ÀûÀÎ joinÀÇ Å¸ÀÔÀ¸·Î ÇÑ Å×ÀÌºí¿¡ ÀÖ´Â °¢°¢ÀÇ ¿ÀÌ ´Ù¸¥ Å×À̺íÀÇ ¸ðµç ¿¿¡ °£´ÜÇÏ°Ô ¸ÅÄ¡µÇ¾î Ãâ·ÂµÈ´Ù. ´É·üÀûÀÌÁö´Â ¾ÊÁö¸¸, ¸ðµç join ÀÇ °øÅëµÈ Ư¡À» ³ªÅ¸³»ÁØ´Ù. Cross JoinÀÇ °£´ÜÇÑ ¿¹ : ---------------------------------------------- mysql> SELECT * FROM pcs, clients; ----------------------------------------------¸Å¿ì ¸¹Àº ¿µéÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù. Å×À̺í1(pcs)¿¡ ÀÖ´Â °¢°¢ÀÇ ¿ÀÌ Å×À̺í2(clients) ÀÇ ¸ðµç ¿¿¡ ¸ÅÄ¡µÈ´Ù´Â °ÍÀ» ±â¾ïÇÏÀÚ. µû¶ó¼, 3 ¿À» °¡Áø Å×À̺í1(pcs)°ú 4 ¿À» °¡Áø Å×À̺í2(clients)¸¦ Æ÷ÇÔÇÑ join¹®Àº ÃÑ 12 ¿ÀÇ Å×À̺íÀ» ¸¸µé°ÍÀÌ´Ù. Áï cross-joinÀº Å×À̺í1¿¡ ÀÖ´Â °¢°¢ÀÇ ¿µéÀÌ Å×À̺í2¿¡ ÀÖ´Â ¸ðµç¿µéÀ» ÇÑ ¹ø¾¿ ±³Â÷ÇØ Ãâ·ÂÇÑ´Ù°í ±â¾ïÇÏ´Â °ÍÀÌ ½¬¿ï °Í°°´Ù. ù¹øÂ° joinÀ» ¼º°øÀûÀ¸·Î ¼öÇàÇß´Ù¸é ´ÙÀ½ÀÇ ¿¹µµ ¾î·ÆÁö ¾ÊÀ» °ÍÀÌ´Ù.¾Æ·¡ÀÇ ¿¹¸¦ µû¶óÇØ º¸°í ¾î¶² °á°ú°¡ Ãâ·ÂµÉÁö ¿¹»óÇØº¸ÀÚ.----------------------------------------------------------------------------- mysql> select c.name, o.cid from orders o, clients c where o.cid = "wjh-042"; -----------------------------------------------------------------------------+--------+---------+ | name | cid | +--------+---------+ | ¿øÁÖÈñ | wjh-042 | | ¿øÁÖÈñ | wjh-042 | | ¿øÁÖÈñ | wjh-042 | | È«±æµ¿ | wjh-042 | | È«±æµ¿ | wjh-042 | | È«±æµ¿ | wjh-042 | | ÀÌ»Ú´Ï | wjh-042 | | ÀÌ»Ú´Ï | wjh-042 | | ÀÌ»Ú´Ï | wjh-042 | | ¸ø³ÀÌ | wjh-042 | | ¸ø³ÀÌ | wjh-042 | | ¸ø³ÀÌ | wjh-042 | +--------+---------+¿¹»óÇÑ ´ë·Î °á°ú°¡ Ãâ·ÂµÇ¾ú³ª? clients Å×ÀÌºí¿¡ ÀÖ´Â °¢°¢ÀÇ nameÀÌ ordersÅ×ÀÌ ºíÀÇ "wjh-042"¸¦ Æ÷ÇÔÇÑ ¿¸¶´Ù ¸ÅÄ¡µÇ¾î Ãâ·ÂµÇ¾ú´Ù. Áö±Ý±îÁöÀÇ ¼³¸íÀÌ Cross JoinÀ» ¼³¸íÇϴµ¥ ÃæºÐÇÏÁö ¾ÊÀ¸¹Ç·Î ´Ù¸¥ ÁúÀǸ¦ »ç¿ëÇØ°¡¸ç JOINÀ» Ȱ¿ëÇØº¸±â ¹Ù¶õ´Ù.NOTE : ¿Ö Å×À̺íÀÇ À̸§¿¡ º°¸íÀ» ÁÖ¾î »ç¿ëÇÒ±î? Aliases(º°¸í)Àº ÁúÀǸ¦ ÀÔ·ÂÇÒ ¶§ ¹Ýº¹ÀûÀΠŰÀÇ ÀÔ·ÂÀ» ÁÙ¿©ÁÖ´Â ¹æ¹ýÀ¸·Î »ç¿ëµÇ¾îÁø´Ù. µû¶ó¼ ¿À» ÁöÁ¤ÇØ ÁÙ ¶§ ¹Ýº¹ÀûÀ¸·Î 'clients'¸¦ ÇÑÀÚ ÇÑÀÚ ÀÔ·ÂÇÏ´Â ´ë½Å¿¡, ÁúÀdz»¿¡ 'from clients c' ¸¦ ÁöÁ¤ÇØÁÖ°í 'c'¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.Cross JoinÀÌ Å×À̺íµéÀ» ¿¬°áÇØ ÁÖ±â´Â ÇÏÁö¸¸, ´É·üÀûÀÌÁö´Â ¸øÇÏ´Ù. µû¶ó¼ °¢°¢ÀÇ Å×À̺íµé·Î ºÎÅÍ ¿ì¸®°¡ ¿øÇÏ´Â µ¥ÀÌŸ¸¦ ¾î¶»°Ô ÇÏ¸é ½±°Ô ¼±ÅÃÇÒ ¼ö ÀÖ´ÂÁö °è¼Ó ´ÙÀ½ ÀåÀ» Àо±â ¹Ù¶õ´Ù.¡ß¡ß The Equi-join Equi-joinÀº ÇÑ Å×ÀÌºí¿¡ ÀÖ´Â ¾î¶°ÇÑ °ªÀÌ µÎ¹øÂ°(¶Ç´Â ´Ù¼öÀÇ) Å×ÀÌºí³»¿¡ Æ÷ÇÔµÈ °ª¿¡ ÀÏÄ¡ ÇÒ ¶§ ¼öÇàµÈ´Ù.product id °¡ 1ÀÎ PC¸¦ ÁÖ¹®ÇÑ °í°´ÀÇ ¸ñ·ÏÀ» ¿øÇÑ´Ù°í °¡Á¤ÇØ º¸ÀÚ.------------------------------------------------------------------- mysql> select p.os, c.name from orders o, pcs p, clients c -> where p.pid=o.pid and o.pid = 1 and o.cid=c.cid; -------------------------------------------------------------------+-------+--------+ | os | name | +-------+--------+ | Linux | ¿øÁÖÈñ | +-------+--------+¡ß Non-Equi-join Equi-joinÀº ´Ù¼öÀÇ Å×À̺íµé »çÀÌ¿¡¼ ÀÏÄ¡ÇÏ´Â ÀÚ·áµé¸¸À» ÃßÃâÇØ³½´Ù. ±×·¯³ª ¸¸ÀÏ ÀÏÄ¡ÇÏÁö ¾ÊÀº ÀÚ·áµé¸¸À» ÃßÃâÇØ¾ß ÇÑ´Ù¸é...? ¿¹¸¦ µé¾î, ´ç½ÅÀÇ »ó»ç°¡ ÁÖ¹®ÇÑ pid°¡ Á¦Ç°ÀÇ pidº¸´Ù ´õ Å« order idÀÇ ¸ðµç ¿î¿µÃ¼Á¦(OS)ÀÇ ¸ñ·ÏÀ» ÇÊ¿ä·Î ÇÑ´Ù¸é ¾î¶»°Ô ÇÒ °ÍÀΰ¡? Àû´çÈ÷ À̸§À» non-equi join¶ó°í ÇϰڴÙ.------------------------------------------------------------------- mysql> SELECT p.os, o.pid from orders o, pcs p where o.pid > p.pid; -------------------------------------------------------------------+-------+------+ | os | pid | +-------+------+ | Linux | 2 | | Linux | 3 | | Linux | 2 | | Linux | 5 | | Linux | 5 | | Linux | 3 | | Linux | 5 | | Linux | 5 | | WinNT | 5 | | WinNT | 5 | | Linux | 5 | | Linux | 5 | +-------+------+orders Å×À̺íÀÇ pid°¡ pcsÅ×À̺íÀÇ pidº¸´Ù ´õ Å« ¸ðµç ¿µéÀÌ ¸ÅÄ¡µÉ °ÍÀÌ´Ù. ÁÖÀDZí°Ô »ìÆìº¸¸é, ¿©·¯°¡Áö Á¦ÇÑÀ» ÁØ °£´ÜÇÑ cross-join ÀÓÀ» ÆÄ¾ÇÇÒ ¼ö ÀÖ À» °ÍÀÌ´Ù. »ó»ç¿¡°Ô´Â Ưº°ÇÏ°Ô À¯¿ëÇÏÁö ¾ÊÀ» Áöµµ ¸ð¸£Áö¸¸, ¸Å¿ì À¯¿ëÇÑ ±â ´ÉÀÎ left joinÀ» À§ÇÑ Áغñ °úÁ¤À¸·Î »ý°¢ÇÏÀÚ. ÀÚ, ÀÌÁ¦ ´ÙÀ½ÀåÀ¸·Î °¡¼ left joinÀ» »ç¿ëÇÒ ¶§ À¯¿ëÇÒ ¼öÀÖ´Â ¿É¼Çµé¿¡ ´ëÇØ ÁýÁßÀûÀ¸·Î ¾Ë¾Æº¸ÀÚ.¡ß¡ß The Left JoinLeft JoinÀº »ç¿ëÀÚ°¡ ¾î¶°ÇÑ Á¦ÇÑÀ» ±â¹ÝÀ¸·Î °ü½ÉÀÖ´Â ¸ðµç Á¾·ùÀÇ ÀڷḦ ÃßÃâ ÇϰÔÇÑ´Ù. Å×À̺í joinÁß °¡Àå ¸·°ÇÑ ¿É¼ÇÀ¸·Î, Å×À̺íÀ» ¸Å¿ì ½±°Ô Á¶ÀÛÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.¸¸ÀÏ »ó»ç°¡ Á»´õ ÀÚ¼¼È÷, ÀÚ¼¼È÷, ÀÚ¼¼ÇϰÔ, ÀÚ¼¼ÇϰÔ!¸¦ ¿ÜÄ£´Ù°í °¡Á¤Çغ¸ÀÚ. left joinÀÌ ¿ì¸®ÀÇ ¹®Á¦¸¦ ÇØ°áÇØ ÁÙ °ÍÀÌ´Ù.------------------------------------------------------------------- mysql> select * from orders left join pcs on orders.pid = pcs.pid; -------------------------------------------------------------------+------------+------+---------+------+------+-------+------+------+ | order_date | pid | cid | pid | spec | os | ram | hd | +------------+------+---------+------+------+-------+------+------+ | 1999-12-05 | 2 | wjh-042 | 2 | 386 | Linux | 128 | 4.2 | | 1999-12-04 | 3 | hgd-043 | 3 | 486 | WinNT | 64 | 3.1 | | 1999-12-04 | 1 | wjh-042 | 1 | 386 | Linux | 64 | 3.1 | | 1999-12-05 | 2 | wjh-042 | 2 | 386 | Linux | 128 | 4.2 | | 1999-12-12 | 5 | ugy-043 | 5 | 586 | Win98 | 128 | 6.4 | | 1999-12-05 | 5 | pty-042 | 5 | 586 | Win98 | 128 | 6.4 | +------------+------+---------+------+------+-------+------+------+°í°´ÀÌ ÁÖ¹®ÇÑ ¸ðµç PCµéÀÇ ¸ñ·ÏÀ» ÃßÃâÇØ ³½´Ù. ¿¹¸¦ µé¾î, PHP3 ¶Ç´Â Perl ½ºÅ©¸³Æ®¸¦ »ç¿ëÇØ ¿µ¼öÁõÀ» Ãâ·ÂÇϴµ¥ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. °í°´µé¿¡°Ô ¿ì¸®È¸ »ç·ÎºÎÅÍ ±¸ÀÔÇÑ ¸ðµç Á¦Ç°ÀÇ ¸ñ·ÏÀ» °¡²û¾¿ ¸ÞÀÏ·Î º¸³»¾ß ÇÒ ¶§¿¡µµ clients Å×À̺í°ú ¿¬°áÇØ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.¾Æ·¡ÀÇ ¿¹¿¡¼ ¿ì¸®´Â Á¦Ç°ÀÇ id(pid)°¡ 3ÀÎ PCÀÇ Á¤º¸¸¸À» º¼ ¼ö ÀÖ´Ù.------------------------------------------------------------------- mysql> select * from orders left join pcs on pcs.pid=3 and pcs.pid=orders.pid; -------------------------------------------------------------------+------------+------+---------+------+------+-------+------+------+ | order_date | pid | cid | pid | spec | os | ram | hd | +------------+------+---------+------+------+-------+------+------+ | 1999-12-05 | 2 | wjh-042 | NULL | NULL | NULL | NULL | NULL | | 1999-12-04 | 3 | hgd-043 | 3 | 486 | WinNT | 64 | 3.1 | | 1999-12-04 | 1 | wjh-042 | NULL | NULL | NULL | NULL | NULL | | 1999-12-05 | 2 | wjh-042 | NULL | NULL | NULL | NULL | NULL | | 1999-12-12 | 5 | ugy-043 | NULL | NULL | NULL | NULL | NULL | | 1999-12-05 | 5 | pty-042 | NULL | NULL | NULL | NULL | NULL | +------------+------+---------+------+------+-------+------+------+¡ß The Using Clauseleft join¿¡ ¾à°£ÀÇ ¿É¼ÇÀ» ÁÖ¾î µÑ ÀÌ»óÀÇ Å×ÀÌºí¿¡ ÀÖ´Â µ¿ÀÏÇÑ Ä÷³À» Á¶±Ý ´õ ±í°Ô ¿¬°üÁöÀ»¼öµµ ÀÖ´Ù. on°ú using¿É¼ÇÀÌ »ç¿ëµÇ¸ç, ¾Æ·¡ÀÇ ¿¹Á¦¸¦ ÂüÁ¶ÇÏÀÚ. -------------------------------------------------------------------- ## ¿øº»ÀÇ ¿¹Á¦´Â ¾Æ·¡¿Í °°Áö¸¸, ¿¡·¯°¡ ¹ß»ýÇØ ÇÊÀÚ°¡ MySQL¸Å´º¾óÀ» ÂüÁ¶ÇØ ³ª¸§´ë·Î ¼öÁ¤À» Çß´Ù.## mysql> SELECT * from clients join on orders where clients.cid = orders.cid; mysql> SELECT * from clients join on orders using (cid); -------------------------------------------------------------------==> ¼öÁ¤ÇÑ ¿¹Á¦------------------------------------------------------------------- mysql> SELECT * from clients left join orders on clients.cid = orders.cid; -------------------------------------------------------------------¶Ç´Â ¾Æ·¡¿Í °°ÀÌ ³ªÅ¸³¾ ¼öµµ ÀÖ´Ù. ------------------------------------------------------------------- mysql> SELECT * from clients left join orders using (cid); -------------------------------------------------------------------µÎ ¿¹Á¦ ¸ðµÎ ¶È°°Àº °á°ú°¡ Ãâ·ÂµÉ °ÍÀÌ´Ù.+--------+---------+---------------------------+------------+------------+------+---------+ | name | cid | email | tel | order_date | pid | cid | +--------+---------+---------------------------+------------+------------+------+---------+ | ¿øÁÖÈñ | wjh-042 | haremoon@won.hongik.ac.kr | 123-456-78 | 1999-12-05 | 2 | wjh-042 | | ¿øÁÖÈñ | wjh-042 | haremoon@won.hongik.ac.kr | 123-456-78 | 1999-12-04 | 1 | wjh-042 | | ¿øÁÖÈñ | wjh-042 | haremoon@won.hongik.ac.kr | 123-456-78 | 1999-12-05 | 2 | wjh-042 | | È«±æµ¿ | hgd-043 | honggd@won.hongik.ac.kr | 421-555-34 | 1999-12-04 | 3 | hgd-043 | | ÀÌ»Ú´Ï | pty-042 | pretty@won.hongik.ac.kr | 459-555-32 | 1999-12-05 | 5 | pty-042 | | ¸ø³ÀÌ | ugy-043 | ugly@won.hongik.ac.kr | 439-555-88 | 1999-12-12 | 5 | ugy-043 | +--------+---------+---------------------------+------------+------------+------+---------+ ´Ù¸¥ ±¸¹®ÀÇ ¿¹¸¦ Àû¿ëÇØ °¡¸ç left join¿¡ ´ëÇØ ÀÌÇØÇϱ⠹ٶõ´Ù. °øºÎ¸¦ ÇÏ´Ùº¸¸é left joinÀÌ ¿©·¯ºÐÀÇ °³¹ßȰµ¿¿¡ ¸Å¿ì Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ ´Ù´Â °ÍÀ» ´À³¥ °ÍÀÌ´Ù. Å×À̺í join¿¡ °üÇÑ Á¤º¸¸¦ Á»´õ ±í°Ô ±³È¯ÇÏ°í ½Í´Ù¸é http://www.mysql.com¿¡ ÀÖ´Â ´Ù¾çÇÑ Åä·Ð ±×·ìÀ» Ã¼Å©ÇØ º¸±â ¹Ù¶õ´Ù. ¡ß¡ß Self-joins Self-joinÀº °ü¸®ÀÚ°¡ ÇϳªÀÇ Å×ÀÌºí¿¡ °ü·ÃµÈ µ¥ÀÌŸ¸¦ ÁýÁß½ÃŰ´Â ¸·°ÇÑ ¹æ¹ýÀ» Á¦°øÇØ ÁØ´Ù. »ç½Ç, self-joinÀº ±× ÀÚ½ÅÀÇ Å×ÀÌºí¿¡ °áÇÕÇÏ´Â °Í¿¡ ÀÇÇØ ¼öÇàµÈ´Ù. °³³äÀÇ ÀÌÇØ¸¦ À§ÇØ ¿¹¸¦ µé¾î ¼³¸íÇϰڴÙ.ÄÄÇ»ÅÍ ¿öÅ©½ºÅ×À̼ÇÀ» ¸¸µå´Âµ¥ »ç¿ëµÇ´Â Çϵå¿þ¾îÀÇ ´Ù¾çÇÑ ºÎǰ¿¡ °üÇÑ Á¤º¸¸¦ °¡Áø ¸Å¿ì Å« µ¥ÀÌŸº£À̽º¸¦ °ü¸®ÇØ¾ß ÇÑ´Ù°í °¡Á¤ÇÏÀÚ. ¿öÅ©½ºÅ×À̼ÇÀº µ¥½ºÅ©, PC, ¸ð´ÏÅÍ, Űº¸µå, ¸¶¿ì½ºµîÀ¸·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. °Ô´Ù°¡, µ¥½ºÅ©´Â ¿öÅ©½ºÅ×À̼ÇÀÇ ¸ðµÎ ´Ù¸¥ ºÎºÐÀÇ 'ºÎ¸ð'¶ó°í »ý°¢µÉ ¼ö ÀÖ´Ù. ¿ì¸®´Â °¢ ¿öÅ©½ºÅ×À̼ÇÀÇ ·¹Äڵ尡 Á¤È®ÇÑ ÀÚ·á·Î À¯ÁöµÇ±â¸¦ ¿øÇÒ °ÍÀ̸ç, À¯ÀÏÇÑ ID¹øÈ£¸¦ ºÎ¿©ÇÔÀ¸·Î½á ¿öÅ©½ºÅ×ÀÌ¼Ç ÀÇ ¸ðµç ºÎºÐÀ» ±¸Ã¼ÀûÀ¸·Î °ü·Ã½Ãų °ÍÀÌ´Ù. »ç½Ç, °¢ ºÎºÐÀº Ç׸ñÀ» ºÐ¸íÇÏ°Ô ÇØÁÖ´Â À¯ÀÏÇÑ ID¹øÈ£¿Í ±×°ÍÀÇ ºÎ¸ð(µ¥½ºÅ©) ID¹øÈ£¸¦ È®ÀÎÇϱâ À§ÇÑ, µÎ°³ÀÇ ID ¹øÈ£¸¦ Æ÷ÇÔ °ÍÀÌ´Ù. Å×À̺íÀÌ ¾Æ·¡¿Í °°´Ù°í °¡Á¤ÇÏÀÚ.mysql> select * from ws; +---------+-----------+-----------+ | uniq_id | name | parent_id | +---------+-----------+-----------+ | d001 | desktop | NULL | | m4gg | monitor | d001 | | k235 | keyboar | d001 | | pc345 | 200mhz pc | d001 | | d002 | desktop | NULL | | m156 | monitor | d002 | | k9334 | keyboar | d002 | | pa556 | 350mhz pc | d002 | +---------+-----------+-----------+ desktopÀº ±×¿Í °ü·ÃµÈ ¸ðµç ºÎºÐµéÀÇ ºÎ¸ð¿Í °°À¸¹Ç·Î parent_id¸¦ °¡Áö°í ÀÖÁö ¾ÊÀ½À» ÁÖ¸ñÇÏÀÚ. Áö±ÝºÎÅÍ À¯¿ëÇÑ Á¤º¸¸¦ À§ÇÑ ÁúÀǸ¦ ½ÃÀÛÇÒ °ÍÀÌ´Ù. self-join ÀÇ »ç¿ë¹ýÀ» ½±°Ô ¼³¸íÇϱâ À§ÇØ Å×À̺íÀ» °£´ÜÇÏ°Ô ¸¸µé¾ú´Ù.------------------------------------------------------------------- mysql> select t1.*, t2.* from ws as t1, ws as t2; -------------------------------------------------------------------¾î¶»°Ô Ãâ·ÂµÇ´Â°¡? ÀÌÀüó·³, ù¹øÂ° Å×À̺íÀÇ °¢ ¿µéÀÌ µÎ¹øÂ° Å×ÀÌºí¿¡ ÀÖ´Â ¸ðµç ¿µé¿¡ ¸ÅÄ¡µÇ¾î ¿¬°áµÇ Ãâ·ÂµÉ °ÍÀÌ´Ù. ¿ì¸®¿¡°Ô ¸Å¿ì À¯¿ëÇÏÁö´Â ¾ÊÁö¸¸ ´Ù½Ã Çѹø ½ÃµµÇغ¸°í È®ÀÎÇØ º¸±â¹Ù¶õ´Ù. Á»´õ Àç¹ÌÀÖ´Â ¿¹¸¦ µé¾îº¸°Ú´Ù.------------------------------------------------------------------- mysql> select parent.uniq_id, parent.name, child.uniq_id, child.name -> from ws as parent, ws as child -> where child.parent_id = parent.uniq_id and parent.uniq_id = "d001"; -------------------------------------------------------------------Èï¹Ì·Î¿î °á°ú°¡ Ãâ·ÂµÉ °ÍÀÌ´Ù. +---------+---------+---------+-----------+ | uniq_id | name | uniq_id | name | +---------+---------+---------+-----------+ | d001 | desktop | m4gg | monitor | | d001 | desktop | k235 | keyboar | | d001 | desktop | pc345 | 200mhz pc | +---------+---------+---------+-----------+self-joinÀº Å×À̺íÀÇ ÀڷḦ °ËÁõÇÏ´Â ¹æ¹ýÀ¸·Îµµ »ç¿ëµÈ´Ù. Å×ÀÌºí³»¿¡ ÀÖ´Â uniq_idÄ÷³Àº Å×ÀÌºí¿¡¼ À¯ÀÏÇØ¾ß Çϸç, ¸¸ÀÏ µ¥ÀÌŸÀÇ ¿£Æ®¸®°¡ ±í¾î ¶æÇÏÁö ¾Ê°Ô °°Àº uniq_id¸¦ °¡Áø µÎ°³ÀÇ Ç׸ñÀÌ µ¥ÀÌŸº£À̽º¿¡ ÀԷµȴٸé ÁÁÁö ¾ÊÀº °á°ú°¡ »ý±æ°ÍÀÌ´Ù. ÀÌ·² °æ¿ì Á¤±âÀûÀ¸·Î self-joinÀ» »ç¿ëÇØ üũÇÒ ¼ö ÀÖ´Ù. ¿ì¸®´Â 350mhz pcÀÇ uniq_id°¡ 'm156'(ÀÌ °ªÀº ¿öÅ©½ºÅ×ÀÌ¼Ç 'd002'¿¡ ¼ÓÇÑ ¸ð´ÏÅÍÀÇ uniq_id °ªÀÌ´Ù.)ÀÌ µÇµµ·Ï º¯°æÇß´Ù°í °¡Á¤ÇÏÀÚ.Å×À̺íÀÇ ³»¿ëÀº ´ÙÀ½°ú °°ÀÌ º¯°æÇÑ´Ù. ------------------------------------------------------------------- mysql> update ws set uniq_id = 'm156' where name = '350mhz pc'; -------------------------------------------------------------------¾Æ·¡ÀÇ ¿¹¸¦ Âü°íÇØ wsÅ×ÀÌºí¿¡ self-joinÀ» Àû¿ëÇØº¸ÀÚ.------------------------------------------------------------------- mysql> select parent.uniq_id, parent.name, child.uniq_id, child.name -> from ws as parent, ws as child -> where parent.uniq_id = child.uniq_id and parent.name <> child.name; -------------------------------------------------------------------¾Æ·¡¿Í °°ÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù. +---------+-----------+---------+-----------+ | uniq_id | name | uniq_id | name | +---------+-----------+---------+-----------+ | m156 | 350mhz pc | m156 | monitor | | m156 | monitor | m156 | 350mhz pc | +---------+-----------+---------+-----------+
|
|
MSIE 6.0 (Windows NT 5.1) 210.105.172.170
|
|
|
|
|
|
 |
|