1、count()有两大作用:
1.1、统计某个列值的数量。
1.2、统计行数。
2、实例
2.1、统计列值时,要求列值非空的(不统计null)。如果在count()的括号中指定了列或者列的表达式,则统计的是这个表达式有值的结果数。所谓的有值,就是不为null。
建表 users:
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(7) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`userName` varchar(50) DEFAULT NULL COMMENT '用户名',
`userAge` int(11) DEFAULT NULL COMMENT '年龄',
`userAddress` varchar(200) DEFAULT NULL COMMENT '家庭住址',
`state_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_state_id` (`state_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2016000010 DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `users` VALUES ('20001', 'liming1 ', '23', '河北承德', '2'), ('20002', ' 1liming', '23', '河北承德', '3'), ('2016000001', 'liqing', '20', '河北省石家庄市', '4'), ('2016000002', 'limin', '21', '河北省承德市', '1'), ('2016000003', ' str0', null, null, '4'), ('2016000009', 'rrrr ', '23', '而非', '5');
COMMIT;
查询sql:
select count(*) from users; -- 数据行总数为6
select count(users.username) from users ; -- 数据行在列username不为null的总数为6
select count(users.userAge) from users; -- 5,因为有一行数据行在列userAge为null
select count(users.userAge=23) from users; -- 5,说明括号里面为列或者列的表达式是一个作用
2.2、统计结果集的行数。当MySQL确认括号内的表达式值不可能为空时,实际上就是在统计行数。例子如上第二、三、四个sql语句。
3、统计某个列不同值的数量时,count() 和sum()的不同写法的同等效果。
建表city:
DROP TABLE IF EXISTS `city`;
CREATE TABLE `city` (
`city` varchar(10) NOT NULL,
`id` tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入数据:
BEGIN;
INSERT INTO `city` VALUES ('承德', '2'), ('石家庄', '10'), ('张家口', '20'), ('保定', '3'), ('邢台', '2'), ('兴隆', '5'), ('平泉', '6'), ('双桥', '3'), ('隆化', '7'), ('积水潭', '8'), ('渭水', '4'), ('浏阳', '6'), ('米清', '5'), ('葛岭', '7'), ('西直门', '3'), ('承德', '1'), ('石家庄', '6'), ('张家口', '8'), ('保定', '0'), ('邢台', '4'), ('兴隆', '6'), ('平泉', '5'), ('双桥', '9'), ('隆化', '11'), ('积水潭', '33'), ('渭水', '5'), ('浏阳', '66'), ('米清', '7'), ('葛岭', '5'), ('西直门', '22');
COMMIT;
查询sql:使用count()而不是sum()实现同样的目的,只需要将满足条件的设置为真,不满足条件的设置为null即可。因为count()不会对列值为null的行计数。
select sum(if(city.city='西直门',1,0)) as xizhimen,sum(if(city.city='积水潭',1,0)) as jishuitan from city; -- 2 2
select count(city.city='西直门' or null) as xizhimen,count(city.city='积水潭' or null) as jishuitan from city; -- 2 2