แนะนำหลักสูตร

SQL รันผ่านแล้ว คำตอบถูกต้องหรือไม่? ก้าวเข้าสู่รายวิชาหลักการฐานข้อมูล DSAI2202 ของ PolyU

รายชื่อที่สร้างออกมาอย่างราบรื่นอาจขาดคนที่ควรถูกมองเห็นมากที่สุดพอดี ตั้งแต่ความสัมพันธ์ระหว่างตารางไปจนถึงขอบเขตในการแก้ไขข้อมูล DSAI2202 มอบเส้นทางการเรียนรู้เพื่อทำความเข้าใจและตรวจสอบ SQL พร้อมทั้งเปิดทางให้ "ให้ AI ช่วยเขียนคำสั่งค้นหา" มีคำถามต่อยอดที่ลึกยิ่งขึ้น

EvoClass ใช้เวลาอ่าน 1 นาที
ภาพประกอบเชิงแนวคิด: ผู้เรียนตรวจสอบตารางบันทึกนักเรียนสองตารางที่เชื่อมโยงกันด้วยเส้น แล้วใช้วงกลมสีแดงล้อมแถวที่ขาดหายไปในผลลัพธ์ โดยมีบัตรนักเรียนที่ยังไม่จับคู่วางอยู่ข้าง ๆ

ลองจินตนาการถึงสถานการณ์การสอนสถานการณ์หนึ่ง: คุณต้องการค้นหานักเรียนที่ยังไม่ได้ส่งการบ้าน จึงขอให้ AI ช่วยเขียน SQL สักชุด โปรแกรมทำงานได้ราบรื่น บนหน้าจอปรากฏรายชื่อที่เรียบร้อย

ไม่มีข้อผิดพลาด ชื่อคอลัมน์ก็ตรงกัน คุณกำลังจะส่งคำเตือน แต่กลับพบว่านักเรียนคนหนึ่งซึ่งไม่มีบันทึกการส่งเลย กลับไม่ปรากฏอยู่ในผลลัพธ์

ปัญหาอาจซ่อนอยู่ในการเชื่อมตาราง คำสั่งค้นหาเก็บไว้เพียงระเบียนที่จับคู่กันได้จากทั้งสองตารางเท่านั้น "คนที่ยังไม่มีบันทึก" จึงถูกตัดออกไปตั้งแต่แรก

ข้อผิดพลาดประเภทนี้เงียบสงบ ฐานข้อมูลได้ทำตามการกระทำที่คุณเขียนลงไป สิ่งที่ต้องตรวจสอบจริง ๆ คือ การกระทำเหล่านั้นได้สื่อความหมายเดิมของคุณหรือไม่

รายวิชา DSAI2202《Database Principles》(หลักการฐานข้อมูล) ของมหาวิทยาลัยโปลีเทคนิคฮ่องกง ครอบคลุมเนื้อหาด้านการสร้างแบบจำลองข้อมูล, SQL, การจัดการธุรกรรม และความปลอดภัยของฐานข้อมูล การเข้าสู่รายวิชาด้วยคำถามอย่าง "ทำไมผลลัพธ์จึงขาดไปหนึ่งคน" ทำให้แนวคิดที่เป็นนามธรรมมีเบาะแสให้ติดตามได้ คำอธิบายรายวิชาอย่างเป็นทางการของ PolyU

ไม่มีชื่อเขาในรายชื่อ เพราะไม่มีบันทึก หรือไม่มีคนคนนี้?

ก่อนอื่น ย่อตัวอย่างตอนเปิดเรื่องให้เล็กลง

ในตารางนักเรียนมีสามคน: อาหมิง, เสี่ยวซิน และอาจี ในตารางการส่งมีเพียงบันทึกของอาหมิงและเสี่ยวซิน ส่วนอาจียังไม่ได้ส่ง

หากใช้ inner join เชื่อมสองตารางเข้าด้วยกันก่อน แล้วจึงค้นหานักเรียนที่ "ยังไม่ได้ส่ง" อาจีก็ไม่อยู่ในผลลัพธ์ промежуточный แล้ว การกรองในภายหลังจะละเอียดเพียงใด ก็ไม่สามารถดึงคนที่ถูกตัดออกไปก่อนหน้านี้กลับมาได้

แนวทางหนึ่งคือเริ่มจากรายชื่อนักเรียนที่สมบูรณ์ เก็บนักเรียนทุกคนไว้ แล้วตรวจสอบว่ามีบันทึกการส่งที่ตรงกันหรือไม่ left join ช่วยสื่อความสัมพันธ์เช่นนี้ได้ แต่ยังต้องตรวจสอบขอบเขตของงาน, ฟิลด์ที่ใช้จับคู่ และเงื่อนไขการกรองในภายหลังต่อไป การเปลี่ยนคำเชื่อมเพียงคำเดียวไม่ได้ให้หลักประกันโดยอัตโนมัติว่าคำตอบจะถูกต้อง บทแนะนำเรื่อง join อย่างเป็นทางการของ PostgreSQL

ใน Lab 7: การอนุมานข้ามความสัมพันธ์ ของ EvoClass ผู้เรียนตรวจสอบรายชื่อลงทะเบียนของนักเรียนกับรายชื่อบนแพลตฟอร์มการเรียนรู้ และสังเกตว่าวิธีการเชื่อมตารางแบบต่าง ๆ เก็บหรือตัดระเบียนออกอย่างไร

สิ่งที่ควรฝึกฝนในที่นี้ คือการพูดให้ชัดก่อนเขียนคำสั่งค้นหา: หนึ่งแถวในผลลัพธ์เป็นตัวแทนของใคร? ใครบ้างที่ต้องถูกเก็บไว้? เมื่อไม่พบบันทึกที่ตรงกัน หมายความว่าอะไร?

เมื่อมีประโยคเหล่านี้ SQL จึงมีเป้าหมายให้เทียบเคียงได้

ก่อนเขียนคำสั่งค้นหา ต้องตัดสินใจก่อนว่าจะบันทึกโลกอย่างไร

ดูรายชื่อนี้ต่อไป นักเรียนคนหนึ่งอาจลงทะเบียนหลายวิชา วิชาหนึ่งอาจมีการบ้านหลายครั้ง การบ้านแต่ละชิ้นอาจอนุญาตให้ส่งได้หลายครั้ง

หากยัดทั้งหมดนี้ลงในตารางใหญ่ตารางเดียว ชื่อ, ชื่อวิชา และข้อมูลครูอาจปรากฏซ้ำแล้วซ้ำเล่า แก้ไขที่หนึ่ง แต่ที่อื่นยังคงค่าเก่าไว้ และเมื่อนับจำนวนนักเรียนอาจนับคนเดียวกันซ้ำเข้าไปอีก

ถึงตอนนี้ ปัญหาได้เกิดขึ้นก่อนการเขียนคำสั่งค้นหาแล้ว: แต่ละแถวในตารางบันทึกอะไรไว้กันแน่?

Lab 2: จากโลกจริงสู่ตารางข้อมูล PostgreSQL เริ่มต้นจากปัญหาความซ้ำซ้อนและการปรับปรุงข้อมูลในตารางแบบแบน เข้าสู่การออกแบบฐานข้อมูลเชิงสัมพันธ์ ส่วน Lab 9: การทำให้ตารางลงทะเบียนเป็นบรรทัดฐาน ก้าวต่อไปสู่การทำให้เป็นบรรทัดฐาน (normalization)

ลองทำแบบฝึกหัดเล็ก ๆ ด้วยกระดาษและปากกา: เขียน "นักเรียน" "วิชา" และ "ความสัมพันธ์การลงทะเบียน" ลงบนกระดาษสามแผ่น แล้วอธิบายว่าพวกมันเชื่อมต่อกันอย่างไร หากนักเรียนคนหนึ่งเปลี่ยนสาขา ต้องแก้ตรงไหน? วิชาใหม่ที่ยังไม่มีใครเลือก จะบันทึกไว้ก่อนได้หรือไม่?

คำถามต่อเนื่องเหล่านี้ทำให้โครงสร้างข้อมูลต้องเผชิญกับการทดสอบจากการเปลี่ยนแปลงในชีวิตประจำวัน การแยกตารางเหมาะสมหรือไม่ ต้องดูว่ามันสื่อความสัมพันธ์ได้ชัดเจนและรักษาความสอดคล้องเมื่อมีการแก้ไขหรือไม่

กลับมาที่คำสั่งค้นหาตอนเปิดเรื่อง คุณก็จะตัดสินได้ง่ายขึ้นว่า: แถวส่วนเกินที่เห็นอยู่ข้างหน้าเป็นนักเรียนหลายคนที่ต่างกัน หรือเป็นการส่งหลายครั้งของนักเรียนคนเดียวกัน?

ประโยคเดียวถูกต้อง แต่ทั้งกระบวนการอาจทำสำเร็จเพียงครึ่งเดียว

หลังจากได้ผลลัพธ์แล้ว ระบบมักต้องแก้ไขข้อมูลอีก

ตัวอย่างเช่น นักเรียนคนหนึ่งขอย้ายห้องเรียน ต้องถูกนำออกจากห้องเดิมและเพิ่มเข้าห้องใหม่ หากขั้นตอนแรกถูกบันทึกแล้ว แต่ขั้นตอนที่สองล้มเหลวด้วยเหตุใดเหตุหนึ่ง นักเรียนอาจไม่สังกัดห้องใดเลยชั่วคราว มองแยกกัน ประโยคทั้งสองอาจเขียนถูกต้อง; มองรวมกัน ระบบกลับเหลือสภาพที่ไม่สมบูรณ์

ธุรกรรม (transaction) มอบเครื่องมือพื้นฐานสำหรับปัญหานี้: จัดกลุ่มขั้นตอนที่ต้องทำร่วมกันให้สำเร็จ เพื่อให้ commit เป็น整體 หรือย้อนกลับเมื่อล้มเหลว การกำหนดขอบเขตของ "整體" นี้ยังต้องอาศัยความเข้าใจในงานนั้น ๆ บทแนะนำเรื่องธุรกรรมอย่างเป็นทางการของ PostgreSQL

การทดลองเรื่องธุรกรรมและการทำงานพร้อมกันใน Lab 10 ดันหัวข้อไปสู่ขอบเขตธุรกรรมและการควบคุมการทำงานพร้อมกัน โดยมีฉากหลังเป็นการจัดการจำนวนที่นั่งที่เคาน์เตอร์ลงทะเบียนเรียน และสังเกตว่าเกิดอะไรขึ้นเมื่อสองเซสชันทำงานพร้อมกัน

ในการฝึก ลองสร้างความล้มเหลวขึ้นเองระหว่างการกระทำสองขั้นตอน แล้วดูว่าฐานข้อมูลเหลืออะไรไว้จริง ๆ จากนั้นให้สองเซสชันทำงานกับข้อมูลชุดเดียวกันพร้อมกัน และสังเกตว่าขั้นตอนที่เคยราบรื่นยังคงเป็นเช่นนั้นหรือไม่

การทดลองหนึ่งครั้งจึงมีความหมายเพิ่มขึ้นอีกชั้น: นอกจากเห็นว่าสิ่งต่าง ๆ สำเร็จได้อย่างไร ยังต้องรู้ว่ามันล้มเหลวได้อย่างไรด้วย

หลังจากให้ AI เขียน SQL แล้ว คุณต้องรับผิดชอบตรวจสอบอะไรด้วยตนเอง?

เมื่อมีประสบการณ์ข้างต้นแล้ว เมื่อกลับมาดูคำสั่งค้นหาที่ AI มอบให้ จุดสนใจจะเปลี่ยนไป

รายชื่อที่ตกหล่นตอนเปิดเรื่องสามารถตรวจสอบได้ด้วยระเบียนนักเรียนสมมติสามรายการ ปัญหาการนับซ้ำสามารถเพิ่มนักเรียนที่มีการส่งสองครั้งเข้าไปแล้วตรวจสอบใหม่ ส่วนการย้ายห้องเรียนสามารถตรวจสอบสภาพข้อมูลเมื่อเกิดความล้มเหลวระหว่างทาง

ตัวอย่างเล็ก ๆ เหล่านี้เป็นหลักฐานสำหรับการตัดสิน คำอธิบายที่เขียนลื่นไหลไม่สามารถแทนการตรวจสอบผลลัพธ์ได้

Lab 12: การตรวจสอบ SQL ที่ AI สร้าง นำการทบทวนเข้าไว้ในการฝึก: รันได้ไหม? ตอบคำถามหรือไม่? อาจทำอะไรเสียหายได้บ้าง? ใครมีสิทธิ์รันมัน?

ผู้เรียนสามารถไล่ถามตามงานเฉพาะเจาะจงทีละขั้น: คำสั่งค้นหานี้เก็บระเบียนใดไว้? การแก้ไขจะกระทบกี่แถว? หากคาดว่าจะแก้เพียงคนเดียว จะพบว่าขอบเขตเขียนผิดก่อนดำเนินการได้อย่างไร? การที่เครื่องมือมีสิทธิ์แก้ไข หมายความว่างานปัจจุบันอนุญาตให้ทำเช่นนั้นด้วยหรือไม่?

สำหรับผู้ที่กำลังทำความรู้จักฐานข้อมูลเชิงสัมพันธ์ หรือเริ่มใช้ AI ช่วยเขียนคำสั่งค้นหา หน้าทางเข้ารายวิชา DSAI2202 บน EvoClass มอบเส้นทางที่จะก้าวลึกต่อจากปฏิบัติการพื้นฐาน เตรียมชุดข้อมูลเล็ก ๆ ที่คุณตรวจสอบด้วยมือได้ไว้ก่อน แล้วจึงเข้าสู่การฝึกพร้อมผลลัพธ์ที่คาดไว้

ครั้งหน้าที่หน้าจอปรากฏรายชื่อที่เรียบร้อย ลองหาคนที่ถูกละเลยได้ง่ายที่สุดก่อน

เมื่อคุณอธิบายได้ว่าทำไมเขาจึงปรากฏ ทำไมเขาจึงขาดไป คุณจึงเริ่มรู้ว่าคำตอบนี้ควรค่าแก่การเชื่อถือหรือไม่


การกำหนดตำแหน่งรายวิชาอ้างอิงจากคำอธิบายรายวิชาอย่างเป็นทางการของ PolyU ส่วนการแนะนำการทดลองอ้างอิงจากสื่อการสอนปัจจุบันของ EvoClass ลิงก์บทเรียนในบทความชี้ไปยังสื่อการเรียนรู้ภาษาจีนตัวย่อ รายชื่อ การส่งการบ้าน และสถานการณ์ย้ายห้องเรียนล้วนเป็นตัวอย่างการสอนที่สร้างขึ้นเพื่อช่วยทำความเข้าใจแนวคิด ไม่ใช่กรณีของนักเรียนจริงหรือบันทึกผลการใช้