mysql 奇淫技巧

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对象(数组或者对象)

  1. 数组使用$[i] ,从0开始。
  2. 对象使用$.key

例:查询json列 depp=dd的员工

SELECT * from (
SELECT *,json_value->'$.deptName’ as deptName FROM dept
) t WHERE JSON_CONTAINS(deptName,JSON_OBJECT("depp","dd"));
posted @ 2022-12-19 18:00  makalo  阅读(77)  评论(0编辑  收藏  举报