若是你沒試過水的話,那一題一題地每一題都敲一遍吧。無論它們對你看來有多麼簡單。 mysql
建庫代碼sql
部分題目答案在末尾,可用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');
我的記錄:spa
多表查詢
鏈接,即:查詢的結果表的一個記錄依賴於各個子表和鏈接條件。操作系統
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;code
查詢的結果都是獲得一個完整(記錄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');