广告
返回顶部
首页 > 资讯 > 数据库 >postgres学习笔记
  • 340
分享到

postgres学习笔记

postgres学习笔记 2018-01-09 09:01:05 340人浏览 猪猪侠
摘要

将一个标识符变得受限同时也使它变成大小写敏感的,反之非受限名称总是被转换成小写形 式。例如,标识符FOO、foo和"foo"在postgresql中被认为是相同的,而"Foo"和"FOO"则互 不相同且也不同于前面三个标识符(Postgr

postgres学习笔记

将一个标识符变得受限同时也使它变成大小写敏感的,反之非受限名称总是被转换成小写形 式。例如,标识符FOOfoo"foo"postgresql中被认为是相同的,而"Foo""FOO"则互 不相同且也不同于前面三个标识符(Postgresql将非受限名字转换为小写形式与SQL标准是不兼容 的,SQL标准中要求将非受限名称转换为大写形式。这样根据标准, foo应该和 "FOO"而不是"foo"相同。如果希望写一个可移植的应用,我们应该总是用引号修饰一个特定名字或者从不使用引号修饰)。

查询自动中添加单引号的方法

SQL> select "123""1234"
"123"1234"

 

查询转义字符需要在字段前加入E

SQL> select E"123foo
1234"
"123
foo
1234"

 

使用美元来代替单引号

SQL> select $$Dianne"s horse$$
"Dianne"s horse"

 

位置参数$number

CREATE FUNCTioN dept(text) RETURNS test.dept
    AS $$ SELECT * FROM test.dept WHERE name = $1 $$
    LANGUAGE SQL;
这里$1引用函数被调用时第一个函数参数的值。

 

聚集表达式

aggregate_name (expression [ , ... ] [ order_by_clause ] ) [ FILTER ( WHERE filter_clause ) ]
aggregate_name (ALL expression [ , ... ] [ order_by_clause ] ) [ FILTER ( WHERE filter_clause ) ]
aggregate_name (DISTINCT expression [ , ... ] [ order_by_clause ] ) [ FILTER ( WHERE filter_clause ) ]
aggregate_name ( * ) [ FILTER ( WHERE filter_clause ) ]
aggregate_name ( [ expression [ , ... ] ] ) WITHIN GROUP ( order_by_clause ) [ FILTER ( WHERE filter_clause ) ]

大部分聚集函数忽略空输入,这样其中一个或多个表达式得到空值的行将被丢弃。除非另有说明,对于所有内建聚集都是这样。

例如,count(*)得到输入行的总数。count(f1)得到输入行中f1为非空的数量,因为count忽略空值。而count(distinct f1)得到f1的非空可区分值的数量。

在处理多参数聚集函数时,注意ORDER BY出现在所有聚集参数之后。

SELECT string_agg(a, "," ORDER BY a) FROM table;

 

如果指定了FILTER,那么只有对filter_clause计算为真的输入行会被交给该聚集函数,其他行会被丢弃。例如:

SELECT
    count(*) AS unfiltered,
    count(*) FILTER (WHERE i < 5) AS filtered
FROM generate_series(1,10) AS s(i);
 unfiltered | filtered
------------+----------
         10 |        4
(1 row)

 

窗口函数

function_name ([expression [, expression ... ]]) [ FILTER ( WHERE filter_clause ) ] OVER window_name
function_name ([expression [, expression ... ]]) [ FILTER ( WHERE filter_clause ) ] OVER ( window_definition )
function_name ( * ) [ FILTER ( WHERE filter_clause ) ] OVER window_name
function_name ( * ) [ FILTER ( WHERE filter_clause ) ] OVER ( window_definition )

其中window_definition的语法是

[ existing_window_name ]
[ PARTITION BY expression [, ...] ]
[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
[ frame_clause ]

而可选的frame_clause是下列之一

{ RANGE | ROWS } frame_start
{ RANGE | ROWS } BETWEEN frame_start AND frame_end

其中frame_startframe_end可以是下面形式中的一种

UNBOUNDED PRECEDING
value PRECEDING
CURRENT ROW
value FOLLOWING
UNBOUNDED FOLLOWING

类型转换

CAST ( expression AS type )
expression::type

CAST语法遵从 SQL,而用::的语法是PostgreSQL的历史用法。

 

创建function样例

CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false)
RETURNS text
AS
$$
 SELECT CASE
        WHEN $3 THEN UPPER($1 || " " || $2)
        ELSE LOWER($1 || " " || $2)
        END;
$$
LANGUAGE SQL IMMUTABLE STRICT;

SELECT concat_lower_or_upper("Hello", "World", true);
 concat_lower_or_upper 
-----------------------
 HELLO WORLD
(1 row)

SELECT concat_lower_or_upper("Hello", "World");
 concat_lower_or_upper 
-----------------------
 hello world
(1 row)
 

使用命名记号

SELECT concat_lower_or_upper(a => "Hello", b => "World", uppercase => true);
 concat_lower_or_upper 
-----------------------
 HELLO WORLD
(1 row)

SELECT concat_lower_or_upper(a => "Hello", uppercase => true, b => "World");
 concat_lower_or_upper 
-----------------------
 HELLO WORLD
(1 row)

SELECT concat_lower_or_upper("Hello", "World", uppercase => true);
 concat_lower_or_upper 
-----------------------
 HELLO WORLD
(1 row)

为了向后兼容性,基于 ":=" 的旧语法仍被支持:
SELECT concat_lower_or_upper(a := "Hello", uppercase := true, b := "World");
 concat_lower_or_upper 
-----------------------
 HELLO WORLD
(1 row)

 

常见数据类型:

用于整数的integer;可以用于分数的numeric;用于字符串text,用于日期的date,用于一天内时间的time以及可以同时包含日期和时间的timestamp。

一个表能够拥有的列的数据是有限的,根据列的类型,这个限制介于250和1600之间。

插入时默认主键值

CREATE TABLE products (
    product_no integer DEFAULT nextval("products_product_no_seq"),
    ...
);
速写
CREATE TABLE products (
    product_no SERIAL,
    ...
);

 

约束:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0)
);
给约束起名
CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CONSTRaiNT positive_price CHECK (price > 0)
);
多列约束
CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0),
    discounted_price numeric CHECK (discounted_price > 0),
    CHECK (price > discounted_price)
);

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric,
    CHECK (price > 0),
    discounted_price numeric,
    CHECK (discounted_price > 0),
    CHECK (price > discounted_price)
);

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0),
    discounted_price numeric,
    CHECK (discounted_price > 0 AND price > discounted_price)
);

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric,
    CHECK (price > 0),
    discounted_price numeric,
    CHECK (discounted_price > 0),
    CONSTRAINT valid_discount CHECK (price > discounted_price)
);

非空约束
CREATE TABLE products (
    product_no integer NOT NULL,
    name text NOT NULL,
    price numeric
);

一列多种约束
CREATE TABLE products (
    product_no integer NOT NULL,
    name text NOT NULL,
    price numeric NOT NULL CHECK (price > 0)
);
空约束,不存在约束,只是脚本中方便切换非空约束才这么写,没实际意义
CREATE TABLE products (
    product_no integer NULL,
    name text NULL,
    price numeric NULL
);
唯一约束
CREATE TABLE products (
    product_no integer UNIQUE,
    name text,
    price numeric
);

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric,
    UNIQUE (product_no)
);
多列组成唯一约束
CREATE TABLE example (
    a integer,
    b integer,
    c integer,
    UNIQUE (a, c)
);

CREATE TABLE products (
    product_no integer CONSTRAINT must_be_different UNIQUE,
    name text,
    price numeric
);

主键
CREATE TABLE products (
    product_no integer UNIQUE NOT NULL,
    name text,
    price numeric
);
CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);
多列主键
CREATE TABLE example (
    a integer,
    b integer,
    c integer,
    PRIMARY KEY (a, c)
);
外键约束和排他约束一般不用

 系统隐式定义列

oid 一行的对象标识符(对象ID)。该列只有在表使用WITH OIDS创建时或者default_with_oids配置变量被设置时才存在。该列的类型为oid(与列名一致)
tableoid 包含这一行的表的OID。该列是特别为从继承层次中选择的查询而准备,因为如果没有它将很难知道一行来自于哪个表。tableoid可以与pg_classoid列进行连接来获得表的名称。
xmin 插入该行版本的事务身份(事务ID)。一个行版本是一个行的一个特别版本,对一个逻辑行的每一次更新都将创建一个新的行版本。
cmin 插入事务中的命令标识符(从0开始)。
xmax 删除事务的身份(事务ID),对于未删除的行版本为0。对于一个可见的行版本,该列值也可能为非零。这通常表示删除事务还没有提交,或者一个删除尝试被回滚。
cmax 删除事务中的命令标识符,或者为0。
ctid 行版本在其表中的物理位置。注意尽管ctid可以被用来非常快速地定位行版本,但是一个行的ctid会在被更新或者被VACUUM FULL移动时改变。因此,ctid不能作为一个长期行标识符。OID或者最好是一个用户定义的序列号才应该被用来标识逻辑行。

OID是32位量,它从一个服务于整个集簇的计数器分配而来。在一个大型的或者历时长久的数据库中,该计数器有可能会出现绕回。因此,不要总是假设OID是唯一的,除非你采取了措施来保证。如果需要在一个表中标识行,推荐使用一个序列生成器。然而,OID也可以被使用,但是是要采取一些额外的预防措施:

  • 如果要将OID用来标识行,应该在OID列上创建一个唯一约束。当这样一个唯一约束(或唯一索引)存在时,系统会注意不生成匹配现有行的OID(当然,这只有在表的航数目少于232(40亿)时才成立。并且在实践中表的尺寸最好远比这个值小,否则将会牺牲性能)。

  • 绝不要认为OID在表之间也是唯一的,使用tableoid和行OID的组合来作为数据库范围内的标识符。

  • 当然,问题中的表都必须是用WITH OIDS创建。在PostgreSQL 8.1中,WITHOUT OIDS是默认形式。

事务标识符也是32位量。在一个历时长久的数据库中事务ID同样会绕回。但如果采取适当的维护过程,这不会是一个致命的问题。但是,长期(超过10亿个事务)依赖事务ID的唯一性是不明智的。

命令标识符也是32位量。这对一个事务中包含的SQL命令设置了一个硬极限: 232(40亿)。在实践中,该限制并不是问题 — 注意该限制只是针对SQL命令的数目而不是被处理的行数。同样,只有真正 修改了数据库内容的命令才会消耗一个命令标识符。

 

列操作命令

增加一列
ALTER TABLE products ADD COLUMN description text;
ALTER TABLE products ADD COLUMN description text CHECK (description <> "");
提示: 增加一个带默认值的列需要更新表中的每一行(来存储新列值)。然而,如果不指定默认值,PostgreSQL可以避免物理更新。因此如果我们准备向列中填充的值大多是非默认值,最好是增加列的时候不指定默认值,增加列后用UPDATE填充正确的数据并且增加所需要的默认值约束。

移除列
ALTER TABLE products DROP COLUMN description;
移除时忽略外键的约束
ALTER TABLE products DROP COLUMN description CASCADE;

增加约束
ALTER TABLE products ADD CHECK (name <> "");
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;

移除约束,"psql d 表名"来查看系统默认约束名
ALTER TABLE products DROP CONSTRAINT some_name;
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;

设置移除默认值
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;

修改列数据类型
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
如果需要一种更复杂的转换,应该加上一个USING子句来指定应该如何把旧值转换为新值。

重命名列
ALTER TABLE products RENAME COLUMN product_no TO product_number;

重命名表
ALTER TABLE products RENAME TO items;

 

 权限:

SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTE以及USAGE

joe是一个已有用户,accounts是一个已有表,用ALL取代特定权限会把与对象类型相关的所有权限全部授权。可以在授予权限时使用"with grant option"来允许接收人将权限转授给其他人。
GRANT UPDATE ON accounts TO joe;

撤销权限:
REVOKE ALL ON accounts FROM PUBLIC;

 

 模式,将模式写入路径中,那么SQL查询可以省略模式名

CREATE SCHEMA myschema;
模式.表
在模式中创建表
CREATE TABLE myschema.mytable (
 ...
);

删除模式
DROP SCHEMA myschema;
DROP SCHEMA myschema CASCADE;

创建一个由其他人所拥有的模式
CREATE SCHEMA schemaname AUTHORIZATION username;
以pg_开头的模式名被保留用于系统目的,所以不能被用户所创建。

不指定模式,默认放在public模式中,查看默认模式
SHOW search_path;
将模式放到搜索路径中可以不用加表明进行查询
SET search_path TO myschema,public;
SET search_path TO myschema;
公共模式没有什么特别之处,它只是默认存在而已,它也可以被删除。

注意在默认情况下,所有人都拥有在public模式上的CREATEUSAGE权限。这使得用户能够连接到一个给定数据库并在它的public模式中创建对象。如果不希望允许这样,可以撤销该权限:

REVOKE CREATE ON SCHEMA public FROM PUBLIC;
第一个"public"是模式,第二个"public"指的是 "每一个用户"。第一种是一个标识符,第二种是一个关键词,所以两者的大小写不同。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

您可能感兴趣的文档:

--结束END--

本文标题: postgres学习笔记

本文链接: https://www.lsjlt.com/news/8668.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • postgres学习笔记
    将一个标识符变得受限同时也使它变成大小写敏感的,反之非受限名称总是被转换成小写形 式。例如,标识符FOO、foo和"foo"在PostgreSQL中被认为是相同的,而"Foo"和"FOO"则互 不相同且也不同于前面三个标识符(Postgr...
    99+
    2018-01-09
    postgres学习笔记
  • 学习笔记-TP5框架学习笔记\(路由\)
    TP5框架简单理解 (PS:只做粗略、关键知识的记录,TP程序的开始。详情请阅读官方手册) 1. 架构总览 TP程序的开始 PHP >=5.3.0, PHP7 ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方...
    99+
    2023-10-25
    学习 php 开发语言
  • 学习笔记3
    一文件查找和压缩1文件查找locate 搜索依赖于数据库,非实时搜索,搜索新建文件需手动更新,适于搜索稳定不频繁修改文件 find 实时搜索,精确搜索,默认当前目录递归搜索 find用法 -maxdepth...
    99+
    2023-01-31
    学习笔记
  • python3学习笔记
    好久不用python,努力捡起来ing python3语法 字符串 repr()把其他类型变量转换为字符串 ord()把单个字符转换为相应的ascii码 int()把其他进制的“字符串”转换为十进制 int(str,n...
    99+
    2023-01-31
    学习笔记
  • Android学习笔记
    LinearLayoutCompat 线性布局 android:orientation=“vertical” 指定布局内控件排列方式为 垂直排...
    99+
    2022-06-06
    android学习 Android
  • 20200619 学习笔记
    主键和唯一的区别 主键:唯一、不为空、只能有一个、可以组合但不推荐 唯一:唯一、可为空、可以多个、可以组合但不推荐 外键 要求在从表设置外键关系 从表的外键列的类型和主表的关联列的类型要求一致或兼容 主...
    99+
    2019-12-15
    20200619 学习笔记
  • 20200618_MySQL学习笔记
    加号 + Mysql中加号只能做运算符 select 100+90  ==> 190  select "100"+90 ==> 190  如果有一个是字符串,那么尝试转换成数值型,转换成功 select "ja...
    99+
    2014-11-26
    20200618_MySQL学习笔记
  • 20200617学习笔记
    基数  一个索引上不同的值的个数,我们称之为“基数”(cardinality)。也就是说,这个基数越大,索引的区分度越好 我们可以使用 show index 方法,看到一个索引的基数 MySQL 是怎样得到索引的基数的呢? 采样...
    99+
    2022-02-22
    20200617学习笔记
  • 20200616学习笔记
    count(*) 的实现方式 在不同的 MySQL 引擎中,count(*) 有不同的实现方式 MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高 而 InnoDB ...
    99+
    2018-10-19
    20200616学习笔记
  • MySQL学习笔记
    作者: Grey 原文地址:MySQL学习笔记 说明 注:本文中的SQL语句如果用到了特定方言,都是基于MySQL数据库。 关于DDL DDL 的英文全称是 Data Definition Language,中文是数据定义语言。它定义了...
    99+
    2015-01-17
    MySQL学习笔记
  • Mycat 学习笔记
    概述 1. Mycat 是什么? Mycat 是数据库中间件,连接 Java 应用程序和数据库,它的作用如下: 读写分离 数据分片:垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表) 多数据源整合 2....
    99+
    2019-10-05
    Mycat 学习笔记
  • sqlite3 学习笔记
    #!/usr/bin/env python3 # -*- coding: utf-8 -*- # @descrip : operate SqLite intrface # @Time : 2020/04/22 21:57 # @Au...
    99+
    2017-12-28
    sqlite3 学习笔记 数据库入门 数据库基础教程
  • xtrabackup学习笔记
    wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/tarball/percona-xtrab...
    99+
    2022-10-18
  • AIDE 学习笔记
    参考:http://www.iamle.com/archives/1664.htmlAIDE的用法和tripwire类似。都是通过生成一份文件指纹的数据库,然后对比。所以,我们最好在刚安装完系统后,就安装这...
    99+
    2022-10-18
  • git 学习笔记
      Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。     ...
    99+
    2022-10-18
  • oracle学习笔记
    oracle安装1.         安装virtualbox:# yum install gcc kernel-devel ...
    99+
    2022-10-18
  • Python学习笔记
    Python介绍 Python是一种解释型、面向对象的语言。 官网:www.python.org Python环境 解释器:www.python.org/downloads 运行方式: 交互模式。在IDLE中运行。 脚本模式。文件的后缀...
    99+
    2023-01-30
    学习笔记 Python
  • tornado学习笔记
    一.UIMOTHODS: 1.在项目目录创建uimothods.py文件(名称可以任意)内容: def test2(self): return ('hello uimothods')2.tornado项目文件中导入并注册: #导入f...
    99+
    2023-01-30
    学习笔记 tornado
  • H3CNE学习笔记
      H3CNE五日“游” ——之第一天 废话少说 直接进入真题!!!!(哈哈 ) H3CNE   H3C认证初级网络工程师 第    一   节 路由器、交换机及其操作系统介绍 路由器 1、 路由器的作用 连接具有不同介质的链路 连接网络或...
    99+
    2023-01-31
    学习笔记 H3CNE
  • Python 学习笔记
    rs=Person.objects.all() all返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。 print rs.query 会打印出原生sql语句 rs=Pe...
    99+
    2023-01-31
    学习笔记 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作