mysql練習題目試水50題,附建庫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');

 

 

 

 

個人記錄:

多表查詢
連接,即:查詢的結果表的一個記錄依賴於各個子表和連接條件。

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'
);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM