3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(二)|学习笔记

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 快速学习3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(二)

开发者学堂课程【PostgreSQL快速入门:3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(二)】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/16/detail/89


3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(二)

 

内容介绍

、PostgreSQL数据库基本操作

、PostgreSQL数据类型介绍

三、PostgreSQL数据库基本操作

1、PostgreSQL数据类型介绍

通过当前数据库的from pg_type可以看到有哪些类型新建的类型也可以看到类型里面有存储存储结构p存储在当前的表里面以不压缩的形式存储e是存储在外面以不压缩的形式存储m是存储在当前表压缩的形式存储x存储在post表以压缩的形式存储数据类型

Category

Array types数组

Boolean types Boolean逻辑

Composite types复合类型

Date/time types时间类型或者日期类型

Enum types枚举类型

Geometric types几何类型

Network address types网络类型

Numeric types数字类型

Pseudo-types虚拟类型

String types String类型

Timespan types 时间块类型包括因特网

User-defined types用户定义类型

Bit-string types Bit-string类型

unknown type未知类型

2、表的操作(创建,插入,更新,删除,截断,删除,重命名,修改表的属性..)

 

四、PostgreSQL数据类型介绍

1、常用数据类型数字

image.png

Smallint2 bytes固定存储2个字节-32768 to +32767范围

Integer4 bytes四个字节Bigint8 bytes八个字节

Realvariable-precision, inexact不精确的类型double precision15 decimal digits precision最多存储15个有意义的数字

not null default nextval('t_ id_seq' : :regclass )自动创建序列

序列的起始值是1,bigint类型最大值9223372036854725807不允许循环创建serial自动创建序列并且把默认的值赋予给下一个序列的值

create table t1<id seria18>;

2、常用数据类型,字符

image.png

variable( can store n chars)字符的长度而不是字节存储的最多是一个字符不是一个字节

ixed-length, blank padded固定长度如果没有达到这个长度会以空格填充的固定的字符串类型

variable unlimited length不指定长度无限长度的variable类型最大支持1gb的存储空间

single-byte internal type单字节使用的类型

后面两个是字节前面是字符char20是存20个字符而不是20个字节

存中文字

Inscrt into t2 vaLues<’你好呀a’>;

存的是字符中文字占了很多个字符或者更多的字节

insert into t2 values <' abc' >;

select pg. column size(c1)c1 from t2;

你好呀占10个字节abc只占了4个字节是字符个数而不是字节数

3、常用数据类型时间

image.png

timestamp [(p)]without time zone]both date and time (no time zone)带日期和时间不带时区

timestamp [ (p) ] withtime zoneboth date and time, with time zone带日期时间时区

timestamp [ (p) ] withtime zoneboth date and time, with time zone带日期时间时区1microsecond 114 digits精度可以到达十四分之一微秒的结果

Datedate (no time of day)只有日期time [ (p) ][ without

time zone]time of day (no date)只有时间

interval [ fields][(p)]time interval时间间隔一年两年一小时都是间隔组合很多

特殊日期/时间输入

image.png

infinity大于所有指定的时间指定时间两万年不管执行多少都大

-infinity不管执行多少都大now当前时间today当前日期的零点tomorrom明天yesterday昨天allballs所有的字段都是0

postgres= =# select timestamp 'epoch' date 'infinity'time 'now date 'today'time 'allballs';

Timestamp Date time date time

1970-01-01 00:00:00 infinity 15:14:13.461166 2012-04-27 00:00:00

时间输入输出格式

Style Specification

De scription

Example

ISO

ISO 8601/SQL standard

1997-12-1707:37:16-08

SQL

traditional style

12/17/1997 07:37:16.00 PST

POSTGRES

original style

Wed Dec 17 07:37:16 1997 PST

German

regional style

17.12.1997 07:37:16,00 PST

datestyle Setting

Input Ordering

Example Output

SQL, DMY指定设置输出的顺序

dlay'month/year

17/12/199715:37:16.00 CET

SQL, MDY

mon th/ dlay/year

12/17/199707:37:16.00 PST

Postges,day

day'month/year

Wed 17 Dec 07:37:16 1997 PST

postgres= =# set datestyle ='SQLDMY";

postgres= =# select now();

27/04/2012 15:49:51 373789 CST

postgres= =# set datestyle= ='SQLMDY';

postgres =# select now();

04/27/2012 l5:50:07 882063 CST

时间间隔imterval格式

Abbreviation

Meaning

Y

Years

M

Months (in the date part)

W

Weeks

D

Days

H

Hours

M

Minutes (in the time part)

s

Seconds

[@] quantity unit [quantity unit...] [direction]

P quantity unit [ quantity unit ..] [ T [ quantity unit ..]

P [ years-months-days ] [ T hours:minutes:seconds ]

IntervalStyle样式

Style Specificatior

Year-Month Interval

Day-Time Interval

Mixed Interval

sql_ standard

1-2

34:05:06

-1-2 +3 -4:05:06

postgres

1 year 2 mons

3 days 04:05:06

-1 year -2 mons +3 days -04:05:06

postgresverbose

@1 year 2 mons

@3days4hours5mins6secs

@1year2mons-3days 4 hours5 minsб secs ago

iso_8601

P1Y2M

P3DT4H5M6S

P-1Y-2M3DT-4H-5M-6S

postgres =# snow mtervarstyie ;

postgres

postgres- =# select interval 'P-1Y-2M3DT-4H-5M-6S";

-1 years -2 mons +3 days -04:05:06指定一年两个月三日小时分秒时间间隔类型

select now()- current_ date ;

22:21:01.361042 

select now()- current_ date ;当前时间当前日期

22:21:09.004178 

postgres =#select interval'l day ago';

-1 days

postgres =# set IntervalStyle ='sql_ standard';

postgres= =# select interval 'P-1Y-2M3DT 4H-5M-6S';

-1-2 +3 -4:05:06

4、常用数据类型布尔逻辑

Name

Storage Size

Description

boolean

1 byte

state of true or false

TRUE 't' 'true' 'y' 'yes' 'on' '1'

FALSE 'f' 'false' 'n' 'no' 'off'0'

unknown (三价逻辑运算)

NULL

htt://blog.163.com/digoal@126/blog/static/1638770402013024224461751/

A AND B

TRUE

UNKNOWN

FALSE

TRUE

TRUE

UNKNOWN

FALSE

UNKNOWN

UNKNOWN

UNKNOWN

FALSE

FALSE

FALSE

FALSE

FALSE

 

A OR B

TRUE

UNKNOWN

FALSE

TRUE

TRUE

TRUE

TRUE

UNKNOWN

TRUE

UNKNOWN

UNKNOWN

FALSE

TRUE

UNKNOWN

FALSE

A

NOT A

TRUE

False

Unknown

Unknown

False

True

5、常用数据类型,枚举

创建自定义类型只存储三个字段三个词除此之外存值就会报错

CREATE TYPE mood AS ENUM ('sad, 'ok', "happy);

CREATE TABLE person (name text,current mood mood);

INSERT INTO person VALUES ("Moe', "happy');

SELECT * FROM person WHERE current mood = "happy';

Name current mood

Moe happy

(1 row)

输入一个不存在的枚举值,将报错

postgres= # SELECT * FROM person WHERE current _mood = "happ';

ERROR: invalid input value for enum mood: "happ"报不存在的错误无效值

避免报错的方法,把枚举转换成text

postgres =# SELECT * FROM person WHERE current mood:text = "happ';

Name current mood

(0 rows)

枚举值每一个在行中占用4 bytes :

postgres= =# select current_ mood,pg_ column_ size(current_ mood) from person;

current_ mood|pg _ecolumn _size

Happy |4

枚举的标签在定义中最大限制由NAMEDATALEN决定,默认是64-1,前面已经讲过。创建一个表表名是NAME类型也是由NAMEDATALEN决定最多能存储63个字符

查找枚举的数据结构

postgres=# select oid,typname from pg_ type where typname ='mood';枚举值不能超过63字符

Oid|typname

3952969|mood

postgres =# select * from pg_enum where enumtypid= 3952969;通过pg_enum查询值enumlabel标签也是name类型

Enumtypid|enumsortorder|enumlabel

3952969 1 Isad

3952969 2 ok

3952969 3 happy

枚举类型变更,可以往里面添加某一个值添加在某一个值的前面或者添加在某一个值的后面但是正常是往后添加让性能更好

ALTER TYPE name ADD VALUE new_ enum_ value [ { BEFORE | AFTER } existing_ enum_ value ]

This form adds a new value to an enum type. If the new value's place in the enum's ordering is not specified using BEFORE or AFTER, then the

new item is placed at the end of the list of values.

注意事项,添加枚举元素时尽量不要改动原来的元素的位置,即尽量新增值插到最后。

否则可能会带来性能问题。

ALTER TYPE .. ADD VALUE (the form that adds a new value to an enum type) cannot be executed inside a transaction block.

Comparisons involving an added enum value will sometimes be slower than comparisons involving only original members of the enum type. This

will usually only occur if BEFORE or AFTER is used to set the new value's sort position somewhere other than at the end of the list. However,

sometimes it will happen even though the new value is added at the end (this occurs if the OID counter "wrapped around" since the original creation

of the enum type). The slowdown is usually insignifcant; but if it matters, optimal performance can be regained by dropping and recreating the

enum type, or by dumping and reloading the database.

6、money类型

显示和客户端参数lc_ monetary有关

Name

Storage Size

Description

Range

money

8 bytes

currency amount

-92233720368547758.08 to +92233720368547758.07

postgres -# show le_ monetary;

C

postgres= # SELECT 712.345'::money;

$12.35

postgres= =# set le_ monetary='zh_ CN";

postgres= # SELECT '12.34S'::money;

¥12.35

人民币换算成美元只是进行货币符号

7、bytea类型

存储的是一个一个的字节流比如存在字符串类型里面会报错的情况下可以选择bytea类型什么字符都可以存允许存空字符

image.png

同时支持两种格式输入

escape

select E\3361\255\276\357*:bytea;

hex, 每两个16进制数字为一组,表示一个"raw byte"

SELECT E'\x DE AD BE EF:':bytea;

支持两种格式输出,需配置

9.0引入hex输出(通过配置bytea_ _output)

9.0以前为escape输出

如果有从老版本数据库迁移到9.0及以后版本的情况,需要注意,可能再次与程序不兼容,只需要将默认值调整为escape即可。

推荐使用hex格式输入输出

8、几何类型

存储点存储线存储线段存储盒子存储矩阵存储路径路径可以是一条闭环可以是一条打开的环存储任意一个几何类型几何类型类似于任意一个闭环路径存储一个圆

image.png

9、网络地址类型

image.png

网段填充例子 :

Table "digoal.tbl_ ip_ info"

Column Type Modifiers

Id integer

Province character varying(10)省份

start_ ip inet 开始IP

end_ ip inet 结束IP

digoal=> insert into tbl_ ip_ info values (1,'浙江','192. 168. 1 .254','192.168.2.5');

digoal=> insert into tbl_ ip_ info values (2,'广东' fK','192. 168.2.254','192.168.3.5');

digoal=> insert into tbl_ip_info values (3,'湖南','192.168.3.254','192.168.4.5');

digoal=> select id,generate_ serijes(0,end_ip-start_ip)+start_ ip from tbl_ ip_ info ;产生多行

192. l68.1.254

192.168.1.255

192.168.2.0

192.168.2.1

192.168.2.2

192.168.2.3

192.168.2.4

192.168.2.5

192.168.2.254

192.168.2.255

10、比特类型,支持变长和定长

Bit strings are strings of l's and 0's. They can be used to store or visualize bit masks. There are two SQL bit types: bit(n) and bit varying(n), where n is a positive integer.

CREATE TABLE test (а BIT(3)定长, b BIT VARYING(5));变长

INSERT INTO test VALUES (B'101', B'00');

INSERT INTO test VALUES (B'10', B'101');

ERROR: bit string length 2 does not match type bit(3)

INSERT INTO test VALUES (B'10'::bit(3), B'101');

SELECT * FROM test;

A b

101 00

100 101默认在末尾添加0

11、全文检索类型

包含两个类型比如一个字符串存储在tsvector,搜索是否包含要的关键字关键字相当于搜索的字符集存在tsvector

(1)tsvector

去除重复分词后按分词顺序存储

可以存储位置信息和权重信息

(2)tsquery

存储查询的分词,可存储权重信息

包含哪些字典通过dictname标记逆行查询

全文检索类型要把字符串转换成分词跟用到的字典有关系,$$类似于字符串外面引号的作用转换成tsvector作为分词存储在tsvector分词支持位置信息章节信息总共分四个章节abcd章节在分词中是层次结构的意思有主题假如把a当作主题检索a在主题里面可以a:1A,a出现在b中没关系检索不到方便可以在章节里面搜索使用english字典拆分the fat rats在英语里面the基本搜不到没有意义不会放在分词中

SELECT to_ tsvector (‘ postgraduate' )@@to_ tsquery(‘postgres:*’);

所有的顺序所有的章节都比对出来。postgraduate当分词用检索两个词转换成tsquery检索到fat检索到rat&的符号扩起来或者用或只要匹配上fat或者匹配上ratrat其中一个就是有效的tsqueryfataba章节和b章节匹配fat同时所有章节里面匹配到cat即可,SELECT to_ tsquery(’ postres:*‘): to_ tsquery

12、uuid类型

UUIDs could be generated by client applications or other libraries invoked through a server-side function.

specifically a group of 8 digits followed by three groups of 4 digits followed by a group of 12 digits, for a total of 32 digits

representing the 128 bits.

输出格式:

A0eebc99-9c0b-4ef8- Ъb6d-6ЪЬ9Ъd380all五组

输入格式:

AOEEBC99-9COB-4EF8-BB6D-6BB9BD380All

{aOeebc99-9c0b-4e f8 -bb6d-6bЬ9ЬdЗ80all}

aOeebc999cOb4e f8ЬЬб d6bb9bd380all

aOee-bc99-9cOb-4e f8- -ЬЬБd-БbЬ9- -bd38-0all

{aOe ebc99-9cOb4e f8-ЬЬб d6bb9-bd380all}

13、数组类型

(1)不限长度

目前PostgreSQL未对长度强限定,如int[]和int[10]都不会限定元素个数。维度不做强限制如果要写二维数组后面所有的值必须要写二维数组结构严

array_ length(ARRAY[[1,2,3,4,5],[6,7,8,9,10]],1)二维数组

(2)不限维度

目前PostgreSQL未对维度强限定,如int[]和int[][],效果是一样的,都可以存储任意维度的数组。

(3)矩阵强制

多维数组中,同一个维度的元素个数必须相同,比如一维里面每一个元素都是五个不能出现四个六个七个

正确

array[[1,2,3,4],[5,6,7,8]]

不正确

array[[1,2,3,4],[5,6,7]]前面存数字后面不能存字符串在同一维度里面不能不一样

(4)元素强制

元素类型必须一致

正确

array[1,2,3]

不正确

array[1,2,'abc]

(5)扩展

一维数组支持prepend, append,, cat操作

array_ append(ARRAY['digoal','francs' ],'david')变成新的数组

array_prepend(david',ARRAY['digoal,'francs'])

二维数组仅支持cat操作,二维数组不能做prepend, append,操作只能再往里面添加数组两个数组合并成新的数组

array_cat(ARRAY['digal",zhou'"f"francs,'tan']], ARRAY['david",guo])

<<digoal, zhou> ,<francs . tan> , <david , guo>>

(6)Subscript

指的是postresql的下标,元素脚本默认从1开始, 也可以指定。

array_ lower(ARRAY[[1,2,3,4,5],[6,7,8,9,10]], 2)

第二个维度的lower1,第一个维度是345,第三个维度没有

array_ lower('[-3:-2]={1,2}::int[], 1)

制定下标的数组

select array_upper([-3:-2]={1,2}:int[], 1)

14、切片

array_ dims(ARRAY[[1,2,3,4,5],[6,7,8,9,10]])

a[1:2][1:1]= {{1},{3}}

第一个[]中的1表示低位subscript, 2表示高位subscript值。

第二个[]中左边的1表示低位subscript,右边的l表示高位subscript值。

a[2:3][1:2]= {{3,4},{5,6}}

分片的另一种写法,只要其中的一个维度用了分片写法,其他的维度如果没有使用分片写法,默认视为高位。

如a[2:3][2]等同于a[2:3][1:2]

PostgreSQL ARRAY datatype introduce

具体可以参考网页中的恶用法http://blog.163.com/digoal@126/blog/static/163877040201201275922529/

例1:

ARRAY[1.2,3.4]是维数组。

ARRAY[1.2][3.4].[5,6]]是二维数组。

例2:

ARRAY[["digoal ,zhou'][a',b',c]]是错误的,因为第二个维度中的第一个array有2个元素,而第二个array有3个元素不是一个矩阵,个数必须致,同时类型也必须一致。

例3:

ARRAY["'digoal, :zhou'][1 ,2]]是错误的,因为[digoal' ,zhou]是te>t0类型,而[1 .2]是int]类型。

例3:

ARRAY[['digoal' ,zhou'][,1 ,2]] 是错误的。因为[digoal' ,zhou']是text[]类型,而[1 .2]是int[]类型。

元素

维数组ARRAY[1,2,3.4]中的4个元素分别是1.2.3, 4.这些in型的值。

二维数组ARA[[1.2][3.4].[5,6]]中的第维度有3个元素是ARRAY[1.2], ARRAY[3.4] , ARRAY[5.,6]这些int[]类型的值,第二个维度的第一个subscript的元素有两个, 分别是1.2,第二个subscript 分别是3.4,第三个subscript分别是5,6,元素之间的分隔符,除了box类型是分号,其他类型的分隔符都是逗号。

扩展性

维数组可以扩展,二维数组无法扩展,参考htp:/lo/ 163 .com/digoal@126/blog/static/163877040201201272718196/

subscript下标

访问ARRAY中的元素需要提供subscript值,默认是从1开始编号,除非赋值的时候强制指定subscript。

ARRAY[[1,2], [3, 4],[5,6]] as a

a[1][1] = 1;

a[1][2] = 2:

a[2][1] = 3;

a[2][2] = 4:

a[3][1] = 5;

a[3][2] = 6;

第一个元素是a11,第二个元素是a12,11是下标表示第一个维度的第几个值第二个维度是第几个值第一个维度的值是1,2,放到第二个维度里面是1,2里面的第一个值所以出来的是1,对于12,第一个1指的还是1,2元素第二个维度里面取的是第二个元素2。

array_ dims, 返回的是各个维度中的低位subscrip和高位subscript。第一个方框指的是第一个维度第一位是1,第一个维度里面的第一个元素的下标是1,最大的元素的下标是2,[1:2][1:5],对于第二个维度的下标最小的下标是1,最大是5,总共是5。

array_ length, 返回的是array中指定维度的长度或元素个数。

digoal=> select array. length (ARRAY[[I2,3 4.5],[6.7.8.9 10]], 1);

Array_lenath

2

digoal=> select array, length (ARRAY[[1,2,3, 4,5],[6, 7,8,9, 10]], 2);

Array_ Length

5

第一个维度的长度是2,五个元素第二个维度有五个元素返回的是5。

array_ lower, 返回的是ARRAY中指定维度的低位subscript值

digoal=> select array_lower (ARRAY[(1,2,3, 4,5], [6,7,8,9,10]], 2);

array_ lower

array_ lower指的是第一个下标第二个维度第一个下标是1。

digoal=> select array_ lower(' [-3;-2]=[1,2]'::int[],1);

Array_lower

第一个维度的下标是-3,最低位是-3,没有第二个维度因为是一维数组

array_ upper, 返回的是ARRAY中指定维度的高位subscript值,如下

digoal=> select array_ upper(ARRAY([1,2,3, 4,5],[6,7,8,9,10]], 2);

Array_upper

5

上标是指维度里面最大的元素的标记位比如在二维里面最大的是5,在一维里面只有两个元素最大是2。

下面就是强制指定subscript值。

digoal=> select array, _upper(' [-3:-2]=[1,2]' :int[], 1);

Array_ upper

-2

上标是-2,因为指定了下标用方框指定下标比如改成多维数组假设第二个维度是一个元素第一个维度的下标是-2,第二个维度返回的是1。

array_ prepend,用于在一维数组的前面插入元素,如下

digoal=> select array, prepend' digoal', ARRAY[' francs' ,' david' ]);

Array_prepend

array_ cat, 用于两个相同维度的数组的连接,或者个n维数组和一个n+ 1维数组的连接,如下:

digoal=> select array_ cat (ARRAY[' francs' ], ARRAY[ di eoal' .' david 1]):

array, cat

[francs, digoal, david)

digoal=> select array_ cat (ARRAY[' francs' ], ARRAY[[' di goal' ]]):

Array_ cat

[[francs], [digoal]]

generate_ subscripts, 用于按顺序返回ARRAY的指定维度的subscript(s)值。

正向返回第一维度的subscript值。

digoal=> select generate_subseripts(a,1) from (select ARRAI['d','b','c''d']as a) t;

generate_ subscripts

把一维数组截出来一维的下标截出来

多维数组指定下标第二个维度有三个元素三个元素的上标下标把a数组的第二个维度下标是2,3,4。

digoal=> select generate_subseripts(a,2)from(select '[-5:-4][2:4]=[[1,2,3], [4,5, 611' ::int[] as a) t;

generate_ subscripts

14、自定义类型

create type test as (info text,id int,crt_ time timestamp(0));

创建表时默认创建一个同名复合数据类型composite type,因此表名和自定义类名不能重复先创建类型再创建表不可以先创建表再创建类型也不可以会报同样的错

create table test (id int primary key ,info text);

ERROR: relation "test" already exists

举例

CREATE TYPE inventory_ item AS (创建数据类型复合数据类型包含三个字段

Name text,

supplier_ id integer,

Price numeric

);

CREATE TABLE on_ hand (使用数据类型

Item inventory item,

Count integer

);

INSERT INTO on_hand VALUES (ROW(fuzzy dice', 42, 1.99), 1000);

SELECT (on_ hand.item).name FROM on_ hand WHERE (on_ hand.item).price <10;

name

fuzzy dice

SET和INTO子句自定义类型不能加括号引用,其他子句中的自定义类型可以加括号引用编辑复合类型的值可以用 ROW(fuzzy dice',10, 100) 方式

UPDATE on_ hand SET item = ROW(fuzzy dice',10, 100) WHERE count= 1000;

更新复合类型某一个字段的值可以通过item.price在where条件里面可以通过加下标加表名字段名用法有一定的区别

UPDATE on_ hand SET item.price = (on_hand.item).price + 100 WHERE

(on_hand.item).name= *'fuzzy dice';

直接通过字段名和字段类型里面的指定的名字进行引用

INSERT INTO on_ hand (item.name, item.supplier_ id) VALUES(test, 2.2);

Postgres=# select * from on_ hand;

Item count

("fuzzy dice'",10,200) 1000

(test,2,)

oid (object identifier) 4 bytes

xid (transaction identifier) 4 bytes xmin,xmax

cid (command identifier) 4 bytes cmin,cmax

tid (tuple identifier) 6 bytes ctid

以下为各系统表对应的oid列的alias,类型都是oid

可使用 Hnamespace, 或者默认的search_ path先后顺序检索

Name

References

Description

Value Example

oid

any

numeric object identifier

564182

regproc

PE_proc

function name

sum

regprocedure

PE_proc

function with argument types

sun (int4)

regoper

pE_operator

operator name

+

regoperator

PE_operator

operator with argument types

* (integer, integer) or - QRONE, integer)

rerclass

Pe_class

relation name

Pg_type

regtype

PZ_type

data type name

integer

regconfig

Pg_ ts_ config

text search configuration

english

regdictionary

Pe_ts_ dict

text search dictionary

simple

test=# create sequence seq_ test start with 1;

CREATE SEQUENCE

test= # select 'seq_ test'::regclass;

regclass

seq_ test

test= =# select 'seq_ test'::regelass::oid;

oid

49247

test= =# select 'sum(int4)'::regprocedure;

regprocedure

sum( integer)

test= # select 'sum(int4)'::regprocedure::oid;

Oid

2108

把sum函数转换成regprocedure类型站换成regprocedure

sum( integer)对应的函数是什么跟object id是通用的类型

15、Pseudo-Types 伪类型

Name

Description

any代表任何类型创建函数非常有用函数可以接收任何数据类型指定any

Indicates that a function accepts any input data type.

anyarray代表任何数组类型

Indicates that a function accepts any array data type (see Section 35.2.5).

anyelement

Indicates that a function accepts any data type (see Section 35.25).

anyenum

Indicates that a function accepts any enum data type (see Section 35.2,5 and Section 8.7).

anynonarray

Indicates that a function accepts any non-array data type (see Section 35.25).

cstring

Indicates that a function accepts or returns a null-terminated C string.

internal

Indicates that a function accepts or returns a server-internal data type.

Language_handler

A procedural language call handler is declared to return language_ handler.

fdw_ handler

A foreign-data wrapper handler is declared to return fdw_ handler .

record

Identifies a function returning an unspecified row type.

triger

A trigger function is declared to return trigger.

void

Indicates that a function returns no value.

Opaque

An obsolete type name that formerly served all the above purposes.

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
6月前
|
NoSQL 关系型数据库 MySQL
阿里云RDS关系型数据库大全_MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等,NoSQL数据库如Redis、Tair、Lindorm和MongoDB
254 0
|
4月前
|
SQL 关系型数据库 C语言
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
45 0
|
4月前
|
SQL 关系型数据库 数据库
PostgreSQL【应用 02】扩展SQL之C语言函数(编写、编译、载入)实例分享
PostgreSQL【应用 02】扩展SQL之C语言函数(编写、编译、载入)实例分享
47 0
|
4月前
|
SQL 关系型数据库 MySQL
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
98 0
|
4月前
|
SQL 关系型数据库 PostgreSQL
PostgreSQL【SQL 01】根据条件更新字段值或追加信息STRPOS(string, substring)函数使用及LIKE函数对比
PostgreSQL【SQL 01】根据条件更新字段值或追加信息STRPOS(string, substring)函数使用及LIKE函数对比
54 0
|
4月前
|
SQL 关系型数据库 PostgreSQL
PostgreSQL【部署 01】离线安装PostgreSQL+PostGIS踩坑及问题解决经验分享(含安装文件PostgreSQL+PostGIS及多个依赖+测试SQL)
PostgreSQL【部署 01】离线安装PostgreSQL+PostGIS踩坑及问题解决经验分享(含安装文件PostgreSQL+PostGIS及多个依赖+测试SQL)
111 0
|
4月前
|
SQL NoSQL 关系型数据库
postgresql|数据库|SQL语句冲突的解决
postgresql|数据库|SQL语句冲突的解决
70 0
|
4月前
|
SQL 关系型数据库 编译器
PostgreSQL SQL扩展 ---- C语言函数(二)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
65 0
|
4月前
|
SQL 关系型数据库 Shell
postgresql|数据库|批量执行SQL脚本文件的shell脚本
postgresql|数据库|批量执行SQL脚本文件的shell脚本
118 0
|
4月前
|
SQL 存储 关系型数据库
PostgreSQL SQL扩展 ---- C语言函数(一)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
43 0