# การทำงานกับข้อมูล: ฐานข้อมูลเชิงสัมพันธ์ |![ Sketchnote โดย [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/05-RelationalData.png)| |:---:| | การทำงานกับข้อมูล: ฐานข้อมูลเชิงสัมพันธ์ - _Sketchnote โดย [@nitya](https://twitter.com/nitya)_ | มีโอกาสที่คุณเคยใช้สเปรดชีตในอดีตเพื่อเก็บข้อมูล คุณมีชุดของแถวและคอลัมน์ โดยที่แถวเก็บข้อมูล (หรือข้อมูล) และคอลัมน์อธิบายข้อมูล (บางครั้งเรียกว่าข้อมูลเมตา) ฐานข้อมูลเชิงสัมพันธ์ถูกสร้างขึ้นบนหลักการพื้นฐานนี้ของคอลัมน์และแถวในตาราง ทำให้คุณสามารถมีข้อมูลกระจายอยู่ในหลายตารางได้ ซึ่งช่วยให้คุณทำงานกับข้อมูลที่ซับซ้อนมากขึ้น หลีกเลี่ยงการทำซ้ำ และมีความยืดหยุ่นในการสำรวจข้อมูล มาสำรวจแนวคิดของฐานข้อมูลเชิงสัมพันธ์กัน ## [แบบทดสอบก่อนบรรยาย](https://ff-quizzes.netlify.app/en/ds/quiz/8) ## ทุกอย่างเริ่มต้นด้วยตาราง ฐานข้อมูลเชิงสัมพันธ์มีแกนหลักเป็นตาราง เช่นเดียวกับสเปรดชีต ตารางคือการรวบรวมของคอลัมน์และแถว แถวเก็บข้อมูลหรือข้อมูลที่เราต้องการทำงานด้วย เช่น ชื่อเมืองหรือปริมาณฝนตก คอลัมน์อธิบายข้อมูลที่เก็บไว้ เรามาเริ่มต้นการสำรวจด้วยการสร้างตารางเพื่อเก็บข้อมูลเกี่ยวกับเมือง เราอาจเริ่มด้วยชื่อและประเทศ คุณสามารถเก็บข้อมูลนี้ในตารางดังนี้: | City | Country | | -------- | ------------- | | Tokyo | Japan | | Atlanta | United States | | Auckland | New Zealand | สังเกตชื่อคอลัมน์ **city**, **country** และ **population** ที่อธิบายข้อมูลที่เก็บไว้ และแต่ละแถวมีข้อมูลเกี่ยวกับเมืองหนึ่งเมือง ## ข้อจำกัดของวิธีการใช้ตารางเดียว มีโอกาสที่ตารางข้างต้นดูคุ้นเคยกับคุณ ลองเพิ่มข้อมูลเพิ่มเติมในฐานข้อมูลที่กำลังเติบโตของเรา — ปริมาณฝนรายปี (เป็นมิลลิเมตร) เราจะเน้นปี 2018, 2019 และ 2020 หากเราเพิ่มข้อมูลสำหรับโตเกียว อาจดูเหมือนดังนี้: | City | Country | Year | Amount | | ----- | ------- | ---- | ------ | | Tokyo | Japan | 2020 | 1690 | | Tokyo | Japan | 2019 | 1874 | | Tokyo | Japan | 2018 | 1445 | คุณสังเกตอะไรเกี่ยวกับตารางของเรา? คุณอาจสังเกตว่าเรากำลังทำซ้ำชื่อและประเทศของเมืองซ้ำๆ นั่นอาจใช้พื้นที่เก็บข้อมูลมาก และไม่จำเป็นต้องมีสำเนาหลายชุดเลย เพราะโตเกียวมีชื่อเดียวที่เราสนใจ โอเค ลองทำอย่างอื่นดู ลองเพิ่มคอลัมน์ใหม่สำหรับแต่ละปี: | City | Country | 2018 | 2019 | 2020 | | -------- | ------------- | ---- | ---- | ---- | | Tokyo | Japan | 1445 | 1874 | 1690 | | Atlanta | United States | 1779 | 1111 | 1683 | | Auckland | New Zealand | 1386 | 942 | 1176 | แม้ว่าวิธีนี้จะหลีกเลี่ยงการทำซ้ำแถว แต่ก็เพิ่มความท้าทายอื่นๆ เราต้องแก้ไขโครงสร้างของตารางทุกครั้งที่มีปีใหม่ นอกจากนี้ เมื่อข้อมูลของเราเติบโต การมีปีเป็นคอลัมน์จะทำให้การดึงข้อมูลและคำนวณค่าทำได้ยากขึ้น นี่คือเหตุผลที่เราต้องมีหลายตารางและความสัมพันธ์ โดยการแยกข้อมูลออก เราสามารถหลีกเลี่ยงการทำซ้ำและมีความยืดหยุ่นมากขึ้นในการทำงานกับข้อมูลของเรา ## แนวคิดของความสัมพันธ์ กลับมาที่ข้อมูลของเราและกำหนดวิธีการแยกข้อมูล เรารู้ว่าเราต้องเก็บชื่อและประเทศของเมือง ดังนั้นสิ่งนี้น่าจะเหมาะสมที่สุดในตารางเดียว | City | Country | | -------- | ------------- | | Tokyo | Japan | | Atlanta | United States | | Auckland | New Zealand | แต่ก่อนที่เราจะสร้างตารางถัดไป เราต้องหาวิธีอ้างอิงแต่ละเมือง เราต้องมีรูปแบบของตัวระบุ, ID หรือ (ในคำศัพท์ทางเทคนิคของฐานข้อมูล) กุญแจหลัก กุญแจหลักคือค่าที่ใช้ระบุแถวเฉพาะในตาราง แม้ว่าสิ่งนี้อาจขึ้นอยู่กับค่าตัวเอง (เช่น เราอาจใช้ชื่อเมือง) แต่มันควรจะเป็นตัวเลขหรือตัวระบุอื่นๆ เสมอ เราไม่ต้องการให้ id เปลี่ยนแปลงเพราะจะทำให้ความสัมพันธ์เสียหาย คุณจะพบว่าในกรณีส่วนใหญ่กุญแจหลักหรือ id จะเป็นตัวเลขที่สร้างขึ้นโดยอัตโนมัติ > ✅ กุญแจหลักมักย่อว่า PK ### cities | city_id | City | Country | | ------- | -------- | ------------- | | 1 | Tokyo | Japan | | 2 | Atlanta | United States | | 3 | Auckland | New Zealand | > ✅ คุณจะสังเกตว่าเราใช้คำว่า "id" และ "กุญแจหลัก" สลับกันในบทเรียนนี้ แนวคิดที่นี่ใช้กับ DataFrames ซึ่งคุณจะได้สำรวจในภายหลัง DataFrames ไม่ใช้คำว่า "กุญแจหลัก" อย่างไรก็ตามคุณจะสังเกตว่าพฤติกรรมของมันคล้ายกันมาก เมื่อเราสร้างตาราง cities แล้ว มาลองเก็บข้อมูลปริมาณฝนแทน แทนที่จะทำซ้ำข้อมูลเต็มของเมือง เราสามารถใช้ id ได้ เราควรแน่ใจว่าตารางที่สร้างขึ้นใหม่มีคอลัมน์ *id* ด้วย เพราะทุกตารางควรมี id หรือกุญแจหลัก ### rainfall | rainfall_id | city_id | Year | Amount | | ----------- | ------- | ---- | ------ | | 1 | 1 | 2018 | 1445 | | 2 | 1 | 2019 | 1874 | | 3 | 1 | 2020 | 1690 | | 4 | 2 | 2018 | 1779 | | 5 | 2 | 2019 | 1111 | | 6 | 2 | 2020 | 1683 | | 7 | 3 | 2018 | 1386 | | 8 | 3 | 2019 | 942 | | 9 | 3 | 2020 | 1176 | สังเกตคอลัมน์ **city_id** ภายในตาราง **rainfall** ที่สร้างขึ้นใหม่ คอลัมน์นี้เก็บค่าที่อ้างอิงถึง ID ในตาราง **cities** ในคำศัพท์ทางเทคนิคของข้อมูลเชิงสัมพันธ์ นี่เรียกว่า **foreign key**; คือกุญแจหลักจากตารางอื่น คุณสามารถคิดว่ามันเป็นการอ้างอิงหรือชี้ไปยังข้อมูล **city_id** 1 อ้างอิงถึงโตเกียว > [!NOTE] > foreign key มักย่อว่า FK ## การดึงข้อมูล เมื่อข้อมูลของเราแยกออกเป็นสองตาราง คุณอาจสงสัยว่าเราจะดึงข้อมูลอย่างไร หากเราใช้ฐานข้อมูลเชิงสัมพันธ์ เช่น MySQL, SQL Server หรือ Oracle เราสามารถใช้ภาษาที่เรียกว่า Structured Query Language หรือ SQL SQL (บางครั้งออกเสียงว่า sequel) เป็นภาษามาตรฐานที่ใช้ดึงและแก้ไขข้อมูลในฐานข้อมูลเชิงสัมพันธ์ ในการดึงข้อมูล คุณใช้คำสั่ง `SELECT` โดยพื้นฐานแล้ว คุณ **เลือก** คอลัมน์ที่ต้องการดู **จาก** ตารางที่เก็บข้อมูลนั้น หากคุณต้องการแสดงชื่อเมืองเท่านั้น คุณสามารถใช้คำสั่งดังนี้: ```sql SELECT city FROM cities; -- Output: -- Tokyo -- Atlanta -- Auckland ``` `SELECT` คือที่ที่คุณระบุคอลัมน์ และ `FROM` คือที่ที่คุณระบุตาราง > [!NOTE] > ไวยากรณ์ SQL ไม่สนใจตัวพิมพ์เล็กหรือใหญ่ หมายความว่า `select` และ `SELECT` มีความหมายเหมือนกัน อย่างไรก็ตาม ขึ้นอยู่กับประเภทของฐานข้อมูลที่คุณใช้ คอลัมน์และตารางอาจแยกแยะตัวพิมพ์เล็กใหญ่ได้ ดังนั้นจึงเป็นแนวปฏิบัติที่ดีในการปฏิบัติต่อทุกอย่างในโปรแกรมมิ่งเหมือนกับว่ามันแยกแยะตัวพิมพ์เล็กใหญ่ เมื่อเขียนคำสั่ง SQL มักนิยมเขียนคำสำคัญเป็นตัวพิมพ์ใหญ่ทั้งหมด คำสั่งข้างต้นจะแสดงเมืองทั้งหมด ลองนึกภาพว่าเราต้องการแสดงเฉพาะเมืองในนิวซีแลนด์ เราต้องมีตัวกรองบางอย่าง คำสำคัญ SQL สำหรับสิ่งนี้คือ `WHERE` หรือ "ที่บางอย่างเป็นจริง" ```sql SELECT city FROM cities WHERE country = 'New Zealand'; -- Output: -- Auckland ``` ## การรวมข้อมูล จนถึงตอนนี้เราได้ดึงข้อมูลจากตารางเดียว ตอนนี้เราต้องการนำข้อมูลจากทั้ง **cities** และ **rainfall** มารวมกัน ซึ่งทำได้โดยการ *join* หรือรวมตารางเข้าด้วยกัน คุณจะสร้างรอยต่อระหว่างสองตาราง และจับคู่ค่าจากคอลัมน์ของแต่ละตาราง ในตัวอย่างของเรา เราจะจับคู่คอลัมน์ **city_id** ใน **rainfall** กับคอลัมน์ **city_id** ใน **cities** ซึ่งจะจับคู่ค่าปริมาณฝนกับเมืองที่เกี่ยวข้อง ประเภทของ join ที่เราจะทำคือ *inner* join หมายความว่าหากแถวใดไม่ตรงกับข้อมูลจากตารางอื่น จะไม่แสดง ในกรณีของเรา ทุกเมืองมีข้อมูลปริมาณฝน ดังนั้นทุกอย่างจะถูกแสดง มาดึงข้อมูลปริมาณฝนของปี 2019 สำหรับทุกเมืองของเรากัน เราจะทำเป็นขั้นตอน ขั้นตอนแรกคือรวมข้อมูลโดยระบุคอลัมน์สำหรับรอยต่อ - **city_id** ดังที่เน้นไว้ก่อนหน้านี้ ```sql SELECT cities.city rainfall.amount FROM cities INNER JOIN rainfall ON cities.city_id = rainfall.city_id ``` เราเน้นสองคอลัมน์ที่ต้องการ และความจริงที่ว่าเราต้องการรวมตารางโดยใช้ **city_id** ตอนนี้เราสามารถเพิ่มคำสั่ง `WHERE` เพื่อกรองเฉพาะปี 2019 ```sql SELECT cities.city rainfall.amount FROM cities INNER JOIN rainfall ON cities.city_id = rainfall.city_id WHERE rainfall.year = 2019 -- Output -- city | amount -- -------- | ------ -- Tokyo | 1874 -- Atlanta | 1111 -- Auckland | 942 ``` ## สรุป ฐานข้อมูลเชิงสัมพันธ์เน้นการแบ่งข้อมูลระหว่างหลายตารางซึ่งจะนำกลับมารวมกันเพื่อแสดงและวิเคราะห์ ซึ่งให้ความยืดหยุ่นสูงในการคำนวณและจัดการข้อมูล คุณได้เห็นแนวคิดหลักของฐานข้อมูลเชิงสัมพันธ์ และวิธีการทำ join ระหว่างสองตาราง ## 🚀 ความท้าทาย มีฐานข้อมูลเชิงสัมพันธ์มากมายบนอินเทอร์เน็ต คุณสามารถสำรวจข้อมูลโดยใช้ทักษะที่คุณได้เรียนรู้ข้างต้น ## แบบทดสอบหลังบรรยาย ## [แบบทดสอบหลังบรรยาย](https://ff-quizzes.netlify.app/en/ds/quiz/9) ## ทบทวน & ศึกษาด้วยตนเอง มีแหล่งข้อมูลหลายแห่งบน [Microsoft Learn](https://docs.microsoft.com/learn?WT.mc_id=academic-77958-bethanycheum) สำหรับคุณที่จะศึกษาต่อเกี่ยวกับ SQL และแนวคิดฐานข้อมูลเชิงสัมพันธ์ - [อธิบายแนวคิดของข้อมูลเชิงสัมพันธ์](https://docs.microsoft.com//learn/modules/describe-concepts-of-relational-data?WT.mc_id=academic-77958-bethanycheum) - [เริ่มต้นการสืบค้นด้วย Transact-SQL](https://docs.microsoft.com//learn/paths/get-started-querying-with-transact-sql?WT.mc_id=academic-77958-bethanycheum) (Transact-SQL คือเวอร์ชันหนึ่งของ SQL) - [เนื้อหา SQL บน Microsoft Learn](https://docs.microsoft.com/learn/browse/?products=azure-sql-database%2Csql-server&expanded=azure&WT.mc_id=academic-77958-bethanycheum) ## การบ้าน [แสดงข้อมูลสนามบิน](assignment.md) --- **ข้อจำกัดความรับผิดชอบ**: เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษาอัตโนมัติ [Co-op Translator](https://github.com/Azure/co-op-translator) แม้เราจะพยายามให้ความถูกต้องสูงสุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลโดยผู้เชี่ยวชาญมนุษย์ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดใด ๆ ที่เกิดจากการใช้การแปลนี้