如果你沒試過水的話,那一題一題地每一題都敲一遍吧。不管它們對你看來有多么簡單。
部分題目答案在末尾,可用ctrl f 搜索題號。
作業練習——學生-選課 表結構
學生表: Student(Sno,Sname,Ssex,Sage,Sdept)
說明:Sno 學號(主鍵),Sname 姓名,Ssex 性別,Sage
年齡,Sdept 所在系別
課程表: Course(Cno,Cname,Cpno,Ccredit)
說明:Cno 課程號(主鍵),Cname 課程名,Cpno 選修課
號(某課程的選修課),Ccredit 學分
學生選課表: SC(Sno,Cno,Grade)
說明:Sno 學號(主鍵),Cno 課程號(主鍵),Grade 成績
作業練習——學生-選課 題目-1
1.編寫建庫sql語句
2.編寫創建數據庫表的語句
3.給數據表加約束
4.往三個表添加測試數據
5.查詢全體學生的學號與姓名
6.查詢全體學生的詳細記錄
7.查詢全體學生的姓名及其出生年份
8.查詢全體學生的姓名,出生年份和所有系,要求用小寫字母表示所
有系名
9.查詢選修了課程的學生學號 並消除重復行
10.查詢計算機系全體學生的名單
11.查詢所有年齡在20歲以下的學生姓名及其年齡
12.查詢考試成績有不及格的學生的學號
作業練習——學生-選課 題目-2(續)
13.查詢年齡在20~23歲(包括20歲和23歲)之間的學生的姓名,系別
和年齡
14.查詢年齡不在20~23歲之間的學生的姓名,系別和年齡
15.查詢信息系(IS),數學系(MA)和計算機系(CS)的學生姓名和性別
16.查詢即不是信息系(IS),數學系(MA)也不是計算機系(CS)的學生姓
名和性別
17.查詢學生號為 2009001 的學生的詳細情況
18.查詢所有姓劉的學生姓名,學號和性別
19.查詢姓“歐陽”且全名為三個漢字的學生的姓名
20.查詢名字中第二個字為陽字的學生的姓名和學號
21.查詢缺少成績的學生的學號和相應的課程號
22.查詢所有成績的學生的學號和相應的課程號
23.查詢計算機系年齡在20歲以上的學生姓名
作業練習——學生-選課 題目-3(續)
24.查詢選修了3號課程的學生的學號及其成績,查詢結果按分數的降
序排列
25.查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系
中的學生按年齡降序排列
26.查詢學員總人數
27.查詢選修了課程的學生人數
28.計算 1 號課程的學生平均成績
29.查詢選修1號課程的學生最高分數
30.求各個課程號及相應的選課人數
31.查詢選修了2門以上課程的學生學號
32.查詢每個學生及其選修課程的情況
33.查詢每一門課的間接選修課(即選修課的選修課)
34.查詢選修2號課程且成績在60分以上的所有學生
作業練習——學生-選課 題目-4(續)
35.查詢每個學生的學號,姓名,選修的課程及成績
36.查詢與 "劉晨"在同一個系學習的學生
37.查詢選修了課程名為“信息系統”的學生學號和姓名
38.查詢其他系中比信息系某一學員年齡小的學生姓名和年齡
39.查詢其他系中比信息系所有學員年齡都小的學生姓名和年齡
40.查詢所有選修了 1 號課程的學生姓名
41.查詢沒有選修 1 號課程的學生姓名
42.查詢選修了全部課程的學生姓名
43.查詢至少選修了 學生 2009002 選修的全部課程的學生號碼
44.對每一個系,求學生的平均年齡,並把結果存入數據庫
45.將計算機系的全體學生的成績置零
作業練習——學生-選課 題目-5(續)
46.刪除學號為 2009008 的學員記錄
47.刪除計算機系所有學生的選課記錄
48.查詢不選修課程名為’SC’的學員姓名和學號
49.列出有二門以上(含兩門)不及格課程的學生姓名及其平均成績
50.列出“1”號課成績比“2”號課成績高的所有學生的學號及其“1”
號課和“2”號課的成績
創建數據庫db_school后:
1 USE `db_school`; 2 3 /*Table structure for table `t_course` */ 4 5 DROP TABLE IF EXISTS `t_course`; 6 7 CREATE TABLE `t_course` ( 8 `Cno` int(11) NOT NULL AUTO_INCREMENT, 9 `Cname` varchar(50) NOT NULL, 10 `Cpno` int(11) NOT NULL, 11 `Ccredit` float NOT NULL, 12 PRIMARY KEY (`Cno`) 13 ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; 14 15 /*Data for the table `t_course` */ 16 17 insert into `t_course`(`Cno`,`Cname`,`Cpno`,`Ccredit`) values (1,'數據庫',5,4),(2,'數學',0,2),(3,'信息系統',1,4),(4,'操作系統',6,3),(5,'數據結構',7,4),(6,'數據處理',0,2),(7,'PASCAL語言',6,4); 18 19 /*Table structure for table `t_sc` */ 20 21 DROP TABLE IF EXISTS `t_sc`; 22 23 CREATE TABLE `t_sc` ( 24 `Sno` int(11) NOT NULL, 25 `Cno` int(11) NOT NULL, 26 `Grade` float DEFAULT NULL, 27 PRIMARY KEY (`Sno`,`Cno`) 28 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 29 30 /*Data for the table `t_sc` */ 31 32 insert into `t_sc`(`Sno`,`Cno`,`Grade`) values (20090001,1,92),(20090001,2,85),(20090001,3,NULL),(20090002,2,90),(20090002,3,80); 33 34 /*Table structure for table `t_student` */ 35 36 DROP TABLE IF EXISTS `t_student`; 37 38 CREATE TABLE `t_student` ( 39 `Sno` int(11) NOT NULL AUTO_INCREMENT, 40 `Sname` varchar(20) NOT NULL, 41 `Ssex` varchar(10) NOT NULL, 42 `Sage` int(11) DEFAULT NULL, 43 `Sdept` varchar(50) DEFAULT NULL, 44 PRIMARY KEY (`Sno`) 45 ) ENGINE=InnoDB AUTO_INCREMENT=20160034 DEFAULT CHARSET=utf8; 46 47 /*Data for the table `t_student` */ 48 49 insert into `t_student`(`Sno`,`Sname`,`Ssex`,`Sage`,`Sdept`) values (20090001,'張凱','男',22,'CS'),(20090002,'李勇','男',23,'IS'),(20090003,'劉晨','女',22,'MA'),(20090004,'張力','男',22,'MA'),(20090005,'張悅','女',20,'CS'),(20090006,'王敏','女',18,'IS'),(20160001,'張三','男',33,'計算機系'),(20160002,'zh','女',12,'計算機系'),(20160003,'zh','男',12,'計算機系'),(20160004,'zh','女',55,'sdfs'),(20160005,'zh','女',12,'sdfs'),(20160006,'zh','女',55,'計算機系'),(20160007,'zh','男',24,'sdfs'),(20160008,'zh','女',47,'計算機系'),(20160009,'zh','男',12,'sdfs'),(20160010,'zh','女',12,'sdfs'),(20160011,'zh','男',12,'sdfs'),(20160012,'zh','女',77,'sdfs'),(20160013,'zh','男',12,'sdfs'),(20160014,'zh','男',12,'計算機系'),(20160015,'zh','男',12,'sdfs'),(20160016,'zh','女',12,'sdfs'),(20160017,'zh','男',12,'sdfs'),(20160018,'zh','男',12,'sdfs'),(20160019,'zh','女',12,'計算機系'),(20160020,'zh','男',12,'sdfs'),(20160021,'zh','男',12,'計算機系'),(20160022,'zh','女',12,'sdfs'),(20160023,'zh','男',12,'sdfs'),(20160024,'zh','女',12,'sdfs'),(20160025,'zh','女',12,'sdfs'),(20160026,'zh','男',12,'sdfs'),(20160027,'zh','女',12,'sdfs'),(20160028,'zh','女',12,'sdfs'),(20160029,'zh','女',12,'sdfs');
個人記錄:
多表查詢
連接,即:查詢的結果表的一個記錄依賴於各個子表和連接條件。
SELECT s.stuName,c.courseName,sc.grade FROM t_student s,t_course c,t_studentcourse sc WHERE s.stuId=sc.stuId AND c.courseId=sc.courseId;
等於
SELECT s.stuName,c.courseName,sc.grade FROM t_student s join t_course c join t_studentcourse sc ON s.stuId=sc.stuId AND c.courseId=sc.courseId;
查詢的結果都是得到一個完整(記錄FULL!)的結果表,然后截取所要的。
COUNT(*) 函數返回表中的記錄數:
SELECT COUNT(*) FROM table_name;
select 查詢了聚集函數只返回一個記錄。
group by 配合聚集函數使用,也可以不配合。值相同的為一組。
分組后一般只查詢分組對象,其他對象沒有意義。
group by 后只接having語句,因為對象為組。
嵌套查詢是獨立的,如別名。
mysql 查詢時對字符串的大小寫不敏感。
查詢是否為null: WHERE sc.Grade IS NULL;
order by 列,列 //用逗號分隔。
聚集函數在結果表中作用,即后發執行。。比broup by還后。
group by 后每個組只存在一個記錄。
查詢所有選修了 1 號課程的學生姓名
? 41.查詢沒有選修 1 號課程的學生姓名
41:
SELECT s.Sname FROM t_student s
WHERE s.Sname
NOT IN(SELECT s.Sname FROM t_student s,t_sc sc
WHERE s.Sno=sc.Sno
AND sc.Cno=1 GROUP BY sc.Sno);
//不用group by也行。
//返回多個記錄,適用於in子句。
//
因為group by 只返回一條數據,所以只有:查詢結果以group by對象區分時才有意義(最直觀的情況是只查詢group by的對象)。換個說法:我們要得到的結果中作為分組依據的列的每個值只有一個記錄。
group by函數本質是為‘聚合’服務的。
//推斷不確定:上面的sql中恰好Cno=1的記錄分組中只有一條。
//不過應該是對的。
相似的having語句是篩選組的(組的記錄固定為1),所以。。。不分組(即一個組)只返回一個記錄。
為null的列參與判斷時,所屬記錄不參與查詢。
既然having是搭配group by用到,而where又不能與聚合函數連用,那用嵌套查詢:
SELECT *FROM t_sc sc WHERE sc.Grade>=(SELECT AVG(sc.Grade) FROM t_sc sc)
42查詢選修了全部課程的學生姓名
以得到各個學生的課程數目表為突破口。
SELECT sc.Sno,COUNT(sc.Cno) AS coursenum FROM t_sc sc
GROUP BY sc.Sno HAVING coursenum=3;
也可以:
SELECT sc.Sno FROM t_sc sc
GROUP BY sc.Sno HAVING COUNT(sc.Cno)=3;
group by是配合查詢中的聚集函數用的。
43查詢至少選修了 學生 2009002 選修的全部課程的學生號碼
SELECT sc.Sno,COUNT(sc.Cno) AS num FROM t_sc sc
WHERE sc.Cno IN(SELECT sc.Cno FROM t_sc sc WHERE sc.Sno='20090002')
GROUP BY sc.Sno HAVING num=(SELECT COUNT(*) FROM t_sc sc WHERE sc.Sno='20090002');
mysql中的整數數據是從1開始的,沒有0;
50.列出“1”號課成績比“2”號課成績高的所有學生的學號及其“1”
號課和“2”號課的成績
SELECT sc1.Sno,sc1.grade,sc2.grade FROM t_sc sc1,t_sc sc2
WHERE sc1.Sno=sc2.Sno AND sc1.Cno=1 AND sc2.Cno=2 AND sc1.Grade>sc2.Grade;
思考題:如何查詢得到一個包含學號和所有所選課程的成績?
49.
SELECT sc.Sno,COUNT(*) FROM t_sc sc WHERE sc.Grade>80 GROUP BY sc.Sno
HAVING COUNT(*)>=2;
等於:
SELECT sc.Sno FROM t_sc sc WHERE sc.Grade>80 GROUP BY sc.Sno
HAVING COUNT(*)>=2;
只要出現了聚集函數,不管在group by 前或后,group by都能得到正確的使用。
:聚集函數的加入相當於增加了一個列,該列的值的計算以分組為界限。
48.
SELECT s.Sname,s.Sno FROM t_student s WHERE s.Sno
NOT IN((SELECT sc.Sno FROM t_course c,t_sc sc
WHERE c.Cno=sc.Cno AND c.Cname='數據庫'));
45.
UPDATE t_sc AS sc SET grade=0 WHERE sc.Sno
IN(
SELECT s.Sno FROM t_student s WHERE s.Sdept='cs'
);