PGSQL学习-基础表结构

1 访问数据库

创建好数据库后,你可以有三种方式访问数据库

  • 运行PostgreSQL的交互式终端程序,它被称为psql, 它允许你交互地输入、编辑和执行SQL命令。

  • 使用一种已有的图形化前端工具,比如pgAdmin或者带ODBC或JDBC支持的办公套件如DataGrip等来创建和管理数据库。

  • 使用多种绑定发行的语言中的一种写一个自定义的应用

psql访问

# psql 访问指定数据库
bash-4.2$ psql postgres
psql (14.12)
Type "help" for help.

postgres=# 

# psql缺省访问,默认postgres数据库
bash-4.2$ psql
psql (14.12)
Type "help" for help.

postgres=# 

# postgres=# 表示 当前数据库为postgres, #表示当前访问用户是数据库超级用户,=>则说明是普通用户

 查看pgsql版本信息

postgres=# select version();
                                                 version                                                  
----------------------------------------------------------------------------------------------------------
 PostgreSQL 14.12 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
(1 row)

psql程序有一些不属于SQL命令的内部命令。它们以反斜线开头,“\

比如:

# \h 活着 \help 可以查看命令帮助文档
postgres=# \h
Available help:
  ABORT                            CHECKPOINT                       CREATE USER                      DROP TRIGGER

# \c 连接到指定数据库
postgres=# \c mydb;
You are now connected to database "mydb" as user "postgres".
mydb=# 


# \l 列出所有的数据库
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

# \dn:列出当前数据库中的所有schema
mydb=# \dn
  List of schemas
  Name  |  Owner   
--------+----------
 mydb_s | postgres
 public | postgres
(2 rows)

# \d 表名 查看表结构
mydb=# \d mydb_s.test01
               Table "mydb_s.test01"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 id     | integer |           |          | 


# \q 退出psql连接

2 创建数据库

# 创建一个名字叫mydb的数据库
create database mydb;

# 删除数据库
drop databse mydb;

3 创建schema

一个cluster可以有多个database,而一个database可以有多个shema,一个shema可以有多个表

也就是说pgsql的数据层次结构分了三层,database -> shema -> table

这样划分可以在同一个database中创建名字相同的表但是属于不同shema

每个database默认有一个public的shema,如果创建表时不指定shema则默认为public

这样,多个用户操作同一个数据库时可以避免出现表名冲突。而且一个数据库需要加载第三方应用的数据时可以单独放在一个shema中,避免了表的冲突,同时也位于同一个database

# 创建shema
create shema shema1;
# 删除shema,如果shema下有表则删除失败
drop shema shema1;
# 强制删除
drop shema shema1 cascade;

# 查看databse下所有shema
\dn
mydb=# \dn
  List of schemas
  Name  |  Owner   
--------+----------
 mydb_s | postgres
 public | postgres

4 创建table

CREATE TABLE table_name(
   column1 datatype,
   column2 datatype,
   .....
);

比如创建一个weather表,包含5个字段,此时weather表属于public shema

CREATE TABLE weather (
    city            varchar(80),
    temp_lo         int,           -- 最低温度
    temp_hi         int,           -- 最高温度
    prcp            real,          -- 湿度
    date            date
);

创建指定shema的表,在表名前显示指定shema名称

CREATE TABLE public.cities (
    name            varchar(80),
    location        point
);

\d 查看表

mydb=# \d
          List of relations
 Schema |  Name   | Type  |  Owner   
--------+---------+-------+----------
 public | cities  | table | postgres
 public | weather | table | postgres

\d 表名 查看表结构

mydb=# \d cities
                       Table "public.cities"
  Column  |         Type          | Collation | Nullable | Default 
----------+-----------------------+-----------+----------+---------
 name     | character varying(80) |           |          | 
 location | point                 |           |          | 

插入数据

insert into

INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
VALUES (value1, value2, value3,...valueN);

请注意所有数据类型都使用了相当明了的输入格式。那些不是简单数字值的常量通常必需用单引号(')包围 

 在weather表中插入一条数据

mydb=# insert into weather values('cq',19,30,3.0,'2024/06/21');
INSERT 0 1

还可以使用copy命令加载大量的数据

比如 

COPY weather FROM '/home/user/weather.txt';

查看表数据

select

mydb=# select * from weather;
 city | temp_lo | temp_hi | prcp |    date    
------+---------+---------+------+------------
 cq   |      19 |      30 |    3 | 2024-06-21
(1 row)

删除表

drop table 表名 [,表名];

基本对数据的操作都和mysql一致,语法都是sql语法,比如添加数据是insert,删除delete,更新update,查询select

5 事务

pgsql中同样适用事务来保证并发时数据的安全

事务最重要的一点是它将多个步骤捆绑成了一个单一的、要么全完成要么全不完成的操作。步骤之间的中间状态对于其他并发事务是不可见的,并且如果有某些错误发生导致事务不能完成,则其中任何一个步骤都不会对数据库造成影响

pgsql中开启事务使用begin,提交事务使用commit,回滚事务使用 rollback

开启一个事务需要将SQL命令用BEGINCOMMIT命令包围起来

BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
COMMIT;

pgsql中也有保存点

利用保存点来以更细的粒度来控制一个事务中的语句。保存点允许我们有选择性地放弃事务的一部分而提交剩下的部分

# 开启事务
BEGIN;

# 更新数据
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
# 添加保存点
SAVEPOINT my_savepoint;
# 更新数据2
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Bob';
# 出现业务错误,需要回滚
-- oops ... forget that and use Wally's account
# 回滚
ROLLBACK TO my_savepoint;
# 再次更新数据3
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Wally';

# 提交事务
COMMIT;

6 表的继承

pgsql中有表继承关系,也就是说一个表可以继承于另一个表,一般表达父子、所属关系,比如城市和首都,首都就属于城市

父表会包含子表信息,子表会继承父表字段

举例:

创建cities和capitals,分别表示城市和首都,首都继承城市,那么首都表拥有cities的所有字段和本身state字段

CREATE TABLE cities (
  name       text,
  population real,
  altitude   int     -- (in ft)
);

CREATE TABLE capitals (
  state      char(2)
) INHERITS (cities);

查询所有cities时,会查询cities表和capitals表

比如:查询海拔高度>500的城市,则会返回cities和captials所有符合要求的

SELECT name, altitude
  FROM cities
  WHERE altitude > 500;

如果只想查询首都海拔高度的,则需要 from only

SELECT name, altitude
    FROM ONLY cities
    WHERE altitude > 500;

only标记可以用着各个语法中,比如 SELECTUPDATE 和DELETE 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值