實驗二 數據庫的查詢
一、實驗學時
2學時
二、實驗目的
(1)掌握查詢的概念和方法。
(2)掌握查詢命令窗口的使用方法。
(3)熟練掌握單表查詢的select語句。
(4)熟練掌握聚合函數的使用。
(5)熟練掌握復雜查詢的select語句。
(6)熟練掌握連接查詢方法。
(7)熟練掌握嵌套查詢方法。
三、實驗要求
(1)硬件設備:奔騰II或奔騰II以上計算機,局域網。
(2)軟件環境:WINDOWS 9X/NT、WINDOWS SERVER、WINDOWS 7、WINDOWS 10、MySQL。
(3)實驗課前預習,課后及時完成實驗內容。
(4)實驗過程及記錄按題目格式要求填寫代碼清單。
四、實驗內容
1.基本查詢
(1)查詢學生表中全體學生的所有信息。
T-SQL語句:
SELECT*
FROM student
(2)檢索全體學生的學號、姓名。
T-SQL語句:
SELECT Sno,Sname
FROM Student
2.查詢時改變列標題的顯示
檢索全體學生的學號、姓名、性別信息,並分別加上“學號”、“姓名”、“性別”的別名信息。
T-SQL語句:
SELECT Sno AS 學號,Sname AS 姓名,Ssex AS 性別 from student;
在sql中 AS
可以為信息添加別名
3.條件查詢
(1)查詢成績大於90分的學生的學號及課程號、成績。
T-SQL語句:
Select*
from sc
where
grade>90;
(2)查詢成績介於85~90分的學生的學號及課程號、成績。
T-SQL語句:
Select*
From sc
Where grade between 85 And 90
between..and...
表示在某某之間.
(3)查詢選修了課程號為“2”,且成績大於88的學生的學號。
T-SQL語句:
select sno
from sc
WHERE Cno='2' AND Grade>88;
4.基於IN子句的數據查詢
從課程表中查詢出“數學”、“PASCAL語言”的所有信息。
T-SQL語句:
SELECT *
from course
where cname in('數學','PASCAL語言');
查詢條件 | 謂詞 |
---|---|
比較 | =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比較運算符 |
確定范圍 | between and,not between and |
確定集合 | in , not in |
字符匹配 | like , not like |
空值 | |
多重條件 | and , or , not |
5.基於Like子句的查詢
(1)從學生表中分別檢索出姓張的所有同學的資料;檢索名字的第二個字是“紅”或“虹”的所有同學的資料。
T-SQL語句:
SELECT *
from student
WHERE sname like '_紅%'OR Sname LIKE '_虹%';
% 通配符部分字符長短.
/ - 通配符代表一個字符.
ESCAPE''
轉義字符;
(2)如果用戶查詢的匹配字符串本身就含有%或_,比如在課程表中,添加一門課程為Visual_Basic,其它相關信息自取。若要查詢名為Visual_Basic的課程的學分,則T-SQL語句為:
(提示:使用ESCAPE短語,MySQL轉譯字符不能用“\”)
select Ccredit
from Course
where Cname like’Visual\_Basic’ escape’\’
6.查詢部分數據
分別從課程表中檢索出前5個的課程信息。(提示:MySQL使用limit)
T-SQL語句:
SELECT *
FROM course
Limit 5
欲取第 n 條到第 m 條信息時, limit n-1,m-n
7.消除重復行
檢索出學生已選課程的課程號,要求顯示的課程號不重復。
T-SQL語句:
SELECT DISTINCT Cno
from sc;
distinct 表示消除每一列中重復的數據. 如何沒有在select中使用distinct則表示默認使用了all.
8.查詢經過計算的值
求為計算值取別名“出生年份”。(提示:用系統函數獲取當前的年份減去年齡即為出生年份。)
T-SQL語句:
select YEAR(now())-Sage'出生年份'
FROM student;
9.使用ORDER BY語句對查詢的結果進行排序
升序的關鍵字是ASC,降序的關鍵字是DESC,系統默認的是升序排列。
顯示所有學生的基本信息,並按學生的年齡的升序排列。
T-SQL語句:
SELECT *
FROM student
ORDER BY Sage ASC;
用戶可以使用 order by 子句對查詢結果按照一個或者多個屬性列升序(ASC)或者降序 (DESC)排序,默認是升序
10.使用Group子句進行查詢
如果要在數據檢索時對表中數據按照一定條件進行分組匯總或求平均值,就要使用Group BY子句並使用集合函數。
(1)匯總總分大於200分的學生的學號及總成績。
T-SQL語句:
SELECT sno,sum(ALL grade)'總成績'
FROM sc
GROUP BY sno
HAVING sum(Grade)>200;
group by 表示按照某一列的值進行分組
Having 和 where 的作用相同 但是 having 只能作用與組中,where 中能作用於基本表和視圖中
(2)查詢各個課程號相應的選課人數。
T-SQL語句:
SELECT cno,COUNT(distinct Sno)'選課人數'
FROM sc
GROUP BY cno;
聚集函數只能用於 select 子句和 group by 中的 having 子句.
11.使用聚合函數
(1)查詢學生總人數。
T-SQL語句:
SELECT COUNT(*)'學生總人數'
FROM student;
count(*) 會統計空值
(2)計算“2”號課程的學生平均成績、最高分、最低分。
T-SQL語句:
SELECT AVG(Grade)'平均成績',MAX(Grade)'最高分',MIN(Grade)'最低分'
FROM sc;
where cno='2';
12.查詢比“王敏”年紀大的男學生信息。
T-SQL語句:
select *
FROM student
WHERE Sage>(
SELECT Sage
FROM student
where sname='王敏'
);
13.檢索所有學生的選課信息。(提示:使用外連接)
T-SQL語句:
Select*
FROM student LEFT outer join sc on(student.Sno=sc.sno);
14.查詢已選課學生的學號、姓名、課程名、成績。(提示:連接查詢)
T-SQL語句:
SELECT student.sno,Sname,Cname,Grade
FROM student,sc,course
WHERE student.sno=sc.sno AND course.cno=sc.cno;
15.查詢選修了“信息系統”的學生的學號和姓名。
T-SQL語句:
SELECT student.sno,Sname
FROM student,sc,course
WHERE student.sno=sc.sno AND
sc.cno=course.cno AND
course.Cname='信息系統';
16.查詢與“劉晨”在同一個系的學生學號、姓名、性別。
子查詢T-SQL語句:
SELECT sno,sname,Ssex
FROM student
WHERE Sdept IN
(SELECT Sdept
FROM student
WHERE Sname='劉晨'
);
連接查詢T-SQL語句:
SELECT S1.Sno,s1.Sname,s1.Sdept
FROM student s1,student s2
WHERE s1.Sdept=s2.Sdept AND s2.Sname='劉晨';
自身連接
17.查詢其他系中比計算機科學系任意學生年齡大的學生的學號、姓名。
帶有ANY或ALL謂詞的子查詢語句:
SELECT sname,sage
FROM student
WHERE Sage>ANY(
SELECT Sage
FROM student
WHERE Sdept='CS'
);
用聚合函數實現:
SELECT Sname,Sage
FROM student
WHERE Sage>(
SELECT MIN(Sage)
FROM student
WHERE Sdept='cs'
) AND Sdept<>'cs';
<>
表示不等於
18.檢索選修3門以上課程的學生的學號、總成績。
T-SQL語句:
SELECT Sno,sum(grade)'總成績'
FROM sc
GROUP BY Sno HAVING COUNT(*)>3;
19.檢索多於2名學生選修的課程號及平均成績。
T-SQL語句:
SELECT cno,AVG(grade)'平均成績'
FROM sc
GROUP BY cno HAVING COUNT(*)>2;
五、實驗思考
- 查詢所有沒有選修課程的學生的學號、姓名。
SELECT sno,Sname
FROM student
WHERE sno not in(
SELECT Sno
FROM sc
);
- 查詢選修課程的人數。
SELECT count(DISTINCT sno)'選修課程的人數'
FROM sc;
- 查詢選課人數大於等於3人的課程編號、課程名稱、人數。
SELECT sc.Cno, Cname,COUNT(sno)’人數’
FROM course RIGHT JOIN sc on(course.cno=sc.cno)
GROUP BY sc.Cno HAVING COUNT(*)>=2;
-
在查詢的FROM子句中實現表與表之間的連接有哪幾種方式?對應的關鍵字分別是什么?
左 left join 左表為准
右 left join 右表為准
內 inner join 左右表中多出現
交叉 cross join 實際中暫時沒用到。