在看到一位同事寫的sql語句,發現,在同一張表統計不同條件的數量的個數時是這樣寫的(公司數據庫表就不貼了,新建了一張簡單表記錄下)
表結構如下:
DROP TABLE IF EXISTS `al_users`;
CREATE TABLE `al_users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`pid` int(11) DEFAULT NULL,
`username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`is_del` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of al_users
-- ----------------------------
INSERT INTO `al_users` VALUES (1, 0, 'zhangsan', 'zhangsan', 10, 0);
INSERT INTO `al_users` VALUES (2, 0, 'lisi', 'lisi', 21, 0);
INSERT INTO `al_users` VALUES (3, NULL, 'wangwu', 'wangwu', 26, 1);
SET FOREIGN_KEY_CHECKS = 1;
現需求如下:統計同一個父級id下的總用戶數,和未刪除的用戶數
同事試這樣寫的:
select
(select count(id) FROM al_users) AS total,
(select count(id) FROM al_users WHERE is_del = 0) AS unDelTotal
FROM al_users
GROUP BY al_users.pid
優化後:
select count(id) AS total,
count(is_del=0) AS unDelTotal
FROM al_users
GROUP BY al_users.pid
這幾條數據測試時運行時間還看不出來太大的差別,數據量大的話,差別就出來了。
後記:
mysql中的sum函數,當參數是具體列名時,是求和,當參數是條件時,是統計條數