Desc:Postgres数据库日常使用,插入更新,复制表,一些使用习惯。
由于经常接触数据库,但又停留在比较浅的层次,暂且没有时间也没必要去系统了解,这篇博客权当记录一些自己常用到的pg数据库语句,持续更新~
语句
插入更新
1 | INSERT INTO the_table (id, column_1, column_2) |
复制表
我们首先创建了一张表user
1 | CREATE TABLE IF NOT EXISTS "user" ( |
我们查看其DDL
1 | create table "user" |
我们插入一些数据
1 | INSERT INTO "user" (name, age, sex) VALUES ('xiaoming',12,TRUE),('xiaohua',18,FALSE ); |
我们利用CREATE TABLE AS
复制。
1 | CREATE TABLE user2 AS SELECT * FROM "user"; |
查看表数据
1 | select * FROM user2; |
查看表DDL
1 | create table user2 |
接着,我们用CREATE TABLE LIKE
复制。
1 | CREATE TABLE user3 (LIKE "user" including constraints including indexes including comments including defaults); |
我们查看表数据
1 | select * FROM user3; |
查看DDL
1 | create table user3 |
从这个操作中你知道CREATE TABLE AS
与CREATE TABLE LIKE
的区别了么?
CREATE TABLE AS
CREATE TABLE AS
复制出来的表,所有约束、注释和序列都没有被拷贝,只是简单的字段拷贝,同时数据也能拷贝过来了。
CREATE TABLE LIKE
CREATE TABLE LIKE
复制的表,里面没有数据,但是你可以指定复制标的约束,索引,注释,序列。其中
- including constraints :复制约束
- including indexes :复制索引
- including comments:复制注释
- including defaults:复制序列
我们向user3中插入一些数据:
1 | INSERT INTO "user3" (name, age, sex) VALUES ('xiaoxiao',12,TRUE),('dada',18,FALSE ); |
嗯,数据id
从3开始的,这就意味着序列是接着“user”继续的。
查看表大小
查看一个表
1 | select pg_size_pretty(pg_relation_size('table_name')); |
查出所有表并按大小排序
1 | SELECT |
查出所有表按大小排序并分离data与index
1 | SELECT |
语法
比较操作符
操作符 | 描述 |
---|---|
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
= | 等于 |
<> or != | 不等于 |
注意
!=操作符在分析器阶段被转换成<>。不能把!=和<>操作符实现为做不同的事。
比较操作符可以用于所有可以比较的数据类型。所有比较操作符都是双目操作符,它们返回boolean类型;类似于1 < 2 < 3的表达式是非法的(因为没有<操作符可以比较一个布尔值和3)。
习惯
- 虽然
SELECT *
对于即席查询很有用,但我们普遍认为在生产代码中这是很糟糕的风格,因为给表增加一个列就改变了结果。 - 在一些数据库系统里,包括老版本的PostgreSQL,
DISTINCT
的实现自动对行进行排序,因此ORDER BY是多余的。但是这一点并不是 SQL 标准的要求,并且目前的PostgreSQL并不保证DISTINCT
会导致行被排序。