實驗六 多表查詢(V2.0)
實驗六 多表查詢
【實驗目的】
1. 掌握等值連線和非等值連線
2. 掌握自身連線(同一個表之間連線)
3. 掌握外連線
4. 掌握複合條件連線
【實驗內容】
1. 基本命令:
select <目標列>
from <表1,表2>[,<表3>[,<...>]]
where <條件>
功能:從表1和表2中查詢滿足條件的目標列。
2. 實驗內容
【例1】查詢選修了3號課程的學生學號和姓名
select student.sno,sname from student,sc where student.sno = sc.sno and cno = '3'
備註:表1和表2笛卡爾積,是連線的第一步,是第一個表的每一行與第二個表的每一行組成一次連線(元組相連)。表1和表2的笛卡爾積,有M(M=表1行數*表2行數)行,N(N=表1列數+表2列數)列。
笛卡爾積的每一行不一定有意義。例如學生表student和選課表sc的笛卡爾積20行中只有5行有意義。需要我們做篩選條件,就是表1的某一列=表二的某一列。例如student.sno = sc.sno
【例2】查詢所有課程的先修課課程號,課程名和學分
解釋:題目需要查詢課程資訊,附加先修課資訊。
兩個表的笛卡爾積,如果是表1與表1做笛卡爾積,結果是笛卡爾積的特例情況。需要對錶做兩個不同的別名,目標列才能夠進行區分。
--查詢每個課程的先修課學分(課程號,課程名,課程學分,先修課名和先修課學分)
select 課程.cno,課程.cname,課程.ccredit,課程.cpno,先修課程.Cname,先修課程.ccredit
from Course 課程,Course 先修課程
where 課程.Cpno = 先修課程.Cno
【例3】查詢全體學生的選修課程情況
解釋:外連線能夠實現表1與表2具有聯絡的元組顯示的同時,可以顯示某個表全部元組(左連線全部顯示左邊表,右連線全部顯示右邊表,左邊表是from結構中第一個表,右邊表是from結構中最後一個表)。
比較:select student.*,cno,grade
from student,sc
where student.sno = sc.sno
本命令只能夠查詢具有選修課程的學生,沒有顯示全部學生。(即沒有選修課的學生,在結果中沒有顯示出來)
比較命令:
-- 比較如下查詢,查詢學生選修情況(只列出具有選課的學生)
select student.*,cno,grade
from student,sc
where student.sno = sc.sno
--查詢全部學生的選修課程情況,沒有選修課程的也要顯示出來。
select student.*,cno,grade
from student left join sc
on student.sno = sc.sno
查詢效果:
【例4】查詢男生同學中選修了資料庫課程的學生學號,姓名,課程名和成績。(複合條件查詢)
思考:
查詢表如果有2個,連線條件有幾個? 1個
如果查詢表有3個,則連線條件有幾個? 2個
如果查詢中有n個表,n>=2,則連線條件為 n-1個。(還可能有其他篩選條件)
例4參考答案
Select student.sno,sname,cname,grade
from student,sc,course
where student.sno = sc.sno and sc.cno = course.cno and ssex = ‘男’ and cname = ‘資料庫’
【練習】
1.查詢姓名為劉晨的學生選修的課號和成績。
2.查詢年齡大於19的學生的學號、選修的課號和成績。
3.查詢年齡大於19(含)的學生的學號和所選修的課程數量。
提示:SC分組統計。(student中可以限定年齡)
select __________,count(cno)
from sc,student
where ________ and ________
group by ____________
查詢年齡大於19(含)學生選修課程數多於1門課程的學生學號和課程數量。
4.查詢3學分以上(含3分)課程被選修情況,結果有學號,課程號,學分,成績(結果按照學號升序、成績降序排序)。
selectf______________________
from sc ,course
where sc.cno=course.cno and ________________
order by _____________________________
5.查詢所有學生的(所有學生包括沒有選課的學生)選課情況(學號、姓名、性別、課程號、成績)。
6.查詢所有課程的(含有沒有被選修的課程)被選修情況(課程號、課程名、學分、學號、成績)。
select course.cno,cname,ccredit,sno,grade
from course________ sc
on ______________________
方法二:
select _____________________________
from sc ______________course
on ______________________________
7. 查詢所有課程的(含有沒有被選修的課程)被選修情況(學號、課程號、課程名、學分、成績)。
【實驗總結】
查詢的目標列或查詢條件決定需要從多個表內進行查詢時,多表查詢。