聚合函数:html
SQL中提供的聚合函数能够用来统计、求和、求最值等等。函数
分类:post
SELECT COUNT(<计数规范>) FROM <表名>
其中,计数规范包括:code
- * :计数全部选择的行,包括NULL值;htm
- ALL 列名:计数指定列的全部非空值行,若是不写,默认为ALL;对象
- DISTINCT 列名:计数指定列的惟一非空值行。blog
SELECT COUNT(*) FROM t_student;
也可加入筛选条件,如求女学生数目:排序
SELECT COUNT(*) FROM t_student WHERE student_sex='女';
SELECT COUNT(DISTINCT student_class) FROM t_student;
DISTINCT即去重,若是不加DISTINCT则结果为表行数——5。class
SELECT SUM(student_age) FROM t_student;
返回列平均值(AVG):im
计算学平生均年龄:
SELECT AVG(student_age)FROM t_student;
返回最大值/最小值(MAX/MIN):
求年龄最大的学生信息(最小值同理):
SELECT MAX(student_age) FROM t_student;
注:这里只能求出最大年龄,要想显示年龄最大的学生所有信息,须要用到以后的子查询。
数据分组(GROUP BY):
SQL中数据能够按列名分组,搭配聚合函数十分实用。
例,统计每一个班的人数:
SELECT student_class,COUNT(ALL student_name) AS 总人数 FROM t_student GROUP BY (student_class);
AS为定义别名,别名的使用在组合及联接查询时会有很好的效果,以后再说。
分组中也能够加入筛选条件WHERE,不过这里必定要注意的是,执行顺序为:WHERE过滤→分组→聚合函数。牢记!
统计每一个班上20岁以上的学生人数:
SELECT student_class,COUNT(student_name) AS 总人数 FROM t_student WHERE student_age >20 GROUP BY (student_class);
HAVING过滤条件:
以前说了分组操做、聚合函数、WHERE过滤的执行顺序,那若是咱们但愿在聚合以后执行过滤条件怎么办?
例,咱们想查询平均年龄在20岁以上的班级
能用下面的语句吗?
SELECT student_class, AVG(student_age) FROM t_student WHERE AVG(student_age)>20 GROUP BY student_class;
SELECT student_class,AVG(student_age) AS 平均年龄 FROM t_student GROUP BY (student_class) HAVING AVG(student_age)>20;
SELECT s.student_id,s.student_name,(SELECT class_name FROM t_class c WHERE c.class_id=s.class_id) FROM t_student s GROUP BY s.student_id;
* 首先这条SQL语句用到了别名,写法为在FORM的表名后加上某个字符好比FROM t_student s,这样在以后调用t_student的某一列时就能够用s.student_id来强调此列来源于对应别名的那张表。
别名在子查询及联接查询中的应用有着很好效果,当两张表有相同列名或者为了增强可读性,给表加上不一样的别名,就能很好的区分哪些列属于哪张表。
还有种状况就是在子查询或联接查询时,主查询及子查询均为对同一张表进行操做,为主、子查询中的表加上不一样的别名可以很好的区分哪些列的操做是在主查询中进行的,哪些列的操做是在子查询中进行的,下文会有实例说明。
SELECT * FROM t_student WHERE student_subject='C语言' AND student_score>=ALL (SELECT student_score FROM t_student WHERE student_subject='C语言') ;
结果:
SELECT * FROM t_student WHERE student_subject='C语言' AND student_score >(SELECT student_score FROM t_student WHERE student_name='李四' AND student_subject='C语言');
经过上面两例,应该能够明白子查询在WHERE中嵌套的做用。经过子查询中返回的列值来做为比较对象,在WHERE中运用不一样的比较运算符来对其进行比较,从而获得结果。
如今咱们回到最开始的问题,怎么查出每门课最高成绩的学生的信息:
SELECT * FROM t_student s1 WHERE s1.student_score >= ALL(SELECT s2.student_score FROM t_student s2 WHERE s1.`student_subject`=s2.student_subject);
这里就是上文提到的别名的第二种用法,主、子查询对同一张表操做,区分开位于内外表中相同的列名。
结果:
子查询的分类:
组合查询:
经过UNION运算符来将两张表纵向联接,基本方式为:
SELECT 列1 , 列2 FROM 表1 UNION SELECT 列3 , 列4 FROM 表2;
UNION ALL为保留重复行:
SELECT 列1 , 列2 FROM 表1 UNION ALL SELECT 列3 , 列4 FROM 表2;