select avg(chinese + math + english) 三科平均分 from exam;
复制代码
6.返回英语最高分
select max(english) from exam;
复制代码
7.返回 > 70 分以上的数学最低分
select min(math) from exam where math > 70;
复制代码
分组查询
group by
SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满意:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出如今SELECT 中则必须包含在聚合函数中。
select column1, sum(column2), .. from table group by column1,column3;
演示表:
计算每种职位的均匀工资:
这里的实验顺序是先分组再计算。 拓展 round
可以使用 round(数值,小数点后的位数) 来指定命值的形式: group by 后面可以跟 order by 子句
练习:
查询每个角色的最高工资、最低工资和均匀工资
select role 职位, max(salary) 最高工资, min(salary) 最低工资 from emp group by 职位;
复制代码
having
GROUP BY 子句进行分组以后,需要对分组效果再进行条件过滤时,不能使用 WHERE 语句,而需要用
HAVING where 是对表中每一行的真实数据进行过滤的
having 是在 group by 之后,对计算效果进行过滤的。
所以两个实验顺序是不一样的,having 可以使用别名来过滤
演示:
显示均匀工资低于1500的角色和它的均匀工资
select role 职位, avg(salary) 平均工资 from emp group by 职位 having 平均工资 < 1500;
select stu.name, sco.score from student stu, score sco where name = '白素贞' and stu.student_id = sco.student_id;
复制代码
select stu.name, sco.score from student stu join score sco on name = '白素贞' and stu.student_id = sco.student_id;
复制代码
查询所有同砚的总成绩,及同砚的个人信息:
起首确定需要什么表:门生表,成绩表;然后取笛卡尔积:
然后确定毗连条件与过滤条件:起首是由于需要的是总成绩,所以要使用聚合函数 sum(),那么就要使用到 分组查询 group by 子句,接着成绩表和门生表的毗连是 student_id 要雷同
这里要留意分组的依据,我们是对成绩表进行分组的,成绩表有门生的 id 和 成绩,那就应该是要按门生的 id 作为分组的依据。
最后简化 sql 语句 将student 取 stu , score 取 sco
select stu.name, stu.mail, sum(sco.score) from student stu, score sco where stu.student_id = sco.student_id group by sco.student_id;
select stu.sn 学号, stu.name 姓名, stu.mail 邮箱, sum(sco.score) 总成绩, c.name from student stu, score sco, class c where stu.student_id = sco.student_id and stu.class_id
= c.class_id group by sco.student_id;
复制代码
外毗连
外毗连分为左外毗连和右外毗连。如果团结查询,左侧的表完全显示就是左外毗连;右侧的表完全显示就是右外毗连。
语法:左外毗连: select 字段名 from 表名1 left join 表名2 on 毗连条件; 与 右外毗连: select 字段 from 表名1 right join 表名2 on 毗连条件;
大家来看一下下面两张表,你会发现 3班 是没有门生的。
如今我们基于上述的式子,演示左外毗连:select * from class c left join student s on c.class_id = s.class_id;
然后我们来演示右外毗连:select * from class c right join student s on c.class_id = s.class_id; 这里会将 student 表全部显示,纵然有门生没有班级这个数据。
进行外毗连如果遇到没有数据的时候,数据库会使用 NULL 添补。
自毗连
自毗连是指在同一张表毗连自身进行查询。
语法:select * from 表名1 别名1, 表名1 别名2; 留意一定要起别名,不然MySQL 无法辨认:
一样平常自毗连会用在自己要和自己比较的时候
演示:
查询哪些门生的 Java 成绩 比 计算机原理要低:可以先查出Java 和 计算机原理的 course_id
select * from score s1, score s2 where s1.course_id = 1 and s2.course_id = 3 and s1.score < s2.score;
子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
单行子查询:
根本语法:select * from table_name where 列名 = (select 列名 from table_name where 条件);
查询与“白素贞” 同砚的同班同砚:select * from student where class_id = (select class_id from student where name = '白素贞');
多行子查询:
[NOT] IN
in 之条件到过就是在不在 in 括号的字段范围内
语法:select * from table_name1 where 列名 [not] in (select * from table_name2);
举例:查询 Java 和 计算机的成绩
select * from score where course_id in (select course_id from course where name = 'Java' or name = '计算机原理');
[NOT] EXISTS
exists 表示存在,如果 exists 后面括号中的查询语句,如果返回的是空效果集,那就类似flase ,不会实验外层的查询,如果返回的是 true ,就会实验外层的查询。
语法:select * from table_name where [not] exists (select * from table_name);
留意如果集合是 select null; 集合不为空(empty),只是集合内容是 null
演示:
合并查询
合并查询可以将多个效果集合并。
使用UNION和UNION ALL时,前后查询的效果集中,字段需要一致。
union 【会去重】
该操作符用于取得两个效果集的并集。当使用该操作符时,会主动去掉效果集中的重复行。
union all 【不会去重】