一、访问函数
结果:
三、按某一列排序
postgres=# INSERT into tbase (nickname) VALUES('TBase 好');postgres=# INSERT into tbase (id,nickname) VALUES(1,'TBase 分布式数据库的时代来了');postgres=# select * from tbase order by id;
结果:
id | nickname—-+—————————– 1 | hello TBase 1 | TBase 分布式数据库的时代来了 2 | TBase 好(3 rows)
四、按第一列排序
postgres=# select * from tbase order by 1;
五、按 id 升序排序,再按 nickname 降序排序
postgres=# select * from tbase order by id, nickname desc;
六、随机排序
postgres=# select * from tbase order by random();
七、计算排序
postgres=# select * from tbase order by md5(nickname);
八、排序使用子查询
postgres=# select * from tbase order by (select id from tbase order by random() limit 1);
九、null 值排序结果处理
postgres=# insert into tbase values(4,null);postgres=# select * from tbase order by nickname nulls first;postgres=# select * from tbase order by nickname nulls last;
十、按拼音排序
postgres=# select * from (values ('张三'), ('李四'),('陈五')) t(myname) order by myname;postgres=# select * from (values ('张三'), ('李四'),('陈五')) t(myname) order by convert(myname::bytea,'UTF-8','GBK');postgres=# select * from (values ('张三'), ('李四'),('陈五')) t(myname) order by convert_to(myname,'GBK');postgres=# select * from (values ('张三'), ('李四'),('陈五')) t(myname) order by myname collate "zh_CN.utf8";
十二、单条件查询
postgres=# select * from tbase where id=1;
十三、多条件 and
postgres=# select * from tbase where id=1 and nickname like '%h%';
十四、多条件 or
postgres=# select * from tbase where id=2 or nickname like '%h%';
十五、ilike 不区分大小写匹配
postgres=# create table t_ilike(id int,mc text);postgres=# insert into t_ilike values(1,'tbase'),(2,'TBase');postgres=# select * from t_ilike where mc ilike '%tb%';
十六、where 条件支持子查询
postgres=# select * from tbase where id=(select (random()*2)::integer from tbase order by random() limit 1);
十七、null 值查询方法
postgres=# select * from tbase where nickname is null;postgres=# select * from tbase where nickname is not null;
十八、exists,只要有记录返回就为真
postgres=# create table t_exists1(id int,mc text);postgres=# insert into t_exists1 values(1,'tbase'),(2,'TBase');postgres=# create table t_exists2(id int,mc text);postgres=# insert into t_exists2 values(1,'tbase'),(1,'TBase');postgres=# select * from t_exists1 where exists(select 1 from t_exists2 where t_exists1.id=t_exists2.id);
十九、exists 等价写法
postgres=# select t_exists1.* from t_exists1, (select distinct id from t_exists2) as t where t_exists1.id=t.id;
20、分页查询
默认从第一条开始,返回一条记录:
postgres=# select * from tbase limit 1;
结果:
id | nickname—-+————- 1 | hello TBase(1 row)
使用 offset 指定从第几条开始,0 表示第一条开始,返回 1 条记录:
postgres=# select * from tbase limit 1 offset 0;
结果:
id | nickname—-+————- 1 | hello TBase(1 row)
从第 3 条开始,返回两条记录:
postgres=# select * from tbase limit 1 offset 2;
结果:
id | nickname—-+—————– 1 | TBase 分布式数据库的时代来了(1 row)
使用 order by 可以获得一个有序的结果:
postgres=# select * from tbase order by id limit 1 offset 2;
结果:
id | nickname—-+———– 2 | TBase 好(1 row)
21、合并多个查询结果
不过滤重复的记录:
postgres=# select * from tbase union all select * from t_appoint_col;
结果:
id | nickname—-+—————– 1 | hello TBase 2 | TBase 好 1 | TBase 分布式数据库的时代来了 1 | hello TBase(4 rows)
过滤重复的记录:
postgres=# select * from tbase union select * from t_appoint_col;
结果:
id | nickname—-+—————– 1 | TBase 分布式数据库的时代来了 1 | hello TBase 2 | TBase 好(3 rows)
22、返回两个结果的交集
postgres=# select * from t_intersect1 INTERSECT select * from t_intersect2;
结果:
id | mc—-+——- 1 | tbase(1 row)
23、返回两个结果的差集
postgres=# select * from t_except1 except select * from t_except2;
结果:
id | mc—-+——- 2 | tbase(1 row)
24、any 用法
只需要大于其中一个值即为真:
postgres=# select * from t_any where id > any (select 1 union select 3);
结果:
id | mc—-+——- 2 | TBase(1 row)
25、all 用法
需要大于所有值才为真:
postgres=# select * from t_all where id > all (select 1 union select 2);
结果:
id | mc—-+——- 3 | TBase(1 row)
27、统计记录数
postgres=# select count(1) from tbase;
结果:
count——- 3(1 row)
28、统计不重复值的记录表
postgres=# select count(distinct id) from tbase;
结果:
count——- 2(1 row)
29、求和
postgres=# select sum(id) from tbase;
结果:
sum—– 4(1 row)
30、求最大值
postgres=# select max(id) from tbase;
结果:
max—– 2(1 row)
31、求最小值
postgres=# select min(id) from tbase;
结果:
min—– 1(1 row)
32、求平均值
postgres=# select avg(id) from tbase;
结果:
avg——————– 1.3333333333333333(1 row)
33、分组字段合并成一个字符串
postgres=# create table t1(f1 int, f2 text, f3 text);postgres=# insert into t1 values(1,'a','a');postgres=# insert into t1 values(1,'b','b');postgres=# insert into t1 values(2,'a','a');postgres=# select f1, string_agg(f2, ',') from t1 group by f1;
结果:
f1 | string_agg—-+———— 1 | a,b 2 | a(2 rows)
34、去重和自定义聚合函数
在聚合函数中使用 DISTINCT 和 ORDER BY 需要满足特定条件,可以自定义函数来实现更灵活的聚合。
36、内连接
postgres=# select * from tbase inner join t_appoint_col on tbase.id=t_appoint_col.id;
结果:
id | nickname | id | nickname—-+—————————–+—-+————- 1 | hello TBase | 1 | hello TBase 1 | TBase 分布式数据库的时代来了 | 1 | hello TBase(2 rows)
37、左外连接
postgres=# select * from tbase left join t_appoint_col on tbase.id=t_appoint_col.id;
结果:
id | nickname | id | nickname—-+————+—-+————- 1 | hello TBase | 1 | hello TBase 2 | TBase 好 | | 1 | TBase 分布式数据库的时代来了 | 1 | hello TBase(3 rows)
38、右外连接
postgres=# select * from tbase right join t_appoint_col on tbase.id=t_appoint_col.id;
结果:
id | nickname | id | nickname—-+——————————-+—-+————- 1 | TBase 分布式数据库的时代来了 | 1 | hello TBase 1 | hello TBase | 1 | hello TBase | 5 | Power TBase(3 rows)
39、全连接
postgres=# select * from tbase full join t_appoint_col on tbase.id=t_appoint_col.id;
结果:
id | nickname | id | nickname—-+————+—-+————- 1 | hello TBase | 1 | hello TBase 2 | TBase 好 | | 1 | TBase 分布式数据库的时代来了 | 1 | hello TBase | | 5 | Power TBase(4 rows)
41、单核计算
postgres=# set max_parallel_workers_per_gather to 0;postgres=# select count(1) from t_count;
42、二核并行
postgres=# set max_parallel_workers_per_gather to 2;postgres=# select count(1) from t_count;
43、四核并行
postgres=# set max_parallel_workers_per_gather to 4;postgres=# select count(1) from t_count;
44、not in 子句包含 null 的情况
postgres=# create table t_not_in(id int, mc text);NOTICE: Replica identity is needed for shard table, please add to this table through "alter table" command.CREATE TABLEpostgres=# insert into t_not_in values(1, 'tbase'), (2, 'pgxz');INSERT 0 2postgres=# select * from t_not_in where id not in (3, 5);
结果:
id | mc—-+——- 1 | tbase 2 | pgxz(2 rows)
postgres=# select * from t_not_in where id not in (3, 5, null);
结果:无输出行
45、只查询特定数据节点(dn)的数据
postgres=# create table t_direct(id int, mc text);NOTICE: Replica identity is needed for shard table, please add to this table through "alter table" command.CREATE TABLEpostgres=# insert into t_direct values(1, 'tbase'), (3, 'pgxz');INSERT 0 2postgres=# EXECUTE DIRECT ON (dn001) 'select * from t_direct';
结果:
id | mc—-+——- 1 | tbase(1 row)
postgres=# EXECUTE DIRECT ON (dn002) 'select * from t_direct';
结果:
id | mc—-+—— 3 | pgxz(1 row)
查询所有节点的数据:
postgres=# select * from t_direct;
结果:
id | mc—-+——- 1 | tbase 3 | pgxz(2 rows)
47、多行变成单行
postgres=# create table t_mulcol_tosimplecol(id int, mc text);NOTICE: Replica identity is needed for shard table, please add to this table through "alter table" command.CREATE TABLEpostgres=# insert into t_mulcol_tosimplecol values(1, 'tbase'), (2, 'TBase');INSERT 0 2postgres=# select array_to_string(array(select mc from t_mulcol_tosimplecol), ',');
结果:
array_to_string—————– tbase,TBase(1 row)
48、一列变成多行
postgres=# create table t_col_to_mulrow(id int, mc text);NOTICE: Replica identity is needed for shard table, please add to this table through "alter table" command.CREATE TABLEpostgres=# insert into t_col_to_mulrow values(1, 'tbase,TBase');INSERT 0 1postgres=# select regexp_split_to_table((select mc from t_col_to_mulrow where id=1 limit 1), ',');
结果:
regexp_split_to_table———————– tbase TBase(2 rows)
49、查询记录所在数据节点
postgres=# select xc_node_id, * from t1;
结果:
xc_node_id | f1 | f2————+—-+—- 2142761564 | 1 | 3 2142761564 | 1 | 3(2 rows)
查询并映射节点名称:
postgres=# select t1.xc_node_id, pgxc_node.node_name, t1.* from t1, pgxc_node where t1.xc_node_id=pgxc_node.node_id;
结果:
xc_node_id | node_name | f1 | f2————+———–+—-+—- 2142761564 | dn001 | 1 | 3 2142761564 | dn001 | 1 | 3(2 rows)
50、grouping sets/rollup/cube 用法
group by 用法
创建销售明细表并插入数据:
create table t_grouping(id int, dep varchar(20), product varchar(20), num int);insert into t_grouping values(1, '业务 1 部', '手机', 90);– 更多插入数据 …
按部门和产品进行分组汇总:
postgres=# select dep, product, sum(num) from t_grouping group by dep, product order by dep, product;
结果:
dep | product | sum———–+———–+—– 业务 1 部 | 电脑 | 80 业务 1 部 | 手机 | 160 业务 2 部 | 电脑 | 120 业务 2 部 | 手机 | 50 业务 3 部 | 电脑 | 80 业务 3 部 | 手机 | 160
使用 grouping sets 进行分组:
postgres=# select dep, product, sum(num) from t_grouping group by grouping sets((dep), (product), ());
结果:
dep | product | sum———–+———–+—– 业务 1 部 | (空) | 240 业务 2 部 | (空) | 170 业务 3 部 | (空) | 240 电脑 | (空) | 280 手机 | (空) | 370(空) | (空) | 650
使用 rollup 和 cube:
postgres=# select dep, product, sum(num) from t_grouping group by rollup((dep), (product));postgres=# select dep, product, sum(num) from t_grouping group by cube((dep), (product));
结果与 grouping sets 相同。
52、创建一个预备语句
postgres=# create table t1(f1 int, f2 int);CREATE TABLEpostgres=# insert into t1 values(1, 1), (2, 2);COPY 2postgres=# PREPARE usrrptplan (int) AS SELECT * FROM t1 WHERE f1=$1;PREPAREpostgres=# EXECUTE usrrptplan(1);
结果:
f1 | f2—-+—- 1 | 1(1 row)
53、释放一个预备语句
postgres=# DEALLOCATE usrrptplan;DEALLOCATEpostgres=# EXECUTE usrrptplan(1);ERROR: prepared statement "usrrptplan" does not exist