读mysql8 CookBook的零碎整理4

创建 JSON 数据表

CREATE TABLE emp_details
(
    emp_no int primary key,
    details json
);
-- 插入JSON 数据
INSERT INTO emp_details(emp_no,details)
VALUES ( 
    '1',
    '{
         "location": "IN",
        "phone": "+11800000000",
        "email" : "abc@example. com",
        "address":{ "linel": "abc","line2": "xyz street",
        		   "city": "Bangalore","pin" : "560103"} 
     }'
);

检索JSON:

-- 可以使用->和->>运算符检索JSON列的字段:
SELECT emp_no,details->'$ .address.pin' pin FROM emp_details;
--结果
+------- +----------=+
|  emp_no |   pin     |
+--------+-----------+
|   1     | "560103"  |
+-----—-+—-—-—-—-—---+
-- 如果不用引号检索数据,可以使用->>运算符:
SELECT emp_no,details->>'$.address.pin ' pin FROM emp_details;
+------- +----------=+
|  emp_no |   pin     |
+--------+-----------+
|   1     | 560103    |
+-----—-+—-—-—-—-—---+
    

JSON函数
MySQL提供了许多处理JSON数据的函数,让我们看看最常用的几种函数。优雅浏览

-- 想要以优雅的格式显示JSON值,请使用JSON_PRETTY()函数:
SELECT emp_no,JSON_PRETTY (details)FROM emp_details 
-- 结果:
emp no:1
JSON_PRETTY (details):{
    "email": "abc@example.com",
    "phone" : "+1180000000o",
    "address" :{
        "pin" : "560103",
        "city":"Bangalore",
        "line1" : "abc",
        "line2": "xyz street"
        },
    "location":"IN"
}
--查找: 可以在WHERE子句中使用col->>path运算符来引用JSON的某一列:
SELECT emp_no FROM emp_details WHERE
details->>'$.address.pin'="560103";
--结果:
+-----——+
| emp_no |
+-——-----+
|   1    |
+-——-----+
-- 也可以使用JSON_CONTAINS函数查询数据。如果找到了数据,则返回1,否则返回0:
SELECT JSON_CONTAINS(details->>'$.address.pin ',"560103") FROMemp_details;
-- 结果:
+---------------------------------------------------------+
|    JSON_CONTAINS(details->>'$.address.pin ', "560103")   |
+---------------------------------------------------------+
|                  1                                       |
+---------------------------------------------------------+
-- 如何查询一个 key?假设要检查address.line1是否存在:
SELECT JSON_CONTAINS_PATH(details, 'one', "$.address.line1")FROMemp_details;
-- 结果:
+---------------------------------------------------------+
| JSON_CONTAINS_PATH (details, 'one', "$.address.line1")   |
+---------------------------------------------------------+
|                  1                                       |
+---------------------------------------------------------+
-- 这里,one表示至少应该存在一个键。假设要检查address.line1或者 address.line2是否存在,代码如下:
    SELECT JSON_CONTAINS_PATH (details,'one ',"$.address.line1"," $ .address. line5") FROM emp_details;
-- 结果:
+----------------------------------------------------------------------------+
|JSON_CONTAINS_PATH (details,'one '"$.address.line1","$ .address.line2")   |
+----------------------------------------------------------------------------+
|                                     1                                       |
+----------------------------------------------------------------------------+
-- 如果要检查address.linel和 address.line5是否同时存在,可以使用all,而不是one:
  SELECT JSON_CONTAINS_PATH (details,'all', "$.address.line1","$.address. line5") FROM emp_details;
  -- 结果:
+----------------------------------------------------------------------------+
| JSON_CONTAINS_PATH (details,'all ', "$ .address.line1","$.address.line5")   |
+----------------------------------------------------------------------------+
|                                     0                                       |
+----------------------------------------------------------------------------+

修改
可以使用三种不同的函数来修改数据:JSON_SET () 、JSON_INSERT ()和JsON_REPLACE()。在MySQL8之前的版本中,我们还需要对整个列进行完整的更新,这并不是最佳的方法。
JSON_SET():替换现有值并添加不存在的值。假设要替换员工的pin码,并添加昵称的详细信息,代码如下:

UPDATE
  emp_details
SET
  details = JSON_SET (details, "$.address.pin", "560100""$.nickname", "kai" )
WHERE  emp_no = 1;
-- JSON_INSERT ():插入值,但不替换现有值。
-- 假设你希望添加新列而不更新现有值,则可以使用JSON_INSERT ():
UPDATE 
   emp_details 
SET 
   details=JSON_INSERT (details,"$.address.pin","560132""$.address.line4""A Wing") 
WHERE  emp_no =1;
-- 在这种情况下,pin不会被更新,只会添加一个新的字段address.line4。
-- JSON_REPLACE ():仅替换现有值。
-- 假设只需要替换现有字段,不需要添加新字段,代码如下:
UPDATE 
  emp_details 
SET 
  details=JSON_REPLACE (details,"$ .address.pin""560132","$.address.line5","Landmark") 
WHERE emp_no= l;
    --在这种情况下,line5不会被添加,只有pin会被更新。

删除
JSON_REMOVE能从JSON文档中删除数据。
假设你不再需要地址中的line5,删除它的代码如下:

UPDATE emp_details SET details=JSON_REMOVE(details," $ .address.line5") WHERE emp_no = 1;

其他函数

-- JSON_KEYS():获取JSON文档中的所有键。
mysql>SELECT JSON_KEYS(details)FROM emp_details WHERE emp_no = 1;
JSON_KEYS (details):["email", "phone", "address", "nickname","location" ]
-- JSON LENGTH():给出JSON 文档中的元素数。
mysql> SELECT JSON_LENGTH (details)FROM emp_details WHERE emp_no = 1

CTE函数

-- 非递归使用
WITH cte(archives_code,id) AS (
    SELECT 
        archives_code, 
        id 
    FROM 
    	archives_record 
     WHERE 
     	DEL_FLAG = '0'
    ORDER BY 
    create_time DESC  LIMIT #{from},#{to}
) SELECT t.* FROM  
    	archives_record t,
    	(SELECT id FROM cte) t9
    WHERE t.id = t9.id 

-- 递归使用 通过 code 和 parent_code 查找树数据
with recursive cte as (
   SELECT
         tr.CODE,
         tr.PARENT_CODE
      FROM
         TYPE_RELATION trsdfsdfsdfs
      WHERE  tr.code = #{code}
   UNION all
      SELECT
         tr.CODE,
         tr.PARENT_CODE
      FROM
         TYPE_RELATION tr
         INNER JOIN cte c2 on tr.PARENT_CODE = c2.CODE
   ) select * from cte

1.ROW_NUMBER () OVER ()生成新序列,按照c2排序,生成新序列
(以下参考 https://blog.51cto.com/u_11103985/2341971)
在这里插入图片描述
按照c1分组,c2排序生成序列
在这里插入图片描述

2.cume_dist() OVER ()在某种排序条件下,小于等于当前行值的行数/总行数
按照c1分组,c2排序,求当前行值的行数/总行数
在这里插入图片描述

3.rank() OVER ()类似于row_number() 生成新排序
按照c1分组,c2排序,生成新序列,当两个排序值相同时rank值相同
在这里插入图片描述

4.PERCENT_RANK() OVER ()当前RANK值-1/总行数-1
在这里插入图片描述

5.DENSE_RANK() OVER ()为了解决rank()编号存在的问题的,比如rank值出现两个1,会跳过2,而DENSE_RANK不会
在这里插入图片描述

6.FIRST_VALUE() OVER ()按照某种方式排序,求第一个值
在这里插入图片描述

7.LAST_VALUE() OVER ()按照某种分组排序求最后一个值
在这里插入图片描述

8.NTH_VALUE() OVER ()按某种方式排序求某一行的值
在这里插入图片描述

9.LAG(id) OVER ()按某种方式排序求上一行的值
在这里插入图片描述

10.lead () OVER ()按某种方式排序求下一行的值
在这里插入图片描述

11.将数据按照某些排序分成N组
在这里插入图片描述
先记录到这

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Practice makes a man perfect. But to practice, you need some knowledge and training. This book helps you with that. Most day-to-day and practical scenarios are covered in this book. Chapter 1, MySQL 8 - Installing and Upgrading, describes how to install MySQL 8 on different flavors of Linux, upgrade to MySQL 8 from previous stable releases, and also downgrade from MySQL 8. Chapter 2, Using MySQL, takes you through the basic uses of MySQL, such as creating databases and tables; inserting, updating, deleting, and selecting data in various ways; saving to different destinations; sorting and grouping results; joining tables; managing users; other database elements such as triggers, stored procedures, functions, and events; and getting metadata information. Chapter 3, Using MySQL (Advanced), covers the latest additions to MySQL 8, such as the JSON datatype, common table expressions, and window functions. Chapter 4, Configuring MySQL, shows you how to configure MySQL and basic configuration parameters. Chapter 5, Transactions, explains the four isolation levels of RDBMS and how to use MySQL for transactions. Chapter 6, Binary Logging, demonstrates how to enable binary logging, various formats of binary logs, and how to retrieve data from binary logs. Chapter 7, Backups, covers various types of backups, the pros and cons of each method, and which one to choose based on your requirements. Chapter 8, Restoring Data, covers how to recover data from varies backups. Chapter 9, Replication, explains how to set up various replication topologies. The recipes on switching a slave from master-slave to chain replication and switching a slave from chain replication to master-slave is something that will interest the readers. Chapter 10, Table Maintenance, covers cloning tables. Managing big tables is something that this chapter will make you a maestro of. Installation and usage of third-party tools is also covered in this chapter. Chapter 11, Managing Tablespace, deals with recipes that will teach the readers how to resize, create, copy, and manage tablespaces. Chapter 12, Managing Logs, takes readers through error, general query, slow query, and binary logs. Chapter 13, Performance Tuning, explains query and schema tuning in detail. There are ample recipes in the chapter that will cover this. Chapter 14, Security, focuses on the aspects of security. Recipes on securing installation, restricting networks and users, setting and resetting of passwords, and much more in covered are detail.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值