当前位置:网站首页>MySQL5.7的JSON基本操作
MySQL5.7的JSON基本操作
2022-07-05 15:01:00 【杨某人信了你的邪】
MySQL5.7的JSON基本操作
1、建表
在新建表时字段类型可以直接设置为json
类型,比如我们创建一张表:
create table `test_user`
(
`id` int primary key auto_increment,
`name` varchar(50) not null,
`info` json
);
json类型字段可以为NULL
2、插入
(1)直接使用字符串构建json对象
insert into test_user(`name`, `info`)
values ('xiaoming', '{ "sex": 1, "age": 18, "nick_name": "小萌" }');
json类型的字段必须时一个有效的json字符串
(2)可以使用JSON_OBJECT()
函数构造json对象
insert into test_user(`name`, `info`)
values ('xiaohua', json_object("sex", 0, "age", 17));
(3)使用JSON_ARRAY()
函数构造json数组
insert into test_user(`name`, `info`)
values ('xiaozhang', json_object("sex", 1, "age", 19, "tag", json_array(3, 5, 90)));
查看test_user表中的数据:
mysql> select * from test_user;
+----+-----------+----------------------------------------------+
| id | name | info |
+----+-----------+----------------------------------------------+
| 1 | xiaoming | {
"age": 18, "sex": 1, "nick_name": "小萌"} |
| 2 | xiaohua | {
"age": 17, "sex": 0} |
| 3 | xiaozhang | {
"age": 19, "sex": 1, "tag": [3, 5, 90]} |
+----+-----------+----------------------------------------------+
3 rows in set (0.00 sec)
3、查询
(1)查询json属性
表达式: 对象为json列->'$.键'
, 数组为json列->'$.键[index]'
mysql> select name, info -> '$.nick_name' as nick_name, info -> '$.sex' as sex, info -> '$.tag[0]' as 1st_tag from test_user;
+-----------+-----------+------+---------+
| name | nick_name | sex | 1st_tag |
+-----------+-----------+------+---------+
| xiaoming | "小萌" | 1 | NULL |
| xiaohua | NULL | 0 | NULL |
| xiaozhang | NULL | 1 | 3 |
+-----------+-----------+------+---------+
3 rows in set (0.00 sec)
等价于:对象为JSON_EXTRACT(json列 , '$.键')
,数组为JSON_EXTRACT(json列 , '$.键[index]')
mysql> select name, JSON_EXTRACT(info, '$.nick_name') as nick_name, JSON_EXTRACT(info, '$.sex') as sex, JSON_EXTRACT(info, '$.tag[0]') as 1st_tag from test_user;
+-----------+-----------+------+---------+
| name | nick_name | sex | 1st_tag |
+-----------+-----------+------+---------+
| xiaoming | "小萌" | 1 | NULL |
| xiaohua | NULL | 0 | NULL |
| xiaozhang | NULL | 1 | 3 |
+-----------+-----------+------+---------+
3 rows in set (0.00 sec)
不过看到上面"小萌"
是带双引号的,这不是我们想要的,可以用JSON_UNQUOTE
函数将双引号去掉
mysql> select name, JSON_UNQUOTE(info -> '$.nick_name') as nick_name from test_user where name = 'xiaoming';
+----------+-----------+
| name | nick_name |
+----------+-----------+
| xiaoming | 小萌 |
+----------+-----------+
1 row in set (0.00 sec)
也可以直接使用操作符->>
mysql> select name, info ->> '$.nick_name' as nick_name from test_user where name = 'xiaoming';
+----------+-----------+
| name | nick_name |
+----------+-----------+
| xiaoming | 小萌 |
+----------+-----------+
1 row in set (0.00 sec)
(2)json属性作为查询条件
mysql> select name, info ->> '$.nick_name' as nick_name from test_user where info -> '$.nick_name' = '小萌';
+----------+-----------+
| name | nick_name |
+----------+-----------+
| xiaoming | 小萌 |
+----------+-----------+
1 row in set (0.00 sec)
(3)通过虚拟列
对JSON类型的指定属性进行快速查询。
创建虚拟列:
mysql> alter table `test_user` add `nick_name` varchar(50) generated always as (info ->> '$.nick_name') virtual;
注意用操作符->>
去除双引号
删除虚拟列
mysql> alter table `test_user` drop `nick_name`;
使用时和普通类型的列查询是一样:
mysql> select name, nick_name from test_user where nick_name = '小萌';
+----------+-----------+
| name | nick_name |
+----------+-----------+
| xiaoming | 小萌 |
+----------+-----------+
1 row in set (0.00 sec)
4、更新
(1)使用JSON_INSERT()
插入新值,但不会覆盖已经存在的值
更新前
mysql> select * from test_user where id = 2;
+----+---------+-----------------------+-----------+
| id | name | info | nick_name |
+----+---------+-----------------------+-----------+
| 2 | xiaohua | {
"age": 17, "sex": 0} | NULL |
+----+---------+-----------------------+-----------+
1 row in set (0.00 sec)
更新
mysql> update test_user set info = json_insert(info, '$.sex', 1, '$.nick_name', '小花') where id = 2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
更新后
mysql> select * from test_user where id = 2;
+----+---------+----------------------------------------------+-----------+
| id | name | info | nick_name |
+----+---------+----------------------------------------------+-----------+
| 2 | xiaohua | {
"age": 17, "sex": 0, "nick_name": "小花"} | 小花 |
+----+---------+----------------------------------------------+-----------+
1 row in set (0.00 sec)
(2)使用JSON_SET()
插入新值,并覆盖已经存在的值
更新前
mysql> select * from test_user where id = 3;
+----+-----------+------------------------------------------+-----------+
| id | name | info | nick_name |
+----+-----------+------------------------------------------+-----------+
| 3 | xiaozhang | {
"age": 19, "sex": 1, "tag": [3, 5, 90]} | NULL |
+----+-----------+------------------------------------------+-----------+
1 row in set (0.00 sec)
更新
mysql> update test_user set info = json_set(info, '$.age', 20, '$.sex', 0, '$.nick_name', '小张') where id = 3;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
更新后
mysql> select * from test_user where id = 3;
+----+-----------+-----------------------------------------------------------------+-----------+
| id | name | info | nick_name |
+----+-----------+-----------------------------------------------------------------+-----------+
| 3 | xiaozhang | {
"age": 20, "sex": 0, "tag": [3, 5, 90], "nick_name": "小张"} | 小张 |
+----+-----------+-----------------------------------------------------------------+-----------+
1 row in set (0.00 sec)
(3)使用JSON_REPLACE()
只替换存在的值
更新前
mysql> select * from test_user where id = 2;
+----+---------+----------------------------------------------+-----------+
| id | name | info | nick_name |
+----+---------+----------------------------------------------+-----------+
| 2 | xiaohua | {
"age": 17, "sex": 0, "nick_name": "小花"} | 小花 |
+----+---------+----------------------------------------------+-----------+
1 row in set (0.00 sec)
更新
mysql> update test_user set info = json_replace(info, '$.sex', 1, '$.tag', '[1,2,3]') where id = 2;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
更新后
mysql> select * from test_user where id = 2;
+----+---------+----------------------------------------------+-----------+
| id | name | info | nick_name |
+----+---------+----------------------------------------------+-----------+
| 2 | xiaohua | {
"age": 17, "sex": 1, "nick_name": "小花"} | 小花 |
+----+---------+----------------------------------------------+-----------+
1 row in set (0.00 sec)
可以看到tag没有更新进去
(4)使用JSON_REMOVE()
删除JSON元素
更新前
mysql> select * from test_user where id = 1;
+----+----------+----------------------------------------------+-----------+
| id | name | info | nick_name |
+----+----------+----------------------------------------------+-----------+
| 1 | xiaoming | {
"age": 18, "sex": 1, "nick_name": "小萌"} | 小萌 |
+----+----------+----------------------------------------------+-----------+
1 row in set (0.00 sec)
更新
mysql> update test_user set info = json_remove(info, '$.sex', '$.tag') where id = 1;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0
更新后
mysql> select * from test_user where id = 1;
+----+----------+------------------------------------+-----------+
| id | name | info | nick_name |
+----+----------+------------------------------------+-----------+
| 1 | xiaoming | {
"age": 18, "nick_name": "小萌"} | 小萌 |
+----+----------+------------------------------------+-----------+
1 row in set (0.00 sec)
边栏推荐
- R 熵权法计算权重及综合得分
- The difference between SQL Server char nchar varchar and nvarchar
- 【jvm】运算指令
- DVWA range clearance tutorial
- P6183 [USACO10MAR] The Rock Game S
- How to solve the problem of garbled code when installing dependency through NPM or yarn
- Hongmeng system -- Analysis from the perspective of business
- Stop B makes short videos, learns Tiktok to die, learns YouTube to live?
- Number protection AXB function! (essence)
- 我想咨询一下,mysql一个事务对于多张表的更新,怎么保证数据一致性的?
猜你喜欢
Creation and optimization of MySQL index
Ten billion massage machine blue ocean, difficult to be a giant
超越PaLM!北大硕士提出DiVeRSe,全面刷新NLP推理排行榜
Ctfshow web entry command execution
Bugku telnet
Bugku easy_ nbt
Database learning - Database Security
Crud of MySQL
CODING DevSecOps 助力金融企业跑出数字加速度
1330: [example 8.3] minimum steps
随机推荐
Common MySQL interview questions (1) (written MySQL interview questions)
MySQL之CRUD
P6183 [USACO10MAR] The Rock Game S
PHP high concurrency and large traffic solution (PHP interview theory question)
Creation and use of thymeleaf template
复现Thinkphp 2.x 任意代码执行漏洞
Usage and usage instructions of JDBC connection pool
Does maxcompute have SQL that can query the current storage capacity (KB) of the table?
Want to ask the big guy, is there any synchronization from Tencent cloud Mysql to other places? Binlog saved by Tencent cloud MySQL on cos
超越PaLM!北大硕士提出DiVeRSe,全面刷新NLP推理排行榜
First PR notes
亿咖通科技通过ISO27001与ISO21434安全管理体系认证
ICML 2022 | 探索语言模型的最佳架构和训练方法
Visual task scheduling & drag and drop | scalph data integration based on Apache seatunnel
How can the boss choose programmers to help me with development?
Go learning ----- relevant knowledge of JWT
STM32+BH1750光敏传感器获取光照强度
Common interview questions about swoole
easyOCR 字符識別
Ecotone technology has passed ISO27001 and iso21434 safety management system certification