สวัสดีครับผมกิ๊กคนเดิม เพิ่มเติมคือวันนี้จะมาพูดถึง การ JOIN ใน SQL ในลักษณะต่าง ๆ… ก่อนจะเข้าสู่บทความอยากจะขอร้องให้เข้าใจก่อนว่า phpmyadmin ไม่ใช่ ฐานข้อมูล มันเป็นแค่ tools เฉย ๆ แล้วแถมอีกนิด apache กับ appserv ไม่ใช่ PHP นะครับ… ถ้าทุกคนเข้าใจตรงนี้อยู่แล้ว ไปต่อกันเลย ถ้าไม่รู้มาก่อนก็ถือว่ารู้ไว้ใช่ว่านะจ๊ะ บทความนี้ได้รับแรงบันดาลใจมาจากภาพด้านล่างนี้ครับ คือพอเห็นรูปแล้วรู้สึกถึงพลังบางอย่าง ที่สามารถอธิบายการใช้ JOIN ได้ในภาพเดียว ยิ่งกว่าการพากเพียรเรียนมาในตำราเสียอีก… ถ้าใครยังไม่เข้าใจ อ่านบทความให้จบแล้วเลื่อนกลับมาดูรูปอีกครั้งครับ https://www.facebook.com/ProgrammersCreateLife/photos/a.241809332534619/1965745276807674/ JOIN IN SQLการ JOIN table ใน SQL นั้นมันก็คือการที่เราต้องการผลลัพท์ของตารางที่มีการ Query มากกว่า 1 ตารางนั่นเอง ผมจะไม่พูดเยอะนะครับว่ามันคือการทำอะไร เราไปกันต่อเลยดีกว่า ถ้าเราจะแบ่งประเภทของการ JOIN ใน SQL นั้นตอนที่ผม Research ก็มีมาเจออันที่ไม่เคยใช้เยอะเหมือนกัน ปัจจุบันการ JOIN มีอยู่ด้วยกัน 11 ประเภท
ในบทความนี้ผมจะยกตัวอย่างการ JOIN มาแค่ 4 อย่างตามที่เราเห็นจากภาพแห่งแรงบันดาลใจของผม อ้อออออออ อีกนิด SQL ไม่ใช่ MySQL หรือ MSSQL หรือ OracleSQL นะครับ LEFT JOINLEFT JOIN เป็นการ JOIN TABLE แบบ เอา TABLE ซ้าย หรือ TABLE แรก เป็นหลัก ถ้าซ้ายมี เอาซ้ายออกมาให้หมด ถ้าขวามี และซ้ายก็มีด้วย ก็จะเอาออกมา ถ้าขวาดันไม่มี แต่ซ้ายมี พวกฟิลด์ต่าง ๆ ที่อยู่ใน TABLE ขวาจะ NULL LEFT JOIN SELECT tbl1.col1, tbl2.col2... FROM tbl1 LEFT JOIN tbl2 ON tbl1.field_name = tbl2.field_name; การจำที่ง่ายที่สุดของ LEFT JOIN คือ เอาซ้ายเป็นหลัก RIGHT JOINRIGHT JOIN เป็นการ JOIN TABLE เหมือน LEFT JOIN ทุกประการแต่… แทนที่จะเอาข้อมูลด้านซ้าย ให้มาเอาด้านขวาแทน… ถ้าขวามี เอาขวาออกมาให้หมด ถ้าขวามี และซ้ายก็มีด้วย ก็จะเอาออกมา ถ้าซ้ายดันไม่มี แต่ขวามี พวกฟิลด์ต่าง ๆ ที่อยู่ใน TABLE ซ้ายจะ NULL RIGHT JOIN SELECT tbl1.col1, tbl2.col2... FROM tbl1 RIGHT JOIN tbl2 ON tbl1.field_name = tbl2.field_name; การจำที่ง่ายที่สุดของ RIGHT JOIN คือ เอาขวาเป็นหลัก INNER JOININNER JOIN ให้จำว่า Inner ล้วน ๆ อ่าวไม่ใช่… การทำ Inner join นั้นเป็นการเอาข้อมูลของทั้งสองตารางมา join กัน แต่ว่า จะเอาเฉพาะที่เงือนไขของทั้งสองตารางมีเหมือนกันเท่านั้น INNER JOIN SELECT tbl1.col1, tbl2.col2... FROM tbl1 INNER JOIN tbl2 ON tbl1.field_name = tbl2.field_name; การจำที่ง่ายที่สุดของ INNER JOIN คือ เอาที่มีทั้งคู่เท่านั้นมาแสดง FULL OUTER JOINFULL OUTER JOIN เป็นการ JOIN แบบไม่สนใจโลก ไม่สนใจว่าจะ ตารางซ้าย ตารางขวาคือเอาหมด ขอแค่มันตรงเงื่อนไขที่ระบุไว้ก็พอ ซ้ายมีก็แสดง ขวามีก็แสดง ซ้ายมีขวาไม่มีก็แสดง ส่วนด้านขวาที่ไม่มีจะออกเป็น null ขวามีซ้ายไม่มีก็แสดง ส่วนด้านซ้ายที่ไม่มีจะออกเป็น null FULL OUTER JOIN SELECT FROM tbl1 *FULL OUTER JOIN tbl2 ON tbl1.field_name = tbl2.field_name; ใน MySQL ไม่มี FULL OUTER JOIN นะครับ ถ้าจะใช้แนะนำให้ไปหาอ่าน “UNION” การจำที่ง่ายที่สุดของ FULL OUTER JOIN คือ เอาหมดทั้งซ้ายทั้งขวา Conclusionการทำ JOIN TABLE ในบทความนี้จะเห็นว่า ไม่มีการพูดถึง Performance ด้วย เนื่องจากต้องการอธิบายเทคนิคการ JOIN ที่ใช้บ่อยในชีวิตประจำวันสำหรับ Beginner มากกว่า ซึ่งการ JOIN นั้นจะมีผลอย่างมาก ในกรณีที่ Data ที่เราต้องการ Query มีปริมาณมาก อย่างใน MySQL เค้าก็จะมีคำสั่ง EXPLAIN เพื่อเอามาดูว่า Query นี้ทำงานอย่างไร ซึ่งเราก็ควรศึกษา และใช้ให้ถูก ให้ควรด้วย ไม่อย่างนั้นตัว Query นี่แหละที่จะเป็นอีกตัวหนึ่งที่ทำให้ระบบ บึ้มมมมมม ถ้าเราลองสังเกตุดี ๆ ระลึกชาติกันนิดหน่อย จะเห็นว่าพวกข้อมูลต่าง ๆ ที่เรากำลัง JOIN กันอยู่เนี่ย มันเป็นพื้นฐานมาจากวิชาคณิตศาสตร์ในเรื่องของ set ด้วย เห็นมั้ย เรียนไปได้ใช้… จบกันไปแล้วนะครับสำหรับ Technic การจำการใช้ JOIN ใน SQL ซึ่งสามารถนำไปประยุกต์ใช้กับ MSSql, MySQL, OracleSQL หรือ Database เจ้าอื่น ๆ กันได้ Foreign Key (FK) คือ การสร้างกฏความสัมพันธ์ระหว่างสองตารางเข้าด้วยกัน โดยอาจเป็นการสร้างความสัมพันธ์ระหว่าง คอลัมน์สองคอลัมน์ หรือกลุ่มของคอลัมน์ โดยที่ Foreign Key จะเป็นคอลัมน์ของตารางลูก ที่ใช้เชื่อมโยงกันกับตารางแม่ ที่เป็น Primary Key (PK) หรือเป็น Index
สองตารางด้านบน ใช้คำสั่งสร้างดังนี้
DROP TABLE IF EXISTS INSERT INTO INSERT INTO ` ON DELETE หมายถึงเมื่อมีการลบ และ ON UPDATE หมายถึงเมื่อมีการอัปเดทข้อมูล จะไปทำตามค่า reference_option ที่ระบุ ได้แก่
หมายเหตุ
จากตัวอย่าง หากมีการล้างตารางด้วย Truncate จะเกิด Error ตามด้านล่าง 1701 - Cannot truncate a table referenced in a foreign key constraint (`orders`, CONSTRAINT `fk_member` FOREIGN KEY (`member_id`) REFERENCES `user` (`id`))หรือหากมีการอัปเดทด้วยข้อมูลที่ไม่มีอยู่จริง
1452 - Cannot add or update a child row: a foreign key constraint fails (`orders`, CONSTRAINT `fk_member` FOREIGN KEY (`member_id`) REFERENCES `user` (`id`) ON DELETE CASCADE)ข้อแตกต่างระหว่าง Primary Key และ Foreign Key คือ คอลัมน์ที่เป็น Primary Key สามารถมีได้แค่รายการเดียวเท่านั้น (คอลัมน์ หรือ กลุ่มของคอลัมน์) และ ไม่สามารถมีค่าซ้ำได้ และ ห้ามเป็น NULL ส่วน Foreign Key สามารถมีได้หลายคอลัมน์ (กลุ่มของ FK สำหรับอ้างอิงไปยังตารางอื่นๆ) และสามารถซ้ำได้ (ตามกฏของคอลัมน์ เช่นเป็น INDEX หรือ UNIQE โดยที่ PK 1 รายการ สามารถอ้างอิงไปยัง FK ได้หลายรายการ) และสามารถเป็น NULL ได้ (หมายถึง ไม่มีความสัมพันธ์ใดๆกับตารางแม่เลย) จุดประสงค์หลักของ Foreign Key คือการสร้างกฏความสัมพันธ์ระหว่างตารางเข้าด้วยกัน เพื่อป้องกันการกระทำกับข้อมูลที่ผิดพลาด ข้อดีของ Foreign Key ก็ตามจุดประสงค์ของมันแหละครับ ใช้ในป้องกันการกระทำกับข้อมูลที่ผิดพลาด หรือใช้ในการสร้างฟอร์มโดยอัตโนมัติ เช่น การ INSERT ข้อมูลบน phpMyAdmin หรือฟอร์มที่สร้างโดยฐานข้อมูล access ก็จะมีตัวเลือกที่ได้ทำการเชื่อมโยงไว้มาให้ ป้องกันการกรอกค่าที่ไม่มีอยู่จริง ส่วนข้อเสียของ Foreign Key หลักๆก็คือ การ INSER UPDATE DELETE จะช้าลง เนื่องจากจะต้องมีการตรวจสอบความสัมพันธ์ของข้อมูลให้ถูกต้องก่อนเสมอ (การลบข้อมูลที่ไม่สามารถทำได้ในบางกรณี ไม่ถือเป็นข้อเสีย เพราะมันเป็นไปตามกฏของฐานข้อมูลที่ได้กำหนดไว้) แล้วเราจำเป็นต้องใช้ Foreign Key หรือไม่ คำตอบก็จะอยู่ที่เงื่อนไขในการใช้งานฐานข้อมูลของเรา
ส่วนตัว ผมไม่ค่อยได้ใช้ Foreign Key สักเท่าไร เนื่องจากผมมักจะเขียนคำสั่งเพื่อจัดการฐานข้อมูลด้วยตัวเอง เช่น ในการลบ ผมก็จะเขียนคำสั่งเพื่อตรวจสอบข้อมูลก่อนเสมอ ผมเลยไม่จำเป็นต้องใช้ Foreign Key อีก เนื่องจากจะเป็นการทำงานซ้ำซ้อนกัน |