MySQL中的JSON

JSON概述

MySQL里的json分为json array和json object。
$表示整个json对象,在索引数据时用下标(对于json array,从0开始)或键值(对于json object,含有特殊字符的key要用"括起来,比如$.“my name”)。

示例:[123, {“aa”: [55, 66], “bb”: 77}, [88,99]],那么:

$[0]123
$[1]:  {"aa": [55, 66], "bb": 77}
$[2][88,99]
$[3]NULL
$[1].aa:[55, 66]
$[1].aa[1]66
$[1].bb:77
$[2][0]88

JSON相关函数

MySQL中的JSON_第1张图片

根据json字段的内容检索查询数据

语法

  • 使用 字段->'$.json属性'进行查询条件
  • 使用json_extract函数查询,json_extract(字段,"$.json属性")
  • 根据json数组查询,用JSON_CONTAINS(字段,JSON_OBJECT('json属性', "内容"))

测试表

MySQL中的JSON_第2张图片
MySQL中的JSON_第3张图片

对应的SQL

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_emp
-- ----------------------------
DROP TABLE IF EXISTS `tb_emp`;
CREATE TABLE `tb_emp`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '员工编号',
  `ename` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '员工姓名',
  `info` json NULL COMMENT '员工信息',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_emp
-- ----------------------------
INSERT INTO `tb_emp` VALUES (1, 'SMITH', '{\"job\": \"CLERK\", \"mgr\": 7902, \"sal\": 800.0, \"comm\": null, \"empno\": 7369, \"ename\": \"SMITH\", \"deptno\": 20, \"hiredate\": 345830400000}');
INSERT INTO `tb_emp` VALUES (2, 'ALLEN', '{\"job\": \"SALESMAN\", \"mgr\": 7698, \"sal\": 1600.0, \"comm\": 300.0, \"empno\": 7499, \"ename\": \"ALLEN\", \"deptno\": 30, \"hiredate\": 351446400000}');
INSERT INTO `tb_emp` VALUES (3, 'WARD', '{\"job\": \"SALESMAN\", \"mgr\": 7698, \"sal\": 1250.0, \"comm\": 500.0, \"empno\": 7521, \"ename\": \"WARD\", \"deptno\": 30, \"hiredate\": 351619200000}');
INSERT INTO `tb_emp` VALUES (4, 'JONES', '{\"job\": \"MANAGER\", \"mgr\": 7839, \"sal\": 2975.0, \"comm\": null, \"empno\": 7566, \"ename\": \"JONES\", \"deptno\": 20, \"hiredate\": 354988800000}');
INSERT INTO `tb_emp` VALUES (5, 'MARTIN', '{\"job\": \"SALESMAN\", \"mgr\": 7698, \"sal\": 1250.0, \"comm\": 1400.0, \"empno\": 7654, \"ename\": \"MARTIN\", \"deptno\": 30, \"hiredate\": 370454400000}');
INSERT INTO `tb_emp` VALUES (6, 'BLAKE', '{\"job\": \"MANAGER\", \"mgr\": 7839, \"sal\": 2850.0, \"comm\": null, \"empno\": 7698, \"ename\": \"BLAKE\", \"deptno\": 30, \"hiredate\": 357494400000}');
INSERT INTO `tb_emp` VALUES (7, 'CLARK', '{\"job\": \"MANAGER\", \"mgr\": 7839, \"sal\": 2450.0, \"comm\": null, \"empno\": 7782, \"ename\": \"CLARK\", \"deptno\": 10, \"hiredate\": 360864000000}');
INSERT INTO `tb_emp` VALUES (8, 'SCOTT', '{\"job\": \"ANALYST\", \"mgr\": 7566, \"sal\": 3000.0, \"comm\": null, \"empno\": 7788, \"ename\": \"SCOTT\", \"deptno\": 20, \"hiredate\": 545756400000}');
INSERT INTO `tb_emp` VALUES (9, 'KING', '{\"job\": \"PRESIDENT\", \"mgr\": null, \"sal\": 5000.0, \"comm\": null, \"empno\": 7839, \"ename\": \"KING\", \"deptno\": 10, \"hiredate\": 374774400000}');
INSERT INTO `tb_emp` VALUES (10, 'TURNER', '{\"job\": \"SALESMAN\", \"mgr\": 7698, \"sal\": 1500.0, \"comm\": 0.0, \"empno\": 7844, \"ename\": \"TURNER\", \"deptno\": 30, \"hiredate\": 368726400000}');
INSERT INTO `tb_emp` VALUES (11, 'ADAMS', '{\"job\": \"CLERK\", \"mgr\": 7788, \"sal\": 1100.0, \"comm\": null, \"empno\": 7876, \"ename\": \"ADAMS\", \"deptno\": 20, \"hiredate\": 548694000000}');
INSERT INTO `tb_emp` VALUES (12, 'JAMES', '{\"job\": \"CLERK\", \"mgr\": 7698, \"sal\": 950.0, \"comm\": null, \"empno\": 7900, \"ename\": \"JAMES\", \"deptno\": 30, \"hiredate\": 376156800000}');
INSERT INTO `tb_emp` VALUES (13, 'FORD', '{\"job\": \"ANALYST\", \"mgr\": 7566, \"sal\": 3000.0, \"comm\": null, \"empno\": 7902, \"ename\": \"FORD\", \"deptno\": 20, \"hiredate\": 376156800000}');
INSERT INTO `tb_emp` VALUES (14, 'MILLER', '{\"job\": \"CLERK\", \"mgr\": 7782, \"sal\": 1300.0, \"comm\": null, \"empno\": 7934, \"ename\": \"MILLER\", \"deptno\": 10, \"hiredate\": 380563200000}');

SET FOREIGN_KEY_CHECKS = 1;

示例:查询JSON中的某几个字段

  • 查看所有员工的编号、名称、工作、薪水

    SELECT id,ename,info->'$.job',info->'$.sal' from tb_emp;
    
    SELECT id,ename,JSON_EXTRACT(info,'$.job'),JSON_EXTRACT(info,'$.sal') from tb_emp;
    
    SELECT id,ename,JSON_EXTRACT(info,'$.job','$.sal') from tb_emp;   -- 了解
    
  • 查询id值为7788的员工的名称是否为SCOTT

    SELECT JSON_CONTAINS(info,'{"ename":"SCOTT"}') 
    from tb_emp 
    WHERE id= 8
    
  • 查询指定字段中是否包含ename和dno中的任何一个

    SELECT JSON_CONTAINS_PATH(info, 'one','$.ename','$.dno')
    from tb_emp
    WHERE id= 8
    
  • 查询指定字段中是否同时包含ename和dno

    SELECT JSON_CONTAINS_PATH(info, 'all','$.ename','$.dno')
    from tb_emp
    WHERE id= 8
    

示例:作为查询条件

  • 查询部门编号为10的员工的详细信息

    select * from tb_emp where info->'$.deptno'=10;
    
  • 查询部门编号为10且mgr为null的员工的详细信息

    select * from tb_emp where info->'$.deptno'=10 and info->'$.ename'='CLARK';
    
  • 查询部门编号为10且id为7的员工的详细信息

    select * from tb_emp where info->'$.deptno'=10 and id =7;
    
  • 查询薪水大于3000的员工的信息

    select * from tb_emp where JSON_EXTRACT(info, '$.sal')>3000;
    
  • 查询薪水等于5000的员工的信息

    select * from tb_emp where JSON_CONTAINS(info, JSON_OBJECT('sal',5000))
    
  • 查询JSON字段中所有的键

    select JSON_KEYS(info) FROM tb_emp;
    

你可能感兴趣的:(#,MySQL,/,MariaDB,json,mysql,数据库)