[转帖]PG语法解剖--基本sql语句用法入门

时间:2022-04-12 01:54:02

PG语法解剖--基本sql语句用法入门

https://www.toutiao.com/i6710897833953722894/

COPY 命令挺好的 需要学习一下. 

 

原创 波波说运维 2019-07-12 00:02:00

概述

今天主要对PG数据库的一些基本SQL语句用法做个介绍,做个简单了解,也做备忘!

下面主要用例子来说明。

[转帖]PG语法解剖--基本sql语句用法入门

 

1、建表语句

create table test (
id int8 primary key,
info text,
crt_time timestamp
);

注意保留字

2、select into & create table as

postgres=# select * into table new_tbl from pg_class;
postgres=# create table tbl_1 as select * from pg_class;
[转帖]PG语法解剖--基本sql语句用法入门

 

3、插入更新删除查询

insert into tbl (xx,xx) values (xx,xx);
update tbl set xx=xx where xxx;
delete from tbl where xxx=xxx;
select xx from xx where xx...;

如果是delete|update limit,则:

update tbl set xx=xx where ctid = any ( array (select ctid from tbl where xx limit ? for update));
delete from tbl where ctid = any ( array (select ctid from tbl where xx limit ? for update));

4、批量DML

insert into xx values (),(),...(); 
copy xx from stdin;
copy xx from ‘file‘;
pg_bulkload
update t set info=t1.info,crt_time=t1.crt_time from t1,t2 where (t.id=t1.id) and t1.id=t2.id;
update tbl_1 set relname=tmp.rel from (values (1,‘test1‘),(2,‘test2‘)) tmp (id, rel) where tmp.id=tbl_1.id;
delete from t using t1 where t.id=t1.id;
delete from tbl_1 using (values (1),(2)) tmp (rel) where tmp.rel=tbl_1.reltype;

注意update , delete 批量操作,JOIN不是一一对应时,更新目标可能会随机匹配。

5、DB端copy 客户端copy

• https://github.com/digoal/blog/blob/master/201805/20180516_03.md

• https://github.com/digoal/blog/blob/master/201805/20180510_01.md

5.1、copy为什么快?

协议:

[转帖]PG语法解剖--基本sql语句用法入门

 

5.2、DB 端copy

copy tbl to ‘file‘;
copy (SQL) to ‘file‘;
copy tbl from ‘file‘;
[转帖]PG语法解剖--基本sql语句用法入门

 

5.3、客户端copy

copy tbl from stdin;c
opy (SQL) to stdout;
copy tbl to stdout;
psql (copy to | from); -- copy协议

6、排序 offset limit

select * from tbl_1 order by relname nulls first;
select * from tbl_1 order by relname nulls last;
select * from tbl_1 order by relname;
select * from tbl_1 order by relname limit 10 offset 10;
select * from tbl_1 order by relname::text collate "C";

7、聚合 解耦合

select string_agg(relname,‘,‘ order by xx) from tbl_1; 
select g,avg(c1) from tbl group by g;
[转帖]PG语法解剖--基本sql语句用法入门

 

8、distinct

select distinct relname,relnamespace from pg_class;SELECT id, COUNT_DISTINCT(val) FROM test_table GROUP BY 1;
select count(distinct (relname,relnamespace)) from pg_class;select distinct on (c3) c2,c3 from tbl;

9、INNER|OUTER JOIN

•inner

select * from t1 join t2 on (t1.x=t2.x) where xxxx;

• left

1)scan filter

select t1.*,t2.* from t1 left join t2 on (t1.x=t2.x) where t1.x=x;

2)join filter

select t1.*,t2.* from t1 left join t2 on (t1.x=t2.x and t1.x=x);

• right

把上面的left join改成right join即可,这里就不多说了。