首页 > 其他分享 >openGauss学习笔记-46 openGauss 高级数据管理-子查询

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

时间:2023-08-21 19:01:56浏览次数:38  
标签:customer name 46 查询 sk 数据管理 openGauss WHERE SELECT

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        |             |   1000
          3869 |               | Grace        |             |
          3869 | hello         |              |             |
          6985 | maps          | Joes         |             |   2200
          9976 | world         | James        |             |   5000
          4421 | 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        |             |   5000
          4421 | 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        |             |   1000
          3869 |               | Grace        |             |
          3869 | hello         |              |             |
          6985 | maps          | Joes         |             |   2200
          9976 | world         | James        |             |   5000
          4421 | Admin         | Local        |             |   3000
(6 rows)

46.3 UPDATE语句中的子查询使用

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

UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM 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        |             |   1000
          3869 |               | Grace        |             |
          3869 | hello         |              |             |
          4421 | Admin         | Local        |             |   3000
          6985 | maps          | Joes         |             |   1100
          9976 | world         | James        |             |   2500
(6 rows)

46.4 DELETE语句中的子查询使用

基本语法如下:

DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM 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        |             |   1000
          3869 |               | Grace        |             |
          3869 | hello         |              |             |
          4421 | Admin         | Local        |             |   3000
(4 rows)

标签:customer,name,46,查询,sk,数据管理,openGauss,WHERE,SELECT
From: https://blog.51cto.com/shuchaoyang/7178542

相关文章

  • SpringBoot复习:(46)全局的bean懒加载是怎么实现的?
    在application.properties中配置:spring.main.lazy-initialization=true在运行SpringApplication的run方法时,代码如下:其中调用了prepareContext,prepareContext代码如下:当在配置文件中配置了spring.main.lazy-initializatinotallow=true后,SpringApplication实例的this.lazyInitial......
  • 记一次CMS GC耗时46.6秒的排查过程与解决方法
    「早上7.16分左右」 ,有个服务发生了紧急告警,很多接口超时,出于 「客户的投诉」 和老板的给出的压力,我开始了排查之旅~~~❝【排查到最后发现,并不是这些超时的接口都有问题,而是 「其中某一个接口影响了整个服务」,只要是这个服务上的接口,都有可能超时、异常、等不正常现象】❞看下......
  • 杭电ACM HDU 3346 Lucky Number
    LuckyNumberTimeLimit:2000/1000MS(Java/Others)   MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):1523   AcceptedSubmission(s):800ProblemDescriptionToChinesepeople,8isaluckynumber.Nowyourtaskistojudgeifanu......
  • Docker 的数据管理
    目录一、管理Docker容器中的数据1.数据卷2.数据卷容器二、容器互联三、Docker镜像创建1.基于已有镜像创建2.基于本地模板创建3.基于Dockerfile创建(1)联合文件系统(UnionFS)(2)镜像加载原理一、管理Docker容器中的数据管理Docker容器中数据主要有两种方式:数据卷(DataVolum......
  • COMP4650 文档分析
    COMP4650COMP4650/6490DocumentAnalysis–Semester2/2023Assignment1Due17:00onWednesday16August2023AEST(UTC+10)LastupdatedJuly28,2023OverviewInthisassignment,yourtaskistoimplementabasicbooleanandrankedinformationretrieval(IR......
  • openGauss学习笔记-45 openGauss 高级数据管理-物化视图
    openGauss学习笔记-45openGauss高级数据管理-物化视图物化视图是相对普通视图而言的。普通视图是虚拟表,而物化视图实际上就是存储SQL执行语句的结果,可以直接使用数据而不用重复执行查询语句,从而提升性能。按照刷新方式物化视图分为两种:全量物化视图:仅支持对已创建的物化视图......
  • Leetcode 146 LRUCache
    /***Copyright(C)2023-08-1813:51zxinlog<[email protected]>**/#include<func.h>#defineN1000//普通NodetypedefstructNode{intkey;intvalue;structNode*prev;structNode*next;}Node;//定义HashNodetyped......
  • openGauss学习笔记-44 openGauss 高级数据管理-存储过程
    openGauss学习笔记-44openGauss高级数据管理-存储过程存储过程是能够完成特定功能的SQL语句集。用户可以进行反复调用,从而减少SQL语句的重复编写数量,提高工作效率。44.1语法格式创建存储过程CREATEPROCEDUREprocedure_name[({[argname][argmode]argtype[......
  • openGauss学习笔记-43 openGauss 高级数据管理-事件触发器
    openGauss学习笔记-43openGauss高级数据管理-事件触发器触发器会在指定的ddl事件发生时自动执行函数。目前事件触发器仅在PG兼容模式下可用。43.1语法格式创建事件触发器。CREATEEVENTTRIGGERnameONevent[WHENfilter_variableIN(filter_value[,...])......
  • sol. ABC246Ex
    动态DP模板题[ABC246Ex]01?Queries题目大意:给定一个长度为\(N\)且只包含?,1,0的字符串\(a\)。\(Q\)次操作,每次操作会修改字符串中的一个字符,并求出此时整个字符串中本质不同的子序列个数。众所周知,动态DP依然是DP的一种。先考虑没有修改操作,那么本题变为一个普......