概念
count()是MySQL中用来统计表中记录的一个函数,返回条件的行数
用法
新建一张student表;
CREATE TABLE `student` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`sex` varchar(255) DEFAULT NULL COMMENT '性别',
`class` varchar(255) DEFAULT NULL COMMENT '班级',
`score` varchar(255) DEFAULT NULL COMMENT '成绩',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入6条数据
INSERT INTO `test`.`student`(`id`, `name`, `age`, `sex`, `class`, `score`) VALUES (1, '张三', 15, '男', '高一(6)班', '97');
INSERT INTO `test`.`student`(`id`, `name`, `age`, `sex`, `class`, `score`) VALUES (2, '李四', 16, '男', '高一(4)班', '');
INSERT INTO `test`.`student`(`id`, `name`, `age`, `sex`, `class`, `score`) VALUES (3, '王五', 15, '男', '高一(5)班', '84');
INSERT INTO `test`.`student`(`id`, `name`, `age`, `sex`, `class`, `score`) VALUES (4, '刘筱筱', 14, '女', '高一(4)班', '98');
INSERT INTO `test`.`student`(`id`, `name`, `age`, `sex`, `class`, `score`) VALUES (5, '李静', 15, '女', '高一(5)班', '98');
INSERT INTO `test`.`student`(`id`, `name`, `age`, `sex`, `class`, `score`) VALUES (6, '李蕊', 14, '女', '高一(4)班', NULL);
查询所有记录
mysql> select * from student;
+----+--------+------+------+-------------+-------+
| id | name | age | sex | class | score |
+----+--------+------+------+-------------+-------+
| 1 | 张三 | 15 | 男 | 高一(6)班 | 97 |
| 2 | 李四 | 16 | 男 | 高一(4)班 | |
| 3 | 王五 | 15 | 男 | 高一(5)班 | 84 |
| 4 | 刘筱筱 | 14 | 女 | 高一(4)班 | 98 |
| 5 | 李静 | 15 | 女 | 高一(5)班 | 98 |
| 6 | 李蕊 | 14 | 女 | 高一(4)班 | NULL |
+----+--------+------+------+-------------+-------+
6 rows in set (0.00 sec)
count(*)
返回表中的记录数(包括所有列),相当于统计表的行数(不会忽略列值为NULL的记录)
mysql> select count(*) from student;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
count(1)
忽略所有列,1表示一个固定值,也可以用count(2)、count(3)代替(不会忽略列值为NULL的记录)
mysql> select count(1) from student;
+----------+
| count(1) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
count(列名)
返回列名指定列的记录数,在统计结果的时候,会忽略列值为NULL的记录(不包括空字符串和0),即列值为NULL的记录不统计在内
mysql> select count(score) from student;
+--------------+
| count(score) |
+--------------+
| 5 |
+--------------+
1 row in set (0.00 sec)
count(distinct 列名)
只包括列名指定列,返回指定列的不同值的记录数,在统计结果的时候,会忽略列值为NULL的记录(不包括空字符串和0),即列值为NULL的记录不统计在内。
mysql> select count(distinct score) from student;
+-----------------------+
| count(distinct score) |
+-----------------------+
| 4 |
+-----------------------+
1 row in set (0.00 sec)
count(*)&count(1)&count(列名)执行效率比较:
- 如果列为主键,count(列名)效率优于count(1)
- 如果列不为主键,count(1)效率优于count(列名)
- 如果表中存在主键,count(主键列名)效率最优
- 如果表中只有一列,则count(*)效率最优
- 如果表有多列,且不存在主键,则count(1)效率优于count(*)
count带条件查询
1.count()函数中使用条件表达式加or null来实现,作用就是当条件不满足时,函数变成了count(null)不会统计数量
mysql> select count(score > 90 or null) from student;
+----------------------------+
| count(score > 90 or null) |
+----------------------------+
| 3 |
+----------------------------+
1 row in set (0.00 sec)
2.count()函数中使用if表达式来实现,当条件满足时表达式的值为非空,条件不满足时表达式值为NULL;
mysql> select count(if(score > 90, 1, null)) from student;
+--------------------------------+
| count(if(score > 90, 1, null)) |
+--------------------------------+
| 3 |
+--------------------------------+
1 row in set (0.00 sec)
3.count()函数中使用case when表达式来实现,当条件满足时表达式的结果为非空,条件不满足时无结果默认为NULL;
mysql> select count(case when score > 90 then 1 end) from student;
+----------------------------------------+
| count(case when score > 90 then 1 end) |
+----------------------------------------+
| 3 |
+----------------------------------------+
1 row in set (0.00 sec)