MySQL练习
There is recorded some MySQL pratices.
数据库和数据准备
- 数据库建立
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30CREATE TABLE STUDENT
(
SNO VARCHAR(3) NOT NULL,
SNAME VARCHAR(4) NOT NULL,
SSEX VARCHAR(2) NOT NULL,
SBIRTHDAY DATETIME,
CLASS VARCHAR(5)
);
CREATE TABLE COURSE
(
CNO VARCHAR(5) NOT NULL,
CNAME VARCHAR(10) NOT NULL,
TNO VARCHAR(10) NOT NULL
);
CREATE TABLE SCORE
(
SNO VARCHAR(3) NOT NULL,
CNO VARCHAR(5) NOT NULL,
DEGREE NUMERIC(10, 1) NOT NULL
);
CREATE TABLE TEACHER
(
TNO VARCHAR(3) NOT NULL,
TNAME VARCHAR(4) NOT NULL, TSEX VARCHAR(2) NOT NULL,
TBIRTHDAY DATETIME NOT NULL, PROF VARCHAR(6),
DEPART VARCHAR(10) NOT NULL
); - 数据填充
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,'曾华' ,'男' ,'1977-09-01',95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,'匡明' ,'男' ,'1975-10-02',95031);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,'王丽' ,'女' ,'1976-01-23',95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,'李军' ,'男' ,'1976-02-20',95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,'王芳' ,'女' ,'1975-02-10',95031);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,'陆君' ,'男' ,'1974-06-03',95031);
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-105' ,'计算机导论',825);
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-245' ,'操作系统' ,804);
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('6-166' ,'数据电路' ,856);
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('9-888' ,'高等数学' ,100);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-245',86);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-245',75);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-245',68);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-105',92);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-105',88);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-105',76);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'3-105',64);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'3-105',91);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'3-105',78);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'6-166',85);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'6-106',79);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'6-166',81);
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (804,'李诚','男','1958-12-02','副教授','计算机系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (856,'张旭','男','1969-03-12','讲师','电子工程系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (825,'王萍','女','1972-05-05','助教','计算机系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (831,'刘冰','女','1977-08-14','助教','电子工程系'); - 数据填充完成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53mysql> SELECT * FROM STUDENT;
+-----+--------+------+---------------------+-------+
| SNO | SNAME | SSEX | SBIRTHDAY | CLASS |
+-----+--------+------+---------------------+-------+
| 108 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 105 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 107 | 王丽 | 女 | 1976-01-23 00:00:00 | 95033 |
| 101 | 李军 | 男 | 1976-02-20 00:00:00 | 95033 |
| 109 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 103 | 陆君 | 男 | 1974-06-03 00:00:00 | 95031 |
+-----+--------+------+---------------------+-------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM COURSE;
+-------+-----------------+-----+
| CNO | CNAME | TNO |
+-------+-----------------+-----+
| 3-105 | 计算机导论 | 825 |
| 3-245 | 操作系统 | 804 |
| 6-166 | 数据电路 | 856 |
| 9-888 | 高等数学 | 100 |
+-------+-----------------+-----+
4 rows in set (0.00 sec)
mysql> SELECT * FROM SCORE;
+-----+-------+--------+
| SNO | CNO | DEGREE |
+-----+-------+--------+
| 103 | 3-245 | 86.0 |
| 105 | 3-245 | 75.0 |
| 109 | 3-245 | 68.0 |
| 103 | 3-105 | 92.0 |
| 105 | 3-105 | 88.0 |
| 109 | 3-105 | 76.0 |
| 101 | 3-105 | 64.0 |
| 107 | 3-105 | 91.0 |
| 108 | 3-105 | 78.0 |
| 101 | 6-166 | 85.0 |
| 107 | 6-106 | 79.0 |
| 108 | 6-166 | 81.0 |
+-----+-------+--------+
12 rows in set (0.00 sec)
mysql> SELECT * FROM TEACHER;
+-----+--------+------+---------------------+-----------+-----------------+
| TNO | TNAME | TSEX | TBIRTHDAY | PROF | DEPART |
+-----+--------+------+---------------------+-----------+-----------------+
| 804 | 李诚 | 男 | 1958-12-02 00:00:00 | 副教授 | 计算机系 |
| 856 | 张旭 | 男 | 1969-03-12 00:00:00 | 讲师 | 电子工程系 |
| 825 | 王萍 | 女 | 1972-05-05 00:00:00 | 助教 | 计算机系 |
| 831 | 刘冰 | 女 | 1977-08-14 00:00:00 | 助教 | 电子工程系 |
+-----+--------+------+---------------------+-----------+-----------------+
4 rows in set (0.00 sec)
题目
查询STUDENT表中的所有记录的SNAME、SSEX和CLASS列
1 | mysql> SELECT SNAME, SSEX, CLASS FROM STUDENT; |
查询教师所有的单位即不重复的DEPART列
1 | mysql> SELECT DEPART FROM TEACHER GROUP BY DEPART; |
查询STUDENT表的所有记录
1 | mysql> SELECT * FROM STUDENT; |
查询SCORE表中成绩在60到80之间的所有记录
1 | mysql> SELECT * FROM SCORE WHERE DEGREE BETWEEN 60 AND 80; |
查询SCORE表中成绩为85,86或88的记录
1 | mysql> SELECT * FROM SCORE WHERE DEGREE IN(85, 86, 88); |
查询STUDENT表中“95031”班或性别为“女”的同学记录
1 | mysql> SELECT * FROM STUDENT WHERE CLASS='95031' OR SSEX='女'; |
以CLASS降序查询STUDENT表的所有记录
1 | mysql> SELECT * FROM STUDENT ORDER BY CLASS DESC; |
以CNO升序、DEGREE降序查询SCORE表的所有记录
1 | mysql> SELECT * FROM SCORE ORDER BY CNO, DEGREE DESC; |
查询“95031”班的学生人数
1 | mysql> SELECT COUNT(*) FROM STUDENT WHERE CLASS='95031'; |
查询SCORE表中的最高分的学生学号和课程号
1 | mysql> SELECT SNO, CNO FROM SCORE WHERE DEGREE IN (SELECT MAX(DEGREE) FROM SCORE); |
查询‘3-105’号课程的平均分
1 | mysql> SELECT AVG(DEGREE) FROM SCORE WHERE CNO='3-105'; |
查询SCORE表中至少有2名学生选修的并以3开头的课程的平均分数
1 | mysql> SELECT AVG(DEGREE) FROM SCORE GROUP BY CNO HAVING COUNT(CNO)>1 AND CNO LIKE '3%'; |
查询最低分大于70,最高分小于90的SNO列
1 | mysql> SELECT SNO FROM SCORE GROUP BY SNO HAVING MIN(DEGREE)>70 AND MAX(DEGREE)<90; |
查询所有学生的SNAME、CNO和DEGREE列
1 | mysql> SELECT A.SNAME, B.CNO, B.DEGREE FROM STUDENT A, SCORE B WHERE A.SNO=B.SNO; |
查询所有学生的SNO、CNAME和DEGREE列
1 | mysql> SELECT A.SNO, B.CNAME, A.DEGREE FROM SCORE A, COURSE B WHERE A.CNO=B.CNO; |
查询所有学生的SNAME、CNAME和DEGREE列
1 | mysql> SELECT A.SNAME, B.CNAME, C.DEGREE FROM STUDENT A, COURSE B, SCORE C WHERE A.SNO=C.SNO AND B.CNO=C.CNO; |
查询“95033”班所选课程的平均分
1 | mysql> SELECT AVG(DEGREE) FROM SCORE INNER JOIN STUDENT S ON S.CLASS='95033'; |
假设使用如下命令建立了一个grade表
1 | CREATE TABLE grade(low int,upp int,rank char(1)); |
查询所有同学的SNO、CNO和rank列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18mysql> SELECT A.SNO, A.CNO, B.rank FROM SCORE A, grade B WHERE A.DEGREE BETWEEN low and upp;
+-----+-------+------+
| SNO | CNO | rank |
+-----+-------+------+
| 103 | 3-245 | B |
| 105 | 3-245 | C |
| 109 | 3-245 | D |
| 103 | 3-105 | A |
| 105 | 3-105 | B |
| 109 | 3-105 | C |
| 101 | 3-105 | D |
| 107 | 3-105 | A |
| 108 | 3-105 | C |
| 101 | 6-166 | B |
| 107 | 6-106 | C |
| 108 | 6-166 | B |
+-----+-------+------+
12 rows in set (0.00 sec)查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录
1
2
3
4
5
6
7
8
9
10mysql> SELECT * FROM STUDENT WHERE SNO IN (SELECT SNO FROM SCORE WHERE CNO='3-105' AND DEGREE>(SELECT DEGREE FROM SCORE WHERE SNO='109' AND CNO='3-105'));
+-----+--------+------+---------------------+-------+
| SNO | SNAME | SSEX | SBIRTHDAY | CLASS |
+-----+--------+------+---------------------+-------+
| 103 | 陆君 | 男 | 1974-06-03 00:00:00 | 95031 |
| 105 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 107 | 王丽 | 女 | 1976-01-23 00:00:00 | 95033 |
| 108 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
+-----+--------+------+---------------------+-------+
4 rows in set (0.00 sec)查询”95033”班和”95031”班全体学生的记录
1
2
3
4
5
6
7
8
9
10
11
12mysql> SELECT * FROM STUDENT WHERE CLASS IN('95033', '95031');
+-----+--------+------+---------------------+-------+
| SNO | SNAME | SSEX | SBIRTHDAY | CLASS |
+-----+--------+------+---------------------+-------+
| 108 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 105 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 107 | 王丽 | 女 | 1976-01-23 00:00:00 | 95033 |
| 101 | 李军 | 男 | 1976-02-20 00:00:00 | 95033 |
| 109 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 103 | 陆君 | 男 | 1974-06-03 00:00:00 | 95031 |
+-----+--------+------+---------------------+-------+
6 rows in set (0.00 sec)查询存在有85分以上成绩的课程CNO
1
2
3
4
5
6
7
8mysql> SELECT CNO FROM SCORE GROUP BY CNO HAVING CNO IN (SELECT CNO FROM SCORE WHERE DEGREE>85);
+-------+
| CNO |
+-------+
| 3-105 |
| 3-245 |
+-------+
2 rows in set (0.00 sec)查询出“计算机系“教师所教课程的成绩表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31mysql> SELECT * FROM SCORE WHERE CNO IN(SELECT CNO FROM COURSE WHERE TNO IN(SELECT TNO FROM TEACHER WHERE DEPART='计算机系'));
+-----+-------+--------+
| SNO | CNO | DEGREE |
+-----+-------+--------+
| 103 | 3-245 | 86.0 |
| 105 | 3-245 | 75.0 |
| 109 | 3-245 | 68.0 |
| 103 | 3-105 | 92.0 |
| 105 | 3-105 | 88.0 |
| 109 | 3-105 | 76.0 |
| 101 | 3-105 | 64.0 |
| 107 | 3-105 | 91.0 |
| 108 | 3-105 | 78.0 |
+-----+-------+--------+
9 rows in set (0.00 sec)
# 解法二
mysql> SELECT * FROM SCORE WHERE CNO IN(SELECT C.CNO FROM TEACHER T, COURSE C WHERE T.DEPART='计算机系' AND T.TNO=C.TNO);
+-----+-------+--------+
| SNO | CNO | DEGREE |
+-----+-------+--------+
| 103 | 3-245 | 86.0 |
| 105 | 3-245 | 75.0 |
| 109 | 3-245 | 68.0 |
| 103 | 3-105 | 92.0 |
| 105 | 3-105 | 88.0 |
| 109 | 3-105 | 76.0 |
| 101 | 3-105 | 64.0 |
| 107 | 3-105 | 91.0 |
| 108 | 3-105 | 78.0 |
+-----+-------+--------+
9 rows in set (0.00 sec)
- 本文标题:MySQL练习
- 本文作者:Thomas Woo
- 发布时间:2018-08-02 18:00
- 最后更新:2020-06-20 15:40
- 本文链接:http://smileorigin.site/database/mysql/pratices/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明出处!