- GROUP BY
- HAVING
- 统计相关:COUNT、SUM、MAX、MIN、AVG
- 连表查询
创建3个表,用于举例
- 学生表:
CREATE TABLE `student`(
`student_id` int(11)not null auto_increment,
`name`VARCHAR(32)default null,
`age` int(11)default null,
`sex` varchar(8) default null,
primary key(`student_id`)
)engine=Innodb auto_increment=8 default charset=utf8;
begin;
insert into `student` values ('11','shen','12','girl'),('12','wang','12','boy'),('13','li','12','boy'),('10','zou','12','boy');
commit;
end;
- 成绩表:
DROP TABLE IF EXISTS `score`;
create table `score`(
`student_id` int(11)default null,
`couse_id`int(11)default null,
`score`int (11)default null
)engine=INNODB DEFAULT charset=utf8;
- 课程表
DROP TABLE IF EXISTS `couse`;
CREATE TABLE `couse`(
`couse_id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT null,
PRIMARY KEY(`couse_id`)
)ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
BEGIN;
insert into `couse` VALUES('1','语文'),('2','数学'),('3','物理');
COMMIT;
GROUP BY
定义:GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组
- 满足"SELECT子句中的列名必须为分组列或者列函数"(要么是group by里用到的列,要么就是带有sum、min等列函数的列)
- 列函数对于GROUP BY子句定义的每个组各返回一个结果
语法:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
查询所有同学的学号、选课数、总成绩
-
表-score:
表-score
- sql:
CREATE DEFINER=`root`@`localhost` PROCEDURE `findall`( )
BEGIN
SELECT student_id,COUNT(student_id),sum(score)
FROM score
GROUP BY student_id;
END
-
结果:
HAVING
定义:过滤,在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数(COUNT、SUM、MAX、MIN、AVG)一起使用,HAVING 子句可以让我们筛选分组后的各组数据
- 通常与GROUP BY子句一起使用
- WHERE过滤行,HAVING过滤组
- 出现在统一sql等顺序:WHERE>GROUP BY> HAVING
查询评价成绩大于60的同学的学号和平均成绩
- sql代码:
BEGIN
SELECT student_id,AVG(score)
FROM score
GROUP BY student_id
HAVING avg(score);
END
-
结果:
统计相关
COUNT
定义:返回匹配指定条件的行数
语法:
COUNT(*) 函数返回表中的记录数
SELECT COUNT(*) FROM table_name;
返回指定列的不同值的数目:
SELECT COUNT(DISTINCT column_name) FROM table_name;
示例(表-score):
SELECT COUNT(*) FROM score
结果:13
SELECT COUNT(DISTINCT student_id) FROM score
结果:5
SUM
定义:返回数值列的总数
语法:
SELECT sum(*) FROM score
SELECT sum(DISTINCT column_name) FROM score
示例(表-score):
SELECT sum(*) FROM score
结果:911
SELECT sum(DISTINCT score) FROM score
结果:831
网友评论