在進行數據庫查詢時,有時需要用到對既有的數據表進行多表查詢得出的臨時條件的數據表,就可以暫時創建成為虛表,並賦予簡單明了的字段名以及臨時表名。
例題a:查詢出每門課程低於平均成績的學生姓名、課程名稱、分數
分析:
1. 要完成題目,首先需要一張所有學生的課程及分數表,所需字段:學生姓名、課程名稱、分數;
select a.Name as Name,b.C_name as C_name,b.Grade as Grade from students a,score b where a.Id=b.stu_id; #可以將臨時創建的虛表定義為st,以備后用
2. 另外還需要一張各課程的平均分數的表,所需字段:課程名稱、平均分數
select C_name,avg(Grade) as avgScore from score group by C_name; #創建虛表av
3. 利用新建的虛表st、av完成題目
select st.*,av.avgscore from
(select a.Name as Name,b.C_name as C_name,b.Grade as Grade
from students a,score b
where a.Id=b.stu_id) as st,
(SELECT C_name,avg(Grade) as avgScore from score group by C_name) as av
where st.C_name=av.C_name and st.Grade<av.avgScore;
例題b:查詢同時參加計算機和英語考試的學生的信息
分析:
1. 要完成題目,分別需要所有學習計算機課程的學生id,以及所有學習英語課程的學生id,所需字段:學生ID,課程名稱;
(SELECT stu_id AS stu_id1,c_name FROM score WHERE c_name = "計算機") AS computer;
(SELECT stu_id AS stu_id2,c_name FROM score WHERE c_name = "英語") AS english;
2. 通過各個表中的學生學號信息,找出同事參加計算機和英語考試的學生的信息
SELECT students.*
FROM
students,
(SELECT stu_id AS stu_id1,c_name FROM score WHERE c_name = "計算機") AS computer,
(SELECT stu_id AS stu_id2,c_name FROM score WHERE c_name = "英語") AS english
where computer.stu_id1=english.stu_id2 and students.id=computer.stu_id1;
