创建学生表
创建表语句:
create table TbStudent
(
stuid integer not null,
stuname varchar(20) not null,
stusex integer default 1,
stubirth datetime not null,
stuaddr varchar(255),
stuphoto longblob
);
添加学生记录:
insert into TbStudent values
(1005, '丘处机', 1, '1983-5-5', '北京市海淀区宝盛北里西区28号', null),
(1006, '王处一', 3, '1985-6-6', '深圳市宝安区宝安大道5010号', null),
(1007, '刘处玄', 1, '1987-7-7', '郑州市金水区纬五路21号', null),
(1008, '孙不二', 0, '1989-8-8', '武汉市光谷大道61号', null),
(1009, '平一指', 3, '1992-9-9', '西安市雁塔区高新六路52号', null),
(1010, '老不死', 1, '1993-10-10', '广州市天河区元岗路310号', null),
(1011, '王大锤', 0, '1994-11-11', null, null),
(1012, '隔壁老王', 3, '1995-12-12', null, null),
(1013, '郭啸天', 1, '1996-10-25', null, null);
为了业务要求,这里的性别出现3
统计数量
根据要求查询数量:
SELECT
-- 学生数量,去除重复id学生
count(DISTINCT st.stuid) 学生数量,
-- 取性别等于1
sum(if(st.stusex = 1,1,0)) 性别1,
-- 取性别为0 或 1的总数量
sum(if(st.stusex = 0 or st.stusex = 1,1,0)) 性别0和1,
-- 性别1 并且 年龄小于1992年的
sum(if(st.stusex = 1 and st.stubirth < '1991-1-1',1,0)) 性别1和小于1992年
FROM `tbstudent` st;
PS
这里只是个小例子,你也可以根据要求变换着使用
数据量在万级别以上的话,而且又是多表关联查询,一定要在查询条件的字段加上索引,速度甚至提升10倍以上
你可以想象一下,不管你是分组还是加条件,你的字段统计是从结果中的每一行进行比对,如果符合就加1,否者再匹配下一行