【PG数据库】学习日记

psql:
选项        说明
-c command    指定 psql 执行一条 SQL 命令 command(用双引号括起),执行后退出。
-d dbname    待连接的数据库名称。
-E            回显由\d 和其他反斜杠命令生成的实际查询。
-f filename    使用 filename 文件中的数据作为命令输入源,而不是交互式读入查询。在处理完文件后,psql 结束并退出。
-h hostname    声明正在运行服务器的主机名
-l            列出所有可用的数据库,然后退出。
-L filename    除了正常的输出源之外,把所有查询记录输出到文件 filename。
-o filename    将所有查询重定向输出到文件 filename。
-p port        指定 PostgreSQL 服务器的监听端口。
-q --quiet    让 psql 安静地执行所处理的任务。缺省时 psql 将输出打印欢迎和许多其他信息。
-t --tuples-only 关闭打印列名称和结果行计数脚注等信息。
-U username    以用户 username 代替缺省用户与数据库建立连接。


psql内部命令
\l             显示所有数据库
\c database    连接数据库
\dn            显示所有scheme
\dt            查看所有表
\di            查看所有索引
\d tablename   查看表格详细内容
\df            查看所有存储过程
\sf function   查看某个存储过程
\z             列出表权限
\i file        执行文件 等价于psql -f file
\q             退出登录
\h 或 \?       列出所有可用的SQL命令

show search_path;           查看当前scheme
set search_path to cfgstat; 切换scheme为cfgstat
ALTER USER postgres WITH PASSWORD '1234'; 设置登陆数据库的默认用户密码
select * from pg_shadow;    显示密码
select * from pg_indexes where tablename='xxx'; 查看表的索引信息
select pg_proc.proname,prosrc from pg_proc where proname='zxommexecdmlproc';查看pg存储过程:

pg移植from sybase:
=========================================================================================================================
                            sybase                                      pg
-------------------------------------------------------------------------------------------------------------------------
数值类型为null时输出0       isnull(@abc,0)                              COALESCE(v_abc, 0);
任意变量类型转换            convert(int, v_str)                         cast(v_str as int) cast(v_count as varchar(10));
获取当前时间戳              getdate()                                   now();
时间戳加减                  dateadd(ss, -3, getdate())                  now() - (3 || 'second')::INTERVAL;
                            dateadd(day, 3, getdate())                  now() + (3 || 'day')::INTERVAL;
                            dateadd(day, 3, @v_endtime)                 v_endtime::timestamp + (3 || 'day')::INTERVAL;
获取时间戳中的部分          datepart(hh,getdate())                      date_part('hour',now());     extract(hour from now());
日期相减得到秒数            datediff(ss,'1994-1-1',getdate())           extract(epoch from(now() - '1994.01.01'))
                            datediff(ss,'1994-1-1',@v_endtime)          extract(epoch from(v_endtime::timestamp - '1994.01.01'))
日期相减得到天数            datediff(day,'1994-1-1',@v_endtime)         date v_endtime - date '1994-1-1'
日期相减得到分钟            datediff(mi,'1994-1-1',@v_endtime)          (date '1994-1-2 03:35:10' - date '1994-1-1 00:00:00')*24*60+date_part('hour',timestamp '1994-1-2 03:35:10')*60 + date_part('minute',timestamp '1994-1-2 03:35:10');
                            datediff(mi,'1994-1-1',getdate())           (date (now()::text) - date '1994-1-1 00:00:00')*24*60+date_part('hour',now())*60 + date_part('minute',now());
时间戳转换为字符串          convert(varchar(10), @v_endtime, 102)       to_char(v_endtime,'yyyy.mm.dd HH24:MI:SS');       
左右拼接(left|right)      right('00'+datepart(hh,getdate()))          right('00'||date_part('hour',now()))
获取字符数                  len('json') / char_length('json')           length('abc');
获取字符串的字节数          datalength('你好abc')                       octet_length('你好abc');
指定子串的位置              charindex(@v_split, @v_temp1)               position(substring in string)
错误码                      if @@error <> 0                             exception when others then  raise                 
影响行数                    @@rowcount                                  get diagnostics v_count_var :=ROW_COUNT;
创建临时表                  create table #temp()                        create temporary table temp();
退出循环                    break                                       exit;
时间戳变量定义类型          datetime                                    timestamp
获取随机数                  rand()                                      random();
数值类型转换为字符          convert(varchar,rand())                     cast(random() as varchar);  random()::text
字符串替换                  stuff('abcd',1,2,'s')或str_replace('abcd','ab','s')   replace('abcd','ab','s')
查询前10行                  select top 10 * from abc                    select * from abc litim 10; (offset 2)
向临时表插入数据            select id into #temp from abc;              create temporary table temp as select id from abc;    
数字转字符串                LTRIM(STR(123,3,0))                         LTRIM(to_char(123,'999'))  
-------------------------------------------------------------------------------------------------------------------------

pg动态sql语句中不能使用select into语句:
例如:v_sqlstr='select into v_count count(1) from abc';   execute v_sqlstr;  (错误)
      v_sqlstr='select count(1) from abc';   execute v_sqlstr into v_count;  (正确)

获取昨天的时间日期:
    select now() - '1 day'::interval;                                       2020-11-12 10:35:39.11988+08   (等价与dateadd(day,-1,getdate()))
    select cast(now() - '1 day'::interval as varchar(10));                  2020-11-12
    select substring(cast(now() - '1 day'::interval as varchar(10)),9,2);   12

时间和字符串转换:
    select to_char(now(),'yyyy-mm-dd HH24:MI:SS');   时间戳转换为字符串
    select to_date('2020-11-13','yyyy-mm-dd');       字符串转换为时间戳
    select cast('20201113' as timestamp);
    to_date('1994-1-1','yyyy-mm-dd') + (3600||'second')::interval  综合
    
拼接表中列为一行:
    select string_agg(name) from abc;
    select id,string_agg(name,',') from abc group by id;

获得结果状态:
(1)GET DIAGNOSTICS integer_var := item{ROW_COUNT,RESULT_OID,PG_CONTEXT}; 
    ROW_COUNT    bigint    最近的SQL命令处理的行数
    RESULT_OID    oid        最近的SQL命令插入的最后一行的 OID(只有在一条INSERT命令插入到一个具有 OID 的表后才有用)
    PG_CONTEXT    text    描述当前调用栈的文本行
(2)FOUND(boolean类型)特殊变量
    如果一个SELECT INTO语句赋值了一行,它将把FOUND设置为真,如果没有返回行则将之设置为假。
    如果一个PERFORM语句生成(并且抛弃)一行或多行,它将把FOUND设置为真,如果没有产生行则将之设置为假。
    如果UPDATE、INSERT以及DELETE语句影响了至少一行,它们会把FOUND设置为真,如果没有影响行则将之设置为假。
    如果一个FETCH语句返回了一行,它将把FOUND设置为真,如果没有返回行则将之设置为假。
    如果一个MOVE语句成功地重定位了游标,它将会把FOUND设置为真,否则设置为假。
    如果一个FOR或FOREACH语句迭代了一次或多次,它将会把FOUND设置为真,否则设置为假。当循环退出时,FOUND用这种方式设置;在循环执行中,尽管FOUND可能被循环体中的其他语句的执行所改变,但它不会被循环语句修改。
    如果查询返回至少一行,RETURN QUERY和RETURN QUERY EXECUTE语句会把FOUND设为真, 如果没有返回行则设置为假。
    其他的PL/pgSQL语句不会改变FOUND的状态。尤其需要注意的一点是:EXECUTE会修改GET DIAGNOSTICS的输出,但不会修改FOUND的输出。
    FOUND是每个PL/pgSQL函数的局部变量;任何对它的修改只影响当前的函数。
    
游标的使用:
    pg:
    声明:declare user_cursor  REFCURSOR;
    打开:open user_cursor for select id from abc1;
    使用:fetch user_cursor into v_id;
    装取成功:while(FOUND = true)     --FOUND内置布尔类型变量,sybse中判断条件为@@sqlstatus = 0  (0:装取成功,1失败,2读完)
              loop
                 raise info '%',v_id;
                 fetch user_cursor into v_id;
              end loop;
    关闭:close user_cursor;
    
调用函数:
(1)位置记号法
    在位置记号法中,参数可以按照从右往左被忽略并且因此而得到默认值。
(2)命名记号法
    使用命名记号法的一个优点是参数可以用任何顺序指定。
    SELECT concat_lower_or_upper(a => 'Hello', uppercase => true, b => 'World');
(3)混合记号法

更新表的统计信息:
    sybase:
    update index statistics table;   更新table的索引统计
    pg:
    analyze [verbose] [ table_name [ ( column_name [, ...] ) ] ]   更新表的统计信息

获取系统时间:
    sybase                                   
    select getdate() 获取系统实时时钟的当前时间戳 
    验证:  
    begin
    select getdate()
    waitfor delay '00:00:05'
    select getdate()
    end
    结果:
    '2020-11-27 19:55:32.786'
    '2020-11-27 19:55:37.75'
    
    pg:    
    select now();     当前事务开始的时间戳       
    select CURRENT_TIMESTAMP;  当前事务开始的时间戳 
    select clock_timestamp(); 实时时钟的当前时间戳
    
identity自增:
    sqlserver中的identity:自增
    create table abcd
    (
        id   int  identity,
        name varchar
    )with identity_gap=5

    postgres中id自增的一种方法:
    create table abcd
    (
        id   int  generated always as identity (cache 100000 START WITH 1 INCREMENT BY 1),
        name varchar(32)              
    );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值