9.MySQL高阶查询方法 |
您所在的位置:网站首页 › mysql跨表查询与join › 9.MySQL高阶查询方法 |
1. 聚合查询 一般需要搭配MySQL中的一些内置“函数” 1)count:用来计算结果的行数 代码语言:javascript复制 select name,decription from user; +--------+--------------+ | name | decription | +--------+--------------+ | 曹操 | 乱世枭雄 | | 刘备 | 仁德之主 | | 孙权 | 年轻有为 | +--------+--------------+ 3 rows in set (0.00 sec) select count(*) from user; +----------+ | count(*) | +----------+ | 3 | +----------+ 1 row in set (0.03 sec)2)sum 代码语言:javascript复制 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) select sum(math) from exam_result; +-----------+ | sum(math) | +-----------+ | 417.1 | +-----------+ 1 row in set (0.00 sec)3)avg 代码语言:javascript复制 select avg(math) from exam_result; +-----------+ | avg(math) | +-----------+ | 69.51667 | +-----------+ 1 row in set (0.00 sec)4)max 代码语言:javascript复制 select max(math) from exam_result; +-----------+ | max(math) | +-----------+ | 80.0 | +-----------+ 1 row in set (0.03 sec)5)min 代码语言:javascript复制 select min(math) from exam_result; +-----------+ | min(math) | +-----------+ | 23.0 | +-----------+ 1 row in set (0.00 sec)求小于80的同学的平均分 代码语言:javascript复制 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. 联合/多表查询实现联合查询的基本机制:笛卡尔积 ![]() 多表查询的过程就是先计算两张表的笛卡尔积,再根据一些条件对笛卡尔积中的记录进行筛选 如果针对两个比较大的表进行联合查询,笛卡尔积的计算开销会很大,最终的查找效率也比较低,在生产环境中,不应该对达标进行联合查询。 例子: 已经创建了四个表结构 ![]() 语法: 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;![]() 自连接是指在同一张表连接自身进行查询 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;![]() 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);![]() 相当于把多个表查询的结果集合合并成一个集合(需要保证多个结果集之间的字段和数目都得一致) a)查询id |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |