查詢資料庫語句大全
注:以下操作均建立在上篇文章sql Server操作1的資料基礎之上
一、實驗目的
熟悉SQL語句的基本使用方法,學習如何編寫SQL語句來實現查詢
二、實驗內容和要求
使用SQL查詢分析器查詢資料,練習查詢語句的使用,掌握SELECT 語句的完整結構,包括簡單查詢、巢狀查詢、連線查詢等基本實現方法。
三、實驗主要儀器裝置和材料
1.計算機及作業系統:PC機,Windows 2000/xp/win7;
2.資料庫管理系統:SQL sever 2005/2008;
四、實驗方法、步驟及結果測試
實驗題目:
1、對實驗一建立的資料庫表進行查詢
簡單查詢:
1 題目1、查詢學生的系別,用小寫字母表示。2 SQL語句 3 select distinct LOWER(Sdept) from S;
1 題目2、查詢叫“劉%”的學生學號、系別 2 SQL語句 3 select Sno Sdept from S where Sname like '劉\%' escape'\';
1 題目3、查詢教師姓名第二個字是“一”的教師姓名,所教課程名。 2 SQL語句 3 select Tname,Cname from C where Tname like '_一_';
1 題目4、查詢沒有成績的學生學號,學號降序排列。 2 SQL語句 3 select S.Sno from S wherenot exists( 4 select * from Sc where S.Sno=Sc.Sno 5 ) 6 order by S.Sno desc;
1 題目5、查詢選修課程的學生人數 2 SQL語句 3 select count(distinct Sno) As '學生人數' from Sc 4 --select count(*) 5 --from S 6 --where exists( select * from Sc where Sc.Sno = S.Sno )
1 題目6、各科選修課成績及格的選修人數。 2 SQL語句 3 select count(distinctSno)As'及格人數' from Sc where Grade>=60 4 group by Cno;
1 題目7、各學院男生人數,超過2人的輸出學院名和人數,並按男生人數降序排列 2 SQL語句 3 select Ssp,count(*) from S where S.Ssex='男' 4 group by Ssp 5 having count(*)>2 6 order by count(*) desc;
1 題目8、查詢IS系男女學生人數各是多少SQL語句 2 select S.Ssex As'性別',count(*) As'IS系人數' from S where S.Sdept='IS' 3 group by Ssex;
1 題目9、找出年齡>23歲,平均成績不及格的學生學號和平均分 2 SQL語句 3 select sno,avg(grade) from SC 4 where sno in( 5 select sno from S where getdate()-sbirth>23 6 ) 7 group by sno 8 having avg(grade)<60 9 或者: 10 --獲得當前系統時間 11 --跨越表查詢要用having,不能用在where 12 Select S.Sno As'學生學號',Avg(Sc.Grade) As'平均成績'from S,Sc 13 where S.Sno=Sc.Sno and getdate()-Sbirth >23 14 group by S.Sno 15 having AVG(Sc.Grade)<60;
1 題目10、顯示所有學生資訊,如果該生選修過課程,顯示其選修課號和考試成績 2 SQL語句 3 select S.*,Sc.Cno,Sc.Grade from S left join Sc on(SC.Sno=S.Sno);
1 題目11、查詢每門課都是80分以上的學生的學號與姓名。 2 SQL語句 3 --如果沒有加"S.Sno=Sc.Sno and"會出現有未選修了課程的學生學號 4 --如果沒有distinct則會出現重複 5 Select distinct S.Sno As'學生學號',S.Sname As'姓名'from S,Sc 6 where S.Sno=Sc.Sno and S.Sno not in 7 (select Sno from Sc where Grade<=80); 8 或者: 9 select sno,sname from S where sno in 10 (select sno from sc group by sno 11 having min(grade)>80)
1 題目12、查詢學分比“計算機應用”多的課程號和課程名、學分 2 SQL語句 3 Select Cname As'課程名',cCredit As'學分' from C 4 where cCredit>(Select cCredit from C where Cname='計算機應用') 5 group by Cname,cCredit;
1 題目13、查詢CS系中年齡比IS系所有人年齡都小的學生學號和姓名 2 SQL語句 3 use Student 4 Select Sno As'學生學號',Sname As'姓名' from S 5 where Sdept='CS' and Sbirth>(Select Max(sBirth) from S where Sdept='IS') 6 group by Sno,Sname; 7 或者: 8 use Student 9 Select Sno As'學生學號',Sname As'姓名' from S 10 where Sdept='CS' and Sbirth>all(Select sBirth from S where Sdept='IS') 11 group by Sno,Sname;
1 題目14、is系沒有選修02號課程的學生學號和學生姓名 2 SQL語句 3 Select Sno As'學生學號',Sname As'學生姓名' from S 4 where S.Sdept='IS'and not exists (select * from Sc where Sc.Sno=S.Sno and Sc.Cno=02) 5 group by Sno,Sname;
1 題目15、被全部學生都選修的課程號、課程名 2 SQL語句 3 select Cno As'課程號',Cname As'課程名' from C 4 where not exists(select * from S where not exists (select * from Sc where Sc.Sno=S.Sno and Sc.Cno=C.Cno))
1 題目16、選修了01號課又選修了02號課的學生的學號和姓名 2 實現程式碼及查詢結果截圖: 3 SQL語句 4 select S.Sno As'學生學號',S.Sname As'學生姓名' from S,Sc 5 where Sc.Sno=S.Sno and Sc.Cno=01 6 intersect 7 select S.Sno As'學生學號',S.Sname As'學生姓名' from S,Sc 8 where Sc.Sno=S.Sno and Sc.Cno=02; 9 或者: 10 select Sname,Sno from S 11 where Sno in( 12 select Sno from SC where cno='01' and Sno in( 13 select Sno from SC where Cno='02'))
1 題目17、被全部IS系的學生都選修的課程號和課程名 2 SQL語句 3 select Cno As'課程號',Cname As'課程名' from C 4 where not exists(select * from S where S.Sdept='IS'and not exists (select * from Sc where Sc.Sno=S.Sno and Sc.Cno=C.Cno))
1 題目18、查詢選修高等數學與選修資料庫的學生差集 2 SQL語句 3 select * from S 4 where exists (select *from Sc where Sc.Sno=S.Sno and exists(select * from C where Sc.Cno=C.Cno and C.Cname='高等數學')) 5 except 6 select * from S 7 where exists (select *from Sc where Sc.Sno=S.Sno and exists(select * from C where Sc.Cno=C.Cno and C.Cname='資料庫')); 8 或者: 9 select Sno from SC,C where 10 C.Cname='高等數學' and C.Cno=SC.Cno and SC.Sno not in( 11 select Sno from SC,C where SC.Cno=C.Cno and C.Cname='資料庫') 12
1 題目19、沒有選修“李一”老師開設的課程的學生學號、姓名、系別 2 SQL語句 3 select S.Sno As'學生學號',S.Sname As'學生姓名',S.Ssp As'系別' from S 4 where not exists( 5 select * from SC,C where SC.cno=C.cno and SC.sno=S.sno 6 and tname='李一')
1 題目20、查詢各選修學生最高分最低分之差大於30分的學生學號 2 SQL語句 3 select Sc.Sno As'學生學號' from Sc 4 group by Sno 5 having max(Grade)-min(Grade)>30;
五、心得總結
1、題目4中查詢沒有成績的學生學號,一開始爸它當成查詢成績為0或者說查詢成績為空的方式去查詢,所以多了一條記錄,但是實際上第九位學生是沒有成績的,即Sc表中無記錄。
2、題目5中,查詢選修課程的學生人數,如果沒有加上distinct就會導致學生人數結果為16,這是因為重複挑選的結果.
3、題目9中,獲得當前系統時間選用getdate(),並且跨越表查詢要用having,不能用在where
4、題目10中,判斷過後顯示其選修課號和考試成績,這個一開始很糾結,感覺要重複讀取學生資訊才行,所以不知道這樣合不合適。
5、題目11中,如果沒有加"S.Sno=Sc.Sno and"會出現有未選修了課程的學生學號
同時,如果沒有distinct則會出現重複
六、進行連線查詢時應注意哪些問題?
1、使用連線查詢時必須在from子句後指定兩個或兩個以上的表。
2、使用連線查詢時應在列名前加表名作為字首但是如果不同表之間的列名不同可以不加表名作為字首如果在不同表之間存在同名列在列名前必須加表名作為字首否則會因為列的二義性而報錯。
3、使用連線查詢時必須在where子句中指定有效的連線條件在不同表的列之間進行連線。如果不指定連線條件或者指定無效的連線條件那麼會導致生成笛卡爾積。
4、使用連線查詢時使用表別名可以簡化連線查詢語句。當指定表別名時別名應該跟在表名的後面。