赞
踩
本文是《postgresql实战》的读书笔记,具体可以参考本书对应章节
类型名称 | 存储长度 | 描述 | 范围 |
---|---|---|---|
smallint | 2 bytes | 小范围整数类型 | -32768 to +32767 |
integer | 4 bytes | 整数类型 | -2147483648 to +2147483647 |
bigint | 8 bytes | 大范围数据类型 | -9223372036854775808 to 9223372036854775807 |
decimal | 可变 | 用户指定精度 | up to 131072 digits before the decimal point; up to 16383 digits after the decimal point |
numeric | 可变 | 用户指定精度 | up to 131072 digits before the decimal point; up to 16383 digits after the decimal point |
real | 4 bytes | 变长,不精确 | 6位十进制精度 |
double precision | 8 bytes | 变长,不精确 | 15 位十进制精度 |
smallserial | 2 bytes | small自增序列 | 1 to 32767 |
serial | 4 bytes | integer 自增序列 | 1 to 2147483647 |
bigserial | 8 bytes | bigint 自增序列 | 1 to 9223372036854775807 |
decimal
和numeric
是等效的。可以存储指定精度的多位数据。比如带小数位的数据。适用于要求计算准确的数值运算。
-- 声明number的语法:
numberic(precision,scale)
-- precision 是指numeric数字里的全部位数
-- scale 是指小数部分的数字位数
smallserial
、serial
和 bigserial
类型是指自增serial类型。严格意义不算一种数据类型。
-- serial 应用
create tabel test_serial(id serial,flag text)
-- 插入表数据可以不指定serial字段名称
函数名称 | 作用描述 |
---|---|
mod() | 按模取余 |
round() | 四舍五入 |
ceil() | 向上取整 |
floor() | 向下取整 |
字符类型名称 | 描述 |
---|---|
character varing(n),varchar(n) | 变成,字符最大数有限制 |
character(n),char(n) | 定长,字符数没有达到最大值则使用空白填充 |
text | 变成,无长度限制 |
函数名称 | 作用描述 |
---|---|
char_length() | 字符数 |
octet_length() | 字节数 |
position() | 指定字符在字符串的位置 |
substring() | 提取字符串中的子 串 |
split_part(string text,delimiter text,field int) | 根据delimiter分隔符拆分字符串string,并返回指定字段,字段从1开始 |
字符类型名称 | 存储长度 | 描述 |
---|---|---|
timestamp [(p)] [without time zone ] | 8 bytes | 包括日期和时间,不带时区,简写timestamp |
timestamp [(p) ] with time zone | 8 bytes | 包括日期和时间,带时区,简写timestamp |
date | 4 bytes | 不含时间 |
time [ (p)] [ without time zone ] | 8 bytes | time of day (no date) 00:00:00 24:00:00 |
time [ (p)] with time zone | 12 bytes | times of day only, with time zone 00:00:00+1459 24:00:00-1459 |
interval [fields ] [(p) ] | 12 bytes | time interval -178000000 years 178000000 years |
SELECT date '2018-11-18' + interval ' 1 days';
-- 2018-11-19 00:00:00
SELECT date '2018-11-18' - interval '1 hour';
--2018-11-17 23:00:00
函数名称 | 作用描述 |
---|---|
current_date | 当前日期 |
current_time | 当前时间 |
extract(field FROM source) | 可以从日期、时间数据类型中抽取年、月、日、时、分、秒信息 field可以是century、year、day、hour、minute、second等 source类型为timestamp、time、interval的表达式 |
-- 当天属于当年的第几天
SELECT extract(doy from now());
postgresql支持一维数组和多维数组。常用的数组类型为数字和字符类型数组。
创建表时在字段数据类型后面加[]
即定义数组类型。
--1. 创建表 CREATE TABLE test_array( id integer, array_i integer[], array_t text[] ); --2.插入数据 --方式一: INSERT INTO test_array(id,array_i,array_t) VALUES(1,'{1,2,3}','{"a","b","c"}'); --方式二: INSERT INTO test_array(id,array_i,array_t) VALUES(2,array[4,5,6],array['d','e','f']); -- 3.查询数据元素 select array_i[1],array_t[3] FROM test_array WHERE id = 1; --4. 修改 UPDATE test_array SET array_i[3]=4 WHERE id = 1;
-- 追加(追加末尾),移除(指定值)
select array_append(array[1,2],3),array_remove(array[1,2],2);
-- 获取维度
SELECT array_ndims(array[1,2]);
postgresql不只是关系型数据库,同时还支持非关系数据类型json。 json属于重量级的非常规数据类型。
--1.创建
CREATE TABLE test_json1(
id serial PRIMARY key,
name json
);
--2.插入数据
INSERT INTO test_json1(name) VALUES ('{"col1":1,"col2":"jack","col3":"male"}');
--3.查询
SELECT * FROM test_json1;
--4. 通过 "->"操作符可以查询json数据的键值
SELECT name -> 'col2' AS name FROM test_json1 WHERE id = 1;
--5.如果以文本格式返回json字段键值可以使用 "->>"操作符
SELECT name ->> 'col2' FROM test_json1 WHERE id = 1;
json
存储格式为文本而jsonb
存储为二进制。。 json类型以文本存储并储存的内容和输入数据一样,当检索json数据时必须重新解析,而jsonb以二进制形式存储已解析好的数据。当检索jsonb数据时不需要重新解析,因此json写入比jsonb快,但检索比jsonb慢。
--1.删除json数据的键/值。 SELECT '{"a":1,"b":2}'::jsonb - 'a'; --jsonb与json函数 --扩展最外层的json对象称为一组 键/值得结果集。 SELECT * FROM json_each('{"a":"foo","b":"bar"}'); /* key value a "foo" b "bar" */ --以文本格式返回 SELECT * FROM json_each_text('{"a":"foo","b":"bar"}'); /* key value a foo b bar */ --row_to_json()函数 -- 能够将行作为json对象返回,此函数常用来生成json测试数据。 -- 比如将普通表转换成json类型表。 create TABLE test_copy( id int4, name varchar(20) ); INSERT INTO test_copy(id,name) VALUES(1,'a'),(2,'b'); -- 将普通表转成json类型表 SELECT row_to_json(test_copy) FROM test_copy; /** row_to_json {"id":1,"name":"a"} {"id":2,"name":"b"} */ -- 返回最外层的json对象中的键的集合 SELECT * FROM json_object_keys('{"a":"foo","b":"bar"}'); /* json_object_keys a b */ -- jsonb 键/值的追加、删除、更新 -- jsonb 追加 通过 "||"操作符 SELECT '{"name":"jack","age":"31"}'::jsonb || '{"sex":"male"}'::jsonb; -- {"age": "31", "sex": "male", "name": "jack"} -- json 键/值删除有两种方式 :① "-" ②"#-" SELECT '{"age": "31", "sex": "male", "name": "jack"}' ::jsonb - 'sex'; -- {"age": "31", "name": "jack"} -- 第二种:"#-" 通常用于嵌套json数据删除的场景 SELECT '{"name":"meki","contact":{"phone":"1234","fax":"0101"}}'::jsonb #- '{contact,fax}'::text[]; -- {"name": "meki", "contact": {"phone": "1234"}} -- 键值更新 。一种方式通过 "||" ;另外一种是 jsonb_set SELECT '{"name":"frank","age":"11"}'::jsonb || '{"age":"12"}'::jsonb; -- {"age": "12", "name": "frank"} --jsonb_set(target jsonb,path text[],new_value [,create_missing booean) -- create_missing值为false表示如果键不存在则不添加 SELECT jsonb_set('{"name":"frank","age":"11"}'::jsonb,'{sex}','"male"'::jsonb,true); -- {"age": "11", "sex": "male", "name": "frank"}
postgresql数据类型转换主要有三种方式:
CAST
函数::
操作符函数 | 返回类型 | 描述 | 示例 |
---|---|---|---|
to_char(timestamp,text) | text | 把时间戳转换成字符串 | to_char(current_timestamp,‘HH12:MI:SS’) |
to_char(interval,text) | text | 把间隔转换成字符串 | interval ‘15h 2m 12s’,HH24:MI:SS |
to_char(int,text) | text | 把整数转成字符串 | to_char(111,‘999’) |
to_date(text,text) | date | 把字符串转换成日期 | to_date(‘05 Dec 2000’,‘DD Mon YYYYY’) |
-- 通过CAST函数进行转换
SELECT CAST(VARCHAR'123' as TEXT);
SELECT CAST(VARCHAR '123' AS INT4);
-- 通过 ::操作符进行转换
SELECT 1::int4,3/2::NUMERIC;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。