1.统计同一张表的多个值
啥意思?比如,一张人员表,要同时统计出男女人数,正常来说 ,我们是要两句sql,但是有没有办法,一句sql 直接统计出来呢?有的!!
例:
SELECT
count(sex = '男' OR NULL),
count(sex = '密切接触者' and age = 16 or NULL)
FROM person
需要注意的是 count
里面的条件都要加 OR NULL
,这里有个问题 为啥 有条件 还要 加上 OR NULL
, 这是因为
COUNT(字段):统计该"字段"不为NULL 的记录。
而 sex
不等 '男'
这时候返回的是 false
不是 null
,不加的话 统计数据就不太准确
2.解析json
MySQL从5.7后引入了json数据类型以及json函数,可以有效的访问json格式的数据。json数据类型相对于字符串,具有以下优点:
1)对于json列数据提供自动校验json格式,错误格式会提示错误;
2)优化存储类型。数据以二进制方式保存,读取效率快;
3)允许通过键值或者数据索引查找对象,无需把整个数据读取出来;
除此之外,json还有以下特点:
1)json存储空间大致于longblob或longtext差不多;
2)mysql8.0.13之后,json允许默认值为null;
3)json列不能设置索引,可通过json中的键值设置索引来提高查询效率;
4)json中null、true、false必须使用小写
参考:https://dev.mysql.com/doc/refman/8.0/en/json.html
相关函数
分类 | 函数 | 语法 | 描述 |
---|---|---|---|
创建JSON | JSON_ARRAY | JSON_ARRAY(val1, val2…) | 创建json数组 |
JSON_OBJECT | JSON_OBJECT(key1, value1, key2, value2…) | 创建ison对象 | |
JSON_QUOTE | JSON_QUOTE(string) | 将参数用双引号括起来 | |
JSON_UNQUOTE | JSON_UNQUOTE(json_val) | 去掉结果的双引号 | |
查询JSON | JSON_CONTAINS | JSON_CONTAINS(json_doc, val[, path]) | 指定path是否包含指定数据,包含返回1,否则返回0.如果有参数为NULL或path不存在,则返回null |
JSON_CONTAINS_PATH | JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] …) | 检查是否存在指定路径,是否满足一个或者所有,存在返回1,否则返回0.如果有参数为null,则返回null。one_or_all:"one"表示查询到一个即返回;"all"表示查询所有。 | |
JSON_EXTRACT | JSON_EXTRACT(json_field, path[, path] …) | 提取son字段某个路径的值 | |
COLUMN->PATH | json_model -> '$.name’ | json_extract的简洁写法,MySQL 5.7.9开始支持 | |
COLUMN->>PATH | json_model ->> '$.name’ | json_unquote(column -> path)的简洁写法 | |
JSON_KEYS | JSON_KEYS(json_field) | 提取json中的键值为json数组 | |
JSON_SEARCH | JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] …]) | 按给定字符串关键字搜索json,返回匹配的路径查询包含指定字符串的paths,并作为一个json array返回。如果有参数为NUL或path不存在,则返回NULL。one_or_all:"one"表示查询到一个即返回;"all"表示查询所有。search_str:要查询的字符串。 可以用LIKE里的’%'或‘_’匹配。path:在指定path下查。 | |
JSON_LENGTH | JSON_LENGTH(json_doc[, path]) | 返回数组的长度,如果是object则是属性个数,常量则为1,1. 标量的长度为1;2. json array的长度为元素的个数;3. json object的长度为key的个数。 | |
JSON_DEPTH | JSON_DEPTH(json_doc) | 返回doc深度空的json array、json object或标量的深度为1 | |
JSON_PRETTY | JSON_PRETTY(json_field) | 返回格式化json数据 | |
修改JSON | JSON_SET | JSON_SET(json_doc, path, val[, path, val] …) | 修改json_field数据中的指定path的值,存在修改,不存在插入 |
JSON_ARRAY_APPEND | JSON_ARRAY_APPEND(json_doc, path, val[, path, val] …) | 给指定的节点,添加元素,如果节点不是数组,则先转换成[doc] |
MySQL里的JSON分为json array和json object。
$
表示整个json对象(数组或者对象)
- 数组使用
$[i]
,从0开始。 - 对象使用
$.key
例:查询json列 depp=dd的员工
SELECT * from (
SELECT *,json_value->'$.deptName’ as deptName FROM dept
) t WHERE JSON_CONTAINS(deptName,JSON_OBJECT("depp","dd"));
标签:返回,技巧,doc,JSON,json,mysql,path,NULL,奇淫
From: https://www.cnblogs.com/makalochen/p/16992781.html