1. 程式人生 > >實驗六 多表查詢(V2.0)

實驗六 多表查詢(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.   查詢所有課程的(含有沒有被選修的課程)被選修情況(學號、課程號、課程名、學分、成績)。

【實驗總結】

查詢的目標列或查詢條件決定需要從多個表內進行查詢時,多表查詢。