树叶云OceanBase教程:OceanBase SELECT

SELECT​ 的语法相对比较复杂。本节首先会介绍 ​SIMPLE SELECT​ 语法结构,然后介绍集合类 ​SELECT​ 的语法结构,最后介绍带有 ​with clause​ 的 ​SELECT​。

SIMPLE SELECT

描述

该语句用于查询表中的内容。

格式


simple_select:
SELECT [/*+ hint statement */] [DISTINCT | UNIQUE | ALL] 
    select_expr_list FROM from_list [WHERE condition] 
  [GROUP BY group_expression_list] [ROLLUP group_expression_list] [HAVING condition]]
  [ORDER BY order_expression_list]
  [FOR UPDATE [OF column] [ {NOWAIT | WAIT integer | SKIP LOCKED } ] ]

select_expr:
    table_name.*
  | table_alias_name.*
  | expr [[AS] column_alias_name]
  
from_list:
    table_reference [, table_reference ...]

table_reference:
      simple_table
    | joined_table

simple_table:
    table_factor [partition_option] [[AS] table_alias_name]
    | (select_stmt) [AS] table_alias_name
    | (table_reference_list)

joined_table:
      table_reference [INNER] JOIN simple_table [join_condition]
    | table_reference outer_join_type JOIN simple_table join_condition

partition_option:
    PARTITION (partition_name_list)

partition_name_list:
    partition_name [, partition_name ...]

outer_join_type:
    {LEFT | RIGHT | FULL} [OUTER]

join_condition:
    ON expression

condition:
    expression

group_expression_list:
    group_expression [, group_expression ...]

group_expression:
    expression [ASC | DESC]

order_expression_list:
    order_expression [, order_expression ...]

order_expression:
    expression [ASC | DESC]

参数解释

参数

描述

DISTINCT | UNIQUE | ALL

在数据库表中,可能会包含重复值。

  • 指定“DISTINCT”,则在查询结果中相同的行只显示一行。

  • 指定 “UNIQUE”,则在查询结果中相同的行只显示一行。

  • 指定“ALL”,则在查询结果中显示所有的行(包含重复),默认为 ALL。

select_expr

列出要查询的表达式或列名,用“,”隔开。也可以用“*”表示所有列。

AS othername

为输出字段重新命名。

FROM table_references

指名了从哪个表或哪些表中读取数据(支持多表查询)。

WHERE where_conditions

可选项,WHERE子句用来设置一个筛选条件,查询结果中仅包含满足条件的数据。where_conditions 为表达式。

GROUP BY group_by_list

按一些字段进行分组,产生统计值。

ROLLUP group_expression_list

合并 Group By 的分组,产生统计值。

HAVING search_confitions

HAVING子句与WHERE子句类似,但是HAVING子句可以使用累计函数(如 SUM、AVG 等)。

ORDER BY order_list

order_list :

colname [ASC | DESC] [,colname [ASC | DESC]…]

用来按升序(ASC)或者降序(DESC)显示查询结果。不指定 ASC 或者 DESC 时,默认为 ASC。

FOR UPDATE

对查询结果所有行上排他锁,以阻止其他事务的并发修改,或阻止在某些事务隔离级别时的并发读取。

  • OF column​:对于多表 Join 的场景,使用该子句可以指示仅锁定某些表(即 column 指定列所在的表)的查询结果行。
  • WAIT​:等待 Interger 时间后再对查询结果行尝试加锁,如果查询结果行中已经有被其他会话加锁的行,则执行失败。
  • NOWAIT​:立即对查询结果行尝试加锁如果查询结果行中已经有被其他会话加锁的行,则执行失败。
  • SKIP LOCKED​:如果查询结果中已经有被其他会话加锁的行,则会跳过这些加锁行,返回未被加锁的行。

说明 SKIP LOCKED 暂不支持多表 JOIN 加锁的场景。

PARTITION(partition_list)

指定查询表的分区信息。例如:partition(p0,p1…)

示例

以如下表 ​a​ 为例。


CREATE TABLE a (id INT,name VARCHAR(10),num INT);
INSERT INTO a VALUES (1, 'a',100);
INSERT INTO a VALUES (2, 'b',200);
INSERT INTO a VALUES (3, 'a',50);
  • 从表a中读取name数据。
    obclient> SELECT name FROM a; 
    +------+
    | NAME |
    +------+
    | a    | 
    | b    | 
    | a    | 
    +------+ 
    3 rows in set (0.00 sec)
  • 在查询结果中对name进行去重处理。
    obclient> SELECT DISTINCT name FROM a;
    +------+
    | NAME | 
    +------+ 
    | a    | 
    | b    | 
    +------+ 
    2 rows in set (0.00 sec)
  • 从表​a​中查询 ​id​、​name​和​num​,然后把​num​列除以 2 输出,输出的列名为​avg​。
    obclient> SELECT id, name, num/2 AS avg FROM a; 
    +----+------+------+ 
    | ID | NAME | AVG  | 
    +----+------+------+ 
    | 1 | a     |  50  | 
    | 2 | b     | 100  | 
    | 3 | a     | 25   | 
    +----+------+------+ 
    3 rows in set (0.00 sec)
  • 从表​a​中根据筛选条件“ name = ‘a’ ”,输出对应的​id​ 、​name​和​num​ 。
    obclient> SELECT id, name, num FROM a WHERE name = 'a'; 
    +----+------+------+ 
    | ID | NAME | NUM  | 
    +----+------+------+ 
    | 1  | a    | 100  | 
    | 3  | a    | 50   | 
    +----+------+------+ 
    2 rows in set (0.00 sec)
  • 从表​a​中查询​name​,按照​name​分组对​num​求和,并输出。
    obclient> SELECT id, name, num FROM a WHERE name = 'a';
    +----+------+------+ 
    | ID | NAME | NUM  | 
    +----+------+------+ 
    | 1  | a    | 100  | 
    | 3  | a    | 50   | 
    +----+------+------+ 
    2 rows in set (0.00 sec)
  • 从表​a​中查询​name​,按照​name​分组对​num​求和,查询​num​总和小于 160 的行,并输出。
    obclient> SELECT name, SUM(num) as sum FROM a GROUP BY name HAVING SUM(num) < 160; 
    +------+------+ 
    | NAME | SUM  | 
    +------+------+ 
    |  a   | 150  | 
    +------+------+ 
    1 row in set (0.00 sec)
  • 从表​a​中查询​id​、​name​和​num​,根据​num​按升序(ASC)输出查询结果。
    obclient> SELECT * FROM a ORDER BY num ASC; 
    +----+------+-----+ 
    | ID | NAME | NUM | 
    +----+------+-----+ 
    | 3  | a    | 50  | 
    | 1  | a    | 100 | 
    | 2  | b    | 200 | 
    +----+------+------+ 
    3 rows in set (0.00 sec)
  • 从表​a​中查询​id​、​name​和​num​,根据​num​按降序(DESC)输出查询结果。
    obclient> SELECT * FROM a ORDER BY num DESC; 
    +----+------+------+ 
    | ID | NAME | NUM  | 
    +----+------+------+ 
    | 2  |  b   | 200  | 
    | 1  |  a   | 100  | 
    | 3  |  a   | 50   | 
    +----+------+------+ 
    3 rows in set (0.00 sec)
  • 从表a中查询指定id的行,并使用FOR UPDATE子句把查询结果行进行锁定。
    /* 在会话 1 中查询表 a 中 id=1 的行并锁定 */ 
    obclient> SELECT * FROM a WHERE id=1 FOR UPDATE; 
    +------+------+------+ 
    | ID   | NAME | NUM  | 
    +------+------+------+ 
    | 1    | a    | 100  | 
    +------+------+------+ 
    1 row in set (0.01 sec) 
    
    /* 在会话 2 中查询表 a 中 id=1 或 id=2 的行并锁定 */ 
    obclient> SELECT * FROM a WHERE id=1 or id=2 FOR UPDATE; 
    ORA-30006: resource busy; acquire with WAIT timeout expired 
    
    obclient> SELECT * FROM a WHERE id=1 or id=2 FOR UPDATE SKIP LOCKED; 
    +------+------+------+ 
    | ID   | NAME | NUM  | 
    +------+------+------+ 
    | 2    | b    | 200  | 
    +------+------+------+ 
    1 row in set (0.01 sec)

集合类 SELECT

描述

该语句用于对多个​SELECT​查询的结果进行​UNION​、​MINUS​、​INTERSECT​。

格式


select_clause_set:
  simple_select [ UNION | UNION ALL |  | INTERSECT] select_clause_set_right
  [ORDER BY sort_list_columns]

select_clause_set_right:
  simple_select | 
  select_caluse_set

参数解释

参数

描述

UNION ALL

合并两个查询的结果

UNION

合并两个查询的结果,并去重

MINUS

从左查询结果集中去重出现在右查询中的结果,并去重

INTERSECT

保留左查询结果集中出现在右查询中的结果,并去重

示例

以如下两表的数据为例:


CREATE TABLE t1 (c1 INT, c2 INT);
CREATE TABLE t2 (c1 INT, c2 INT);
INSERT INTO t1 VALUES (1, -1), (2, -2);
INSERT INTO t2 VALUES (1, 1), (2, -2), (3, 3);
  • 计算​t1​、​t2​的所有的记录
    obclient>SELECT c1, c2 FROM t1 UNION ALL SELECT c1, c2 FROM t2; 
    +------+------+ 
    | C1   | C2   | 
    +------+------+ 
    | 1    | -1   | 
    | 2    | -2   | 
    | 1    | 1    | 
    | 2    | -2   | 
    | 3    | 3    | 
    +------+------+ 
    5 rows in set (0.01 sec)
  • 计算​t1​、​t2​的去重后的所有记录
    obclient>SELECT c1, c2 FROM t1 UNION SELECT c1, c2 FROM t2; 
    +------+------+ 
    |  C1  |  C2  | 
    +------+------+ 
    |  1   |  -1  | 
    |  2   |  -2  | 
    |  1   |   1  | 
    |  3   |   3  | 
    +------+------+ 
    4 rows in set (0.01 sec)
  • 计算​t1​和​t2​的交集
    SELECT c1, c2 FROM t1 INTERSECT SELECT c1, c2 FROM t2; 
    +------+------+ 
    |  C1  |  C2  | 
    +------+------+ 
    |  2   |  -2  | 
    +------+------+
  • 计算​t1​和​t2​的差集
    obclient>SELECT c1, c2 FROM t1 INTERSECT SELECT c1, c2 FROM t2; 
    +------+------+ 
    |  C1  |  C2  | 
    +------+------+ 
    |   2  |  -2  | 
    +------+------+

带有 with clause 的 SELECT

描述

如果查询语句中有多个相同的子查询,可以把相同的子查询放在​with clause​作为公共表达式,在主体查询中直接引用即可。

格式


with_clause_select:
    with_clause simple_select

with_clause:
    WITH table_name [opt_column_alias_name_list] AS ( select_clause )

select_clause:
    simple_select | select_clause_set
  
opt_column_alias_name_list:
    (column_name_list)
  
column_name_list:
    column_name | column_name , column_name_list

参数解释

示例

以如下表格数据和​SELECT​查询为例。


CREATE TABLE t1(c1 INT, c2 INT, c3 INT);
CREATE TABLE t2(c1 INT);
INSERT INTO t1 VALUES(1,1,1);
INSERT INTO t1 VALUES(2,2,2);
INSERT INTO t1 VALUES(3,3,3);
INSERT INTO t2 VALUES(4);

obclient>SELECT * FROM t1 WHERE c1 > (SELECT COUNT(*) FROM t2)
                      AND c2 > (SELECT COUNT(*) FROM t2)
                      AND c3 > (SELECT COUNT(*) FROM t2);
+------+------+------+
| C1   | C2   | C3   |
+------+------+------+
|    2 |    2 |    2 |
|    3 |    3 |    3 |
+------+------+------+
2 rows in set (0.01 sec)

可以抽取相同子查询为​with clause​:


obclient>WITH TEMP(cnt) AS (SELECT COUNT(*) FROM t2)
      SELECT t1.* FROM t1, temp WHERE c1 > temp.cnt AND c2 > temp.cnt 
      AND c3 > temp.cnt;
+------+------+------+
| C1   | C2   | C3   |
+------+------+------+
|    2 |    2 |    2 |
|    3 |    3 |    3 |
+------+------+------+
2 rows in set (0.00 sec)

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/231841.html<

(0)
管理的头像管理
上一篇2025-04-19 21:35
下一篇 2025-04-19 21:37

相关推荐

  • 骨干网络体系结构能干什么?骨干网络体系结构的作用

    骨干网络体系结构是现代信息社会的“超级高速公路网”,它通过分层设计、冗余备份和智能调度,确保海量数据在全球范围内高速、稳定、安全地传输,是支撑云计算、物联网及人工智能应用的底层基石,想象一下,如果你把互联网比作一个巨大的城市交通系统,那么骨干网络就是连接各个城市的主干道和立交桥,没有它,你的每一次微信发送、每一……

    2026-06-18
    0
  • 高io数据库可以干什么用?高io数据库适合什么场景

    高IO数据库的核心价值在于通过极高的读写吞吐量,解决海量数据场景下的性能瓶颈,是支撑高并发交易、实时分析及大规模内容分发的关键基础设施,在数字化转型的深水区,数据不再仅仅是静态的记录,而是流动的资产,传统的机械硬盘或普通SSD早已无法满足现代应用对速度的极致追求,高IO(Input/Output)数据库,就是那……

    2026-06-18
    0
  • 高io服务器性能如何?高io服务器适合什么场景

    高IO服务器并非单纯指代某种硬件,而是指在随机读写、高并发连接及小文件处理场景下,具备极致IOPS(每秒输入输出操作次数)和低延迟特性的计算资源,它是支撑现代高并发应用稳定运行的核心基石,在2026年的数字化浪潮中,业务负载早已从简单的静态页面展示演变为复杂的实时数据处理,许多开发者在排查系统瓶颈时,往往忽略了……

    2026-06-18
    0
  • 隔离网络空间哪里便宜?国内隔离网络空间价格

    隔离网络空间并没有统一的“便宜”标准,其成本高度取决于物理隔离等级、带宽需求及安全合规要求,通常物理网闸方案初期投入较高但长期运维成本低,而逻辑隔离方案虽初期便宜但存在潜在安全风险,建议根据业务敏感度选择混合隔离架构以平衡成本与安全,在数字化时代,企业构建独立网络环境的需求日益增长,但“隔离网络空间哪里便宜”这……

    2026-06-18
    0
  • 骨干网络体系结构设备为何故障?常见原因有哪些

    骨干网络体系结构设备故障的核心原因通常归结为硬件老化、配置错误、物理链路中断及外部攻击四大类,其中电源模块失效与光模块性能衰减是占比最高的隐性故障源,骨干网作为数字经济的“大动脉”,其稳定性直接关乎国计民生,当核心路由器或交换机出现丢包、震荡甚至宕机时,运维人员往往面临巨大的压力,很多人第一反应是检查软件配置……

    2026-06-18
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注