openGauss学习笔记-46 openGauss 高级数据管理-子查询

文章目录

    • openGauss学习笔记-46 openGauss 高级数据管理-子查询
      • 46.1 SELECT语句中的子查询使用
      • 46.2 INSERT语句中的子查询使用
      • 46.3 UPDATE语句中的子查询使用
      • 46.4 DELETE语句中的子查询使用

openGauss学习笔记-46 openGauss 高级数据管理-子查询

子查询或称为内部查询,嵌套查询,指的是在数据库查询的WHERE子句中嵌入查询语句,相当于临时表。一个SELECT语句的查询结果能够作为另一个语句的输入值。

子查询可以与SELECT,INSERT,UPDATE和DELETE语句一起使用。

以下是子查询必须遵守的几个规则:

  • 子查询必须用括号括起来。
  • 子查询在SELECT子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较。
  • ORDER BY不能用在子查询中,虽然主查询可以使用ORDER BY。可以在子查询中使用GROUP BY,功能与ORDER BY相同。
  • 子查询返回多于一行,只能与多值运算符一起使用,如IN运算符。
  • BETWEEN运算符不能与子查询一起使用,但是,BETWEEN可在子查询内部使用。

46.1 SELECT语句中的子查询使用

SELECT语句在子查询返回的数据中进行查询。基本语法如下:

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR(SELECT column_name [, column_name ]FROM table1 [, table2 ][WHERE]);

示例:

创建表customer,数据内容如下。

openGauss=# SELECT * FROM customer_t1;c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------3869 | hello         | Grace        |             |   10003869 |               | Grace        |             |3869 | hello         |              |             |6985 | maps          | Joes         |             |   22009976 | world         | James        |             |   50004421 | Admin         | Local        |             |   3000
(6 rows)

在SELECT中使用子查询,语句如下。

openGauss=# SELECT * FROM customer_t1 WHERE c_customer_sk IN (SELECT c_customer_sk FROM customer_t1 WHERE amount > 2500) ;c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------9976 | world         | James        |             |   50004421 | Admin         | Local        |             |   3000
(2 rows)

46.2 INSERT语句中的子查询使用

子查询也可以与INSERT语句一起使用。INSERT语句使用子查询返回的数据插入到另一个表中。基本语法如下:

INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ] ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]

示例:

创建表customer_bak,表结构与customer_t1一致。

openGauss=# CREATE TABLE customer_bak
(c_customer_sk             integer,c_customer_id             char(5),c_first_name              char(6),c_last_name               char(8),Amount                    integer
);
CREATE TABLE

将表customer_t1中的数据插入customer_bak。

openGauss=# INSERT INTO customer_bak SELECT * FROM customer_t1  WHERE c_customer_sk  IN (SELECT c_customer_sk  FROM customer_t1) ;
INSERT 0 6

插入数据后的customer_bak的表如下:

openGauss=# SELECT * FROM customer_bak;c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------3869 | hello         | Grace        |             |   10003869 |               | Grace        |             |3869 | hello         |              |             |6985 | maps          | Joes         |             |   22009976 | world         | James        |             |   50004421 | Admin         | Local        |             |   3000
(6 rows)

46.3 UPDATE语句中的子查询使用

通过UPDATE语句使用子查询时,表中多个列被更新。基本语法如下:

UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ](SELECT COLUMN_NAMEFROM TABLE_NAME[ WHERE ])

示例:

把表customer_t1中所有c_customer_sk大于4000的客户的amount更新为原来的0.50倍:

openGauss=# UPDATE customer_t1 SET amount = amount * 0.50 WHERE c_customer_sk IN (SELECT c_customer_sk FROM customer_bak WHERE c_customer_sk > 5000 );
UPDATE 2

更新影响2行,更新后表customer_t1数据如下:

openGauss=# SELECT *  FROM  customer_t1;c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------3869 | hello         | Grace        |             |   10003869 |               | Grace        |             |3869 | hello         |              |             |4421 | Admin         | Local        |             |   30006985 | maps          | Joes         |             |   11009976 | world         | James        |             |   2500
(6 rows)

46.4 DELETE语句中的子查询使用

基本语法如下:

DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ](SELECT COLUMN_NAMEFROM TABLE_NAME[ WHERE ])

示例:

删除表customer_t1中所有c_customer_sk大于4000的客户:

openGauss=# DELETE FROM customer_t1 WHERE c_customer_sk IN (SELECT c_customer_sk FROM customer_bak WHERE  c_customer_sk > 5000 );
DELETE 2

删除影响2行,删除后的表customer_t1数据如下:

openGauss=# SELECT *  FROM  customer_t1;c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------3869 | hello         | Grace        |             |   10003869 |               | Grace        |             |3869 | hello         |              |             |4421 | Admin         | Local        |             |   3000
(4 rows)

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/76812.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【广州华锐视点】VR线上教学资源平台提供定制化虚拟现实学习内容

虚拟现实(VR)技术的出现为我们提供了一种全新的在线教学方式。由广州华锐视点开发的VR线上教学资源平台,作为一个综合性的学习工具,正在教育领域迅速发展,并被越来越多的教育机构和学生所接受。那么,VR线上…

Redis缓存问题(穿透, 击穿, 雪崩, 污染, 一致性)

目录 1.什么是Redis缓存问题? 2.缓存穿透 3.缓存击穿 4.缓存雪崩 5.缓存污染(或满了) 5.1 最大缓存设置多大 5.2 缓存淘汰策略 6.数据库和缓存一致性 6.1 4种相关模式 6.2 方案:队列重试机制 6.3 方案:异步更新缓…

图数据库_Neo4j学习cypher语言_使用CQL_构建明星关系图谱_导入明星数据_导入明星关系数据_创建明星关系---Neo4j图数据库工作笔记0009

首先找到明星数据 可以看到有一个sheet1,是,记录了所有的关系的数据 然后比如我们搜索一个撒贝宁,可以看到撒贝宁的数据 然后这个是构建的CQL语句 首先我们先去启动服务 neo4j console 然后我们再来看一下以前导入的,可以看到导入很简单, 就是上面有CQL 看一下节点的属性

【Linux命令行与Shell脚本编程】第二十章 sed进阶

Linux命令行与Shell脚本编程 第二十章 sed进阶 文章目录 Linux命令行与Shell脚本编程十.sed进阶10.1.多行命令(nNDP)10.1.1.next命令10.1.1.1.单行next命令n10.1.1.2.合并文本行N 10.1.2.多行删除命令D10.1.3.多行打印命令P 10.2.保留空间(hHgGx)10.3.排除命令(!)10.4.改变执行…

使用本地电脑搭建可以远程访问的SFTP服务器

文章目录 1. 搭建SFTP服务器1.1 下载 freesshd 服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2. 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内网连接测试成功 3. 使用cpolar内网穿透3.1 创建SFTP隧道3.2 查看在线隧道列表 4. 使用SFTP客户端&#x…

使用 OpenTelemetry 构建可观测性 04 - 收集器

在之前的博文中,我们讨论了如何使用 SDK 和链路追踪生产者来导出进程中的遥测数据。尽管有多种类型的导出器可供选择,但其中一个常见的目标是将数据导出到 OpenTelemetry Collector。本篇文章将深入探讨收集器以及如何使用它。 选 OTel Collector 还是…

(一)Dubbo源码解析:增强SPI

〇、前言 在Dubbo的架构设计中,如何可以通过“类插拔”的方式,对其功能进行灵活的扩展或者削弱,那么,SPI起到了极其关键的作用。本篇文章作为分析Dubbo源码的第一篇文章,我们先暂时放下“服务注册发布流程”、“服务启…

【蛋白-蛋白】Rosetta InterfaceAnalyzer 学习笔记

Rosetta InterfaceAnalyzer是一种用于分析蛋白质相互作用界面的工具,可以计算结合能、埋藏界面表面积、包装统计数据和其他有用的界面指标。 这里以(PDB:3R2X)为例,介绍如何利用Rosetta中InterfaceAnalyzer来快速分析蛋白-蛋白相互作用,并提…

SHELL 基础 显示字符颜色, 修改历史命令,Linux里的命令 执行顺序

echo 打印命令 : 显示字符串 : [rootserver ~]# echo this is SHELL language this is SHELL language [rootserver ~]# echo this is SHELL language this is SHELL language [rootserver ~]# echo "this is SHELL language" this is SH…

飞机打方块(二)游戏界面制作

一、背景 1.新建bg节点 二、飞机节点功能实现 1.移动 1.新建plane节点 2.新建脚本GameController.ts,并绑定Canvas GameControll.ts const { ccclass, property } cc._decorator;ccclass export default class NewClass extends cc.Component {property(cc.Node)canvas:…

badgerdb里面的事务

事务的ACID A 原子性(Atomicity) 多步骤操作,只能是两种状态,要么所有的步骤都成功执行,要么所有的步骤都不执行,举例说明就是小明向小红转账30元的场景,拆分成两个步骤,步骤1&#…

Redis原理剖析

一、Redis简介 Redis是一个开源的,基于网络的,高性能的key-value数据库,弥补了memcached这类key-value存储的不足,在部分场合可以对关系数据库起到很好的补充作用,满足实时的高并发需求。 Redis跟memcached类似&#…