多表聯合查詢&&多對多關係的案例

廣義笛卡爾積:表R(3行4列)和S(2行5列),結果爲表T(3*2=6行,4+5=9列)

廣義笛卡爾積(即沒有where語句的多表查詢):是不恰當用對標查詢的結果,會大量佔用內存。

主鍵&表之間的關係(外鍵)建表的基礎上,驗證廣義笛卡爾積的弊端:

錯誤:
select student.sno,student.sname,banji.bname from student,banji;
正確:
select student.sno,student.sname,banji.bname from student,banji
where student.sclass=banji.bno;

外連接查詢:(語法:在附表後加'(+)'可以將主表中未與附表匹配的記錄打印一遍)
作用:將一表(主表)中的所有記錄至少打印一遍(先打印與另一表(附表)匹配上的,再打印未匹配上的)
過程(抽象理解):首先將正常多表查詢的結果輸出,再在附表中加一個空記錄,與主表中未匹配的記錄匹配並打印。

對以下這種情況,普通的多表查詢查詢結果爲輸出表1,使用了外連接查詢結果爲輸出表2

select student.snum,student.name,student.age,student_course.cnum
from student,student_course where student.snum=student_course.snum;

外連接查詢:語法(+)
select student.snum,student.name,student.age,student_course.cnum
from student,student_course where student.snum=student_course.snum(+);


多對多關係的案例——學生選課問題(三表聯合查詢)

drop table s_c

drop table s_c;
drop table student;
drop table course;

create table student(
sid char(5) primary key,
sname varchar2(20),
sage number(2)
);
insert into student values('s0001','Mike',19);
insert into student values('s0002','John',20);
insert into student values('s0003','Tom',19);

create table course
(
cid char(5) primary key,
cname varchar(40)
);
insert into course values('c0001','SQL Programming');
insert into course values('c0002','C++ Programming');
insert into course values('c0003','Java Programming');

create table S_C( --學生選課記錄表
sid char(5),
cid char(5),
primary key(sid,cid), --以這個邏輯字段作爲主鍵保證沒有相同的一個人重複選同一門課(因爲在這個表中名字可以重複出現,課程也可以重複出現,但不能有兩個字段這兩個都相等。)
constraint sid_fk foreign key(sid) references student(sid),
constraint cid_fk foreign key(cid) references course(cid)
);
insert into S_C values('s0001','c0003');
insert into S_C values('s0002','c0003');
insert into S_C values('s0002','c0001');--s0003號學生未選課
commit;

普通:(不會出現未選課的)
select student.sid,sname,sage,cname from student,s_c,course
where s_c.cid=course.cid and student.sid=s_c.sid;

加外連接查詢:
select student.sid,sname,sage,NVL(cname,'沒有選課') from student,s_c,course
where s_c.cid=course.cid(+) and student.sid=s_c.sid(+);



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章