《MySQL——38道查询练习(无连接查询)》

目录

  • 一、准备数据
    • 1、创建数据库
    • 2、创建学生表
    • 3、创建教师表
    • 4、创建课程表
    • 5、创建成绩表
    • 6、添加数据
  • 二、查询练习
    • 1、查询 student 表的所有行
    • 2、查询 student 表中的 name、sex 和 class 字段的所有行
    • 3、查询 teacher 表中不重复的 department 列
    • 4、查询 score 表中成绩在60-80之间的所有行(区间查询和运算符查询)
    • 5、查询 score 表中成绩为 85, 86 或 88 的行
    • 6、查询 student 表中 '95031' 班或性别为 '女' 的所有行
    • 7、以 class 降序的方式查询 student 表的所有行
    • 8、以 c_no 升序、degree 降序查询 score 表的所有行
    • 9、查询 "95031" 班的学生人数
    • 10、查询 score 表中的最高分的学生学号和课程编号(子查询或排序查询)
    • 11、计算分组平均值
    • 12、分组条件与模糊查询
    • 13、多表查询-1
    • 14、多表查询-2
    • 15、三表关联查询
    • 16、子查询加分组求平均分
    • 17、子查询 - 1
    • 18、子查询 - 2
    • 19、YEAR 函数与带 IN 关键字查询
    • 20、多层嵌套子查询
    • 21、多表查询
    • 22、子查询 - 3
    • 23、UNION 和 NOTIN 的使用
    • 24、ANY 表示至少一个 - DESC ( 降序 )
    • 25、表示所有的 ALL
    • 26、复制表的数据作为条件查询
    • 27、子查询 - 4
    • 28、条件加组筛选
    • 29、NOTLIKE 模糊查询取反
    • 30、YEAR 与 NOW 函数
    • 31、MAX 与 MIN 函数
    • 32、多段排序
    • 33、子查询 - 5
    • 34、MAX 函数与子查询
    • 35、子查询 - 6
    • 36、子查询 - 7
    • 37、子查询 - 8
    • 38、按等级查询
  • 参考

一、准备数据

创建数据库-》创建学生表-》创建教师表-》创建课程表-》创建成绩表;

1、创建数据库

-- 创建数据库
CREATE DATABASE select_test;
-- 切换数据库
USE select_test;

2、创建学生表

由学号、姓名、性别、出生年月日、所在年级组成。学号为主键。

-- 创建学生表
CREATE TABLE student (no VARCHAR(20) PRIMARY KEY,name VARCHAR(20) NOT NULL,sex VARCHAR(10) NOT NULL,birthday DATE, -- 生日class VARCHAR(20) -- 所在班级
);

3、创建教师表

由教师编号、姓名、性别、出生年月日、职称、所在部门组成,教师编号为主键。

-- 创建教师表
CREATE TABLE teacher (no VARCHAR(20) PRIMARY KEY,name VARCHAR(20) NOT NULL,sex VARCHAR(10) NOT NULL,birthday DATE,profession VARCHAR(20) NOT NULL, -- 职称department VARCHAR(20) NOT NULL -- 部门
);

4、创建课程表

由课程号、课程名称、教师编号组成,课程号为主键,教师编号为外键。

-- 创建课程表
CREATE TABLE course (no VARCHAR(20) PRIMARY KEY,name VARCHAR(20) NOT NULL,t_no VARCHAR(20) NOT NULL, -- 教师编号-- 表示该 tno 来自于 teacher 表中的 no 字段值FOREIGN KEY(t_no) REFERENCES teacher(no) 
);

5、创建成绩表

由学生学号、课程号、成绩组成。
学生学号、课程号均为外键。两者联合为主键。
因为一个学生要修多门课程,每个课程都有一个成绩。如果只设学号or课程号为主键,都会存在无法区分问题。

-- 成绩表
CREATE TABLE score (s_no VARCHAR(20) NOT NULL, -- 学生编号c_no VARCHAR(20) NOT NULL, -- 课程号degree DECIMAL,	-- 成绩-- 表示该 s_no, c_no 分别来自于 student, course 表中的 no 字段值FOREIGN KEY(s_no) REFERENCES student(no),	FOREIGN KEY(c_no) REFERENCES course(no),-- 设置 s_no, c_no 为联合主键PRIMARY KEY(s_no, c_no)
);

6、添加数据

添加学生表数据、添加教师表数据、添加课程表数据、添加添加成绩表数据。

-- 添加学生表数据
INSERT INTO student VALUES('101', '曾华', '男', '1977-09-01', '95033');
INSERT INTO student VALUES('102', '匡明', '男', '1975-10-02', '95031');
INSERT INTO student VALUES('103', '王丽', '女', '1976-01-23', '95033');
INSERT INTO student VALUES('104', '李军', '男', '1976-02-20', '95033');
INSERT INTO student VALUES('105', '王芳', '女', '1975-02-10', '95031');
INSERT INTO student VALUES('106', '陆军', '男', '1974-06-03', '95031');
INSERT INTO student VALUES('107', '王尼玛', '男', '1976-02-20', '95033');
INSERT INTO student VALUES('108', '张全蛋', '男', '1975-02-10', '95031');
INSERT INTO student VALUES('109', '赵铁柱', '男', '1974-06-03', '95031');-- 添加教师表数据
INSERT INTO teacher VALUES('804', '李诚', '男', '1958-12-02', '副教授', '计算机系');
INSERT INTO teacher VALUES('856', '张旭', '男', '1969-03-12', '讲师', '电子工程系');
INSERT INTO teacher VALUES('825', '王萍', '女', '1972-05-05', '助教', '计算机系');
INSERT INTO teacher VALUES('831', '刘冰', '女', '1977-08-14', '助教', '电子工程系');-- 添加课程表数据
INSERT INTO course VALUES('3-105', '计算机导论', '825');
INSERT INTO course VALUES('3-245', '操作系统', '804');
INSERT INTO course VALUES('6-166', '数字电路', '856');
INSERT INTO course VALUES('9-888', '高等数学', '831');-- 添加添加成绩表数据
INSERT INTO score VALUES('103', '3-105', '92');
INSERT INTO score VALUES('103', '3-245', '86');
INSERT INTO score VALUES('103', '6-166', '85');
INSERT INTO score VALUES('105', '3-105', '88');
INSERT INTO score VALUES('105', '3-245', '75');
INSERT INTO score VALUES('105', '6-166', '79');
INSERT INTO score VALUES('109', '3-105', '76');
INSERT INTO score VALUES('109', '3-245', '68');
INSERT INTO score VALUES('109', '6-166', '81');

二、查询练习

1、查询 student 表的所有行

SELECT * FROM student;

在这里插入图片描述

2、查询 student 表中的 name、sex 和 class 字段的所有行

SELECT name, sex, class FROM student;

在这里插入图片描述

3、查询 teacher 表中不重复的 department 列

如果单纯使用:

SELECT department FROM teacher;

会发现有重复
在这里插入图片描述

-- 查询 teacher 表中不重复的 department 列
-- department: 去重查询
SELECT DISTINCT department FROM teacher;

在这里插入图片描述

4、查询 score 表中成绩在60-80之间的所有行(区间查询和运算符查询)

-- 查询 score 表中成绩在60-80之间的所有行(区间查询和运算符查询)
-- BETWEEN xx AND xx: 查询区间, AND 表示 "并且"
SELECT * FROM score WHERE degree BETWEEN 60 AND 80;
SELECT * FROM score WHERE degree > 60 AND degree < 80;

在这里插入图片描述

5、查询 score 表中成绩为 85, 86 或 88 的行

-- 查询 score 表中成绩为 85, 86 或 88 的行
-- IN: 查询规定中的多个值
SELECT * FROM score WHERE degree IN (85, 86, 88);

在这里插入图片描述

6、查询 student 表中 ‘95031’ 班或性别为 ‘女’ 的所有行

-- 查询 student 表中 '95031' 班或性别为 '女' 的所有行
-- or: 表示或者关系
SELECT * FROM student WHERE class = '95031' or sex = '女';

在这里插入图片描述

7、以 class 降序的方式查询 student 表的所有行

-- 以 class 降序的方式查询 student 表的所有行
-- DESC: 降序,从高到低
-- ASC(默认): 升序,从低到高
SELECT * FROM student ORDER BY class DESC;
SELECT * FROM student ORDER BY class ASC;

在这里插入图片描述

8、以 c_no 升序、degree 降序查询 score 表的所有行

-- 以 c_no 升序、degree 降序查询 score 表的所有行
SELECT * FROM score ORDER BY c_no ASC, degree DESC;

在这里插入图片描述

9、查询 “95031” 班的学生人数

-- 查询 "95031" 班的学生人数
-- COUNT: 统计
SELECT COUNT(*) FROM student WHERE class = '95031';

在这里插入图片描述

10、查询 score 表中的最高分的学生学号和课程编号(子查询或排序查询)

首先找到最高分在哪儿,然后把他选择出来

-- (SELECT MAX(degree) FROM score): 子查询,算出最高分
SELECT s_no, c_no FROM score WHERE degree = (SELECT MAX(degree) FROM score);

降序排序,然后选择第一条数据

--  排序查询
-- LIMIT r, n: 表示从第r行开始,查询n条数据
SELECT s_no, c_no, degree FROM score ORDER BY degree DESC LIMIT 0, 1;

11、计算分组平均值

查询每门课的平均成绩

-- AVG: 平均值
SELECT AVG(degree) FROM score WHERE c_no = '3-105';
SELECT AVG(degree) FROM score WHERE c_no = '3-245';
SELECT AVG(degree) FROM score WHERE c_no = '6-166';-- GROUP BY: 分组查询		这样就不需要一行一行地打了
SELECT c_no, AVG(degree) FROM score GROUP BY c_no;

12、分组条件与模糊查询

查询 score 表中至少有 2 名学生选修,并以 3 开头的课程的平均分数。
首先查询score表。

SELECT * FROM score;
-- c_no 课程编号
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 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 |
+------+-------+--------+

分析表发现,至少有 2 名学生选修的课程是 3-105 、3-245 、6-166 ,以 3 开头的课程是 3-105 、3-245 。也就是说,我们要查询所有 3-105 和 3-245 的 degree 平均分。

首先把 c_no, AVG(degree) 通过分组查询出来

-- 首先把 c_no, AVG(degree) 通过分组查询出来
SELECT c_no, AVG(degree) FROM score GROUP BY c_no
+-------+-------------+
| c_no  | AVG(degree) |
+-------+-------------+
| 3-105 |     85.3333 |
| 3-245 |     76.3333 |
| 6-166 |     81.6667 |
+-------+-------------+

再查询出至少有 2 名学生选修的课程

-- 再查询出至少有 2 名学生选修的课程
-- HAVING: 表示持有
HAVING COUNT(c_no) >= 2

并且是以 3 开头的课程

-- 并且是以 3 开头的课程
-- LIKE 表示模糊查询,"%" 是一个通配符,匹配 "3" 后面的任意字符。
AND c_no LIKE '3%';

把前面的SQL语句拼接起来,后面加上一个 COUNT(*),表示将每个分组的个数也查询出来

-- 把前面的SQL语句拼接起来,
-- 后面加上一个 COUNT(*),表示将每个分组的个数也查询出来。
SELECT c_no, AVG(degree), COUNT(*) FROM score GROUP BY c_no
HAVING COUNT(c_no) >= 2 AND c_no LIKE '3%';
+-------+-------------+----------+
| c_no  | AVG(degree) | COUNT(*) |
+-------+-------------+----------+
| 3-105 |     85.3333 |        3 |
| 3-245 |     76.3333 |        3 |
+-------+-------------+----------+

13、多表查询-1

查询所有学生的 name,以及该学生在 score 表中对应的 c_no 和 degree 。

从student表中选出学号和姓名;
从score表中选出学号、班级号、和分数。

SELECT no, name FROM student;
+-----+-----------+
| no  | name      |
+-----+-----------+
| 101 | 曾华      |
| 102 | 匡明      |
| 103 | 王丽      |
| 104 | 李军      |
| 105 | 王芳      |
| 106 | 陆军      |
| 107 | 王尼玛    |
| 108 | 张全蛋    |
| 109 | 赵铁柱    |
+-----+-----------+SELECT s_no, c_no, degree FROM score;
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 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 |
+------+-------+--------+

通过分析可以发现,只要把 score 表中的 s_no 字段值替换成 student 表中对应的 name 字段值就可以了。

-- FROM...: 表示从 student, score 表中查询
-- WHERE 的条件表示为,只有在 student.no 和 score.s_no 相等时才显示出来。
SELECT name, c_no, degree FROM student, score 
WHERE student.no = score.s_no;
+-----------+-------+--------+
| name      | c_no  | degree |
+-----------+-------+--------+
| 王丽      | 3-105 |     92 |
| 王丽      | 3-245 |     86 |
| 王丽      | 6-166 |     85 |
| 王芳      | 3-105 |     88 |
| 王芳      | 3-245 |     75 |
| 王芳      | 6-166 |     79 |
| 赵铁柱    | 3-105 |     76 |
| 赵铁柱    | 3-245 |     68 |
| 赵铁柱    | 6-166 |     81 |
+-----------+-------+--------+

14、多表查询-2

查询所有学生的 no课程名称 ( course 表中的 name ) 和成绩 ( score 表中的 degree ) 列。
只有 score 关联学生的 no ,因此只要查询 score 表,就能找出所有和学生相关的 nodegree

SELECT s_no, c_no, degree FROM score;
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 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 |
+------+-------+--------+

然后观察 course 表:

+-------+-----------------+
| no    | name            |
+-------+-----------------+
| 3-105 | 计算机导论      |
| 3-245 | 操作系统        |
| 6-166 | 数字电路        |
| 9-888 | 高等数学        |
+-------+-----------------+

只要把 score 表中的 c_no 替换成 course 表中对应的 name 字段值就可以了。

-- 增加一个查询字段 name,分别从 score、course 这两个表中查询。
-- as 表示取一个该字段的别名。
SELECT s_no, name as c_name, degree FROM score, course
WHERE score.c_no = course.no;
+------+-----------------+--------+
| s_no | c_name          | degree |
+------+-----------------+--------+
| 103  | 计算机导论      |     92 |
| 105  | 计算机导论      |     88 |
| 109  | 计算机导论      |     76 |
| 103  | 操作系统        |     86 |
| 105  | 操作系统        |     75 |
| 109  | 操作系统        |     68 |
| 103  | 数字电路        |     85 |
| 105  | 数字电路        |     79 |
| 109  | 数字电路        |     81 |
+------+-----------------+--------+

15、三表关联查询

查询所有学生的 name 、课程名 ( course 表中的 name ) 和 degree 。
sname来自student
cname来自course
degree来自score
只有 score 表中关联学生的学号和课堂号,我们只要围绕着 score 这张表查询就好了。

-- 由于字段名存在重复,使用 "表名.字段名 as 别名" 代替。
SELECT student.name as s_name, course.name as c_name, degree 
FROM student, score, course
WHERE student.NO = score.s_no
AND score.c_no = course.no;

在这里插入图片描述

16、子查询加分组求平均分

查询 95031 班学生每门课程的平均成绩。
分为三个步骤:
1、找到95031班的学生

SELECT no FROM student WHERE class = '95031'

2、以上面的学生号为查找对象,在分数表中将学生号、课程号、分数打印出来
score 表中根据 student 表的学生编号筛选出学生的课堂号和成绩:

-- IN (..): 将筛选出的学生号当做 s_no 的条件查询
SELECT s_no, c_no, degree FROM score
WHERE s_no IN (SELECT no FROM student WHERE class = '95031');
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 105  | 3-105 |     88 |
| 105  | 3-245 |     75 |
| 105  | 6-166 |     79 |
| 109  | 3-105 |     76 |
| 109  | 3-245 |     68 |
| 109  | 6-166 |     81 |
+------+-------+--------+

3、以课程号分组,算平均成绩

SELECT c_no, AVG(degree) FROM score
WHERE s_no IN (SELECT no FROM student WHERE class = '95031')
GROUP BY c_no;
+-------+-------------+
| c_no  | AVG(degree) |
+-------+-------------+
| 3-105 |     82.0000 |
| 3-245 |     71.5000 |
| 6-166 |     80.0000 |
+-------+-------------+

17、子查询 - 1

查询在 3-105 课程中,所有成绩高于 109 号同学的记录。
where的条件有两个:1、课程号为3-105 2、在本门课程中分数高于109号同学的分数

SELECT * FROM score 
WHERE c_no = '3-105'
AND degree > (SELECT degree FROM score WHERE s_no = '109' AND c_no = '3-105');

18、子查询 - 2

查询所有成绩高于 109 号同学的 3-105 课程成绩记录。
不限制课程号,只要成绩大于109号同学的3-105课程成绩就可以

SELECT * FROM score
WHERE degree > (SELECT degree FROM score WHERE s_no = '109' AND c_no = '3-105');

19、YEAR 函数与带 IN 关键字查询

查询所有和 101 、108 号学生同年出生的 no 、name 、birthday 列。

-- YEAR(..): 取出日期中的年份
SELECT no, name, birthday FROM student
WHERE YEAR(birthday) IN (SELECT YEAR(birthday) FROM student WHERE no IN (101, 108));

在这里插入图片描述

20、多层嵌套子查询

查询 ‘张旭’ 教师任课的学生成绩表。
1、首先找到教师编号:

SELECT NO FROM teacher WHERE NAME = '张旭'

2、通过 course 表找到该教师课程号

SELECT NO FROM course WHERE t_no = ( SELECT NO FROM teacher WHERE NAME = '张旭' );

3、通过筛选出的课程号查询成绩表:

SELECT * FROM score WHERE c_no = (SELECT no FROM course WHERE t_no = ( SELECT no FROM teacher WHERE NAME = '张旭' )
);

反复套娃。。。

21、多表查询

查询某选修课程多于5个同学的教师姓名。
1、首先在 teacher 表中,根据 no 字段来判断该教师的同一门课程是否有至少5名学员选修:

-- 查询 teacher 表
SELECT no, name FROM teacher;
+-----+--------+
| no  | name   |
+-----+--------+
| 804 | 李诚   |
| 825 | 王萍   |
| 831 | 刘冰   |
| 856 | 张旭   |
+-----+--------+
SELECT name FROM teacher WHERE no IN (-- 在这里找到对应的条件
);

2、查看和教师编号有有关的表的信息:

SELECT * FROM course;
-- t_no: 教师编号
+-------+-----------------+------+
| no    | name            | t_no |
+-------+-----------------+------+
| 3-105 | 计算机导论      | 825  |
| 3-245 | 操作系统        | 804  |
| 6-166 | 数字电路        | 856  |
| 9-888 | 高等数学        | 831  |
+-------+-----------------+------+

3、在 score 表中将 c_no 作为分组,并且限制 c_no 持有至少 5 条数据

-- 在此之前向 score 插入一些数据,以便丰富查询条件。
INSERT INTO score VALUES ('101', '3-105', '90');
INSERT INTO score VALUES ('102', '3-105', '91');
INSERT INTO score VALUES ('104', '3-105', '89');
-- 查询 score 表
SELECT * FROM score;
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 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 |
+------+-------+--------+SELECT c_no FROM score GROUP BY c_no HAVING COUNT(*) > 5;
+-------+
| c_no  |
+-------+
| 3-105 |
+-------+

4、根据筛选出来的课程号,找出在某课程中,拥有至少5名学员的教师编号:

SELECT t_no FROM course WHERE no IN (SELECT c_no FROM score GROUP BY c_no HAVING COUNT(*) > 5
);
+------+
| t_no |
+------+
| 825  |
+------+

5、在 teacher 表中,根据筛选出来的教师编号找到教师姓名:

SELECT name FROM teacher WHERE no IN (-- 最终条件SELECT t_no FROM course WHERE no IN (SELECT c_no FROM score GROUP BY c_no HAVING COUNT(*) > 5)
);

22、子查询 - 3

查询 “计算机系” 课程的成绩表。
1、先找出 course 表中所有 计算机系 课程的编号

-- 通过 teacher 表查询所有 `计算机系` 的教师编号
SELECT no, name, department FROM teacher WHERE department = '计算机系'
+-----+--------+--------------+
| no  | name   | department   |
+-----+--------+--------------+
| 804 | 李诚   | 计算机系     |
| 825 | 王萍   | 计算机系     |
+-----+--------+--------------+-- 通过 course 表查询该教师的课程编号
SELECT no FROM course WHERE t_no IN (SELECT no FROM teacher WHERE department = '计算机系'
);
+-------+
| no    |
+-------+
| 3-245 |
| 3-105 |
+-------+

2、根据这个编号查询 score

-- 根据筛选出来的课程号查询成绩表
SELECT * FROM score WHERE c_no IN (SELECT no FROM course WHERE t_no IN (SELECT no FROM teacher WHERE department = '计算机系')
);
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 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 |
+------+-------+--------+

23、UNION 和 NOTIN 的使用

查询 计算机系电子工程系 中的不同职称的教师。
首先观察所有教师,发现题目中要求我们找到的是804 and 856.

在这里插入图片描述
1、首先找计算机系里面的讲师,这个讲师的职称不在电子工程系里面。

-- NOT: 代表逻辑非
SELECT * FROM teacher WHERE department = '计算机系' AND profession NOT IN (SELECT profession FROM teacher WHERE department = '电子工程系'
)

在这里插入图片描述
2、另外一个反过来

SELECT * FROM teacher WHERE department = '电子工程系' AND profession NOT IN (SELECT profession FROM teacher WHERE department = '计算机系'
);

在这里插入图片描述
3、使用union把两个集合拼接起来(注意第一句话不要有分号)

SELECT * FROM teacher WHERE department = '计算机系' AND profession NOT IN (SELECT profession FROM teacher WHERE department = '电子工程系'
)
-- 合并两个集
UNION
SELECT * FROM teacher WHERE department = '电子工程系' AND profession NOT IN (SELECT profession FROM teacher WHERE department = '计算机系'
);

在这里插入图片描述

24、ANY 表示至少一个 - DESC ( 降序 )

查询课程 3-105 且成绩 至少 高于 3-245 的 score 表,并且按照degree从高到低排序
1、首先把课程为3-1053-245 的成绩表选出来看看

SELECT * FROM score WHERE c_no = '3-105';
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 101  | 3-105 |     90 |
| 102  | 3-105 |     91 |
| 103  | 3-105 |     92 |
| 104  | 3-105 |     89 |
| 105  | 3-105 |     88 |
| 109  | 3-105 |     76 |
+------+-------+--------+SELECT * FROM score WHERE c_no = '3-245';
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 103  | 3-245 |     86 |
| 105  | 3-245 |     75 |
| 109  | 3-245 |     68 |
+------+-------+--------+

2、在 3-105 成绩中,只要有一个大于从 3-245 筛选出来的任意行就符合条件。最后根据降序查询结果。
这里其实意思就是大于3-245成绩最小值即可

SELECT * FROM score WHERE c_no = '3-105' AND degree > ANY(SELECT degree FROM score WHERE c_no = '3-245'
) ORDER BY degree DESC;
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 103  | 3-105 |     92 |
| 102  | 3-105 |     91 |
| 101  | 3-105 |     90 |
| 104  | 3-105 |     89 |
| 105  | 3-105 |     88 |
| 109  | 3-105 |     76 |
+------+-------+--------+

25、表示所有的 ALL

查询课程 3-105 且成绩高于 3-245 的 score 表。
也就是说,在 3-105 每一行成绩中,都要大于从 3-245 筛选出来全部行才算符合条件。

SELECT * FROM score WHERE c_no = '3-105' AND degree > ALL(SELECT degree FROM score WHERE c_no = '3-245'
);
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 101  | 3-105 |     90 |
| 102  | 3-105 |     91 |
| 103  | 3-105 |     92 |
| 104  | 3-105 |     89 |
| 105  | 3-105 |     88 |
+------+-------+--------+

26、复制表的数据作为条件查询

查询某课程成绩比该课程平均成绩低的 score 表。
1、首先查询每个课程的平均分

-- 查询平均分
SELECT c_no, AVG(degree) FROM score GROUP BY c_no;
+-------+-------------+
| c_no  | AVG(degree) |
+-------+-------------+
| 3-105 |     87.6667 |
| 3-245 |     76.3333 |
| 6-166 |     81.6667 |
+-------+-------------+

2、查询 score 表

SELECT degree FROM score;
+--------+
| degree |
+--------+
|     90 |
|     91 |
|     92 |
|     86 |
|     85 |
|     89 |
|     88 |
|     75 |
|     79 |
|     76 |
|     68 |
|     81 |
+--------+

3、将表 b 作用于表 a 中查询数据。ab两表均为score的别名

SELECT * FROM score a WHERE degree < ((SELECT AVG(degree) FROM score b WHERE a.c_no = b.c_no)
);
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 105  | 3-245 |     75 |
| 105  | 6-166 |     79 |
| 109  | 3-105 |     76 |
| 109  | 3-245 |     68 |
| 109  | 6-166 |     81 |
+------+-------+--------+

27、子查询 - 4

查询所有任课 ( 在 course 表里有课程 ) 教师的 namedepartment

SELECT name, department FROM teacher WHERE no IN (SELECT t_no FROM course);
+--------+-----------------+
| name   | department      |
+--------+-----------------+
| 李诚   | 计算机系        |
| 王萍   | 计算机系        |
| 刘冰   | 电子工程系      |
| 张旭   | 电子工程系      |
+--------+-----------------+

28、条件加组筛选

查询 student 表中至少有 2 名男生的 class

-- 查看学生表信息
SELECT * FROM student;
+-----+-----------+-----+------------+-------+
| no  | name      | sex | birthday   | class |
+-----+-----------+-----+------------+-------+
| 101 | 曾华      || 1977-09-01 | 95033 |
| 102 | 匡明      || 1975-10-02 | 95031 |
| 103 | 王丽      || 1976-01-23 | 95033 |
| 104 | 李军      || 1976-02-20 | 95033 |
| 105 | 王芳      || 1975-02-10 | 95031 |
| 106 | 陆军      || 1974-06-03 | 95031 |
| 107 | 王尼玛    || 1976-02-20 | 95033 |
| 108 | 张全蛋    || 1975-02-10 | 95031 |
| 109 | 赵铁柱    || 1974-06-03 | 95031 |
| 110 | 张飞      || 1974-06-03 | 95038 |
+-----+-----------+-----+------------+-------+-- 只查询性别为男,然后按 class 分组,并限制 class 行大于 1。
SELECT class FROM student WHERE sex = '男' GROUP BY class HAVING COUNT(*) > 1;
+-------+
| class |
+-------+
| 95033 |
| 95031 |
+-------+

29、NOTLIKE 模糊查询取反

查询 student 表中不姓 “王” 的同学记录。

-- NOT: 取反
-- LIKE: 模糊查询
SELECT * FROM student WHERE name NOT LIKE '王%';
+-----+-----------+-----+------------+-------+
| no  | name      | sex | birthday   | class |
+-----+-----------+-----+------------+-------+
| 101 | 曾华      || 1977-09-01 | 95033 |
| 102 | 匡明      || 1975-10-02 | 95031 |
| 104 | 李军      || 1976-02-20 | 95033 |
| 106 | 陆军      || 1974-06-03 | 95031 |
| 108 | 张全蛋    || 1975-02-10 | 95031 |
| 109 | 赵铁柱    || 1974-06-03 | 95031 |
| 110 | 张飞      || 1974-06-03 | 95038 |
+-----+-----------+-----+------------+-------+

30、YEAR 与 NOW 函数

查询 student 表中每个学生的姓名和年龄。
使用函数 YEAR(NOW()) 计算出当前年份,减去出生年份后得出年龄。

SELECT name, YEAR(NOW()) - YEAR(birthday) as age FROM student;
+-----------+------+
| name      | age  |
+-----------+------+
| 曾华      |   42 |
| 匡明      |   44 |
| 王丽      |   43 |
| 李军      |   43 |
| 王芳      |   44 |
| 陆军      |   45 |
| 王尼玛    |   43 |
| 张全蛋    |   44 |
| 赵铁柱    |   45 |
| 张飞      |   45 |
+-----------+------+

31、MAX 与 MIN 函数

查询 student 表中最大和最小的 birthday 值。

SELECT MAX(birthday), MIN(birthday) FROM student;
+---------------+---------------+
| MAX(birthday) | MIN(birthday) |
+---------------+---------------+
| 1977-09-01    | 1974-06-03    |
+---------------+---------------+

32、多段排序

classbirthday 从大到小的顺序查询 student 表。

SELECT * FROM student ORDER BY class DESC, birthday;
+-----+-----------+-----+------------+-------+
| no  | name      | sex | birthday   | class |
+-----+-----------+-----+------------+-------+
| 110 | 张飞      || 1974-06-03 | 95038 |
| 103 | 王丽      || 1976-01-23 | 95033 |
| 104 | 李军      || 1976-02-20 | 95033 |
| 107 | 王尼玛    || 1976-02-20 | 95033 |
| 101 | 曾华      || 1977-09-01 | 95033 |
| 106 | 陆军      || 1974-06-03 | 95031 |
| 109 | 赵铁柱    || 1974-06-03 | 95031 |
| 105 | 王芳      || 1975-02-10 | 95031 |
| 108 | 张全蛋    || 1975-02-10 | 95031 |
| 102 | 匡明      || 1975-10-02 | 95031 |
+-----+-----------+-----+------------+-------+

33、子查询 - 5

查询 “男” 教师及其所上的课程。
先从教师表中找教师再把查询结果作为课程表的查询依据

SELECT * FROM course WHERE t_no in (SELECT no FROM teacher WHERE sex = '男');
+-------+--------------+------+
| no    | name         | t_no |
+-------+--------------+------+
| 3-245 | 操作系统     | 804  |
| 6-166 | 数字电路     | 856  |
+-------+--------------+------+

34、MAX 函数与子查询

查询最高分同学的 score 表。

-- 找出最高成绩(该查询只能有一个结果)
SELECT MAX(degree) FROM score;
-- 根据上面的条件筛选出所有最高成绩表,
-- 该查询可能有多个结果,假设 degree 值多次符合条件。
SELECT * FROM score WHERE degree = (SELECT MAX(degree) FROM score);
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 103  | 3-105 |     92 |
+------+-------+--------+

35、子查询 - 6

查询和 “李军” 同性别的所有同学 name

-- 首先将李军的性别作为条件取出来
SELECT sex FROM student WHERE name = '李军';
+-----+
| sex |
+-----+
||
+-----+
-- 根据性别查询 name 和 sex
SELECT name, sex FROM student WHERE sex = (SELECT sex FROM student WHERE name = '李军'
);
+-----------+-----+
| name      | sex |
+-----------+-----+
| 曾华      ||
| 匡明      ||
| 李军      ||
| 陆军      ||
| 王尼玛    ||
| 张全蛋    ||
| 赵铁柱    ||
| 张飞      ||
+-----------+-----+

36、子查询 - 7

查询和 "李军" 同性别同班的同学 name

SELECT name, sex, class FROM student WHERE sex = (SELECT sex FROM student WHERE name = '李军'
) AND class = (SELECT class FROM student WHERE name = '李军'
);
+-----------+-----+-------+
| name      | sex | class |
+-----------+-----+-------+
| 曾华      || 95033 |
| 李军      || 95033 |
| 王尼玛    || 95033 |
+-----------+-----+-------+

37、子查询 - 8

查询所有选修 “计算机导论” 课程的 “男” 同学成绩表。
需要的 “计算机导论” 和性别为 “男” 的编号可以在 course 和 student 表中找到。

SELECT * FROM score WHERE c_no = (SELECT no FROM course WHERE name = '计算机导论'
) AND s_no IN (SELECT no FROM student WHERE sex = '男'
);
+------+-------+--------+
| s_no | c_no  | degree |
+------+-------+--------+
| 101  | 3-105 |     90 |
| 102  | 3-105 |     91 |
| 104  | 3-105 |     89 |
| 109  | 3-105 |     76 |
+------+-------+--------+

38、按等级查询

建立一个 grade 表代表学生的成绩等级,并插入数据:

CREATE TABLE grade (low INT(3),upp INT(3),grade char(1)
);INSERT INTO grade VALUES (90, 100, 'A');
INSERT INTO grade VALUES (80, 89, 'B');
INSERT INTO grade VALUES (70, 79, 'C');
INSERT INTO grade VALUES (60, 69, 'D');
INSERT INTO grade VALUES (0, 59, 'E');SELECT * FROM grade;
+------+------+-------+
| low  | upp  | grade |
+------+------+-------+
|   90 |  100 | A     |
|   80 |   89 | B     |
|   70 |   79 | C     |
|   60 |   69 | D     |
|    0 |   59 | E     |
+------+------+-------+

2、查询所有学生的 s_no 、c_no 和 grade 列。
思路是,使用区间 ( BETWEEN ) 查询,判断学生的成绩 ( degree ) 在 grade 表的 low 和 upp 之间。

SELECT s_no, c_no, grade FROM score, grade 
WHERE degree BETWEEN low AND upp;
+------+-------+-------+
| s_no | c_no  | grade |
+------+-------+-------+
| 101  | 3-105 | A     |
| 102  | 3-105 | A     |
| 103  | 3-105 | A     |
| 103  | 3-245 | B     |
| 103  | 6-166 | B     |
| 104  | 3-105 | B     |
| 105  | 3-105 | B     |
| 105  | 3-245 | C     |
| 105  | 6-166 | C     |
| 109  | 3-105 | C     |
| 109  | 3-245 | D     |
| 109  | 6-166 | B     |
+------+-------+-------+

参考

一天学会MySQL
某Github

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作经常使用的SQL整理,实战篇(一)

工作经常使用的SQL整理&#xff0c;实战篇&#xff08;一&#xff09; 原文:工作经常使用的SQL整理&#xff0c;实战篇&#xff08;一&#xff09;工作经常使用的SQL整理&#xff0c;实战篇&#xff0c;地址一览&#xff1a; 工作经常使用的SQL整理&#xff0c;实战篇&#xff…

XPth和XSLT的一些简单用法

&#xff08;目的在于让大家知道有这个东西的存在&#xff09; XPath:即XML Path语言(Xpath)表达式使用路径表示法(像在URL中使用一样)来为XML文档的各部分寻址&#xff01; 关于XPath如何使用了&#xff0c;我们来看看&#xff01;当然这里面的代码只是入门&#xff0c;更深层…

isc dhcp_ISC的完整形式是什么?

isc dhcpISC&#xff1a;印度学校证书 (ISC: Indian School Certificate) ISC is an abbreviation of the Indian School Certificate. It alludes to the 12th class examination or higher secondary examination conducted by the Council for the Indian School Certificat…

《MySQL——连接查询》

内连接&#xff1a; inner join 或者 join 外连接 1、左连接 left join 或 left outer join 2、右连接 right join 或 right outer join 3、完全外连接 full join 或 full outer join 图示理解 全连接 创建person表和card表 CREATE DATABASE testJoin;CREATE TABLE person (…

win7下 apache2.2 +php5.4 环境搭建

这篇文章很好 没法复制 把链接粘贴来http://www.360doc.com/content/13/0506/13/11495619_283349585.shtml# 现在能复制了&#xff1a; 把任何一篇你要复制、却不让复制的文章收藏入收藏夹(直接CtrlD,确定) 2在收藏夹中&#xff0c;右击刚才收藏的那个网址&#xff0c;点属性 3…

HDU_1533 Going Home(最优匹配) 解题报告

转载请注明出自cxb:http://blog.csdn.net/cxb569262726 题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1533 说实话&#xff0c;这个题目刚开始还真看不出是完备匹配下的最大权匹配&#xff08;当然&#xff0c;这个也可以用网络流做。&#xff08;应该是添加…

c#中 uint_C#中的uint关键字

c#中 uintC&#xff03;uint关键字 (C# uint keyword) In C#, uint is a keyword which is used to declare a variable that can store an integral type of value (unsigned integer) the range of 0 to 4,294,967,295. uint keyword is an alias of System.UInt32. 在C&…

《MySQL——事务》

目录事务的必要性MySQL中如何控制事务手动开启事务事务的四大特征事务的四大特征事务开启方式事务手动提交与手动回滚事务的隔离性脏读现象不可重复读现象幻读现象串行化一些补充使用长事务的弊病commit work and chain的语法是做什么用的?怎么查询各个表中的长事务&#xff1…

运行在TQ2440开发板上以及X86平台上的linux内核编译

一、运行在TQ2440开发板上的linux内核编译 1、获取源码并解压 直接使用天嵌移植好的“linux-2.6.30.4_20100531.tar.bz2”源码包。 解压&#xff08;天嵌默认解压到/opt/EmbedSky/linux-2.6.30.4/中&#xff09; tar xvjf linux-2.6.30.4_20100531.tar.bz2 -C / 2、获取默认配置…

ArcCatalog ArcMap打不开

原来是因为&#xff1a; 连接了电信的无线网卡 关掉即可 启动ArcCatalog之后再开启无线网卡 没问题&#xff01;转载于:https://www.cnblogs.com/ccjcjc/archive/2012/08/21/2649867.html

Python熊猫– GroupBy

Python熊猫– GroupBy (Python Pandas – GroupBy) GroupBy method can be used to work on group rows of data together and call aggregate functions. It allows to group together rows based off of a column and perform an aggregate function on them. GroupBy方法可用…

MySQL索引底层原理理解以及常见问题总结

目录二叉查找树为索引红黑树为索引B树作为索引B树作为索引MyISAM存储引擎索引实现InnoDB存储引擎索引实现常见问题聚集索引与非聚集索引InnoDB基于主键索引和普通索引的查询有什么区别&#xff1f;InnoDB主键索引为何是整型的自增主键何时使用业务字段作为主键呢&#xff1f;哈…

Spring之HibernateTemplate 和HibernateDaoSupport

spring提供访问数据库的有三种方式&#xff1a; HibernateDaoSupport HibernateTemplate&#xff08;推荐使用&#xff09; jdbcTemplate(我们一般不用&#xff09; 类所在包&#xff1a; HibernateTemplate&#xff1a;org.springframework.orm.hibernate3.HibernateTemplate …

JDOJ-重建二叉树

这是一道面试题&#xff0c;可以说是数据结构中的基础题了&#xff0c;由先序遍历以及中序遍历生成一棵树&#xff0c;然后输出后序遍历。 一个递归函数传递5个参数&#xff0c;顶点编号&#xff0c;先序左右区间&#xff0c;中序左右区间&#xff0c;每次进行区间长度判定&…

des算法密码多长_密码学中的多个DES

des算法密码多长This is a DES that was susceptible to attacks due to tremendous advances in computer hardware in cryptography. Hence, it was a very complex or competent algorithm it would be feasible to reuse DES rather than writing an of cryptography. 由于…

《MySQL——索引笔记》

目录回表覆盖索引最左前缀原则联合索引的时候&#xff0c;如何安排索引内的字段顺序&#xff1f;索引下推重建索引问题联合主键索引和 InnoDB 索引组织表问题in与between的区别回表 回到主键索引树搜索的过程&#xff0c;我们称为回表。 覆盖索引 覆盖索引就是在这次的查询中…

计算凸多边形面积的算法

1. 思路&#xff1a; 可以将凸多边形&#xff08;边数n > 3&#xff09;划分为 (n - 2) 个三角形&#xff0c;分别运用向量叉积计算每个三角形的面积&#xff0c;最后累加各个三角形的面积就是多边形的面积。 2. 求多边形面积的算法模板&#xff1a;   定义点的结构体 str…

Windows CE开发常见问题解答

转自&#xff1a; http://blog.csdn.net/slyzhang/article/details/6110490 1.怎样在一个控件获得焦点时打开软键盘&#xff1f;比如一个EditBox获得焦点后&#xff0c;这个时候自动打开软键盘&#xff0c;这样可以方便用户输入——SIPINFO、SHSIPINFO、SIPSETINFO、SIPGETINFO…

Julia中的supertype()函数

Julia| supertype()函数 (Julia | supertype() function) supertype() function is a library function in Julia programming language, it is used to get the concrete supertype of the given type (data type). supertype()函数是Julia编程语言中的库函数&#xff0c;用于…

《操作系统知识点整理》

目录进程与线程比较多线程同步与互斥生产者与消费者哲学家就餐问题读者写者问题进程间通信管道消息队列共享内存信号量信号Socket锁互斥锁与自旋锁读写锁乐观锁与悲观锁死锁进程与线程比较 进程是资源&#xff08;包括内存、打开的文件等&#xff09;分配的单位&#xff0c;线…