sql查询练习
来自B站课程 "一天学会MYSQL数据库"1的大刘课程的全部练习题,老师有些单词拼的不对,我自己重新修改了字段名,整理如下
新建一个查询练习用的数据库 Unicersity
CREATE DATABASE Unicersity;
创建学生表:students(学号, 姓名, 性别, 出生日期, 所在班级)
CREATE TABLE students(
s_num VARCHAR(20) PRIMARY KEY COMMENT'学生学号',
s_name VARCHAR(20) NOT NULL COMMENT'学生姓名 不能为空',
s_sex VARCHAR(10) NOT NULL COMMENT'学生性别',
s_birthday DATETIME COMMENT'学生生日',
s_class VARCHAR(20) COMMENT'学生所在的班级'
);
创建教师表:teachers(教师编号,教师名字,教师性别,出生日期,职称,所在部门)
CREATE TABLE teachers(
t_num VARCHAR(20) PRIMARY KEY COMMENT'教师编号',
t_name VARCHAR(20) NOT NULL COMMENT'教师姓名',
t_sex VARCHAR(20) NOT NULL COMMENT'教师性别',
t_birthday DATETIME COMMENT'教师生日',
t_title VARCHAR(20) NOT NULL COMMENT'教师职称',
t_department VARCHAR(20) NOT NULL COMMENT'教师所在的部门'
);
创建课程表:courses(课程号,课程课程名称,教师编号)
CREATE TABLE courses(
c_num VARCHAR(20) PRIMARY KEY COMMENT'课程号',
c_name VARCHAR(20) NOT NULL COMMENT'课程名称',
t_num VARCHAR(20) NOT NULL COMMENT '教师编号 外键关联teacher表',
FOREIGN KEY(t_num) references teachers(t_num)
);
创建成绩表:srores(学号,课程号,成绩)
CREATE TABLE scores (
s_num VARCHAR(20) NOT NULL COMMENT '成绩表的编号 依赖学生学号',
c_num VARCHAR(20) NOT NULL COMMENT '课程号 依赖于课程表中的c_id',
score decimal,
foreign key(s_num) references students(s_num),
foreign key(c_num) references courses(c_num),
PRIMARY KEY(s_num,c_num)
);
分别向表中添加数据
--学生表数据
INSERT INTO students VALUES('101','曾华','男','1977-09-01','95033');
INSERT INTO students VALUES('102','匡明','男','1975-10-02','95031');
INSERT INTO students VALUES('103','王丽','女','1976-01-23','95033');
INSERT INTO students VALUES('104','李军','男','1976-02-20','95033');
INSERT INTO students VALUES('105','王芳','女','1975-02-10','95031');
INSERT INTO students VALUES('106','陆军','男','1974-06-03','95031');
INSERT INTO students VALUES('107','王尼玛','男','1976-02-20','95033');
INSERT INTO students VALUES('108','张全蛋','男','1975-02-10','95031');
INSERT INTO students VALUES('109','赵铁柱','男','1974-06-03','95031');
--教师表数据
INSERT INTO teachers VALUES('804','李诚','男','1958-12-02','副教授','计算机系');
INSERT INTO teachers VALUES('856','张旭','男','1969-03-12','讲师','电子工程系');
INSERT INTO teachers VALUES('825','王萍','女','1972-05-05','助教','计算机系');
INSERT INTO teachers VALUES('831','刘冰','女','1977-08-14','助教','电子工程系');
--添加课程表
INSERT INTO courses VALUES('3-105','计算机导论','825');
INSERT INTO courses VALUES('3-245','操作系统','804');
INSERT INTO courses VALUES('6-166','数字电路','856');
INSERT INTO courses VALUES('9-888','高等数学','831');
--添加成绩表
INSERT INTO scores VALUES('103','3-245','86');
INSERT INTO scores VALUES('105','3-245','75');
INSERT INTO scores VALUES('109','3-245','68');
INSERT INTO scores VALUES('103','3-105','92');
INSERT INTO scores VALUES('105','3-105','88');
INSERT INTO scores VALUES('109','3-105','76');
INSERT INTO scores VALUES('103','6-166','85');
INSERT INTO scores VALUES('105','6-166','79');
INSERT INTO scores VALUES('109','6-166','81');
几张表的数据展现
mysql> select* from students;
+-------+--------+-------+---------------------+---------+
| s_num | s_name | s_sex | s_birthday | s_class |
+-------+--------+-------+---------------------+---------+
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 103 | 王丽 | 女 | 1976-01-23 00:00:00 | 95033 |
| 104 | 李军 | 男 | 1976-02-20 00:00:00 | 95033 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 106 | 陆军 | 男 | 1974-06-03 00:00:00 | 95031 |
| 107 | 王尼玛 | 男 | 1976-02-20 00:00:00 | 95033 |
| 108 | 张全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-06-03 00:00:00 | 95031 |
| 110 | 刘表 | 男 | NULL | NULL |
+-------+--------+-------+---------------------+---------+
mysql> select* from teachers;
+-------+--------+-------+---------------------+---------+--------------+
| t_num | t_name | t_sex | t_birthday | t_title | t_department |
+-------+--------+-------+---------------------+---------+--------------+
| 804 | 李诚 | 男 | 1958-12-02 00:00:00 | 副教授 | 计算机系 |
| 825 | 王萍 | 女 | 1972-05-05 00:00:00 | 助教 | 计算机系 |
| 831 | 刘冰 | 女 | 1977-08-14 00:00:00 | 助教 | 电子工程系 |
| 856 | 张旭 | 男 | 1969-03-12 00:00:00 | 讲师 | 电子工程系 |
+-------+--------+-------+---------------------+---------+--------------+
mysql> select * from courses;
+-------+------------+-------+
| c_num | c_name | t_num |
+-------+------------+-------+
| 3-105 | 计算机导论 | 825 |
| 3-245 | 操作系统 | 804 |
| 6-166 | 数字电路 | 856 |
| 9-888 | 高等数学 | 831 |
+-------+------------+-------+
mysql> select * from scores;
+-------+-------+-------+
| s_num | c_num | score |
+-------+-------+-------+
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 103 | 3-105 | 92 |
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
| 109 | 6-166 | 81 |
+-------+-------+-------+
开始 练习
1.查询student表中所有的记录
mysql> select* from students;
+-------+--------+-------+---------------------+---------+
| s_num | s_name | s_sex | s_birthday | s_class |
+-------+--------+-------+---------------------+---------+
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 103 | 王丽 | 女 | 1976-01-23 00:00:00 | 95033 |
| 104 | 李军 | 男 | 1976-02-20 00:00:00 | 95033 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 106 | 陆军 | 男 | 1974-06-03 00:00:00 | 95031 |
| 107 | 王尼玛 | 男 | 1976-02-20 00:00:00 | 95033 |
| 108 | 张全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-06-03 00:00:00 | 95031 |
| 110 | 刘表 | 男 | NULL | NULL |
+-------+--------+-------+---------------------+---------+
2.查询student表中所有记录的s_name,s_sex和s_class列
mysql> SELECT s_num,s_name,s_class FROM students;
+-------+--------+---------+
| s_num | s_name | s_class |
+-------+--------+---------+
| 101 | 曾华 | 95033 |
| 102 | 匡明 | 95031 |
| 103 | 王丽 | 95033 |
| 104 | 李军 | 95033 |
| 105 | 王芳 | 95031 |
| 106 | 陆军 | 95031 |
| 107 | 王尼玛 | 95033 |
| 108 | 张全蛋 | 95031 |
| 109 | 赵铁柱 | 95031 |
| 110 | 刘表 | NULL |
+-------+--------+---------+
3.查询教师所有的单位但是不重复的t_department列
mysql> SELECT distinct(t_department) FROM teachers;
+--------------+
| t_department |
+--------------+
| 计算机系 |
| 电子工程系 |
+--------------+
2 rows in set (0.00 sec)
4.查询score表中成绩在60-80之间所有的记录
注意:BETWEEN… ADN… 是包含边界的
mysql> SELECT * FROM scores WHERE score BETWEEN 61 AND 79;
mysql> SELECT * FROM scores WHERE score >60 and score < 80;
+-------+-------+-------+
| s_num | c_num | score |
+-------+-------+-------+
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
+-------+-------+-------+
5.查询score表中成绩为85, 86, 或者88的记录
mysql> SELECT * FROM scores WHERE score IN(85, 86, 88);
+-------+-------+-------+
| s_num | c_num | score |
+-------+-------+-------+
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 105 | 3-105 | 88 |
+-------+-------+-------+
6.查询student表中’95031’班或者性别为’女’的同学记录
mysql> SELECT * FROM students WHERE s_class = '95031' OR s_sex = '女';
+-------+--------+-------+---------------------+---------+
| s_num | s_name | s_sex | s_birthday | s_class |
+-------+--------+-------+---------------------+---------+
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 103 | 王丽 | 女 | 1976-01-23 00:00:00 | 95033 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 106 | 陆军 | 男 | 1974-06-03 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-06-03 00:00:00 | 95031 |
+-------+--------+-------+---------------------+---------+
6 rows in set (0.00 sec)
7.以class降序查询student表中所有的记录
mysql> SELECT * FROM students ORDER BY s_class desc;
+-------+--------+-------+---------------------+---------+
| s_num | s_name | s_sex | s_birthday | s_class |
+-------+--------+-------+---------------------+---------+
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 103 | 王丽 | 女 | 1976-01-23 00:00:00 | 95033 |
| 104 | 李军 | 男 | 1976-02-20 00:00:00 | 95033 |
| 107 | 王尼玛 | 男 | 1976-02-20 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 106 | 陆军 | 男 | 1974-06-03 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-06-03 00:00:00 | 95031 |
| 110 | 刘表 | 男 | NULL | NULL |
+-------+--------+-------+---------------------+---------+
8.以c_num升序.score降序插叙scores表中所有的数据
mysql> SELECT * FROM scores ORDER BY c_num ASC, score DESC;
+-------+-------+-------+
| s_num | c_num | score |
+-------+-------+-------+
| 103 | 3-105 | 92 |
| 105 | 3-105 | 88 |
| 109 | 3-105 | 76 |
| 103 | 3-245 | 86 |
| 105 | 3-245 | 75 |
| 109 | 3-245 | 68 |
| 103 | 6-166 | 85 |
| 109 | 6-166 | 81 |
| 105 | 6-166 | 79 |
+-------+-------+-------+
9.查询’95031’班的学生人数
mysql> SELECT COUNT(s_num) FROM students WHERE s_class = '95031';
+--------------+
| COUNT(s_num) |
+--------------+
| 5 |
+--------------+
10.查询score表中的最高分数的学生号和课程号.
mysql> SELECT c_num, s_num FROM scores WHERE score = (SELECT MAX(score) FROM scores);
+-------+-------+
| c_num | s_num |
+-------+-------+
| 3-105 | 103 |
+-------+-------+
11.查询每门课的平均成绩
mysql> select c_num, avg(score) from scores group by c_num;
+-------+-------------------+
| c_num | avg(score) |
+-------+-------------------+
| 3-105 | 85.33333333333333 |
| 3-245 | 76.33333333333333 |
| 6-166 | 81.66666666666667 |
+-------+-------------------+
12,查询score表中至少有2名学生选修的,并且以3开头的课程的平均分
mysql> select c_num, avg(score) from scores group by c_num having count(s_num)>=2
-> and c_num like "3%";
+-------+-------------------+
| c_num | avg(score) |
+-------+-------------------+
| 3-105 | 87.66666666666667 |
| 3-245 | 76.33333333333333 |
+-------+-------------------+
2 rows in set (0.00 sec)
13.查询分数大于70但是小于90的s_num列:
mysql> select s_num, c_num from scores where score > 70 and score < 90 ;
+-------+-------+
| s_num | c_num |
+-------+-------+
| 103 | 3-245 |
| 103 | 6-166 |
| 104 | 3-105 |
| 105 | 3-105 |
| 105 | 3-245 |
| 105 | 6-166 |
| 109 | 3-105 |
| 109 | 6-166 |
+-------+-------+
14.多表查询 s_name , scores .
mysql>select s_name,students.s_num, c_num, score from students, scores where students.s_num = scores.s_num;
+--------+-------+-------+-------+
| s_name | s_num | c_num | score |
+--------+-------+-------+-------+
| 王丽 | 103 | 3-105 | 92 |
| 王丽 | 103 | 3-245 | 86 |
| 王丽 | 103 | 6-166 | 85 |
| 王芳 | 105 | 3-105 | 88 |
| 王芳 | 105 | 3-245 | 75 |
| 王芳 | 105 | 6-166 | 79 |
| 赵铁柱 | 109 | 3-105 | 76 |
| 赵铁柱 | 109 | 3-245 | 68 |
| 赵铁柱 | 109 | 6-166 | 81 |
+--------+-------+-------+-------+
15.查询所有学生的s_num, c_name, score 数据来自三个表
mysql> select students.s_num, c_name ,score from students, courses, scores
-> where students.s_num = scores.s_num and scores.c_num = courses.c_num;
+-------+------------+-------+
| s_num | c_name | score |
+-------+------------+-------+
| 103 | 计算机导论 | 92 |
| 103 | 操作系统 | 86 |
| 103 | 数字电路 | 85 |
| 105 | 计算机导论 | 88 |
| 105 | 操作系统 | 75 |
| 105 | 数字电路 | 79 |
| 109 | 计算机导论 | 76 |
| 109 | 操作系统 | 68 |
| 109 | 数字电路 | 81 |
+-------+------------+-------+
16.查询所有的学生 s_name , c_name, sc_degree列 , 将上面的s_num 换成s_name
mysql> select students.s_name, c_name ,score from students, courses, scores
-> where students.s_num = scores.s_num and scores.c_num = courses.c_num;
+--------+------------+-------+
| s_name | c_name | score |
+--------+------------+-------+
| 王丽 | 计算机导论 | 92 |
| 王丽 | 操作系统 | 86 |
| 王丽 | 数字电路 | 85 |
| 王芳 | 计算机导论 | 88 |
| 王芳 | 操作系统 | 75 |
| 王芳 | 数字电路 | 79 |
| 赵铁柱 | 计算机导论 | 76 |
| 赵铁柱 | 操作系统 | 68 |
| 赵铁柱 | 数字电路 | 81 |
+--------+------------+-------+
- 查询班级是’95031’班学生每门课的平均分
mysql>select avg(score) from scores
->where s_num in (select s_num from students where s_class = '95031')
->group by c_num;
+-------+-------------------+
| c_no | AVG(sc.sc_degree) |
+-------+-------------------+
| 3-105 | 82.0000 |
| 3-245 | 71.5000 |
| 6-166 | 80.0000 |
+-------+-------------------+
18.查询选修"3-105"课程的成绩高于’109’号同 学’3-105’成绩 的所有同学的姓名 学号 成绩
mysql> select students.s_num ,students.s_name ,score from students ,scores
-> where c_num = '3-105' and score> (select score from scores where s_num = '109' and c_num ='3-105') and students.s_num = scores.s_num;
+-------+--------+-------+
| s_num | s_name | score |
+-------+--------+-------+
| 101 | 曾华 | 90 |
| 102 | 匡明 | 91 |
| 103 | 王丽 | 92 |
| 104 | 李军 | 89 |
| 105 | 王芳 | 88 |
+-------+--------+-------+
19.查询成绩 高于学号为’109’, 课程号为’3-105’的成绩的所有记录
mysql> SELECT * FROM scores WHERE score >(SELECT score FROM scores WHERE s_num = '109' AND c_num = '3-105');
+-------+-------+-------+
| s_num | c_num | score |
+-------+-------+-------+
| 103 | 3-105 | 92 |
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 105 | 3-105 | 88 |
| 105 | 6-166 | 79 |
| 109 | 6-166 | 81 |
+-------+-------+-------+
- 查询所有学号为108. 101 的同学同年出生的所有学生的s_num,s_name和s_birthday
mysql> SELECT * FROM students WHERE YEAR(s_birthday)
-> IN (SELECT YEAR(s_birthday) FROM students WHERE s_num IN('108','101'));
+-------+--------+-------+---------------------+---------+
| s_num | s_name | s_sex | s_birthday | s_class |
+-------+--------+-------+---------------------+---------+
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
+-------+--------+-------+---------------------+---------+
21.查询 张旭 教师任课的学生的成绩
mysql> select * from students where s_num IN (SELECT s_num FROM scores WHERE c_num = (SELECT c_num FROM courses WHERE t_num = (SELECT t_num FROM teachers WHERE t_name='张旭')));
+-------+--------+-------+---------------------+---------+
| s_num | s_name | s_sex | s_birthday | s_class |
+-------+--------+-------+---------------------+---------+
| 103 | 王丽 | 女 | 1976-01-23 00:00:00 | 95033 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-06-03 00:00:00 | 95031 |
+-------+--------+-------+---------------------+---------+
22.查询选修课程的同学人数多余 5 人的教师姓名
mysql> INSERT INTO scores VALUES('101','3-105','90'); --为了效果,添加几条数据
Query OK, 1 row affected (0.03 sec)
mysql> INSERT INTO scores VALUES('102','3-105','91');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO scores VALUES('104','3-105','89');
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM teachers WHERE t_num IN (SELECT t_num FROM courses WHERE c_num IN (SELECT c_num FROM scores GROUP BY c_num HAVING COUNT(s_num) > 5));
+-------+--------+-------+---------------------+---------+--------------+
| t_num | t_name | t_sex | t_birthday | t_title | t_department |
+-------+--------+-------+---------------------+---------+--------------+
| 825 | 王萍 | 女 | 1972-05-05 00:00:00 | 助教 | 计算机系 |
+-------+--------+-------+---------------------+---------+--------------
23.查询95033班和95031班全体学生的记录
mysql> SELECT * FROM students WHERE s_class IN('95031','95033') ORDER BY s_class ;
+-------+--------+-------+---------------------+---------+
| s_num | s_name | s_sex | s_birthday | s_class |
+-------+--------+-------+---------------------+---------+
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 106 | 陆军 | 男 | 1974-06-03 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-06-03 00:00:00 | 95031 |
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 103 | 王丽 | 女 | 1976-01-23 00:00:00 | 95033 |
| 104 | 李军 | 男 | 1976-02-20 00:00:00 | 95033 |
| 107 | 王尼玛 | 男 | 1976-02-20 00:00:00 | 95033 |
+-------+--------+-------+---------------------+---------+
24.查询存在85分以上成绩的课程c_num
mysql> SELECT * FROM scores where score > 85;
+-------+-------+-------+
| s_num | c_num | score |
+-------+-------+-------+
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 103 | 3-105 | 92 |
| 103 | 3-245 | 86 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
+-------+-------+-------+
25.查出所有’计算机系’ 教师所教课程的成绩表
mysql> SELECT * FROM scores WHERE c_num IN (SELECT c_num FROM courses WHERE t_num IN (SELECT t_num FROM teachers WHERE t_department = '计算机系'));
+-------+-------+-------+
| s_num | c_num | score |
+-------+-------+-------+
| 103 | 3-245 | 86 |
| 105 | 3-245 | 75 |
| 109 | 3-245 | 68 |
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 103 | 3-105 | 92 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
| 109 | 3-105 | 76 |
+-------+-------+-------+
26.查询’计算机系’与’电子工程系’ 不同职称的教师的name和title
mysql> SELECT * FROM teachers WHERE t_department = '计算机系' AND t_title NOT IN (SELECT t_title FROM teachers WHERE t_department = '电子工程系')
-> UNION
-> SELECT * FROM teachers WHERE t_department = '电子工程系' AND t_title NOT IN (SELECT t_title FROM teachers WHERE t_department = '计算机系');
+-------+--------+-------+---------------------+---------+--------------+
| t_num | t_name | t_sex | t_birthday | t_title | t_department |
+-------+--------+-------+---------------------+---------+--------------+
| 804 | 李诚 | 男 | 1958-12-02 00:00:00 | 副教授 | 计算机系 |
| 856 | 张旭 | 男 | 1969-03-12 00:00:00 | 讲师 | 电子工程系 |
+-------+--------+-------+---------------------+---------+--------------+
27, 查询选修编号为"3-105"课程且成绩至少高于选修编号为’3-245’同学的c_num,s_num和score,并且按照score从高到地次序排序
mysql> select * from scores where c_num = '3-105' AND score > ANY(SELECT score FROM scores WHERE c_num = '3-245' ) ORDER BY score desc ;
+-------+-------+-------+
| s_num | c_num | score |
+-------+-------+-------+
| 103 | 3-105 | 92 |
| 102 | 3-105 | 91 |
| 101 | 3-105 | 90 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
| 109 | 3-105 | 76 |
+-------+-------+-------+
28.查询选修编号为"3-105"且成绩高于选修编号为"3-245"课程的同学c_num .s_num 和score
mysql> SELECT * FROM scores WHERE score > ALL (select score from scores WHERE c_num = '3-245') AND c_num= '3-105';
+-------+-------+-------+
| s_num | c_num | score |
+-------+-------+-------+
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 103 | 3-105 | 92 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
+-------+-------+-------+
29查询所有教师和同学的 name ,sex, birthday
mysql> SELECT s_name AS name, s_sex AS sex, s_birthday AS birthday FROM students
-> UNION
-> SELECT t_name AS name, t_sex AS sex, t_birthday AS birthday FROM teachers;
+--------+-----+---------------------+
| name | sex | birthday |
+--------+-----+---------------------+
| 曾华 | 男 | 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 |
| 王尼玛 | 男 | 1976-02-20 00:00:00 |
| 张全蛋 | 男 | 1975-02-10 00:00:00 |
| 赵铁柱 | 男 | 1974-06-03 00:00:00 |
| 李诚 | 男 | 1958-12-02 00:00:00 |
| 王萍 | 女 | 1972-05-05 00:00:00 |
| 刘冰 | 女 | 1977-08-14 00:00:00 |
| 张旭 | 男 | 1969-03-12 00:00:00 |
+--------+-----+---------------------+
30.查询所有’女’教师和’女’学生的name,sex,birthday
mysql> SELECT s_name AS name, s_sex AS sex, s_birthday AS birthday FROM students WHERE s_sex = '女'
-> UNION
-> SELECT t_name AS name, t_sex AS sex, t_birthday AS birthday FROM teachers WHERE t_sex = '女';
+------+-----+---------------------+
| name | sex | birthday |
+------+-----+---------------------+
| 王丽 | 女 | 1976-01-23 00:00:00 |
| 王芳 | 女 | 1975-02-10 00:00:00 |
| 王萍 | 女 | 1972-05-05 00:00:00 |
| 刘冰 | 女 | 1977-08-14 00:00:00 |
+------+-----+---------------------+
31.查询成绩比该课程平均成绩低的同学的成绩表
mysql> select * from scores as a where score<
-> (select avg(score) from scores as b where b.c_num = a.c_num group by c_num) ;
+-------+-------+-------+
| s_num | c_num | score |
+-------+-------+-------+
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
| 109 | 6-166 | 81 |
+-------+-------+-------+
32.查询所有任课教师的t_name 和 t_depart(要在课程表中可以查得到)
mysql> SELECT * FROM teachers WHERE t_num IN(SELECT t_num FROM courses);
+-------+--------+-------+---------------------+---------+--------------+
| t_num | t_name | t_sex | t_birthday | t_title | t_department |
+-------+--------+-------+---------------------+---------+--------------+
| 804 | 李诚 | 男 | 1958-12-02 00:00:00 | 副教授 | 计算机系 |
| 825 | 王萍 | 女 | 1972-05-05 00:00:00 | 助教 | 计算机系 |
| 831 | 刘冰 | 女 | 1977-08-14 00:00:00 | 助教 | 电子工程系 |
| 856 | 张旭 | 男 | 1969-03-12 00:00:00 | 讲师 | 电子工程系 |
+-------+--------+-------+---------------------+---------+--------------+
33.查出至少有2名男生的班号
mysql> SELECT s_class FROM students WHERE s_sex = '男' GROUP BY s_class HAVING COUNT(s_num) > 1;
+---------+
| s_class |
+---------+
| 95033 |
| 95031 |
+---------+
34.查询student 表中 不姓"王"的同学的记录
mysql> SELECT * FROM students WHERE s_name NOT LIKE '王%';
+-------+--------+-------+---------------------+---------+
| s_num | s_name | s_sex | s_birthday | s_class |
+-------+--------+-------+---------------------+---------+
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 104 | 李军 | 男 | 1976-02-20 00:00:00 | 95033 |
| 106 | 陆军 | 男 | 1974-06-03 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-06-03 00:00:00 | 95031 |
+-------+--------+-------+---------------------+---------+
- 查询student 中每个学生的姓名和年龄(当前时间 - 出生年份)
mysql> SELECT s_name, YEAR(NOW()) - YEAR(s_birthday) AS age FROM students;
+--------+------+
| s_name | age |
+--------+------+
| 曾华 | 43 |
| 匡明 | 45 |
| 王丽 | 44 |
| 李军 | 44 |
| 王芳 | 45 |
| 陆军 | 46 |
| 王尼玛 | 44 |
| 张全蛋 | 45 |
| 赵铁柱 | 46 |
| 刘表 | NULL |
+--------+------+
- 查询student中最大和最小的 s_birthday的值
mysql> select max(s_birthday),min(s_birthday) from students;
+---------------------+---------------------+
| max(s_birthday) | min(s_birthday) |
+---------------------+---------------------+
| 1977-09-01 00:00:00 | 1974-06-03 00:00:00 |
+---------------------+---------------------+
37.以班级号和年龄从大到小的顺序查询student表中的全部记录
mysql> SELECt * FROM students ORDER BY s_class DESC, s_birthday;
+-------+--------+-------+---------------------+---------+
| s_num | s_name | s_sex | s_birthday | s_class |
+-------+--------+-------+---------------------+---------+
| 103 | 王丽 | 女 | 1976-01-23 00:00:00 | 95033 |
| 104 | 李军 | 男 | 1976-02-20 00:00:00 | 95033 |
| 107 | 王尼玛 | 男 | 1976-02-20 00:00:00 | 95033 |
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 106 | 陆军 | 男 | 1974-06-03 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-06-03 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 110 | 刘表 | 男 | NULL | NULL |
+-------+--------+-------+---------------------+---------+
38.查询"男"教师 及其所上的课
mysql> SELECT * FROM courses WHERE t_num IN (SELECT t_num FROM teachers WHERE t_sex = '男');
+-------+----------+-------+
| c_num | c_name | t_num |
+-------+----------+-------+
| 3-245 | 操作系统 | 804 |
| 6-166 | 数字电路 | 856 |
+-------+----------+-------+
39.查询最高分同学的s_num ,c_num 和 score
mysql> SELECT * FROM scores WHERE score in (select MAX(score) FROM scores);
+-------+-------+-------+
| s_num | c_num | score |
+-------+-------+-------+
| 103 | 3-105 | 92 |
+-------+-------+-------+
- 查询和"李军"同性别的所有同学的 s_name
mysql> SELECT s_name, s_sex FROM students WHERE s_sex = (SELECT s_sex FROM students WHERE s_name = '李军');
+--------+-------+
| s_name | s_sex |
+--------+-------+
| 曾华 | 男 |
| 匡明 | 男 |
| 李军 | 男 |
| 陆军 | 男 |
| 王尼玛 | 男 |
| 张全蛋 | 男 |
| 赵铁柱 | 男 |
| 刘表 | 男 |
+--------+-------+
41.查询和"李军"同性别并且同班的所有同学的s_name
mysql> SELECT s_name, s_sex FROM students WHERE s_sex = (SELECT s_sex FROM students WHERE s_name = '李军') AND s_class = (SELECT s_class FROM students WHERE s_name = '李军');
+--------+-------+
| s_name | s_sex |
+--------+-------+
| 曾华 | 男 |
| 李军 | 男 |
| 王尼玛 | 男 |
+--------+-------+
- 查询所有选修’计算机导论’课程的’男’同学的成绩表
mysql> select * from scores where
-> s_num in (select s_num from students where s_sex ='男')
-> and
-> c_num in (select c_num from courses where c_name = '计算机导论');
+-------+-------+-------+
| s_num | c_num | score |
+-------+-------+-------+
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 104 | 3-105 | 89 |
| 109 | 3-105 | 76 |
+-------+-------+-------+
个人觉得很不错的SQL课程 https://www.bilibili.com/video/BV1Vt411z7wy ↩︎