例題詳解2
查詢成績比該課程平均成績低的同學的成績表。
select * from score t1 left join
(
select cno,avg(degree) as ‘avg‘ from score group by cno
) t2
on t1.cno=t2,cno
where t1.degree<t2.avg
第一步是:查出每科的平均成績, select cno,avg(degree) as ‘avg‘ from score group by cno ,
以課程進行分組,並建立新表,別名是 ‘avg‘,別名必須寫,否則 t2 找不到數據,這是新建的列
也可以是不同寫法,as a 或者 as [avg] 在這因為avg 是關鍵字(就是表中有其已經出現的)所以加括號
第二步是:與成績表鏈接,
select * from score t1 left join () on,並且是左連接,以成績表為基準,使之每個人的成績與其平均成績相對應,
方便看其大小,相當於平均成績,貼到每個人身上,然後,每個人和自己的平均成績對比。
第三步是:添加條件 where t1.degree<t2.avg
查詢所有未講課的教師的Tname和Depart.
看其有沒有講課在成績表裏看,因為沒有成績就不會有講課
首先是查出成績表,然後與其教師表鏈接
但是,成績表與其沒有相同的屬性
而,課程表與教師表有相同屬性
所以,成績表先與其課程表鏈接
而後,課程表與教師表再連
實現,三表鏈接
select * from score t1 right join course t2 on t1.cno=t2.cno right join Teacher t3 on t3.tno=t2.tno where t1.cno is null
這時所有的表中數據都會出現,然後添加條件where t1.cno is null,意思是,成績表score中編號cno 為空
也可以是score表中的成績為空,都可以,能區分就行
然後改其字段,* 變為 t3.tname , t3.Depart 即可
右連接,是因為,以右表為準,沒有講課的老師,則會左邊為空,沒有與之對應的學生和課程以及成績
若是左鏈接,則會出現,相應的學生,課程,及成績的後面,沒有與之對應的老師,為空
查詢Student表中每個學生的姓名和年齡。
第一種方法:
select datediff (year,sbirthday,getdate()) * from Student
裏面有三個參數,一個是年,一個是初始時間,一個是現在時間
也可以寫具體時間‘1990-1-1’
第二種方法:
select Sname,year(getdate())-year(sbirthday)from Student
例題詳解2