![]() |
|
![]() |
|
![]() |
ในหัวข้อนี้จะแสดงให้เห็นถึงการใช้คำสั่ง SQL เพื่อสืบค้นข้อมูลที่มีชนิดข้อมูลที่ซับซ้อนในลักษณะต่างๆ จากรีเลชัน employee ถ้าต้องการค้นหาชื่อของพนักงานที่มีบุตรชื่อ Jane เราสามารถเขียนเป็นคำสั่ง select ได้ดังนี้ select name from employee where Jane in childname เราเรียกแอตทริบิวต์ childname ว่า relation-valued attribute ซึ่งจะปรากฎอยู่ในส่วนของ where ในคำสั่ง Select หรือ จงแสดงชื่อของพนักงาน และชื่อของบุตร พนักงานแต่ละคน สามารถเขียนคำสั่ง select ได้ดังนี้ select E.name, C.childname from employee as E, E.childname as C เนื่องจากแอตทริบิวต์ childname ของรีเลชัน employee เป็นฟิลด์ประเภท set-valued ดังนั้นจึงสามารถใช้ในส่วนของ fromได้ เราสามารถใช้ aggregate ฟังก์ชันเพื่อดำเนินการกับกลุ่มข้อมูลได้ เช่นจงแสดงชื่อพนักงาน และจำนวนบุตรของพนักงานแต่ละคน สามารถเขียนเป็นคำสั่ง select ได้ดังนี้ select name, count(childname) from employee Path Expressionเราใช้สัญลักษณ์จุด (.) เพื่อการอ้างอิงแอตทริบิวต์ที่ประกอบกันเป็นแอตทริบิวต์ผสมได้ เช่น สมมุติเรามีรีเลชันที่เก็บข้อมูล phd-student และรีเลชัน person โดยกำหนดนิยามของรีเลชันดังนี้ create table phd-students ( advisor ref(person)) under person ดังนั้นถ้าเราต้องการค้นหาข้อมูลชื่อของ advisor ของนักเรียนปริญญาเอกทั้งหมด สามารถเขียนเป็นคำสั่ง ได้ดังนี้ select phd-students.advisor.name from phd-students เนื่องจาก phd-students.advisor มีการอ้างถึงแอตทริบิวต์ name ในตาราง people ซึ่งการอ้างอิงนี้ใช้เพื่อซ่อนการ join ระหว่างรีเลชัน จากตัวอย่างข้างต้น ถ้าเราไม่ได้ใช้วิธีการอ้างอิง ฟิลด์ advisor ของรีเลชัน phd-student จะต้องเป็น foreign ไปที่รีเลชัน person จากนั้นก็จะทำการ join ระหว่างรีเลชัน phd-student กับ person ด้วย foreign key โดยเราจะเรียกนิพจน์ phd-students.advisor.name นี้ว่า path expression Nesting and Unnestingการทำ unnesting คือการแปลงความสัมพันธ์เชิงกลุ่มให้อยู่ในรูปแบบ 1 NF พิจารณารีเลชัน employee มีแอตทริบิวต์ childname และ training ที่เป็นความสัมพันธ์เชิงกลุ่ม สมมุติว่าเราต้องการแปลงรีเลชัน employee ให้อยู่ในรูปแบบที่ไม่มีรีเลชันเชิงกลุ่ม สามารถทำได้โดย select empno, name, C as childname, T.tno as tno, T.tdate as tdate from employee As E, E.childname As C, E.training As T โดยที่ตัวแปร E ในประโยค from เป็นการประกาศขอบเขตของรีเลชัน employee ตัวแปร C กำหนดขอบเขตแอตทริบิวต์ childname และตัวแปร T ก็จะกำหนดขอบเขตแอตทริบิวต์ training ในทางกลับกันถ้าทำการแปลงจากรีเลชันที่อยู่ในรูป 1 NF ไปเป็นรีเลชันเชิงกลุ่มจะเรียกว่าการทำ nesting ในการทำ nesting จะใช้วิธีการจัดกลุ่ม ซึ่งเมื่อทำการจัดกลุ่มแล้ว จะเหมือนกับมีการสร้าง multiset รีเลชันของแต่ละกลุ่มขึ้นมา และทำการส่ง multiset กลับคืนมาแทนที่จะใช้ฟังก์ชัน aggregate ตัวอย่างเช่น จากรูปที่ 3 เป็นรีเลชันที่อยู่ในรูป 1 NF เราต้องการแปลงให้อยู่ในรูปของ ความสัมพันธ์เชิงกลุ่ม สามารถเขียนเป็นคำสั่ง ได้ดังนี้ select empno, empname, set(childname) as childname-list, set(training) as training-list from employee group by empno, empname |
|
|