已默认会安装和登录MySQL,此处不再赘述。
创建数据集
1 | CREATE DATABASE `test`; |
2 | USE `test`; |
3 | DROP TABLE IF EXISTS course; |
4 | CREATE TABLE course( |
5 | cno INT(11) NOT NULL, |
6 | cname VARCHAR(20) NOT NULL, |
7 | tno INT(11) NOT NULL, |
8 | PRIMARY KEY (cno) |
9 | ); |
10 | INSERT INTO course(cno,cname,tno) |
11 | VALUES |
12 | (1,'企业管理',3), |
13 | (2,'马克思',1), |
14 | (3,'UML',2), |
15 | (4,'数据库',5), |
16 | (5,'物理',8), |
17 | (6,'计算机',8); |
18 | DROP TABLE IF EXISTS sc; |
19 | CREATE TABLE sc( |
20 | sno INT(11) NOT NULL, |
21 | cno INT(11) NOT NULL, |
22 | score INT(11) NOT NULL |
23 | ); |
24 | INSERT INTO sc(sno,cno,score) |
25 | VALUES (1,1,80),(1,2,86),(1,3,83),(1,4,89),(2,1,50),(2,2,36),(2,3,43),(2,4,59),(3,1,50),(3,2,96),(3,3,73),(3,4,69),(4,1,90),(4,2,36),(4,3,88),(4,4,99),(5,1,90),(5,2,96),(5,3,98),(5,4,99),(6,1,70),(6,2,66),(6,3,58),(6,4,79),(6,5,79),(6,6,79),(7,1,80),(7,2,76),(7,3,68),(7,4,59),(7,5,89),(1,5,80),(1,6,90); |
26 | DROP TABLE IF EXISTS student; |
27 | CREATE TABLE student( |
28 | sno INT(11) NOT NULL, |
29 | sname VARCHAR(20) NOT NULL, |
30 | sage DATETIME NOT NULL, |
31 | ssex CHAR(2) NOT NULL, |
32 | PRIMARY KEY (sno) |
33 | ); |
34 | INSERT INTO student(sno,sname,sage,ssex) |
35 | VALUES |
36 | (1,'张三','1980-01-23 00:00:00','男'), |
37 | (2,'李四','1982-12-12 00:00:00','男'), |
38 | (3,'张飒','1981-09-09 00:00:00','男'), |
39 | (4,'莉莉','1983-03-23 00:00:00','女'), |
40 | (5,'王弼','1982-06-21 00:00:00','男'), |
41 | (6,'王丽','1984-10-10 00:00:00','女'), |
42 | (7,'刘香','1980-12-22 00:00:00','女'); |
43 | DROP TABLE IF EXISTS teacher; |
44 | CREATE TABLE teacher( |
45 | tno INT(3) NOT NULL, |
46 | tname VARCHAR(20) NOT NULL, |
47 | PRIMARY KEY (tno) |
48 | ); |
49 | INSERT INTO teacher(tno,tname) |
50 | VALUES(1,'张老师'),(2,'王老师'),(3,'李老师'),(4,'赵老师'),(5,'刘老师'),(6,'向老师'),(7,'李文静'),(8,'叶平'); |
题目练习
- 1.查询课程1的成绩比课程2的成绩高的所有学生的学号
1
SELECT
2
a.*
3
FROM
4
sc AS a
5
LEFT JOIN
6
sc AS b
7
ON
8
a.sno = b.sno
9
WHERE
10
a.cno = 1 AND
11
b.cno = 2 AND
12
a.score > b.score;
- 2.查询平均成绩大于60分的同学的学号和平均成绩
1
SELECT
2
sno,
3
AVG( score ) AS score
4
FROM
5
sc
6
GROUP BY
7
sno
8
HAVING
9
score > 60;
- 3.查询所有同学的学号、姓名、选课数、总成绩
1
SELECT
2
sst.sno AS '学号',
3
sst.sname AS '姓名',
4
COUNT( ssc.cno ) AS '选课数',
5
SUM( ssc.score ) AS '总成绩'
6
FROM
7
sc AS ssc,
8
student AS sst
9
WHERE
10
ssc.sno = sst.sno
11
GROUP BY
12
sst.sno;
- 4.查询姓“李”的老师的个数
1
SELECT
2
COUNT(teacher.tname) AS "个数"
3
FROM
4
teacher
5
WHERE
6
teacher.tname LIKE "李%";
- 5.查询没学过“叶平”老师课的同学的学号、姓名
1
SELECT
2
sno,
3
sname
4
FROM
5
student
6
WHERE
7
sno NOT IN
8
(
9
SELECT
10
DISTINCT(a.sno)
11
FROM
12
sc AS a
13
WHERE
14
a.cno > 4 /*杨平老师授课的为5和6*/
15
);
- 6.查询同时学过课程1和课程2的同学的学号、姓名
1
SELECT
2
a.sno AS 'xuehao',
3
a.sname AS 'xingming'
4
FROM
5
student AS a, sc
6
WHERE
7
a.sno = sc.sno
8
AND sc.cno IN (1,2)
9
GROUP BY
10
sc.sno
11
HAVING COUNT(sc.cno) >=2;
- 7.查询学过“叶平”老师所教所有课程的所有同学的学号、姓名
1
SELECT
2
a.sno AS 'xuehao',
3
a.sname AS 'xingming'
4
FROM
5
student AS a,
6
sc AS b,
7
course AS c,
8
teacher AS d
9
WHERE
10
a.sno = b.sno AND b.cno = c.cno AND c.tno = d.tno AND d.tname = '叶平'
11
GROUP BY a.sno
12
HAVING COUNT(b.cno) >=2;
- 8.查询所有课程成绩小于60分的同学的学号、姓名
1
SELECT
2
student.sno AS 'xuehao',
3
student.sname AS 'xingming'
4
FROM
5
student
6
WHERE
7
student.sno NOT IN
8
(SELECT sc.sno FROM sc WHERE sc.score >=60);
- 9.查询没有学全所有课的同学的学号、姓名
1
SELECT
2
student.sno AS 'xuehao',
3
student.sname AS 'xingming'
4
FROM
5
student
6
WHERE
7
student.sno NOT IN(
8
SELECT
9
sc.sno
10
FROM
11
sc,course
12
WHERE
13
sc.cno = course.cno
14
GROUP BY sc.sno
15
HAVING COUNT(sc.cno) >=6
16
);
- 10.查询至少有一门课程 与 学号为1的同学所学课程 相同的同学的学号和姓名
1
SELECT
2
DISTINCT
3
sst.sno AS '学号',
4
sst.sname AS '姓名'
5
FROM
6
student sst, sc
7
WHERE
8
sst.sno=sc.sno
9
AND sst.sno!=1
10
AND sc.cno IN
11
(SELECT cno FROM sc WHERE sno=1);