华为云用户手册

  • 语法格式 1 2 3 4 VALUES {( expression [, ...] )} [, ...] [ ORDER BY { sort_expression [ ASC | DESC | USING operator ] } [, ...] ] [ { [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] } | { LIMIT start, { count | ALL } } ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ];
  • generate_subscripts(array anyarray, dim int, reverse boolean) 描述:生成一系列包括给定数组的下标。当reverse为真时,该系列则以相反的顺序返回。 返回值类型:setof int 示例: 1 2 3 4 5 6 7 8 SELECT generate_subscripts('{NULL,1,NULL,2}'::int[], 1,TRUE) AS s; s --- 4 3 2 1 (4 rows)
  • rb_contain_rb(roaringbitmap,roaringbitmap) 描述:判断第一个roaringbitmap是否包含第二个roaringbitmap。 返回值类型:bool 示例: 1 2 3 4 5 SELECT rb_contain_rb(rb_build('{1,3}'), rb_build('{2,3}')); rb_contain_rb --------------- f (1 row)
  • rb_containedby_rb(roaringbitmap,roaringbitmap) 描述:判断跟定的第二个roaringbitmap是否包含第一个roaringbitmap。 返回值类型:bool 示例: 1 2 3 4 5 SELECT rb_containedby_rb(rb_build('{1,3}'), rb_build('{2,3}')); rb_containedby_rb --------------- f (1 row)
  • rb_clear(roaringbitmap,int,int) 描述:从roaringbitmap中清除指定范围内的元素。 返回值类型:roaringbitmap 示例: 1 SELECT rb_to_array(rb_clear(rb_build('{1,2,3}'),1,2)); rb_to_array ------------- {2,3} (1 row)
  • rb_xor(roaringbitmap, roaringbitmap) 描述:计算两个roaringbitmap的异或。 返回值类型:roaringbitmap 示例: 1 2 3 4 5 SELECT rb_to_array(rb_xor(rb_build('{1,2,3}'), rb_build('{2,3,4}'))); rb_to_array ------------- {1,4} (1 row)
  • rb_or(roaringbitmap, roaringbitmap) 描述:计算两个roaringbitmap的并集。 返回值类型:roaringbitmap 示例: 1 2 3 4 5 SELECT rb_to_array(rb_or(rb_build('{1,2,3}'), rb_build('{2,3,4}'))); rb_to_array ------------- {1,2,3,4} (1 row)
  • rb_xor_cardinality(roaringbitmap, roaringbitmap) 描述:计算两个roaringbitmap异或以后的基数。 返回值类型:int 示例: 1 2 3 4 5 SELECT rb_xor_cardinality(rb_build('{1,2,3}'), rb_build('{2,3,4}')); rb_xor_cardinality -------------------- 2 (1 row)
  • rb_to_array(roaringbitmap) 描述:rb_build的逆向操作,把roaringBitmap转成int数组。 返回值类型: array 示例: 1 2 3 4 5 6 7 8 9 10 SELECT rb_to_array(c) FROM r_row; rb_to_array ------------- {1,2,3} (1 row) SELECT rb_to_array('\x3a300000010000000000020010000000010002000300'); rb_to_array ------------- {1,2,3} (1 row)
  • rb_andnot_cardinality(roaringbitmap, roaringbitmap) 描述:计算两个roaringbitmap按照andnot计算结果以后的基数。 返回值类型:int 示例: 1 2 3 4 5 SELECT rb_andnot_cardinality(rb_build('{1,2,3}'), rb_build('{2,3,4}')); rb_andnot_cardinality ----------------------- 1 (1 row)
  • rb_and(roaringbitmap, roaringbitmap) 描述:计算两个roaringbitmap的交集。 返回值类型:roaringbitmap 示例: 1 2 3 4 5 SELECT rb_to_array(rb_and(rb_build('{1,2,3}'), rb_build('{2,3,4}'))); rb_to_array ------------- {2,3} (1 row)
  • rb_andnot(roaringbitmap, roaringbitmap) 描述:在第一个roaringbitmap集合中,但是不在第二个roaringbitmap中的集合。 返回值类型:roaringbitmap 示例: 1 2 3 4 5 SELECT rb_to_array(rb_andnot(rb_build('{1,2,3}'), rb_build('{2,3,4}'))); rb_to_array ------------- {1} (1 row)
  • rb_and_cardinality(roaringbitmap, roaringbitmap) 描述:计算两个roaringbitmap的交集的基数。 返回值类型:int 示例: 1 2 3 4 5 SELECT rb_and_cardinality(rb_build('{1,2,3}'), rb_build('{2,3,4}')); rb_and_cardinality -------------------- 2 (1 row)
  • rb_or_cardinality(roaringbitmap, roaringbitmap) 描述:计算两个roaringbitmap的并集的基数。 返回值类型:int 示例: 1 2 3 4 5 SELECT rb_or_cardinality(rb_build('{1,2,3}'), rb_build('{2,3,4}')); rb_or_cardinality ------------------- 4 (1 row)
  • rb_build(array) 描述:将int数组转成roaringbitmap类型。 返回值类型:roaringbitmap 示例: 1 2 3 4 5 SELECT rb_build('{1,2,3}'); rb_build ------------------------------------------------ \x3a300000010000000000020010000000010002000300 (1 row) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 CREATE TABLE r_row (a int, b text, c roaringbitmap); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using round-robin as the distribution mode by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE INSERT INTO r_row values (1, 'a', rb_build('{1,2,3}')); INSERT 0 1 SELECT * FROM r_row; a | b | c ---+---+------------------------------------------------ 1 | a | \x3a300000010000000000020010000000010002000300 (1 row) INSERT INTO r_row values (2, 'b', rb_build('{}')); INSERT 0 1 SELECT * FROM r_row; a | b | c ---+---+------------------------------------------------ 2 | b | \x3a30000000000000 1 | a | \x3a300000010000000000020010000000010002000300 (2 rows)
  • 修改数组 更新数组 更新整个数组数据: UPDATE books SET price_by_quarter = '{30,30,30,30}' WHERE title = 'Robinson Crusoe'; 使用ARRAY表达式语法更新整个数组数据: UPDATE books SET price_by_quarter = ARRAY[30,30,30,30] WHERE title = 'Robinson Crusoe'; 更新数组中的一个元素: UPDATE books SET price_by_quarter[4] = 35 WHERE title = 'Robinson Crusoe'; 更新数组中的一个切片元素: UPDATE books SET price_by_quarter[1:2] = '{27,27}' WHERE title = 'Robinson Crusoe'; 一个已存储的数组值可以被通过对其还不存在的元素赋值来扩大大小。任何位于已存在的元素和新元素之间的位置都将被空值填充。例如,如果数组myarray目前有4个元素,使用UPDATE对myarray[6]赋值后它将有6个元素,其中myarray[5]为空值。目前,采用这种方式扩大数组只允许使用在一维数组上。 构建新数组 新的数组值也可以通过串接操作符“||”构建。串接操作符允许把一个单独的元素加入到一个一维数组的开头或末尾。也可接受两个N维数组,或者一个N维数组和一个N+1维数组。 SELECT ARRAY[1,2] || ARRAY[3,4]; ?column? ----------- {1,2,3,4} (1 row) SELECT ARRAY[5,6] || ARRAY[[1,2],[3,4]]; ?column? --------------------- {{5,6},{1,2},{3,4}} (1 row) 使用函数array_prepend、array_append或array_cat构建数组。 SELECT array_prepend(1, ARRAY[2,3]); array_prepend --------------- {1,2,3} (1 row) SELECT array_append(ARRAY[1,2], 3); array_append -------------- {1,2,3} (1 row) SELECT array_cat(ARRAY[1,2], ARRAY[3,4]); array_cat ----------- {1,2,3,4} (1 row) SELECT array_cat(ARRAY[[1,2],[3,4]], ARRAY[5,6]); array_cat --------------------- {{1,2},{3,4},{5,6}} (1 row) SELECT array_cat(ARRAY[5,6], ARRAY[[1,2],[3,4]]); array_cat --------------------- {{5,6},{1,2},{3,4}} (1 row)
  • 语法格式 1 ARRAY [ param ] 或 1 '{ param }' 其中参数param说明如下: param :数组包含的值,允许出现零个或多个,多个值之间用逗号分隔,没有值可填写为NULL。 以'{ param }' 这种格式作为数组常量时,其中的字符串类型的元素不能再以单引号开始和结束,需要使用双引号。两个连续单引号转换为一个单引号。 以第一个元素的数据类型作为数组的数据类型,要求数组中所有元素的类型相同,或者能够相互转换。
  • 数组值输入 输入数组值时要把一个数组值写成一个文字常数,将元素值用花括号包围并用逗号分隔。一个数组常量的一般格式如下: 1 '{ val1 delim val2 delim ... }' 其中,delim是类型的定界符,每个val可以是数组元素类型的一个常量或子数组。 一个数组常量的例子如下: 1 '{{1,2,3},{4,5,6},{7,8,9}}' 该常量是一个二维的,3乘3数组,它由3个整数子数组构成。 向表books插入数据并查询表books: 1 2 3 4 5 6 7 8 9 10 11 12 INSERT INTO books VALUES (1, 'One Hundred years of Solitude','{25,25,25,25}','{{"fiction"}, {"adventure"}}'), (2, 'Robinson Crusoe', '{30,32,32,32}', '{{"adventure"}, {"fiction"}}'), (3, 'Gone with the Wind', '{27,27,29,28}', '{{"romance"}, {"fantasy"}}'); SELECT * FROM books; id | title | price_by_quarter | tags ----+-------------------------------+------------------+------------------------- 1 | One Hundred years of Solitude | {25,25,25,25} | {{fiction},{adventure}} 2 | Robinson Crusoe | {30,32,32,32} | {{adventure},{fiction}} 3 | Gone with the Wind | {27,27,29,28} | {{romance},{fantasy}} (3 rows) 插入多维数组数据时,多维数组的每一维都必须有相匹配的长度。 使用ARRAY关键字插入数据: INSERT INTO books VALUES (1, 'One Hundred years of Solitude',ARRAY[25,25,25,25],ARRAY['fiction', 'adventure']), (2, 'Robinson Crusoe', ARRAY[30,32,32,32], ARRAY['adventure', 'fiction']), (3, 'Gone with the Wind', ARRAY[27,27,29,28], ARRAY['romance', 'fantasy']);
  • 数组类型的定义 一个数组数据类型可以通过在数组元素的数据类型名称后面加上方括号([])来命名。 例如,创建表books,其中表示书本价格的列price的类型为一维integer类型数组,表示书本标签的列tag的类型为二维text类型数组。 1 CREATE TABLE books (id SERIAL PRIMARY KEY, title VARCHAR(100), price_by_quarter int[], tags TEXT[][]); CREATE TABLE语法可以指定数组的大小,例如: 1 CREATE TABLE test ( a int[3]); 当前的数据库实现会忽略语句中数组的大小限制,即其行为与未指定长度的数组相同。同时,也不会强制所声明的维度数。一个特定元素类型的数组全部被当作是相同的类型,而忽略其大小或维度数。 也可以使用关键词ARRAY来定义一维数组。表books中的列price使用ARRAY定义并指定数组大小,如下所示: 1 price_by_quarter int ARRAY[4] 使用ARRAY定义,不指定数组尺寸: 1 price_by_quarter int ARRAY
  • 参数说明 agg_name 聚集函数的名称 agg_type 聚集函数参数的类型 source_type 类型转换的源数据类型。 target_type 类型转换的目标数据类型。 object_name 对象名。 table_name.column_name view_name.column_name 定义/修改注释的列名称。前缀可加表名称或者视图名称。 constraint_name 定义/修改注释的表约束的名称。 table_name 表的名称。 function_name 定义/修改注释的函数名称。 argmode,argname,argtype 函数参数的模式、名称、类型。 large_object_oid 定义/修改注释的大对象的OID值。 operator_name 操作符名称。 left_type,right_type 操作参数的数据类型(可以用模式修饰)。当前置或者后置操作符不存在时,可以增加NONE选项。 text 注释。
  • 示例 为customer.c_customer_sk列加注释: 1 COMMENT ON COLUMN customer.c_customer_sk IS 'Primary key of customer demographics table.'; 为tpcds.customer_details_view_v2视图加注释: 1 COMMENT ON VIEW tpcds.customer_details_view_v2 IS 'View of customer detail'; 为customer表加注释: 1 COMMENT ON TABLE customer IS 'This is my table';
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 COMMENT ON { AGGREGATE agg_name (agg_type [, ...] ) | CAST (source_type AS target_type) | COLLATION object_name | COLUMN { table_name.column_name | view_name.column_name } | CONSTRAINT constraint_name ON table_name | CONVERSION object_name | DATABASE object_name | DOMAIN object_name | EXTENSION object_name | FOREIGN DATA WRAPPER object_name | FOREIGN TABLE object_name | FUNCTION function_name ( [ {[ argmode ] [ argname ] argtype} [, ...] ] ) | INDEX object_name | LARGE OBJECT large_object_oid | OPERATOR operator_name (left_type, right_type) | OPERATOR CLASS object_name USING index_method | OPERATOR FAMILY object_name USING index_method | [ PROCEDURAL ] LANGUAGE object_name | ROLE object_name | RULE rule_name ON table_name | SCHEMA object_name | SERVER object_name | TABLE object_name | TABLESPACE object_name | TEXT SEARCH CONFIGURATION object_name | TEXT SEARCH DICTIONARY object_name | TEXT SEARCH PARSER object_name | TEXT SEARCH TEMPLATE object_name | TYPE object_name | VIEW object_name } IS 'text';
  • 注意事项 每个对象只存储一条注释,因此要修改对象的注释,对同一个对象发出一条新的COMMENT命令即可。要删除注释,在文本字符串的位置写上NULL即可。当删除对象时,注释自动被删除掉。 目前注释浏览没有安全机制:任何连接到数据库上的用户都可以看到所有该数据库对象的注释。共享对象(比如数据库、角色、表空间)的注释是全局存储的,连接到任何数据库的任何用户都可以看到它们。因此,不要在注释里存放与安全有关的敏感信息。 对大多数对象来说,只有对象的所有者可以设置注释。角色没有所有者,所以COMMENT ON ROLE命令仅可以由系统管理员对系统管理员角色执行,有CREATE ROLE权限的角色也可以为非系统管理员角色设置注释。系统管理员可以对所有对象进行注释。
  • 货币类型 货币类型存储带有固定小数精度的货币金额。表1中显示的范围假设有两位小数。可以以任意格式输入,包括整型、浮点型或者典型的货币格式(如“$1,000.00”)。根据区域字符集,输出一般是最后一种形式。 表1 货币类型 名字 存储容量 描述 范围 money 8 字节 货币金额 -92233720368547758.08 到 +92233720368547758.07 numeric,int和bigint类型的值可以转化为money类型。如果从real和double precision类型转换到money类型,可以先转化为numeric类型,再转化为money类型,例如: 1 SELECT '12.34'::float8::numeric::money; 这种用法是不推荐使用的。浮点数不应该用来处理货币类型,因为小数点的位数可能会导致错误。 money类型的值可以转换为numeric类型而不丢失精度。转换为其他类型可能丢失精度,并且必须通过以下两步来完成: 1 SELECT '52093.89'::money::numeric::float8; 当一个money类型的值除以另一个money类型的值时,结果是double precision(也就是,一个纯数字,而不是money类型);在运算过程中货币单位相互抵消。 父主题: 数据类型
  • 示例 本示例假定用户已预先成功创建控制组。 创建一个默认资源池,其控制组为“DefaultClass”组下属的“Medium”Timeshare Workload控制组: 1 CREATE RESOURCE POOL pool1; 创建一个资源池,其控制组指定为“DefaultClass”组下属的“High”Timeshare Workload控制组: 1 CREATE RESOURCE POOL pool2 WITH (CONTROL_GROUP="High"); 创建一个资源池,其控制组指定为“class1”组下属的“Low”Timeshare Workload控制组: 1 CREATE RESOURCE POOL pool3 WITH (CONTROL_GROUP="class1:Low"); 创建一个资源池,其控制组指定为“class1”组下属的“wg1”Workload控制组: 1 CREATE RESOURCE POOL pool4 WITH (CONTROL_GROUP="class1:wg1"); 创建一个资源池,其控制组指定为“class1”组下属的“wg2”Workload控制组: 1 CREATE RESOURCE POOL pool5 WITH (CONTROL_GROUP="class1:wg2:3");
  • 参数说明 pool_name 资源池名称。 资源池名称不能和当前数据库里已有的资源池重名。 取值范围:字符串,要符合标识符的命名规范。 group_name 控制组名称。 设置控制组名称时,语法可以使用双引号,也可以使用单引号。 group_name对大小写敏感。 不指定group_name时,默认指定的字符串为“Medium”,代表指定DefaultClass控制组的“Medium”Timeshare控制组。 若数据库管理员指定自定义Class组下的Workload控制组,如control_group的字符串为:“class1:workload1”;代表此资源池指定到class1控制组下的workload1控制组。也可同时指定Workload控制组的层次,如control_group的字符串为:“class1:workload1:1”。 若数据库用户指定Timeshare控制组代表的字符串,即“Rush”、“High”、“Medium”或“Low”其中一种,如control_group的字符串为“High”;代表资源池指定到DefaultClass控制组下的“High”Timeshare控制组。 多租户场景下,组资源池关联的控制组为Class级别,业务资源池关联Workload控制组。且不允许在各种资源池间相互切换。 取值范围:字符串,要符合说明中的规则,其指定已创建的控制组。 stmt 资源池语句执行的最大并发数量。 取值范围:数值型,-1~INT_MAX。 dop 资源池简单语句执行的最大并发数量。 取值范围:数值型,1~INT_MAX memory_size 资源池最大使用内存。 取值范围:字符串,内容范围1KB~2047GB mem_percent 资源池可用内存占全部内存或者组用户内存使用的比例。 在多租户场景下,组用户和业务用户的mem_percent范围1-100,默认为20。 在普通场景下,普通用户的mem_percent范围为0-100,默认值为0。 mem_percent和memory_limit同时指定时,只有mem_percent起作用。 io_limits 该参数8.1.2版本中已废弃,为兼容历史版本保留该参数。 io_priority 该参数8.1.2版本中已废弃,为兼容历史版本保留该参数。 nodegroup 在逻辑集群模式下,指定资源池所属的逻辑集群名称。必须是存在的逻辑集群。 如果逻辑集群名称包含大写字符、特殊符号或以数字开头,SQL语句中对逻辑集群名称需要加双引号。 is_foreign 在逻辑集群模式下,指定当前资源池用于控制没有关联本逻辑集群的普通用户的资源。这里的逻辑集群是由资源池nodegroup字段指定的。 nodegroup必须是存在的逻辑集群,不能是elastic_group和安装的nodegroup (group_version1)。 如果指定了is_foreign为true,则资源池不能再关联用户,即不允许通过CREATE USER ... RESOURCE POOL语句来将该资源池配置给用户。该资源池自动检查用户是否关联到资源池指定的逻辑集群,如果用户没有关联到该逻辑集群,则这些用户在逻辑集群所包含的DN上运行将受到该资源池的资源控制。
  • 语法格式 1 2 CREATE RESOURCE POOL pool_name [WITH ({MEM_PERCENT=pct | CONTROL_GROUP="group_name" | ACTIVE_STATEMENTS=stmt | MAX_DOP = dop | MEMORY_LIMIT='memory_size' | io_limits=io_limits | io_priority='priority' | nodegroup='nodegroup_name' | is_foreign = boolean | except_rule='except_rule'}[, ... ])];
  • 参数说明 WITH [ RECURSIVE ] with_query [, ...] 用于声明一个或多个可以在主查询中通过名字引用的子查询,相当于临时表。 如果声明了RECURSIVE,那么允许SELECT子查询通过名字引用它自己。 其中with_query的详细格式为:with_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( {select | values | insert | update | delete} ) with_query_name指定子查询生成的结果集名字,在查询中可使用该名称访问子查询的结果集。 默认情况下,被主查询多次引用的with_query通常只被执行一次,并将其结果集进行物化,供主查询多次查询其结果集;被主查询引用一次的with_query,则不再单独执行,而是将其子查询直接替换到主查询中的引用处,随主查询一起执行。显示指定[ NOT ] MATERIALIZED,可改变默认行为: 指定MATERIALIZED时,将子查询执行一次,并将其结果集进行物化。 指定NOT MATERIALIZED时,则将其子查询替换到主查询中的引用处。以下几种情况会忽略NOT MATERIALIZED: 子查询中含有volatile函数。 子查询为含有FOR UPDATE/FOR SHARE的SELECT/VALUES语句。 子查询为INSERT/UPDATE/DELETE等语句。 with_query为RECURSIVE。 被引用次数大于1的with_query2引用了外层自引用的with_query1,则with_query2不能被替换到引用处。 例如下面示例中,tmp2被引用了两次,tmp2因为引用了外层自引用的tmp1,所以即使tmp2指定了NOT MATERIALIZED也会被物化。 1 2 3 4 5 with recursive tmp1(b) as (values(1) union all (with tmp2 as not materialized (select * from tmp1) select tt1.b + tt2.b from tmp2 tt1, tmp2 tt2)) select * from tmp1; column_name指定子查询结果集中显示的列名。 每个子查询可以是SELECT,VALUES,INSERT,UPDATE或DELETE语句。 plan_hint子句 以/*+ */的形式在SELECT关键字后,用于对SELECT对应的语句块生成的计划进行hint调优,详细用法请参见章节:使用Plan Hint进行调优。 ALL 声明返回所有符合条件的行,是默认行为,可以省略该关键字。 DISTINCT [ ON ( expression [, ...] ) ] 从SELECT的结果集中删除所有重复的行,使结果集中的每行都是唯一的。 ON ( expression [, ...] ) 只保留那些在给出的表达式上运算出相同结果的行集合中的第一行。 DISTINCT ON表达式是使用与ORDER BY相同的规则进行解释的。除非使用了ORDER BY来保证需要的行首先出现,否则,"第一行" 是不可预测的。 SELECT列表 指定查询表中列名,可以是部分列或者是全部(使用通配符*表示)。 通过使用子句AS output_name可以为输出字段取个别名,这个别名通常用于输出字段的显示。 列名可以用下面几种形式表达: 手动输入列名,多个列之间用英文逗号(,)分隔。 可以是FROM子句里面计算出来的字段。 FROM子句 为SELECT声明一个或者多个源表。 FROM子句涉及的元素如下所示。 table_name 表名或视图名,名称前可加上模式名,如:schema_name.table_name。 alias 给表或复杂的表引用起一个临时的表别名,以便被其余的查询引用。 别名用于缩写或者在自连接中消除歧义。如果提供了别名,它就会完全隐藏表的实际名字。 column_alias 列别名 PARTITION 查询分区表的某个分区的数据。 partition_name 分区名。 partition_value 指定的分区键值。在创建分区表时,如果指定了多个分区键,可以通过PARTITION FOR子句指定的这一组分区键的值,唯一确定一个分区。 subquery FROM子句中可以出现子查询,创建一个临时表保存子查询的输出。 with_query_name WITH子句同样可以作为FROM子句的源,可以通过WITH查询的名字对其进行引用。 function_name 函数名称。函数调用也可以出现在FROM子句中。 join_type 有5种类型,如下所示。 [ INNER ] JOIN 一个JOIN子句组合两个FROM项。可使用圆括弧以决定嵌套的顺序。如果没有圆括弧,JOIN从左向右嵌套。 在任何情况下,JOIN都比逗号分隔的FROM项绑定得更紧。 LEFT [ OUTER ] JOIN 返回笛卡尔积中所有符合连接条件的行,再加上左表中通过连接条件没有匹配到右表行的那些行。这样,左边的行将扩展为生成表的全长,方法是在那些右表对应的字段位置填上NULL。请注意,只在计算匹配的时候,才使用JOIN子句的条件,外层的条件是在计算完毕之后施加的。 RIGHT [ OUTER ] JOIN 返回所有内连接的结果行,加上每个不匹配的右边行(左边用NULL扩展)。 这只是一个符号上的方便,因为总是可以把它转换成一个LEFT OUTER JOIN,只要把左边和右边的输入互换位置即可。 FULL [ OUTER ] JOIN 返回所有内连接的结果行,加上每个不匹配的左边行(右边用NULL扩展),再加上每个不匹配的右边行(左边用NULL扩展)。 CROSS JOIN CROSS JOIN等效于INNER JOIN ON(TRUE) ,即没有被条件删除的行。这种连接类型只是符号上的方便,因为它们与简单的FROM和WHERE的效果相同。 必须为INNER和OUTER连接类型声明一个连接条件,即NATURAL ON,join_condition,USING (join_column [, ...]) 之一。但是它们不能出现在CROSS JOIN中。 其中CROSS JOIN和INNER JOIN生成一个简单的笛卡尔积,和在FROM的顶层列出两个项的结果相同。 ON join_condition 连接条件,用于限定连接中的哪些行是匹配的。如:ON left_table.a = right_table.a。 USING(join_column[,...]) ON left_table.a = right_table.a AND left_table.b = right_table.b ... 的简写。要求对应的列必须同名。 NATURAL NATURAL是具有相同名称的两个表的所有列的USING列表的简写。 from item 用于连接的查询源对象的名称。 WHERE子句 WHERE子句构成一个行选择表达式,用来缩小SELECT查询的范围。condition是返回值为布尔型的任意表达式,任何不满足该条件的行都不会被检索。 WHERE子句中可以通过指定"(+)"操作符的方法将表的连接关系转换为外连接。但是不建议用户使用这种用法,因为这并不是SQL的标准语法,在做平台迁移的时候可能面临语法兼容性的问题。同时,使用"(+)"有很多限制: "(+)"只能出现在where子句中。 如果from子句中已经有指定表连接关系,那么不能再在where子句中使用"(+)"。 "(+)"只能作用在表或者视图的列上,不能作用在表达式上。 如果表A和表B有多个连接条件,那么必须在所有的连接条件中指定"(+)",否则"(+)"将不会生效,表连接会转化成内连接,并且不给出任何提示信息。 "(+)"作用的连接条件中的表不能跨查询或者子查询。如果"(+)"作用的表,不在当前查询或者子查询的from子句中,则会报错。如果"(+)"作用的对端的表不存在,则不报错,同时连接关系会转化为内连接。 "(+)"作用的表达式不能直接通过"OR"连接。 如果"(+)"作用的列是和一个常量的比较关系, 那么这个表达式会成为join条件的一部分。 同一个表不能对应多个外表。 "(+)"只能出现"比较表达式","NOT表达式",“ANY表达式”,“ALL表达式”,“IN表达式”,“NULLIF表达式”,“IS DISTINCT FROM表达式”,“IS OF”表达式。"(+)"不能出现在其他类型表达式中,并且这些表达式中不允许出现通过“AND”和“OR”连接的表达式。 "(+)"只能转化为左外连接或者右外连接,不能转化为全连接,即不能在一个表达式的两个表上同时指定"(+)" 对于WHERE子句的LIKE操作符,当LIKE中要查询特殊字符“%”、“_”、“\”的时候需要使用反斜杠“\”来进行转义。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 CREATE TABLE tt01 (id int,content varchar(50)); INSERT INTO tt01 values (1,'Jack say ''hello'''); INSERT INTO tt01 values (2,'Rose do 50%'); INSERT INTO tt01 values (3,'Lilei say ''world'''); INSERT INTO tt01 values (4,'Hanmei do 100%'); SELECT * FROM tt01; id | content ----+------------------- 3 | Lilei say 'world' 4 | Hanmei do 100% 1 | Jack say 'hello' 2 | Rose do 50% (4 rows) SELECT * FROM tt01 WHERE content like '%''he%'; id | content ----+------------------ 1 | Jack say 'hello' (1 row) SELECT * FROM tt01 WHERE content like '%50\%%'; id | content ----+------------- 2 | Rose do 50% (1 row) GROUP BY子句 将查询结果按某一列或多列的值分组,值相等的为一组。 ROLLUP ( { expression | ( expression [, ...] ) } [, ...] ) ROLLUP是计算一个有序的分组列在GROUP BY中指定的标准聚集值,然后从右到左进一步创建高层次的部分和,最后创建了累积和。一个分组能够看做一系列的分组集。例如: 1 GROUP BY ROLLUP (a,b,c) 等价于: 1 GROUP BY GROUPING SETS((a,b,c), (a,b), (a), ( )) ROLLUP子句中的元素可以是单独的字段或表达式,也可以是使用括号包含的列表。如果是括号中的列表,产生分组集时它们必须作为一个整体。例如: 1 GROUP BY ROLLUP ((a,b), (c,d)) 等价于: 1 GROUPING SETS ((a,b,c,d), (a,b), (c,d ), ( )) CUBE ( { expression | ( expression [, ...] ) } [, ...] ) CUBE是自动对group by子句中列出的字段进行分组汇总,结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值。它会为每个分组返回一行汇总信息, 用户可以使用CUBE来产生交叉表值。比如,在CUBE子句中给出三个表达式(n = 3),运算结果为2n = 23 = 8组。 以n个表达式的值分组的行称为常规行,其余的行称为超级聚集行。例如: 1 GROUP BY CUBE (a,b,c) 等价于: 1 GROUP BY GROUPING SETS((a,b,c), (a,b), (a,c), (b,c), (a), (b), (c), ( )) CUBE子句中的元素可以是单独的字段或表达式,也可以是使用括号包含的列表。如果是括号中的列表,产生分组集时它们必须作为一个整体。例如: 1 GROUP BY CUBE (a, (b, c), d) 等价于: GROUP BY GROUPING SETS ((a,b,c,d), (a,b,c), (a), ( )) GROUPING SETS ( grouping_element [, ...] ) GROUPING SETS子句是GROUP BY子句的进一步扩展,它可以使用户指定多个GROUP BY选项。选项用于定义分组集,每个分组集都需要包含在单独的括号中,空白的括号(())表示将所有数据当作一个组处理。 这样做可以通过裁剪用户不需要的数据组来提高效率。 用户可以根据需要指定所需的数据组进行查询。 如果SELECT列表的表达式中引用了那些没有分组的字段,则会报错,除非使用了聚集函数,因为对于未分组的字段,可能返回多个数值。 HAVING子句 与GROUP BY子句配合用来选择特殊的组。HAVING子句将组的一些属性与一个常数值比较,只有满足HAVING子句中的逻辑表达式的组才会被提取出来。 WINDOW子句 一般形式为WINDOW window_name AS ( window_definition ) [, ...],window_name是可以被随后的窗口定义所引用的名称,window_definition可以是以下的形式: [ existing_window_name ] [ PARTITION BY expression [, ...] ] [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ] [ frame_clause ] frame_clause为窗函数定义一个窗口框架window frame,窗函数(并非所有)依赖于框架,window frame是当前查询行的一组相关行。frame_clause可以是以下的形式: [ RANGE | ROWS ] frame_start [ RANGE | ROWS ] BETWEEN frame_start AND frame_end frame_start和frame_end可以是: UNBOUNDED PRECEDING value PRECEDING(RANGE不支持) CURRENT ROW value FOLLOWING(RANGE不支持) UNBOUNDED FOLLOWING 对列存表的查询目前只支持row_number窗口函数,不支持frame_clause。 UNION子句 UNION计算多个SELECT语句返回行集合的并集。 UNION子句有如下约束条件: 除非声明了ALL子句,否则缺省的UNION结果不包含重复的行。 同一个SELECT语句中的多个UNION操作符是从左向右计算的,除非用圆括弧进行了标识。 FOR UPDATE不能在UNION的结果或输入中声明。 一般表达式: select_statement UNION [ALL] select_statement select_statement可以是任何没有ORDER BY、LIMIT、FOR UPDATE子句的SELECT语句。 如果用圆括弧包围,ORDER BY和LIMIT可以附着在子表达式里。 INTERSECT子句 INTERSECT计算多个SELECT语句返回行集合的交集,不含重复的记录。 INTERSECT子句有如下约束条件: 同一个SELECT语句中的多个INTERSECT操作符是从左向右计算的,除非用圆括弧进行了标识。 当对多个SELECT语句的执行结果进行UNION和INTERSECT操作的时候,会优先处理INTERSECT。 一般形式: select_statement INTERSECT select_statement select_statement可以是任何没有FOR UPDATE子句的SELECT语句。 EXCEPT子句 EXCEPT子句有如下的通用形式: select_statement EXCEPT [ ALL ] select_statement select_statement是任何没有FOR UPDATE子句的SELECT表达式。 EXCEPT操作符计算存在于左边SELECT语句的输出而不存在于右边SELECT语句输出的行。 EXCEPT的结果不包含任何重复的行,除非声明了ALL选项。使用ALL时,一个在左边表中有m个重复而在右边表中有n个重复的行将在结果中出现max(m-n,0) 次。 除非用圆括弧指明顺序,否则同一个SELECT语句中的多个EXCEPT操作符是从左向右计算的。EXCEPT和UNION的绑定级别相同。 目前,不能给EXCEPT的结果或者任何EXCEPT的输入声明FOR UPDATE子句。 MINUS子句 与EXCEPT子句具有相同的功能和用法。 ORDER BY子句 对SELECT语句检索得到的数据进行升序或降序排序。对于ORDER BY表达式中包含多列的情况: 首先根据最左边的列进行排序,如果这一列的值相同,则根据下一个表达式进行比较,以此类推。 如果对于所有声明的表达式都相同,则按随机顺序返回。 ORDER BY中排序的列必须包括在SELECT语句所检索的结果集的列中。 如果未指定ORDER BY,则按数据库系统最快生成的顺序返回。 可以选择在 ORDER BY子句中的任何表达式之后添加关键字ASC(升序)或 DESC(降序)。如果未指定,则默认使用ASC。 如果要支持中文拼音排序和不区分大小写排序,需要在初始化数据库时指定编码格式为UTF-8或GBK。 命令如下: initdb –E UTF8 –D ../data –locale=zh_CN.UTF-8或initdb –E GBK –D ../data –locale=zh_CN.GBK。 [ { [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] } | { LIMIT start, { count | ALL } } ] LIMIT子句由两个独立的Limit子句、Offset子句和一个多参Limit子句构成: LIMIT { count | ALL } OFFSET start [ ROW | ROWS ] LIMIT start, { count | ALL } 其中,count声明返回的最大行数,而start声明开始返回行之前忽略的行数。如果这两个参数都指定了,会在开始计算count个返回行之前先跳过start行。多参Limit子句不可和单参的Limit子句或Offset子句共同出现。 FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY 如果不指定count,默认值为1,FETCH子句限定返回查询结果从第一行开始的总行数。 FOR UPDATE子句 FOR UPDATE子句将对SELECT检索出来的行进行加锁。这样避免它们在当前事务结束前被其他事务修改或者删除,即其他企图UPDATE、 DELETE、 SELECT FOR UPDATE这些行的事务将被阻塞,直到当前事务结束。 为了避免操作等待其他事务提交,可使用NOWAIT选项,如果被选择的行不能立即被锁住,执行SELECT FOR UPDATE NOWAIT将会立即汇报一个错误,而不是等待。 FOR SHARE的行为类似,只是它在每个检索出来的行上要求一个共享锁,而不是一个排他锁。一个共享锁阻塞其它事务执行UPDATE、DELETE、SELECT,不阻塞SELECT FOR SHARE。 如果在FOR UPDATE或FOR SHARE中明确指定了表名字,则只有这些指定的表被锁定,其他在SELECT中使用的表将不会被锁定。否则,将锁定该命令中所有使用的表。 如果FOR UPDATE或FOR SHARE应用于一个视图或者子查询,它同样将锁定所有该视图或子查询中使用到的表。 多个FOR UPDATE和FOR SHARE子句可以用于为不同的表指定不同的锁定模式。 如果一个表中同时出现(或隐含同时出现)在FOR UPDATE和FOR SHARE子句中,则按照FOR UPDATE处理。类似的,如果影响一个表的任意子句中出现了NOWAIT,该表将按照NOWAIT处理。 对于for update/share,执行计划不能下推的SQL,直接返回报错信息;对于执行计划可以下推的,下推到DN执行。 对列存表的查询不支持for update/share。 NLS_SORT 指定某字段按照特殊方式排序。目前仅支持中文拼音格式排序和不区分大小写排序。 取值范围: SCHINESE_PINYIN_M,按照中文拼音排序(目前只支持GBK字符集内的一级汉字排序)。如果要支持此排序方式,在创建数据库时需要指定编码格式为“GBK”,否则排序无效。 generic_m_ci,不区分大小写排序。 PARTITION子句 查询某个分区表中相应分区的数据。
  • 语法格式 查询数据 1 2 3 4 5 6 7 8 9 10 11 12 13 [ WITH [ RECURSIVE ] with_query [, ...] ] SELECT [/*+ plan_hint */] [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] { * | {expression [ [ AS ] output_name ]} [, ...] } [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY grouping_element [, ...] ] [ HAVING condition [, ...] ] [ WINDOW {window_name AS ( window_definition )} [, ...] ] [ { UNION | INTERSECT | EXCEPT | MINUS } [ ALL | DISTINCT ] select ] [ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ] [ { [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] } | { LIMIT start, { count | ALL } } ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ] [ {FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ]} [...] ]; condition和expression中可以使用targetlist中表达式的别名。 只能同一层引用。 只能引用targetlist中的别名。 只能是后面的表达式引用前面的表达式。 不能包含volatile函数。 不能包含Window function函数。 不支持在join on条件中引用别名。 targetlist中有多个要应用的别名则报错。 其中子查询with_query为: 1 2 with_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( {select | values | insert | update | delete} ) 其中指定查询源from_item为: 1 2 3 4 5 6 {[ ONLY ] table_name [ * ] [ partition_clause ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ] |( select ) [ AS ] alias [ ( column_alias [, ...] ) ] |with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ] |function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ] |function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] ) |from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]} 其中group子句为: 1 2 3 4 5 6 ( ) | expression | ( expression [, ...] ) | ROLLUP ( { expression | ( expression [, ...] ) } [, ...] ) | CUBE ( { expression | ( expression [, ...] ) } [, ...] ) | GROUPING SETS ( grouping_element [, ...] ) 其中指定分区partition_clause为: 1 2 PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } 指定分区只适合普通表。 其中设置排序方式nlssort_expression_clause为: 1 NLSSORT ( column_name, ' NLS_SORT = { SCHINESE_PINYIN_M | generic_m_ci } ' ) 简化版查询语法,功能相当于select * from table_name。 1 TABLE { ONLY {(table_name)| table_name} | table_name [ * ]};
  • 示例2:通过行级控制实现分区权限管理 创建用户alice: 1 CREATE ROLE alice PASSWORD '{password1}'; 创建范围分区表web_returns_p1,并插入数据: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE TABLE web_returns_p1 ( wr_returned_date_sk integer, wr_returned_time_sk integer, wr_item_sk integer NOT NULL, wr_refunded_customer_sk integer ) WITH (orientation = column) DISTRIBUTE BY HASH (wr_item_sk) PARTITION BY RANGE(wr_returned_date_sk) ( PARTITION p2016 START(800) END(830) EVERY(1) ); INSERT INTO web_returns_p1 values (801,17,11,102); INSERT INTO web_returns_p1 values (802,18,12,103); 将表web_returns_p1的读取权限赋予alice用户: 1 GRANT SELECT ON web_returns_p1 TO alice; 打开行访问控制策略开关: 1 ALTER TABLE web_returns_p1 ENABLE ROW LEVEL SECURITY; 创建行级访问控制策略web_returns_rsl。其中wr_returned_date_sk为web_returns_p1分区表的分区名,801为分区值: 1 CREATE ROW LEVEL SECURITY POLICY web_returns_rsl ON web_returns_p1 USING('wr_returned_date_sk' = '801'); 将行级访问控制策略web_returns_rsl的赋予用户alice: 1 ALTER ROW LEVEL SECURITY POLICY web_returns_rsl ON web_returns_p1 TO alice; 切换至alice用户: 1 set role alice password '{password1}'; 查询表web_returns_p1: 1 select * from web_returns_p1;
共100000条