1。alter user bcsystem password ‘bcsystem’; //为bcsystem用户修改密码
2、Having和where的区别:Having是在汇总之后进行的,而where是在汇总之前进行的。在SQL中加上Having是where无法和合计函数一起使用。合计函数如:MIN,MAX,SUN,AVG,COUNT,COUNT(*).
3、连接多个字符串用||
4、对于该表跟主表没有直接的关系(跟第三张表有关系),不要用左联等查询。可以用子查询的方式,用子查询必须确保查到的列是唯一,并且不能查找多个字段。
5、索引:
概念:是加快检索表中数据的方法
特点:1、加快数据库的检索速度
2、索引降低了数据库插入、修改、删除等维护任务速度
3、创建在表上,不能创建在视图上
4、既可以直接创建,也可以间接创建
5、可以在优化隐藏中使用索引
6、使用查询处理器执行SQL语句,在一个表上,一次只能使用一个索引。
7、其他
6、存储函数
如:查找分类的上级分类
CREATE or replace FUNCTION func_get_category_type(in in_id int4, out o_type text) AS //in 传进的参数 out 输出的参数
$BODY$
DECLARE
v_rec_record RECORD; //记录
BEGIN
o_type = ”;
FOR v_rec_record IN (WITH RECURSIVE r AS (SELECT *
FROM bc_category
WHERE id = in_id
union ALL
SELECT bc_category.*
FROM bc_category, r
WHERE bc_category.id = r.pid)SELECT name_
FROM r where r.id != in_id
ORDER BY id) LOOP
if o_type =” then
o_type := v_rec_record.name_;
else
o_type := o_type|| ‘/’ || v_rec_record.name_;
end if;
END LOOP;
return;
END;
$BODY$
LANGUAGE ‘plpgsql’;
删除该存储函数:drop function func_get_category_type(int4);//这里必须指明的参数就是函数所传进去参数的类型
7、问题:把表中的两个普通字段设置唯一性约束,可是当有一个为空,另外一个字段相同,但是唯一性约束就不能起作用!
原因:postgreSQL认为null都是不相等的,多栏键值的唯一性只有全部是非NULL的情况下才可进行比较。
Null values are not considered equal. A multicolumn unique index will only reject cases where all indexed columns are equal in multiple rows.
解决:postgreSQL有表达式索引,如:create unique index 名称 on 表名((coalesce(pid , -1) || code ));注:pid、code是表中的字段,pid可以为空
8、触发器是特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发。比如通过按钮的点击事件触发。而触发器的事件,是由对表进行增删改操作所触发。
a、raise info ‘TG_OP=%’, TG_OP; 此语句可以在控制台中输出TG_OP的值
b、TG_OP的值是大写的如”DELETE”,现实中就遇到写成小写”delete”导致出错。
–触发器的Demo
create or replace function fun_stu_major() –触发器的存储函数
returns trigger as
$BODY$
DECLARE
rec record;
BEGIN
DELETE FROM major_stats;–将统计表里面的旧数据清空
FOR rec IN (SELECT major,sum(score) as total_score,count(*) as total_students
FROM stu_score GROUP BY major) LOOP
INSERT INTO major_stats VALUES(rec.major,rec.total_score,rec.total_students);
END LOOP;
return NEW;
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE
–创建触发器trigger
create trigger tri_stu_major
AFTER insert or update or delete
on stu_score
for each row
execute procedure fun_stu_major()
9、COALESCE(A,B)函数,如果A有值,B没值,结果是A;如果A没值,B有值,结果是B;两边都没值,结果是null;两边都有值,结果是A.A和B的类型要一致!不然会报错。它相当于case … when…then …else ….end语句的高级函数。
10、unnest(anyarray)函数,其中的anyarray包括json数组。官网解释返回类型:expand an array to a set of rows,意思是将array扩展成一个集合的行。(即把数组变成表的多行)。
11、string_agg(expression,delimiter),expression是表达式(一般对应的列),delimiter是分隔符,官网解释:concatenates the values into string。意思是把一系列的值变成字符串
array_agg(expression),expression是表达式(一般对应的列),官网解释:concatenates the values into an array。意思是把一系列的值变成数组。
12、今天发现一个问题,select 里面的where 模糊查询引用到该select左联字段导致性能大大下降(一个不到500ms的查询竟然超过94秒),需要处处留意,侧重优化。
13、SQL拼接模糊查询语句:注意单引号的嵌套是不行的,此处like后面字符串本身的需要的单引号现在可以去掉,如:h.shiftwork like ‘%’ || (select c.plate_no from bs_car c where c.id = $1) || ‘%’)
14、将多行转成字符串可以这样实现:先用array(select a.name from admin a),然后再套上array_to_string(array(select a.name from admin a), ‘,’);思路就是先转成array,再通过array_to_string()转成字符串。
15、union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all 则将所有的结果全部显示出来。
union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序。
union all:对两个结果集进行并集操作,包括重复行,不进行排序!
16、distinct默认只支持一个字段,要实现多个字段,就要对整体需求进行重新构思。或者用not exists()实现。
17、在进行除法操作时往往需要保留到小数点多少位,可以使用round(X,2)方法,”X“表示原始得到的值,“2”表示保留到小数点后2位数
18、数据库建立索引的原则
a、天下没有免费的午餐,使用索引是需要付出代价的。
如创建索引和维护索引都需要花费时间与精力。如当建有索引的表中的记录又增加、删除、修改操作时,数据库要对索引进行调整,虽然这个工作数据库自动会完成,但是,需要消耗服务器的资源。当表中的数据越多,这个消耗的资源也就越多。如索引是数据库中实际存在的对象,所以,每个索引都会占用一定的物理空间。索引多了,不但会占用大量的物理空间,而且,也会影响到整个数据库的运行性能。
b、对于查询中很少涉及的列或者重复值比较多的列,不要建立索引。
c、对于按范围查询的列,最好建立索引(数据多的情况下,少的话考虑综合因素,可以不建立),还要配合top关键(limit)字来限制一次查询的结果。
d、表中若有主键或者外键,一定要为其建立索引。
e、对于一些特殊的数据类型,不要建立索引。
如文本字段(text),图像类型字段(image)等。因为这个字段有一个共同特点:如长度不确定,要么很长,几个字符;要么就是空字符串。如文本数据类型常在应用系统的数据库表中用来做备注的数据类型。有时候备注很长,但有时候又没有数据。若这种类型的字段上建立索引,那根本起不了作用。相反,还增加了系统的负担。
所以,在一些比较特殊的数据类型上,建立索引要谨慎。在通常情况下,没有必要为其建立索引。但是,也有特殊的情况。如有时候,在ERP系统中,有产品信息这个表,其中有个产品规格这个字段。有时候,其长度可能长达5000个字符。此时,只有文本型的数据类型可以容纳这么大的数据量。而且,在查询的时候,用户又喜欢通过规格这个参数来查询产品信息。此时,若不为这个字段建立索引的话,则查询的速度会很慢。遇到这种情况时,数据库管理员只有牺牲一点系统资源,为其建立索引。
f、索引可以跟where语句的集合融为一体
用户在查询信息的时候,有时会经常会用到一些限制语句。如在查询销售订单的时候,经常会用到客户以及下单日期的条件集合;如在查询某个产品的库存交易情况时,就会利用产品编号与交易日期起止日期的条件集合。
对于这些经常用在Where子句中的数据列,将索引建立在Where子句的集合过程中,对于需要加速或者频繁检索的数据列,可以让这些经常参与查询的数据列按照索引的排序进行查询,以加快查询的时间。
总结:索引就好像一把双刃剑,即可以提高数据库的性能,也可能对数据库的性能起到反面作用。作为数据库管理员,要有这个能力判断在合适的时间、合适的业务、合适的字段上建立合适的索引。以上六个铁律,只是对建立索引的一些基本要求
19、关于select * from h not exists( h1)取最新和最旧日期的判断口诀:取最新,里面(h1)的日期比外面(h)的日期大,取最旧,里面(h1)的日期比外面(h)的日期小
20、数据库的恢复SQL语句:在xx.sql文件下,打开cmd命令,输入psql -u be system -f xx.sql
