首页 > 数据库 >【SQL练习】demo1

【SQL练习】demo1

时间:2024-08-28 15:16:39浏览次数:14  
标签:info salary name 练习 JSON demo1 emp SQL

为了适应技术发展的需求,SQL 标准于 2016 年增加了以下 JSON 功能:

JSON 对象的存储与检索。

将 JSON 对象表示成 SQL 数据。

将 SQL 数据表示成 JSON 对象。

如今,主流关系型数据库都增加了原生 JSON 数据类型和相关函数的支持,使得我们可以将 SQL 的强大功能与 JSON 文档存储的灵活性相结合。当我们需要为应用程序增加文档存储功能时,可以考虑直接在现有的关系型数据库中使用 JSON 数据类型。

以下是一个使用 JSON 字段存储员工信息的示例:

Oracle 21c

CREATE TABLE employee_json(
  emp_id    INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  emp_info  JSON NOT NULL
);

MySQL

CREATE TABLE employee_json(
  emp_id    INTEGER AUTO_INCREMENT PRIMARY KEY,
  emp_info  JSON NOT NULL
);

Microsoft SQL Server

CREATE TABLE employee_json(
  emp_id    INTEGER IDENTITY PRIMARY KEY,
  emp_info  VARCHAR(MAX) NOT NULL CHECK ( ISJSON(emp_info)>0 )
);

PostgreSQL

CREATE TABLE employee_json(
  emp_id    INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  emp_info  JSONB NOT NULL
);

SQLite

CREATE TABLE employee_json(
  emp_id    INTEGER PRIMARY KEY,
  emp_info  TEXT NOT NULL CHECK ( JSON_VALID(emp_info)=1 )
);

我们可以使用 INSERT 语句将文本数据插入 JSON 字段:

INSERT INTO employee_json(emp_info)
VALUES ('{"emp_name": "刘备", "sex": "男", "dept_id": 1, "manager": null, "hire_date": "2000-01-01", "job_id": 1, "income": [{"salary":30000}, {"bonus": 10000}], "email": "[email protected]"}');

其中,income节点是一个数组,包含了salary和bonus两个对象。

使用 SQL 语句查询 JSON 字段的方式与普通字段相同,SQL 标准使用 JSON_VALUE 函数查询 JSON 元素的值,使用 JSON_QUERY 函数查询元素中的对象和数组。

例如,以下语句从 emp_info 字段中获取员工的姓名和月薪:

Oracle和Microsoft SQL Server

SELECT emp_id,
       JSON_VALUE(emp_info, '$.emp_name') emp_name,
       JSON_VALUE(emp_info, '$.income[0].salary') salary,
       JSON_VALUE(JSON_QUERY(emp_info, '$.income[0]'),'$.salary') salary
FROM employee_json
WHERE JSON_VALUE(emp_info, '$.emp_name') = '刘备';
emp_id|emp_name|salary|salary
------|--------|------|------
      1|刘备      |30000 |30000 

MySQL和SQLite

SELECT emp_id,
       JSON_EXTRACT(emp_info, '$.emp_name') emp_name,
       JSON_EXTRACT(emp_info, '$.income[0].salary') salary
FROM employee_json
WHERE JSON_EXTRACT(emp_info, '$.emp_name') = '刘备';
# MySQL
emp_id|emp_name|salary
------|--------|------
      1|"刘备"   |30000
# SQLite
emp_id|emp_name|salary
------|--------|------
      1|刘备      | 30000

PostgreSQL

SELECT emp_id,
       JSONB_EXTRACT_PATH_TEXT(emp_info, 'emp_name') emp_name,
       JSONB_EXTRACT_PATH_TEXT(emp_info, 'income', '0', 'salary') salary 
FROM employee_json
WHERE JSONB_EXTRACT_PATH_TEXT(emp_info, 'emp_name') = '刘备';
emp_id|emp_name|salary
------|--------|------
      1|刘备      |30000 

SQL 标准还定义了各种操作 JSON 数据的函数,具体可以参考特定数据库的实现。

2019 年 9 月 17 图形查询语言(GQL)成为了继 SQL 之后另一种新的 ISO 标准数据库查询语言。
同时,最新的 SQL:2023 中增加的一个全新部分:Property Graph Queries (SQL/PGQ)。这个新功能支持使用图数据库的方式查询表中的数据。

参考

标签:info,salary,name,练习,JSON,demo1,emp,SQL
From: https://www.cnblogs.com/o-O-oO/p/18384724

相关文章

  • MySQL写操作所加的锁
    写操作所加的锁:DELETE:对一条记录做DELETE操作的过程其实是先在B+树中定位到这条记录的位置,然后获取这条记录的X锁,然后再执行deletemark操作。UPDATE:①如果未修改该记录的键值并且被更新的列占用的存储空间在修改前后未发生变化,则先在B+树中定位到这条记录的位置,然后再获......
  • 前后端不分离 "老" 项目,SQL 注入漏洞处理实践
    前言接上篇的XSS漏洞处理实践,这次是针对SQL注入漏洞的处理实践。我们的后端代码,在项目初期没有使用世面上的ORM框架,而是使用spring的JdbcTemplate简单的封装了增删改查的DAO方法。然后暴露一通用的Controller层接口,这样无论是前端还是后端都更加“方便了”!前端可......
  • MySQL:简述对索引的认识
    一、为什么要有索引?一般的应用系统,读操作的比例远远大于写操作的比例,而且插入操作和一般的更新操作很少出现性能问题。在生产环境中,我们遇到最多的,也是最容易出现性能问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起查询优化,就不得不提到索引了。......
  • Windows系统安装MySQL
    下载MySQL打开网址MySQL::DownloadMySQLCommunityServer点击图下所示位置Download进入图下所示界面,点击图下所示位置不登录下载已下载完成安装MySQL将下载好的压缩包解压到一个专门的位置,该软件为绿色版软件,解压即可使用配置环境变量我们想要让MySQL可以在wind......
  • 给自己复盘的随想录笔记-链表练习题(在整理ing)
    删除链表的倒数第N个节点双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。思路是这样的,但要注意一些细节。分为如下几步:推荐大家使用虚拟头结点,这样方便处理删除实际头结点的逻辑,定......
  • 【MySQL】mysql索引和事务(面试经典问题)
    欢迎关注个人主页:逸狼创造不易,可以点点赞吗~如有错误,欢迎指出~目录mysql索引代价查看索引创建索引 删除索引索引背后的数据结构B树B+树B+树与B树的区别B+树的优势mysql事务 事务涉及的四个核心特性:隔离性详细解释脏读不可重复读幻读隔离性的四......
  • postgresql下Schema和DataBase
    database—>schema—>table1.同一个实例下,不同database是不能相互访问的,即独立的。2.同一个数据库,不同模式下的表是可以相互访问,即可共享的3.不同模式下,表名可以是一样。也就是表在模式下是独立。##授权某个库下的某个模式下有创建表的权限grantcreateondatabasedb_na......
  • sqlserver调优的相关查询
    SQLServer系统卡顿可能由多种原因引起,如硬件资源不足、查询性能问题、锁争用、并发连接过多等。以下是一些排查和优化步骤:1.检查硬件资源CPU使用率:检查SQLServer的CPU使用情况,特别是是否有单个查询占用了过多的CPU资源。使用TaskManager或PerformanceMonitor查......
  • js练习--用户管理API
    需要node.js运行环境,创建2个文件:user.js,server.jsuser.js:letusers={};module.exports=users;server.js:consthttp=require('http');//导入user模块letusers=require('./user');//创建HTTP服务器constserver=http.createServer((req,res)=......
  • ZoneMinder视频监控系统SQL注入
    0x01漏洞描述:ZoneMinder(简称ZM)是一套基于Linux操作系统的摄像机的视像数据监控的应用软件(大家可以简单理解为网络摄像机)。ZoneMinder支持单一或多台视像镜头应用,包括摄取、分析、记录(包括移动侦测功能)、和监视来源。index.php接口处存在sql注入,未经身份验证的远程攻击者除......