1. 数字类型

1.1 数字类型:

类型名称 存储长度 描述 范围
smallint(int2) 2字节 小范围整数类型 -32 768到+32 767
integer(int4) 4字节 整数类型 -2 147 483 648到+2 147 483 647
bigint(int8) 8字节 大范围整数类型 -9 223 372 036 854 775 808到+9 223 372 036 854 775 807
decimal 可变 用户指定精度 小数点前131 072位;小数点后16 383位
numeric 可变 用户指定精度 小数点前131 072位;小数点后16 383位
real 4字节 变长,不精确 6位十进制精度
double precision 8字节 变长,不精确 15位十进制精度
smallserial 2字节 smallint自增序列 1到32 767
serial 4字节 integer自增序列 1到2 147 483 647
bigserial 8字节 bigint自增序列 1到9 223 372 036 854 775 807

1.2 数字类型说明:

  1. 1. smallintintegerbigint类型详细说明:
  2. smallintintegerbigint都是整数类型,例如定义integer类型的表:
  3. create table test_integer (id1 integer,id2 int4);
  4. 2. decimalnumeric类型详细说明:
  5. decimalnumeric是等效的,可以存储指定精度的多位数据
  6. 比如带小数位的数据,适用于要求计算准确的数值运算。
  7. 例如numeric(2,1) 即这个数不超过2位数,且小数点后面最多有一位,多出来的小数会被四舍五入。
  8. create table test (num numeric(2,1));
  9. insert into test values (2.2);
  10. num
  11. -----
  12. 2.2
  13. insert into test values (2.26);
  14. num
  15. -----
  16. 2.3
  17. 3. realdouble precision是浮点数据类型
  18. numeric 可以存储最多1000位精度的数字并且准确地进行计算。
  19. 非常适合用于货币金额和其它要求计算准确的数量。
  20. 不过,numeric类型上的算术运算比整数类型或者浮点数类型要慢的多。
  21. 4. smallserialserialbigserial类型是自增serial类型,如下创建一张测试表:
  22. postgres=# create table test_serial (id serial,flag text);
  23. CREATE TABLE
  24. postgres=# insert into test_serial (flag) values ('a');
  25. INSERT 0 1
  26. postgres=# insert into test_serial (flag) values ('b');
  27. INSERT 0 1
  28. postgres=# insert into test_serial (flag) values ('c');
  29. INSERT 0 1
  30. postgres=# select * from test_serial;
  31. id | flag
  32. ----+------
  33. 1 | a
  34. 2 | b
  35. 3 | c
  36. (3 rows)

< http://www.javashuo.com/article/p-zwuoxwat-cq.html>

1.3 数字类型操作符和数学函数

  1. 1. 例如计算加、减、乘、除、模取余:
  2. postgres=# select 1+2,2*3,4/2,8%3;
  3. ?column? | ?column? | ?column? | ?column?
  4. ----------+----------+----------+----------
  5. 3 | 6 | 2 | 2
  6. 2. 按模取余:
  7. postgres=# select mod(8,3);
  8. mod
  9. -----
  10. 2
  11. 3. 四舍五入:
  12. postgres=# select round(10.2),round(10.9);
  13. round | round
  14. -------+-------
  15. 10 | 11
  16. 4. 返回大于或等于给出参数的最小整数:
  17. postgres=# select ceil(3.6),ceil(-3.6);
  18. ceil | ceil
  19. ------+------
  20. 4 | -3
  21. (1 row)
  22. 5. 返回小于或等于给出参数的最大整数:
  23. postgres=# select floor(3.6),floor(-3.6);
  24. floor | floor
  25. -------+-------
  26. 3 | -4
  27. (1 row)

2.字符类型

2.1 字符类型:

字符类型名称 描述
character varying(n),varchar(n) 变长,字符最大数有限制
character(n),char(n) 定长,字符数没达到最大值则使用空白填充
text 变长,无长度限制

2.2 字符类型说明

  1. 1. 创建一张测试表,并插入一条测试数据:
  2. create table test_char(col1 varchar(4),col2 character(4));
  3. insert into test_char(col1,col2) values('a','a');
  4. 2. 查看两个字段值的字符串长度:
  5. postgres=# select char_length(col1),char_length(col2) from test_char;
  6. char_length | char_length
  7. -------------+-------------
  8. 1 | 1
  9. 3. 查看两个字段实际占用的物理空间大小:
  10. postgres=# select octet_length(col1),octet_length(col2) from test_char;
  11. octet_length | octet_length
  12. --------------+--------------
  13. 1 | 4
  14. (1 row)

2.3 字符类型函数

  1. 计算字符串占用的字符数:
  2. postgres=# select char_length('abcd');
  3. char_length
  4. -------------
  5. 4
  6. 计算字符串占用的字节数:
  7. postgres=# select octet_length('abcd');
  8. octet_length
  9. --------------
  10. 4
  11. 指定字符在字符串的位置:
  12. postgres=# select position('a' in 'abcd');
  13. position
  14. ----------
  15. 1
  16. 提取字符串中的子串:
  17. postgres=# select substring('abcdedfdfdd' from 4 for 4);
  18. substring
  19. -----------
  20. dedf
  21. 拆分字符串,split_part函数:
  22. # 以@为分隔符,提取第二列:
  23. postgres=# select split_part('abc@def@ghr','@',2);
  24. split_part
  25. ------------
  26. def

3.时间/日期类型

3.1 时间类型:

字符类型名称 存储长度 描述
timestamp[ (p) ] [without time zone] 8字节 包括日期和时间,不带时区,简写timestamp
timestamp[ (p) ] with time zone 8字节 包括日期和时间,带时区,简写成timestamptz
date 4字节 日期,但不包含一天中的时间
time[ (p) ] [without time zone] 8字节 一天中的时间,不包含日期,不带时区
time[ (p) ] [with time zone] 12字节 一天中的时间,不包含日期,带时区
interval[ fields ] [ (p) ] 16字节 时间间隔

3.1.1 时间类型转换

  1. 系统自带的now()函数,默认返回的类型为timestamp [ (p) ] with time zone类型,如下所示:
  2. postgres=# select now();
  3. now
  4. -------------------------------
  5. 2022-02-21 12:55:44.192936+08
  6. timestimep[ (p) ] with time zone类型转换为timestimep without time zone类型:
  7. postgres=# select now()::timestamp without time zone;
  8. now
  9. ----------------------------
  10. 2022-02-22 12:30:30.851688
  11. 转换成date类型:
  12. postgres=# select now()::date;
  13. now
  14. ------------
  15. 2022-02-22
  16. 转换成time without time zone类型:
  17. postgres=# select now()::time without time zone;
  18. now
  19. -----------------
  20. 12:31:44.490888
  21. 转换成time with time zone类型:
  22. postgres=# select now()::time with time zone;
  23. now
  24. --------------------
  25. 12:32:12.679392+08

3.2 时间/日期类型操作符

  1. 日期相加:
  2. postgres=# select date '2017-07-29' + interval'1 days';
  3. ?column?
  4. ---------------------
  5. 2017-07-30 00:00:00
  6. 日期相减:
  7. postgres=# select date '2017-07-29' - interval'1 days';
  8. ?column?
  9. ---------------------
  10. 2017-07-28 00:00:00
  11. 日期相乘:(例如100秒乘1秒)
  12. postgres=# select 100* interval '1 second';
  13. ?column?
  14. ----------
  15. 00:01:40
  16. 日期相除:(例如将1小时除3
  17. postgres=# select interval '1 hour' / double precision '3';
  18. ?column?
  19. ----------
  20. 00:20:00

3.3 时间、日期类型常用函数:

  1. 显示当前时间:
  2. postgres=# select current_date,current_time;
  3. current_date | current_time
  4. --------------+--------------------
  5. 2021-06-02 | 19:14:25.254973+08
  6. extract函数,可以从日期、时间、数据类型中抽取年、月、日、时、分、秒信息:
  7. # 语法:
  8. extract (field from source)
  9. # field值可以为century、year、month、day、hour、minute、second等,source类型为timestamp、time、interval的值表达式,例如取年份,代码如下:
  10. postgres=# select extract(year from now());
  11. date_part
  12. -----------
  13. 2021
  14. 对于timestamp类型,取月份和月份里的第几天:
  15. postgres=# select extract(month from now()),extract(day from now());
  16. date_part | date_part
  17. -----------+-----------
  18. 6 | 2
  19. 取小时,分钟:
  20. postgres=# select extract(hour from now()),extract(minute from now());
  21. date_part | date_part
  22. -----------+-----------
  23. 19 | 31
  24. 取秒:
  25. postgres=# select extract(second from now());
  26. date_part
  27. -----------
  28. 25.230762
  29. 取当前日期所在年份中的第几周:
  30. postgres=# select extract(week from now());
  31. date_part
  32. -----------
  33. 22
  34. 当天属于当前年份的第几天:
  35. postgres=# select extract(doy from now());
  36. date_part
  37. -----------
  38. 153

4.布尔类型

4.1 布尔类型:

字符类型名称 存储长度 描述
boolean 1字节 状态为true或false

4.2 布尔类型说明:

  1. true状态的有效值可以是TRUEttrueyyeson1false状态的有效值为FALSEffasennooff0
  2. # 创建表并插入数据:
  3. create table test_boolean(cola boolean,colb boolean);
  4. insert into test_boolean (cola,colb) values ('true','false');
  5. insert into test_boolean (cola,colb) values ('t','f')
  6. insert into test_boolean (cola,colb) values ('TRUE','FALSE');
  7. insert into test_boolean (cola,colb) values ('yes','no');
  8. insert into test_boolean (cola,colb) values ('y','n');
  9. insert into test_boolean (cola,colb) values ('1','0');
  10. insert into test_boolean (cola,colb) values (null,null);
  11. # 以上插入的是TRUE、t、true、y、yes、on、1和FALSE、f、fase、n、no、off、0,但最终显示结果都会以t或f进行显示,而插入的null值,则为空:

image.png

删除库下所有表:

DO $$ DECLARE r RECORD; BEGIN — if the schema you operate on is not”current”, you will want to — replace current_schema() in query with ‘schematodeletetablesfrom’ — and update the generate ‘DROP…’ accordingly. FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP EXECUTE ‘DROP TABLE IF EXISTS ‘ || quote_ident(r.tablename) || ‘ CASCADE’; END LOOP; END $$;

5.网络地址类型

5.1 网络地址类型:

字符类型名称 存储长度 描述
cidr 7或19字节 IPv4和IPv6网络
inet 7或19字节 IPv4和IPv6网络
macaddr 6字节 MAC地址
macaddr8 8字节 MAC地址(EUI-64格式)

5.2 网络地址演示说明:

  1. 说明:
  2. inetcidr类型存储的网络地址格式为address/y,其中address表示IPv4IPv6网络地址,y表示网络掩码位数,如果y省略,IPv4掩码为32IPv6掩码为128inetcidr类型都会对数据合法性进行检查,如果数据不合法则报错:

image.png

  1. inetcidr类型的差别:

cidr类型的输出默认带子网掩码,而inet不一定:
image.png
image.png

cidr类型对IP地址和子网掩码合法性进行检查而inet不会:
image.png
image.png

5.3 网络地址操作符:

操作符 描述 举例说明
< 小于 inet’192.168.1.5’ < inet ‘192.168.1.6’
<= 小于等于 inet ‘192.168.1.5’ <= inet ‘192.168.1.5’
= 等于 inet’192.168.1.5’ = inet’192.168.1.5’
>= 大于等于 inet ‘192.168.1.5’ >= inet ‘192.168.1.5’
> 大于 inet’192.168.1.6’ > inet’192.168.1.5’
<> 不等于 inet’192.168.1.5’ <> inet’192.168.1.6’
<< 被包含 inet’192.168.5’ << inet’192.168.1’/24
<<= 被包含或等于 inet’192.168.1’ <<= inet’192.168.1’
>> 包含 inet’192.168.1’/24 >> inet’192.168.5’
>>= 包含或等于 inet’192.168.1’ >>= inet’192.168.1’
&& 包含或被包含 inet’192.168.1’/24 && inet’192.168.1.80/28’
~ 按位取反 ~inet’192.168.1.6’;
& 按位与 inet’192.168.1.6’ & inet’0.0.0.255’
| 按位或 inet’192.168.1.6’ | inet’0.0.0.255’
+ inet’192.168.1.6’ + 1
- inet’192.168.1.6’ – 1
- inet’192.168.1.6’ - inet’192.168.1.5’

5.4 网络地址操作符

  1. IP地址,返回文本格式:
  2. select host(cidr '192.168.1.0/24');
  3. IP地址和网络掩码,返回文本格式:
  4. select text(cidr '192.168.1.0/24');
  5. 取网络地址子网掩码,返回文本格式:
  6. select netmask(cidr '192.168.1.0/24');

image.png
image.png
image.png

6.范围类型

6.1 范围类型:

int4range integer范围类型
int8range bigint范围类型
numrange numeric范围类型
tsrange timestamp范围类型
tstzrange timestamp范围类型
daterange date范围类型

6.2 范围类型说明:

  1. 用户可以通过create type自定义范围类型,integer范围类型举例:
  2. daet范围类型举例:

image.png
image.png

6.3 范围类型操作符:

  1. 以下所包含的是否都大于3,如果是则显示f
  2. 以下所包含,左边的是否大于右边的,如果不是则显示f
  3. 等于操作符:
  4. 计算交叉:
  5. 范围是否为空:
  6. 提取上边界:
  7. 提取下边界:

image.png
image.png
image.png
image.png
image.png
image.png
image.png

6.4 给范围类型创建索引:

  1. 范围类型数据支持创建GIST索引,GIST索引支持的操作符有“=” “&&” “<@” “@>” “<<” “-|-” “&>” “&<”等:
  2. create index idx_ip_address_range on ip_address using gist (ip_range);

6.5 演示说明:

  1. 创建一个json类型的表,并插入数据:
  2. create table test_json1 (id serial primary key,name json);
  3. insert into test_json1 (name) values ('{"col1":1,"col2":"francs","col3":"male"}');
  4. insert into test_json1 (name) values ('{"col1":2,"col2":"fp","col3":"male"}');
  5. 查看表test_json1中的数据:
  6. 查看json数据的键值:
  7. select name -> 'col2' from test_json1 where id=1;
  8. 以文本的形式显示json数据的键值:
  9. select name ->> 'col2' from test_json1 where id = 1;

image.png
image.png

7.jsonb/json类型

7.1 jsonb/json差异

  1. jsonb的输入和输出键值的顺序不一样,而json则完全一样:
  2. select '{"bar":"baz","balance":7.77,"active":false}'::jsonb;
  3. select '{"bar":"baz","balance":7.77,"active":false}'::json;
  4. jsonb类型会去掉数据中键值的空格:
  5. select '{"id":1, "name":"francs"}'::jsonb;
  6. jsonb会删除重复的键:
  7. select '{"id":1,"name":"francs","name":"test"}'::jsonb;

image.png
image.png

image.png

image.png

7.2 jsonb/json操作符

  1. 以文本格式显示json类型的字段键值可以使用“->>”操作符:
  2. select name ->> 'col2' from test_json1 where id=1;
  3. 字符串是否作为顶层键值:
  4. select '{"a":1,"b":2}'::jsonb ? 'a';
  5. 删除json数据的键值:
  6. select '{"a":1,"b":2}'::jsonb - 'a';

image.png
image.png
image.png

7.3 jsonb/json函数

  1. 扩展最外层的json对象成为一组键/值结果集:
  2. select * from json_each('{"a":"foo","b":"bar"}');
  3. 以文本形式返回结果:
  4. select * from json_each_text('{"a":"foo","b":"bar"}');
  5. row_to_json()函数,例如将一个普通表转换为json格式:
  6. create table test_copy (id serial not null,name varchar(30));
  7. insert into test_copy (name) values ('foo');
  8. select row_to_json(test_copy) from test_copy;
  9. 返回最外层的json对象中的键的集合:
  10. select * from json_object_keys('{"a":"foo","b":"bar"}');

image.png
image.png
image.png
image.png

7.4 jsonb键/值的追加、删除、更新:

  1. jsonb键/值追加可通过“||”操作符,例如增减sex键:
  2. select '{"name":"francs","age":"31"}'::jsonb || '{"sex":"male"}'::jsonb;
  3. 删除键/值:
  4. # 方法一,通过“-”删除:
  5. select '{"name":"james","emai1":"james@localhost"}'::jsonb - 'emai1';
  6. select '["red","green","blue"]'::jsonb -0;
  7. # 方法二,通过“#-”删除指定键/值,通常用于有嵌套json数据删除场景:
  8. # 如删除嵌套contact中的fax值:
  9. select '{"name":"James","contact":{"phone":"01234 567890","fax":"01987 543210"}}'::jsonb #- '{contact,fax}'::text[];
  10. # 删除嵌套aliases中的位置为1的键/值:
  11. select '{"name":"James","aliases":["Jamie","The Jamester","J Man"]}'::jsonb #- '{aliases,1}'::text[];
  12. 键/值更新:
  13. # 方法一,使用“||”操作符,如更改age列:
  14. select '{"name":"francs","age":"31"}'::jsonb || '{"age":"32"}'::jsonb;
  15. # 方法二,使用jsonb_set函数:
  16. # 如更新age列:
  17. select jsonb_set('{"name":"francs","age":"31"}'::jsonb,'{age}','"32"'::jsonb,false);
  18. # 如增加set列:
  19. select jsonb_set('{"name":"francs","age":"31"}'::jsonb,'{set}','"male"'::jsonb,true);

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

8.数据类型转换

8.1 通过CAST函数进行转换

  1. varchar字符类型转换成text类型:
  2. select cast(varchar'123' as text);
  3. varchar字符类型转换成int4类型:
  4. select cast(varchar'123' as int4);

image.png
image.png

8.2 通过 :: 操作符经行转换

  1. 转换为int4numeric类型:
  2. select 1::int4,3/2::numeric;
  3. 通过SQL查询某个表的字段名称:
  4. # 方法一,在使用类型转换之前需要两步完成:
  5. # 首先获取指定表的OID:
  6. select oid,relname from pg_class where relname = 'test_json1';
  7. # 在通过OID查询某个表的字段:
  8. select attname from pg_attribute where attrelid='33036' and attnum > 0;
  9. # 方法二,使用类型转换后可一步完成:
  10. select attname,attrelid,attnum from pg_attribute where attrelid='test_json1'::regclass and attnum >0;

image.png
image.png