9.MySQL高阶查询方法——聚合查询 / 联合(多表)查询

2022-10-26 15:16:41 浏览数 (1)

1. 聚合查询

一般需要搭配MySQL中的一些内置“函数”

1)count:用来计算结果的行数

代码语言:javascript复制
<mysql> select name,decription from user;
 -------- -------------- 
| name   | decription   |
 -------- -------------- 
| 曹操   | 乱世枭雄     |
| 刘备   | 仁德之主     |
| 孙权   | 年轻有为     |
 -------- -------------- 
3 rows in set (0.00 sec)

<mysql> select count(*) from user;
 ---------- 
| count(*) |
 ---------- 
|        3 |
 ---------- 
1 row in set (0.03 sec)

2)sum

代码语言:javascript复制
<mysql> select * from exam_result;
 ------ ----------- --------- ------ --------- 
| id   | name      | chinese | math | english |
 ------ ----------- --------- ------ --------- 
|    1 | 唐三藏    |    28.5 | 80.0 |    67.8 |
|    3 | 沙和尚    |    61.7 | 78.6 |    48.5 |
|    4 | 猪八戒    |    66.0 | 80.0 |    67.8 |
|    5 | 孙仲谋    |    21.0 | 23.0 |    91.5 |
|    6 | 曹孟德    |    67.5 | 75.5 |    67.8 |
|    7 | 刘玄德    |    66.9 | 80.0 |    69.8 |
 ------ ----------- --------- ------ --------- 
6 rows in set (0.00 sec)

<mysql> select sum(math) from exam_result;
 ----------- 
| sum(math) |
 ----------- 
|     417.1 |
 ----------- 
1 row in set (0.00 sec)

3)avg

代码语言:javascript复制
<mysql> select avg(math) from exam_result;
 ----------- 
| avg(math) |
 ----------- 
|  69.51667 |
 ----------- 
1 row in set (0.00 sec)

4)max

代码语言:javascript复制
<mysql> select max(math) from exam_result;
 ----------- 
| max(math) |
 ----------- 
|      80.0 |
 ----------- 
1 row in set (0.03 sec)

5)min

代码语言:javascript复制
<mysql> select min(math) from exam_result;
 ----------- 
| min(math) |
 ----------- 
|      23.0 |
 ----------- 
1 row in set (0.00 sec)

求小于80的同学的平均分

代码语言:javascript复制
<mysql> select avg(math) from exam_result where math < 80;
 ----------- 
| avg(math) |
 ----------- 
|  59.03333 |
 ----------- 
1 row in set (0.00 sec)

6)group by 把得到的查询结果集按照一定的规律分组(可以分成多个组)

代码语言:javascript复制
select [列] from [表名] group by [前面的列];

使用以上语句,就可以将这一列重复的类型压缩成一个

如果要求平均值

代码语言:javascript复制
select [列] ,avg(列) from [表名] group by [前面的列];

如果针对group by进行筛选,使用having

代码语言:javascript复制
select [列] ,avg(列) from [表名] group by [前面的列] having avg(列) > 250;

1. 联合/多表查询

实现联合查询的基本机制:笛卡尔积

多表查询的过程就是先计算两张表的笛卡尔积,再根据一些条件对笛卡尔积中的记录进行筛选

如果针对两个比较大的表进行联合查询,笛卡尔积的计算开销会很大,最终的查找效率也比较低,在生产环境中,不应该对达标进行联合查询。

例子:

已经创建了四个表结构

1)内连接

语法:

select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件 select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;

a)查找名字为“许仙”的分数

代码语言:javascript复制
select student.id,student.name,score.student_id,score.score from student,score where student.id = score.student_id and student.name ='许仙';

把where后面的条件称之为:连接条件

另外一种写法为: (join on 方式)

代码语言:javascript复制
 select student.id,student.name,score.student_id,score.score from student inner join score on student.id = score.student_id and student.name ='许仙';  

b)查找所有同学的总成绩以及基本信息

代码语言:javascript复制
select student.id,student.name,sum(score.score) from student,score where student.id = score.student_id group by student.id;

b)查找所有同学的每一科的成绩以及基本信息

代码语言:javascript复制
 select student.name, course.name, score.score from student,score,course where student.id = score.student_id and course.id = score.course_id;
2)自连接

自连接是指在同一张表连接自身进行查询

a)“计算机原理”分数大于“java”的分数的同学

代码语言:javascript复制
 select s1.student_id, s1.score, s1.course_id, s2.student_id, s2.score, s2.course_id from score s1,score s2 
 where s1.student_id = s2.student_id and s1.course_id = 3 and s2.course_id = 1 and s1.score > s2.score;
3)子查询

a)和某一同学同班的同学

代码语言:javascript复制
 select name from student where classes_id = (select classes_id from student where name = '不想毕业');

b)查询语文或者英文课程所对应的成绩

借助in:

代码语言:javascript复制
 select * from score where course_id in (select id from course where name = '语文' or name = '英文');

借助exist也可以:

代码语言:javascript复制
 select * from score where exists (select score.course_id from course where (name = '语文' or name = '英文') and course.id = score.course_id);
4)合并查询

相当于把多个表查询的结果集合合并成一个集合(需要保证多个结果集之间的字段和数目都得一致) a)查询id<3或者是英文课程 方法一:

方法二:

0 人点赞