1 准备数据

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

INSERT 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 (101, '6-166', 85);
INSERT INTO SCORE (SNO, CNO, DEGREE) VALUES (107, '6-106', 79);
INSERT INTO SCORE (SNO, CNO, DEGREE) VALUES (108, '3-105', 78);
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', '助教', '电子工程系');

2 查询1

2.1 like:查询Student表中不姓“王”的同学记录

SELECT *
FROM student
WHERE sname NOT LIKE "王%";

-------------------------------------------------------

108	曾华	男	1977-09-01 00:00:00	95033
105	匡明	男	1975-10-02 00:00:00	95031
101	李军	男	1976-02-20 00:00:00	95033
103	陆君	男	1974-06-03 00:00:00	95031

2.2 in:查询95033班和95031班全体学生的记录

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

2.3 or / in:查询 score 表中成绩为85,86或88的记录

SELECT *
FROM score
WHERE degree = 85 or degree = 86 or degree = 88;

-------------------------------------------------------

SNO CNO DEGREE
103	3-245	86.0
105	3-105	88.0
101	6-166	85.0

-------------------------------------------------------------------------------------------------------------

SELECT *
FROM score
WHERE degree IN (85, 86, 88);

-------------------------------------------------------

SNO CNO DEGREE
103	3-245	86.0
105	3-105	88.0
101	6-166	85.0

2.4 between:查询Score表中成绩在60到80之间的所有记录

SELECT *
FROM score
WHERE degree > 60 and degree < 80;

-------------------------------------------------------

SNO CNO DEGREE
105	3-245	75.0
109	3-245	68.0
109	3-105	76.0
101	3-105	64.0
107	6-106	79.0
108	3-105	78.0

-------------------------------------------------------------------------------------------------------------

SELECT *
FROM score
WHERE dergee BETWEEN 60 AND 80;

-------------------------------------------------------

SNO CNO DEGREE
105	3-245	75.0
109	3-245	68.0
109	3-105	76.0
101	3-105	64.0
107	6-106	79.0
108	3-105	78.0

2.5 limit:查询Score表中的最高分的学生学号和课程号

SELECT sno, cno
FROM score
ORDER BY degree DESC
LIMIT 1;

-------------------------------------------------------

sno cno
103	3-105

-------------------------------------------------------------------------------------------------------------

SELECT sno, cno
FROM score
WHERE degree = (
  SELECT max(degree)
  FROM score
);

-------------------------------------------------------

sno cno
103	3-105

2.6 order by:以 cno 升序、degree降序查询 score 表的所有记录

注意 ORDER BY 子句中的顺序,交换顺序之后是不一样的。首先根据第一个字段排序,如果第一个字段相同,再根据第二个字段排序。

SELECT *
FROM score
ORDER BY cno ASC, degree DESC;

-------------------------------------------------------

SNO CNO DEGREE
101	3-105	64.0
109	3-105	76.0
108	3-105	78.0
105	3-105	88.0
107	3-105	91.0
103	3-105	92.0
109	3-245	68.0
105	3-245	75.0
103	3-245	86.0
107	6-106	79.0
108	6-166	81.0
101	6-166	85.0

2.7 avg:查询3-105号课程的平均分

SELECT AVG(degree)
FROM score
WHERE cno = '3-105';

-------------------------------------------------------

AVG(degree)
81.50000

2.8 avg:查询95033班所选课程的平均分

SELECT AVG(degree)
FROM score
WHERE sno IN
    (SELECT sno
     FROM student
     WHERE class = '95033');

-------------------------------------------------------

AVG(degree)
79.66667

2.9 avg:查询Score表中至少有5名学生选修的并以3开头的课程的平均分数

SELECT cno, AVG(degree)
FROM score
WHERE cno LIKE '3%'
GROUP BY cno
HAVING COUNT(*) > 5;

-------------------------------------------------------

cno AVG(degree)
3-105	81.50000

2.10 count:查询95031班的学生人数

SELECT COUNT(*)
FROM STUDENT
WHERE class = '95031';

-------------------------------------------------------

COUNT(*)
3

2.11 year:查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列

SELECT sno, sname, sbirthday
FROM student
WHERE YEAR(sbirthday) =
    (SELECT YEAR(sbirthday)
     FROM student
     WHERE sno = '108');

-------------------------------------------------------

sno sname sbirthday
108	曾华	1977-09-01 00:00:00

2.12 year:查询Student表中每个学生的姓名和年龄

SELECT sname, YEAR(NOW()) - YEAR(sbirthday)
FROM student;

-------------------------------------------------------

sname YEAR(NOW()) - YEAR(sbirthday)
曾华	46
匡明	48
王丽	47
李军	47
王芳	48
陆君	49

2.13 min、max:查询所有课程成绩最低分大于70分,最高分小于90分的学生的学号

暗含了要根据sno分组

SELECT sno
FROM score
GROUP BY sno
HAVING min(degree) > 70 AND max(degree) < 90;

-------------------------------------------------------

sno
105
108

2.14 union:查询所有教师和同学的name、sex和birthday

SELECT tname name, tsex sex, tbirthday birthday
FROM teacher
UNION
SELECT sname name, ssex sex, sbirthday birthday
FROM student;

-------------------------------------------------------

name sex birthday
李诚	男	1958-12-02 00:00:00
张旭	男	1969-03-12 00:00:00
王萍	女	1972-05-05 00:00:00
刘冰	女	1977-08-14 00:00:00
曾华	男	1977-09-01 00:00:00
匡明	男	1975-10-02 00:00:00
王丽	女	1976-01-23 00:00:00
李军	男	1976-02-20 00:00:00
王芳	女	1975-02-10 00:00:00
陆君	男	1974-06-03 00:00:00

2.15 union:查询所有“女”教师和“女”同学的name、sex和birthday

SELECT tname name, tsex sex, tbirthday birthday
FROM teacher
WHERE tsex = '女'
UNION
SELECT sname name, ssex sex, sbirthday birthday
FROM student
WHERE ssex = '女';

-------------------------------------------------------

name sex birthday
王萍	女	1972-05-05 00:00:00
刘冰	女	1977-08-14 00:00:00
王丽	女	1976-01-23 00:00:00
王芳	女	1975-02-10 00:00:00

2.16 >:查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录

SELECT *
FROM score
WHERE cno = '3-105'
AND degree > 
    (SELECT degree
     FROM score·
     WHERE sno = '109' AND cno = '3-105');

-------------------------------------------------------

SNO CNO DEGREE
103	3-105	92.0
105	3-105	88.0
107	3-105	91.0
108	3-105	78.0

3 查询2

3.1 查询所有学生的Sname、Cno和Degree列

SELECT a.sname, b.cno, b.degree
FROM student a, score b
WHERE a.sno = b.sno;

-------------------------------------------------------

sname cno degree
陆君	3-245	86.0
匡明	3-245	75.0
王芳	3-245	68.0
陆君	3-105	92.0
匡明	3-105	88.0
王芳	3-105	76.0
李军	3-105	64.0
王丽	3-105	91.0
李军	6-166	85.0
王丽	6-106	79.0
曾华	3-105	78.0
曾华	6-166	81.0

3.2 查询所有学生的Sno、Cname和Degree列

SELECT a.sno, b.cname, a.degree
FROM score a, course b
WHERE a.cno = b.cno;

-------------------------------------------------------

sno cname degree
103	操作系统	86.0
105	操作系统	75.0
109	操作系统	68.0
103	计算机导论	92.0
105	计算机导论	88.0
109	计算机导论	76.0
101	计算机导论	64.0
107	计算机导论	91.0
101	数据电路	85.0
108	计算机导论	78.0
108	数据电路	81.0

3.3 查询所有学生的Sname、Cname和Degree列

SELECT a.sname, b.cname, c.degree
FROM student a 
JOIN score c ON a.sno = c.sno
JOIN course b ON b.cno = c.cno;

-------------------------------------------------------

SELECT student.sname, course.cname, score.degree
FROM student
INNER JOIN score ON student.sno = score.sno
INNER JOIN course ON score.cno = course.cno;

-------------------------------------------------------

SELECT student.sname, course.cname, score.degree
FROM student, score, course
WHERE student.sno = score.sno
AND score.cno = course.cno;

-------------------------------------------------------

sname cname degree
曾华	计算机导论	78.0
曾华	数据电路	81.0
匡明	操作系统	75.0
匡明	计算机导论	88.0
王丽	计算机导论	91.0
李军	计算机导论	64.0
李军	数据电路	85.0
王芳	操作系统	68.0
王芳	计算机导论	76.0
陆君	操作系统	86.0
陆君	计算机导论	92.0

3.4 查询所有任课教师的Tname和Depart

SELECT tname, depart
FROM teacher a
WHERE tno IN
    (SELECT DISTINCT tno
     FROM course);

-------------------------------------------------------

tname depart
王萍	计算机系
李诚	计算机系
张旭	电子工程系
刘冰	电子工程系

3.5 查询至少有2名男生的班号

SELECT CLASS
FROM student
WHERE ssex = '男'
GROUP BY CLASS
HAVING count(ssex) > 1;

-------------------------------------------------------

CLASS
95031
95033

3.6 查询成绩比该课程平均成绩低的同学的成绩表

SELECT a.*
FROM score a
WHERE degree <
    (SELECT AVG(degree)
     FROM score b
     WHERE b.cno = a.cno);

-------------------------------------------------------

SNO CNO DEGREE
105	3-245	75.0
109	3-245	68.0
109	3-105	76.0
101	3-105	64.0
108	3-105	78.0
108	6-166	81.0

3.7 查询存在有85分以上成绩的课程Cno

SELECT cno
FROM score
GROUP BY cno
HAVING MAX(degree) > 85;

-------------------------------------------------------

cno
3-105
3-245

3.8 查询“张旭“教师任课的学生成绩

SELECT * 
FROM score 
WHERE CNO = (
	SELECT CNO 
	FROM course
	JOIN teacher ON course.TNO = teacher.TNO 
	AND teacher.TNAME = '张旭' 
)

-------------------------------------------------------

SNO CNO DEGREE
101	6-166	85.0
108	6-166	81.0

3.9 查询选修某课程的同学人数多于5人的教师姓名

SELECT tname
FROM teacher
WHERE tno IN
    (SELECT tno
     FROM course
     WHERE cno IN
         (SELECT cno
          FROM score
          GROUP BY cno
          HAVING count(sno) > 5));

-------------------------------------------------------

tname
王萍

-------------------------------------------------------------------------------------------------------------

SELECT tname
FROM teacher
WHERE tno IN
    (SELECT c.tno
     FROM course c,score s
     WHERE c.cno = s.cno
     GROUP BY c.tno
     HAVING COUNT(c.tno) > 5);

-------------------------------------------------------

tname
王萍

3.10 查询出“计算机系“教师所教课程的成绩表

SELECT *
FROM score
WHERE cno IN
    (SELECT cno
     FROM course, teacher
     WHERE depart = '计算机系'
     AND course.tno = teacher.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