Mysql技术分享

Summary: Author: 张亚飞 | Read Time: 1 minute read | Published: 2022-11-11
Filed under Categories: LinuxTags: Note,

Mysql技术分享

[](https://relph1119.github.io/mysql-learning-notes/#/mysql)

索引下推

HAVING 分组筛选

如果想要从 GROUP BY 分组中进行筛选的话,不是用 WHERE 而是使用 HAVING 来进行聚合函数的筛选。WHERE 只能过滤行,如果是要对 GROUP BY 的结果进行筛选,需要使用 HAVING 条件,HAVING 子句必须写在 GROUP BY 子句之后

使用 HAVING 子句时 SELECT 语句的顺序

SELECT -> FROM -> WHERE -> GROUP BY -> HAVING

查询商品分类条数汇总并将条数为2的商品提取出来

SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type
HAVING COUNT(*) = 2;

查询结果

product_type | count
-------------+------
衣服         |  2
办公用品     |  2

注意: 如果 HAVING 查询没有带 GROUP BY 子句,MySQL 会自动加上 GROUP BY NULL 条件以符号规范,这样可能会导致非预期错误。

例如:

SELECT * FROM t HAVING id=MIN(id);
SELECT * FROM t HAVING id=MAX(id);

会被转化成:

SELECT * FROM t GROUP BY NULL HAVING id=MIN(id);
SELECT * FROM t GROUP BY NULL HAVING id=MAX(id); // 查询结果为空

NULL 值

NULL和空值

NULL也就是在字段中存储NULL值,空值也就是字段中存储空字符(“)。 1、占用空间区别

mysql>  select length(NULL), length(''), length('1');
+--------------+------------+-------------+
| length(NULL) | length('') | length('1') |
+--------------+------------+-------------+
| NULL         |          0 |           1 |
+--------------+------------+-------------+
1 row in set

复制代码小总结:从上面看出空值(”)的长度是0,是不占用空间的;而的NULL长度是NULL,其实它是占用空间的。

判断是否为 NULL 应该用 IS NULL 或 IS NOT NULL

使用 =!= 查询 NULL 永远返回 NULL

使用 count 列会过滤值为 NULL 的记录

SELECT count(end_id) FROM meet_bill;
SELECT count(end_at) FROM meet_bill;

Comments

Cor-Ethan, the beverage → www.iirii.com