CSDN乘风破浪的 SQL


CSDN乘风破浪的 SQL
本文插图
作者 |不剪发的Tony老师 , 已获授权责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN 博客大家好 , 我是只谈技术不剪发的 Tony 老师 。 最近有一个非常火的综艺节目叫做《乘风破浪的姐姐》 , 邀请了 30 位年龄在 30 岁以上的女艺人 , 通过封闭式训练和考核 , 最终由全民投票选出 5 位成员组成全新女团 。
看了这个节目之后 , 最有感触的不是姐姐们的多才多艺 , 而是她们面对人生的态度和敢于挑战自我的勇气和自信 。 只是对于我来说 , 她们当中很多人应该不是姐姐而是妹妹(一不小心暴露了年龄??) 。
那么 , 这和 SQL 语言有什么关系呢?SQL 由 IBM 于上世纪 70 年代创建 , 如今已经成为了使用最广泛的数据库查询语言 。 不过 , 相信很多人对于 SQL 的理解就是关系数据库 , 就是增删改查;实际上 , SQL 在经历了四十而不惑之后就像“姐姐们”一样成熟而有魅力 , 同时它又敢于在不断变化的产业需求和各种非关系模型的冲击之下实现自我突破 。 因此 , 本文就给大家介绍一下最近几年 SQL 如何在各个领域乘风破浪!
CSDN乘风破浪的 SQL
本文插图
如果你认为 SQL 就是简单的增删改查(INSERT、SELECT、UPDATE、DELETE) , 那么你了解的仅仅是 1992 年的SQL 。
如果你了解通用表表达式(CTE)和递归查询、用户定义类型或者 OLAP 功能 , 那么你使用的是 1999 年的 SQL 。
如果你接触过窗口函数(分析函数)、MERGE(UPSERT)语句或者 XML 数据类型 , 应该知道这些不过是 2003 年的 SQL 。
2006 年的 SQL 已经定义了 SQL 操作 XML 的规范 , 支持使用 XQuery 同时访问 SQL 数据和 XML 文档 。 2008 年又增加了 TRUNCATE TABLE 语句、INSTEAD OF 触发器以及 FETCH 子句等功能 。
2011 年 SQL 最主要的新功能之一就是增强了对时态数据库(Temporal database)的支持 , 可以用于记录那些随着时间而变化的历史数据值 , 应用领域包括金融、保险、预订系统、医疗信息管理系统等 。 目前 , MariaDB、Oracle、PostgreSQL、Microsoft SQL Server 在一定程度上实现了某些时态表功能 , 国内的腾讯 TDSQL 是一个全时态数据库系统 。
时间来到了 2016 年 , SQL 标准又增加了几个重要的功能 , 首先就是对 JSON 文档的支持 。
SQL 与文档数据库
文档数据库属于 NoSQL 的一种 , 具有模式自由的存储特性 , 通常采用 JSON 格式进程数据的存储 。 常用的文档数据库包括 MongoDB、CouchDB 等 。
实际上 , 2016 年 SQL 标准就已经增加了 JSON 功能的支持 , 包括:

  • JSON 对象的存储与检索;
  • 将 JSON 对象表示成 SQL 数据;
  • 将 SQL 数据表示成 JSON 对象 。
这些功能可以表示为以下示意图:
CSDN乘风破浪的 SQL
本文插图
如今 , 主流的关系数据库也都增加了原生 JSON 数据类型和相关函数的支持 , 包括 Oracle、MySQL、SQL Server、PostgreSQL 等 。
CSDN乘风破浪的 SQL
本文插图
我们以 MySQL 为例 , 演示一下如何使用 SQL 查询 JSON 数据 。
select emp_id,emp_info,emp_info->'$.emp_name' emp_name,emp_info->'$.sex' sex,emp_info->>'$.income[0].salary' salaryfrom employee_jsonlimit 3;emp_id|emp_info|emp_name|sex|salary |1|{"sex": "男", "email": "liubei@shuguo.com", "income": [{"salary": 33000.0}, {"bonus": 10000}], "job_id": 1, "dept_id": 1, "manager": null, "emp_name": "刘备", "hire_date": "2000-01-01"}|"刘备" |"男"|33000.0|2|{"sex": "男", "email": "guanyu@shuguo.com", "income": [{"salary": 26000}, {"bonus": 10000}], "job_id": 2, "dept_id": 1, "manager": 1, "emp_name": "关羽", "hire_date": "2000-01-01"} |"关羽" |"男"|26000 |3|{"sex": "男", "email": "zhangfei@shuguo.com", "income": [{"salary": 24000}, {"bonus": 10000}], "job_id": 2, "dept_id": 1, "manager": 1, "emp_name": "张飞", "hire_date": "2000-01-01"} |"张飞" |"男"|24000 |其中 , emp_info 字段类型为 JSON;-> 操作符返回的类型是 JSON , ->> 返回的类型是字符串 , 使用 SQL/JSON 路径表达式获取数据中的元素值;$ 代表整个文档;$.emp_name 表示获取 JSON 对象的 emp_name 元素;$.income[0].salary 表示获取 income 数组中的第一个对象的 salary 元素 , 数组的下标从 0 开始 。


推荐阅读