表表达式在FROM
子句的SELECT
子句中定义数据源或作为TABLE
子句的参数。
- selectOpt
参数 | 说明 |
---|---|
table_name | 表或视图名称。 |
table_alias_name | 在别名表表达式中使用的名称。 |
name | 列名的一个或多个别名,用于别名表表达式。 |
index_name | 强制索引选择的可选语法。 |
func_application | 函数的结果。 |
row_source_extension_stmt | 受支持语句的结果行。 |
select_stmt | 用作子查询的选择查询。 |
joined_table | 一个连接表达式。 |
语法
identifier
identifier.identifier
identifier.identifier.identifier
表表达式中的单个SQL标识符指定当前数据库中具有该名称的表、视图或序列的内容。
如果名称由两个或多个标识符组成,则应用名称解析规则。
例如:
select * from cust; -- uses table `cust` in the current database
select * from ora.cust; -- uses table `cust` in database `ora`
强制索引扫描
强制扫描特定索引的语法是:
select * from table@my_idx;
例如:
select * from cust_info@cust_info_cust_card_no_idx;
强制部分索引扫描
要强制进行部分索引扫描,您的语句必须有一个WHERE
子句。
create table te (
t INT,
index idx (t) where t > 1);
insert into te(t) values (3);
select * from te@idx where t > 1;
强制部分GIN索引扫描
要强制进行部分GIN索引扫描,语句必须有一个WHERE
子句:
create table tee (
j JSON,
INVERTED INDEX idx (j) WHERE j->'a' = '1');
insert into tee(j)
values ('{"a": 1}'),
('{"a": 3, "b": 2}'),
('{"a": 1, "b": 2}');
select * from tee@idx WHERE j->'a' = '1' AND j->'b' = '2';
j
--------------------
{"a": 1, "b": 2}
表表达式中的单个标识符可以引用前面定义的公用表表达式。
例如:
with m as (select * from cust)
select * from m;
表表达式可以将函数应用程序的结果用作数据源。
函数名的解析遵循与表名解析相同的规则。有关详细信息,请参阅名称解析。
标量函数作为数据源
当返回单个值的函数用作表表达式时,它被解释为包含函数结果的单列和单行的表格数据。
例如:
select * from sin(2.6);
sin
----------------------
0.5155013718214642
表生成器函数
一些函数直接从单个函数应用程序生成具有多行的表格数据。这也称为集合返回函数(SRF)。
例如:
select * from generate_series(2,4);
+-----------------+
| generate_series |
+-----------------+
| 2 |
| 3 |
| 4 |
+-----------------+
别名表表达式
别名表表达式在当前查询的上下文中临时重命名表和列。
语法:
<table expr> AS <name>
<table expr> AS <name>(<colname>, <colname>, ...)
在第一种形式中,表表达式等价于它的左操作数,为整个表使用了一个新名称,其中的列保留了它们的原始名称。
在第二种形式中,列也被重命名。
例如:
select c.x from (select count(*) as x from cust_info) as c;
select c.x from (select count(*) from cust_info) as c(x);
序数注释
将名为 的列附加ordinality
到表表达式操作数中指定的数据源,其值描述每行的序数。
语法:
<table expr> WITH ORDINALITY
例如:
select * from (values('b'),('d'),('f')) ;
+---------+
| column1 |
+---------+
| b |
| d |
| f |
+---------+
select * from (values('b'),('d'),('f')) WITH ORDINALITY;
column1 | ordinality
----------+-------------
b | 1
d | 2
f | 3
使用子查询
可以将括号内的选择查询用作表表达式,这称为子查询。
例如:
select c+2 from (select COUNT(*) AS c from cust_info);
select * from (values(1), (2), (3));
select ename || ' ' || empno from (TABLE emp);
使用另一个语句的输出
语法:
with table_expr as ( <stmt> ) select .. from table_expr
WITH
查询将执行语句的输出指定为行源。支持以下语句作为表表达式的行源:
DELETE
EXPLAIN
INSERT
SELECT
SHOW
UPDATE
UPSERT
例如:
WITH a AS (SHOW COLUMNS from cust) SELECT "column_name" FROM a;
column_name
---------------
cardno
name
email
age
sal
rowid
可以在SELECT
子句和TABLE
子句中使用表表达式。因此,它们可以出现在任何可能出现选择子句的地方。例如:
SELECT ... FROM <table expr>, <table expr>, ...
TABLE <table expr>
INSERT INTO ... SELECT ... FROM <table expr>, <table expr>, ...
INSERT INTO ... TABLE <table expr>
CREATE TABLE ... AS SELECT ... FROM <table expr>, <table expr>, ...
UPSERT INTO ... SELECT ... FROM <table expr>, <table expr>, ...