1 数据操作
1.1 插入数据
insert into <tablename> values (a,b,c,d,...);
insert into <tablename>(columnname1,columnname2,...) values(a,b,...);
1.1.1 插入多条数据
insert into <tablename> values (a,b,c,d,...),(a1,b1,c1,d1,...),...;
1.1.2 将查询结果插入表
insert into <tablename>(columnname1,columnname2,...) select (columnname3,columnname4,...) from <atablename> where <condition>;
1.2 更新数据
update <tablename> set columnname1=xxx,columnname2=xxx,... where <condition>;
1.3 删除数据
delete from <tablename> [where <condition>];
1.4 查询数据
select * from <tablename>;
select columnname1,columnname2 from <tablename>;
select * from <tablename> where columname=xxx and columnname2=xxx;
1.4.1 集合函数查询
-
COUNT()
select count(*) from <tablename> where <condition>; select columnname,count(*) from <tablename> where <condition> group by columnname;
-
AVG()
-
MAX()
-
MIN()
-
SUM()
1.4.2 连接查询
1.4.2.1 内连接
select * from batch_job_execution e,batch_job_instance i where e.job_instance_id=i.job_instance_id;
1.4.2.2 外连接
-
LEFT JOIN
:返回左表全部数据以及右表中连接字段相等的数据。select tablename1.columnname...,tablename2.columnname... from tablename1 left outer join tablename2 on tablename1.columnname=tablename2.columnname;
例如:
select e.job_instance_id,e.job_execution_id,p.key_name,p.string_val from batch_job_execution e left outer join batch_job_execution_params p on e.job_execution_id=p.job_execution_id;
-
RIGHT JOIN
:返回右表全部数据以及左表中连接字段相等的数据。
1.4.3 子查询
1.4.3.1 ANY
返回tablename1的columnname1中的字段>tablename2中columname2的字段中任意一个值的数据。
select * from tablename1 where columnname1> ANY (select columname2 from tablename2);
1.4.3.2 ALL
返回tablename1的columnname1中的字段>tablename2中columname2的字段中所有值的数据
1.4.3.3 IN
select * from tablename1 where columnname1 in (select columnname2 from tablename2);
1.4.3.4 EXISTS
EXISTS
后面跟子查询语句,如果子查询语句至少返回一行数据,则执行外层查询语句,否则不执行。
NOT EXISTS
后面跟子查询语句,如果子查询语句没有返回行,则执行外层查询语句,否则不执行。
select * from tablename1 where exists(select * from tablename2 where <condition>);
select * from tablename1 where not exists(select * from tablename2 where <condition>);
1.4.4 合并查询结果
select * from tablename1 union [all] select * from tablename2;
1.4.5 正则表达式查询
~
:匹配正则表达式,区分大小写~*
:匹配正则表达式,不区分大小写!~
:不匹配正则表达式,区分大小写!~*
:不匹配正则表达式,不区分大小写。
select * from <tablename> where columname [~/~*/!~/!~*] '正则表达式'
2 索引
2.1 索引分类
postgre的索引包括 b-tree,hash,GiST,GIN。常用btree,hash只能用于=
。
2.2 索引设计原则
- 不要在数据量少的表中建索引,有可能直接查询时间比遍历索引时间更短;
- 不要建立过多的索引,只根据需要建索引,否则会影响插入、删除、修改速度,还会占用磁盘空间;
- 不要对枚举类型的字段或者值类型少的字段建索引,否则不但不会提高查询效率,还会影响更新效率;
- 在频繁进行排序或分组的列上建立索引时,如果待排序列有多个,可以创建联合索引。
- 如果某一列的数据具有唯一性,可以创建唯一索引。
2.3 索引操作
create [unique|fulltext|spatial] INDEX <indexname> on <tablename> (colname[length],...) [ASC|DESC]
2.3.1 创建普通索引
create index <indexname> on <tablename>(columnname);
2.3.2 创建唯一索引
create unique index <indexname> on <tablename>(columnname);
2.3.3 创建联合索引
create index <indexname> on <tablename>(columnname1,columnname2,...);
2.3.4 修改索引名称
alter index <indexname> rename to <newindexname>;
2.3.5 删除索引
drop index <indexname>;