การสืบค้นข้อมูลชนิดที่ซับซ้อน
ในหัวข้อนี้จะแสดงให้เห็นถึงการใช้คำสั่ง 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
เราใช้สัญลักษณ์จุด (.) เพื่อการอ้างอิงแอตทริบิวต์ที่ประกอบกันเป็นแอตทริบิวต์ผสมได้ เช่น สมมุติเรามีรีเลชันที่เก็บข้อมูล 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
การทำ 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