PostgreSQLを簡単な方法で学ぶ

PostgreSQL

関係データベース

公式サイト:https://www.postgresql.org/

ダウンロードリンク:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

データベース

データベースを作成する

postgres=# \l
                                                        数据库列表
   名称    |  拥有者  | 字元编码 |            校对规则            |             Ctype              |       存取权限     
-----------+----------+----------+--------------------------------+--------------------------------+-----------------------
 postgres  | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 |
 template0 | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 | =c/postgres          +
           |          |          |                                |                                | postgres=CTc/postgres
 template1 | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 | =c/postgres          +
           |          |          |                                |                                | postgres=CTc/postgres
(3 行记录)

postgres=# create database mydb;
CREATE DATABASE

postgres=# \l
                                                        数据库列表
   名称    |  拥有者  | 字元编码 |            校对规则            |             Ctype              |       存取权限     
-----------+----------+----------+--------------------------------+--------------------------------+-----------------------
 mydb      | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 |
 postgres  | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 |
 template0 | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 | =c/postgres          +
           |          |          |                                |                                | postgres=CTc/postgres
 template1 | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 | =c/postgres          +
           |          |          |                                |                                | postgres=CTc/postgres
(4 行记录)

データベースを使用

postgres=# \c mydb;
您现在已经连接到数据库 "mydb",用户 "postgres".

データベースを削除

postgres=# drop database mydb
DROP DATABASE

postgres=# \l
                                                        数据库列表
   名称    |  拥有者  | 字元编码 |            校对规则            |             Ctype              |       存取权限     
-----------+----------+----------+--------------------------------+--------------------------------+-----------------------
 postgres  | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 |
 template0 | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 | =c/postgres          +
           |          |          |                                |                                | postgres=CTc/postgres
 template1 | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 | =c/postgres          +
           |          |          |                                |                                | postgres=CTc/postgres
(3 行记录)

テーブル

テーブルを作成

create table posts (
	id serial primary  key,
	title varchar(255) not null,
    content text check(length(content) > 8),
    is_draft boolean default true,
    is_del boolean default false,
    created_date timestamp default 'now'
);

テーブル制約

null以外:空にすることはできません

一意:すべてのデータの値は一意である必要があります

チェック:フィールド設定条件

default:デフォルト値

主キー(null以外、一意):主键

テーブルを見る

mydb=# \dt
                关联列表
 架构模式 |  名称   |  类型  |  拥有者
----------+---------+--------+----------
 public   | mytable | 数据表 | postgres
 public   | posts   | 数据表 | postgres
 
mydb=# \d posts;
                                                    数据表 "public.posts"
     栏位     |            类型             | 校对规则 |  可空的  |                           预设                      
--------------+-----------------------------+----------+----------+-----------------------------------------------------------
 id           | integer                     |          | not null | nextval('posts_id_seq'::regclass)
 title        | character varying(255)      |          | not null |
 content      | text                        |          |          |
 is_draft     | boolean                     |          |          | true
 is_del       | boolean                     |          |          | false
 created_date | timestamp without time zone |          |          | '2020-09-19 11:30:36.484723'::timestamp without time zone
索引:
    "posts_pkey" PRIMARY KEY, btree (id)
检查约束限制
    "posts_content_check" CHECK (length(content) > 8)
 

テーブルを削除

mydb=# drop table mytable;
DROP TABLE
mydb=# \dt
               关联列表
 架构模式 | 名称  |  类型  |  拥有者
----------+-------+--------+----------
 public   | posts | 数据表 | postgres
 

テーブル構造の変更

  • テーブル[テーブル名]を変更…

  • インデックスを作成…

  • ドロップインデックス…

mydb=# \d users;
                                   数据表 "public.users"
  栏位  |          类型          | 校对规则 |  可空的  |               预设
--------+------------------------+----------+----------+-----------------------------------
 id     | integer                |          | not null | nextval('users_id_seq'::regclass)
 player | character varying(255) |          | not null |
 score  | real                   |          |          |
 team   | character varying(255) |          |          |
索引:
    "users_pkey" PRIMARY KEY, btree (id)


mydb=# alter table users add fullname varchar(255);
ALTER TABLE
mydb=# \d users;
                                    数据表 "public.users"
   栏位   |          类型          | 校对规则 |  可空的  |               预设
----------+------------------------+----------+----------+-----------------------------------
 id       | integer                |          | not null | nextval('users_id_seq'::regclass)
 player   | character varying(255) |          | not null |
 score    | real                   |          |          |
 team     | character varying(255) |          |          |
 fullname | character varying(255) |          |          |
索引:
    "users_pkey" PRIMARY KEY, btree (id)


mydb=# alter table users drop fullname;
ALTER TABLE
mydb=# \d users;
                                   数据表 "public.users"
  栏位  |          类型          | 校对规则 |  可空的  |               预设
--------+------------------------+----------+----------+-----------------------------------
 id     | integer                |          | not null | nextval('users_id_seq'::regclass)
 player | character varying(255) |          | not null |
 score  | real                   |          |          |
 team   | character varying(255) |          |          |
索引:
    "users_pkey" PRIMARY KEY, btree (id)


mydb=# alter table users rename player to nba_player;
ALTER TABLE
mydb=# \d users;
                                     数据表 "public.users"
    栏位    |          类型          | 校对规则 |  可空的  |               预设
------------+------------------------+----------+----------+-----------------------------------
 id         | integer                |          | not null | nextval('users_id_seq'::regclass)
 nba_player | character varying(255) |          | not null |
 score      | real                   |          |          |
 team       | character varying(255) |          |          |
索引:
    "users_pkey" PRIMARY KEY, btree (id)


mydb=# alter table users alter nba_player type varchar(100);
ALTER TABLE
mydb=# \d users;
                                     数据表 "public.users"
    栏位    |          类型          | 校对规则 |  可空的  |               预设
------------+------------------------+----------+----------+-----------------------------------
 id         | integer                |          | not null | nextval('users_id_seq'::regclass)
 nba_player | character varying(100) |          | not null |
 score      | real                   |          |          |
 team       | character varying(255) |          |          |
索引:
    "users_pkey" PRIMARY KEY, btree (id)


mydb=# create index nba_player_idx on users(nba_player);
CREATE INDEX
mydb=# \d users;
                                     数据表 "public.users"
    栏位    |          类型          | 校对规则 |  可空的  |               预设
------------+------------------------+----------+----------+-----------------------------------
 id         | integer                |          | not null | nextval('users_id_seq'::regclass)
 nba_player | character varying(100) |          | not null |
 score      | real                   |          |          |
 team       | character varying(255) |          |          |
索引:
    "users_pkey" PRIMARY KEY, btree (id)
    "nba_player_idx" btree (nba_player)


mydb=# drop index nba_player_idx;
DROP INDEX
mydb=# \d users;
                                     数据表 "public.users"
    栏位    |          类型          | 校对规则 |  可空的  |               预设
------------+------------------------+----------+----------+-----------------------------------
 id         | integer                |          | not null | nextval('users_id_seq'::regclass)
 nba_player | character varying(100) |          | not null |
 score      | real                   |          |          |
 team       | character varying(255) |          |          |
索引:
    "users_pkey" PRIMARY KEY, btree (id)

インデックス

デフォルトでは、PostgreSQLはインデックスの作成中にテーブル(SELECTステートメント)の読み取りを許可しますが、テーブルへの書き込み(INSERT、UPDATE、DELETE)はインデックスが作成されるまでブロックされます

インデックスタイプ

Bツリー

デフォルトでは、CREATE INDEXコマンドはBツリーインデックスを作成します。これはほとんどの状況に適しています。

Bツリーは、シーケンシャルに格納できるデータに対する等しいクエリと範囲クエリの処理に適しています。特に、インデックス付きフィールドに比較のために次の演算子のいずれかが含まれる場合、PostgreSQLのクエリプランナーはBツリーインデックスの使用を検討します。インデックス列のIS NULLまたはIS NOT NULL条件はBツリーインデックスと組み合わせることができます使用する。

<
<=
=
>=
>
between
in
col like 'foo%'
col ~ '^foo

ハッシュ

ハッシュインデックスは、単純な等値比較のみを処理できます。インデックス付きの列で比較に=演算子を使用する場合、クエリプランナーはハッシュインデックスの使用を検討します。次のコマンドを使用して、ハッシュインデックスを作成します。

CREATE INDEX name ON table USING hash (column);

GiST、SP-GiST、GIN

すべて

フィールドタイプ

タイプの紹介:https://www.postgresql.org/docs/12/datatype.html

数値

int

実数(浮動小数点)

シリアル(シリアルタイプバージョン)

文字型

char(不変、スペースTODOを追加)

varchar(変数)

テキスト

ブール

ブール

日付タイプ

data (年月日)

時間(時間、分、秒)

タイムスタンプ(年、月、日、時、分、秒)

注目のタイプ

アレイ

inet(ネットワークアドレスタイプ)

json

xml

INSERTステートメント

  • [テーブル名](フィールド、…)の値(値、…)に挿入します。

チェック機能が原因でSQLの挿入が失敗した場合、自動インクリメントされたIDも使用されます。

mydb=# \d users;
                                   Table "public.users"
 Column |         Type          | Collation | Nullable |              Default              
--------+-----------------------+-----------+----------+-----------------------------------
 id     | integer               |           | not null | nextval('users_id_seq'::regclass)
 name   | character varying(20) |           |          | 
 age    | integer               |           |          | 
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "u_user_age_idx" UNIQUE, btree (name, age)
    "u_age_nn_idx" btree (age) WHERE age IS NOT NULL
Number of child tables: 1 (Use \d+ to list them.)

mydb=# SELECT * FROM USERS;
 id | name  | age 
----+-------+-----
  2 | Cindy |  16
  4 | Dove  |    
  5 | Awa   |  14
  6 | Seven |  18
  1 | Bob   |  46
(5 rows)

# 插入相同的 “名称” 和 “年龄” 失败 - 受唯一索引限制
mydb=# insert into users (name, age) values ('Bob', 46);
ERROR:  duplicate key value violates unique constraint "u_user_age_idx"
DETAIL:  Key (name, age)=(Bob, 46) already exists.

# 插入数据,如果已经存在则忽略
mydb=# insert into users (name, age) values ('Bob', 46) on conflict do nothing;
INSERT 0 0

# 插入数据,如果已经存在则更新 “年龄” 为 47
mydb=# insert into users (name, age) values ('Bob', 46) on conflict (name, age) do update set age = 47;
INSERT 0 1

mydb=# select * from users;
 id | name  | age 
----+-------+-----
  2 | Cindy |  16
  4 | Dove  |    
  5 | Awa   |  14
  6 | Seven |  18
  1 | Bob   |  47
(5 rows)

# 插入数据,如果已经存在则在原来的基础上 加2
mydb=# insert into users (name, age) values ('Bob', 47) on conflict (name, age) do update set age = users.age + 2;
INSERT 0 1
mydb=# select * from users;
 id | name  | age 
----+-------+-----
  2 | Cindy |  16
  4 | Dove  |    
  5 | Awa   |  14
  6 | Seven |  18
  1 | Bob   |  49
(5 rows)

# 插入数据,如果已经存在则在原来的基础上添加上新增的值
mydb=# insert into users (name, age) values ('Bob', 49) on conflict (name, age) do update set age = users.age + excluded.age;
INSERT 0 1
mydb=# select * from users;                                                                                   id | name  | age 
----+-------+-----
  2 | Cindy |  16
  4 | Dove  |    
  5 | Awa   |  14
  6 | Seven |  18
  1 | Bob   |  98
(5 rows)

SELECTステートメント

mydb=# select id, player, score, team from users;
 id | player  | score |  team
----+---------+-------+---------
  1 | kuli    |  28.3 | yongshi
  2 | hadeng  |  30.2 | huojian
  3 | adu     |  25.6 | yongshi
  4 | azhan   |  27.8 | qishi
  5 | shengui |  31.3 | leiting
  6 | baibian |  19.8 | rehuo
(6 行记录)

mydb=# select id, player, score, team from users where player like 'a%';
 id | player | score |  team
----+--------+-------+---------
  3 | adu    |  25.6 | yongshi
  4 | azhan  |  27.8 | qishi
(2 行记录)

# _ 为占位符
mydb=# select id, player, score, team from users where player like 'ad_';
 id | player | score |  team
----+--------+-------+---------
  3 | adu    |  25.6 | yongshi
(1 行记录)

mydb=# select id, player, score, team from users order by score desc;
 id | player  | score |  team
----+---------+-------+---------
  5 | shengui |  31.3 | leiting
  2 | hadeng  |  30.2 | huojian
  1 | kuli    |  28.3 | yongshi
  4 | azhan   |  27.8 | qishi
  3 | adu     |  25.6 | yongshi
  6 | baibian |  19.8 | rehuo
(6 行记录)

# limit {取的条数} offset {偏移量}
mydb=# select id, player, score, team from users order by score desc limit 1 offset 0;
 id | player  | score |  team
----+---------+-------+---------
  5 | shengui |  31.3 | leiting
(1 行记录)

mydb=# select id, player, score, team from users order by score desc limit 1 offset 1;
 id | player | score |  team
----+--------+-------+---------
  2 | hadeng |  30.2 | huojian
(1 行记录)

mydb=# select id, player, score, team from users order by score desc limit 2 offset 1;
 id | player | score |  team
----+--------+-------+---------
  2 | hadeng |  30.2 | huojian
  1 | kuli   |  28.3 | yongshi
(2 行记录)

mydb=# select id, player, score, team from users order by score desc limit 2 offset 2;
 id | player | score |  team
----+--------+-------+---------
  1 | kuli   |  28.3 | yongshi
  4 | azhan  |  27.8 | qishi
(2 行记录)

mydb=# select team, max(score) from users group by team;
  team   | max
---------+------
 yongshi | 28.3
 qishi   | 27.8
 rehuo   | 19.8
 leiting | 31.3
 huojian | 30.2
(5 行记录)

mydb=# select team, max(score) from users group by team having max(score) > 30;
  team   | max
---------+------
 leiting | 31.3
 huojian | 30.2
(2 行记录)

mydb=# select team, max(score) from users group by team having max(score) > 30 order by max(score);
  team   | max
---------+------
 huojian | 30.2
 leiting | 31.3
(2 行记录)
  
mydb=# select id, player, score, team, concat(player, '/', team) as "info" from users;
 id | player  | score |  team   |      info
----+---------+-------+---------+-----------------
  1 | kuli    |  28.3 | yongshi | kuli/yongshi
  2 | hadeng  |  30.2 | huojian | hadeng/huojian
  3 | adu     |  25.6 | yongshi | adu/yongshi
  4 | azhan   |  27.8 | qishi   | azhan/qishi
  5 | shengui |  31.3 | leiting | shengui/leiting
  6 | baibian |  19.8 | rehuo   | baibian/rehuo
(6 行记录)
  
# 对数据进行随机排序 (random() 获取随机数)
mydb=# select id, player, score, team from users order by random();
 id | player  | score |  team
----+---------+-------+---------
  2 | hadeng  |  30.2 | huojian
  3 | adu     |  25.6 | yongshi
  6 | baibian |  19.8 | rehuo
  5 | shengui |  31.3 | leiting
  4 | azhan   |  27.8 | qishi
  1 | kuli    |  28.3 | yongshi
(6 行记录)

# select for update
# [线程A] 开启事务
mydb=# begin;
BEGIN

# [线程A] 查询 ID = 1 的数据,并加锁
mydb=# select * from users where id = 1 for update;
 id | name | age 
----+------+-----
  1 | Bob  |  21
(1 row)

# [线程B] 更新阻塞
mydb=# update users set age = 22 where id = 1;

# [线程A] 提交事务
mydb=# commit;

# [线程B]  更新成功
UPDATE 1

テーブルの関連付け

mydb=# select * from twitters;
 id | user_id |             content
----+---------+----------------------------------
  1 |       1 | 今天又是大胜,克莱打的真好!
  2 |       2 | 今晚我得了60分,哈哈!
  3 |       3 | 获胜咱不怕,缺谁谁尴尬.
  4 |       4 | 明年我也可能转会西部
  5 |       5 | 我都双20+了,怎么球队就是不胜呢?
  6 |       1 | 明年听说有条大鱼要来,谁呀?
(6 行记录)

mydb=# select * from users;
 id | nba_player | score |  team
----+------------+-------+---------
  1 | kuli       |  28.3 | yongshi
  2 | hadeng     |  30.2 | huojian
  3 | adu        |  25.6 | yongshi
  5 | shengui    |  31.3 | leiting
  6 | baibian    |  19.8 | rehuo
  4 | azhan      |  29.1 | qishi
(6 行记录)

mydb=# select * from users u, twitters t where u.id = t.user_id;
 id | nba_player | score |  team   | id | user_id |             content
----+------------+-------+---------+----+---------+----------------------------------
  1 | kuli       |  28.3 | yongshi |  1 |       1 | 今天又是大胜,克莱打的真好!
  2 | hadeng     |  30.2 | huojian |  2 |       2 | 今晚我得了60分,哈哈!
  3 | adu        |  25.6 | yongshi |  3 |       3 | 获胜咱不怕,缺谁谁尴尬.
  4 | azhan      |  29.1 | qishi   |  4 |       4 | 明年我也可能转会西部
  5 | shengui    |  31.3 | leiting |  5 |       5 | 我都双20+了,怎么球队就是不胜呢?
  1 | kuli       |  28.3 | yongshi |  6 |       1 | 明年听说有条大鱼要来,谁呀?
(6 行记录)

mydb=# select * from users u join twitters t on u.id = t.user_id;
 id | nba_player | score |  team   | id | user_id |             content
----+------------+-------+---------+----+---------+----------------------------------
  1 | kuli       |  28.3 | yongshi |  1 |       1 | 今天又是大胜,克莱打的真好!
  2 | hadeng     |  30.2 | huojian |  2 |       2 | 今晚我得了60分,哈哈!
  3 | adu        |  25.6 | yongshi |  3 |       3 | 获胜咱不怕,缺谁谁尴尬.
  4 | azhan      |  29.1 | qishi   |  4 |       4 | 明年我也可能转会西部
  5 | shengui    |  31.3 | leiting |  5 |       5 | 我都双20+了,怎么球队就是不胜呢?
  1 | kuli       |  28.3 | yongshi |  6 |       1 | 明年听说有条大鱼要来,谁呀?
(6 行记录)

# left join 等同与 left outer join
mydb=# select * from users u left join twitters t on u.id = t.user_id;
 id | nba_player | score |  team   | id | user_id |             content
----+------------+-------+---------+----+---------+----------------------------------
  1 | kuli       |  28.3 | yongshi |  1 |       1 | 今天又是大胜,克莱打的真好!
  2 | hadeng     |  30.2 | huojian |  2 |       2 | 今晚我得了60分,哈哈!
  3 | adu        |  25.6 | yongshi |  3 |       3 | 获胜咱不怕,缺谁谁尴尬.
  4 | azhan      |  29.1 | qishi   |  4 |       4 | 明年我也可能转会西部
  5 | shengui    |  31.3 | leiting |  5 |       5 | 我都双20+了,怎么球队就是不胜呢?
  1 | kuli       |  28.3 | yongshi |  6 |       1 | 明年听说有条大鱼要来,谁呀?
  6 | baibian    |  19.8 | rehuo   |    |         |
(7 行记录)

mydb=# select * from users u left outer join twitters t on u.id = t.user_id;
 id | nba_player | score |  team   | id | user_id |             content
----+------------+-------+---------+----+---------+----------------------------------
  1 | kuli       |  28.3 | yongshi |  1 |       1 | 今天又是大胜,克莱打的真好!
  2 | hadeng     |  30.2 | huojian |  2 |       2 | 今晚我得了60分,哈哈!
  3 | adu        |  25.6 | yongshi |  3 |       3 | 获胜咱不怕,缺谁谁尴尬.
  4 | azhan      |  29.1 | qishi   |  4 |       4 | 明年我也可能转会西部
  5 | shengui    |  31.3 | leiting |  5 |       5 | 我都双20+了,怎么球队就是不胜呢?
  1 | kuli       |  28.3 | yongshi |  6 |       1 | 明年听说有条大鱼要来,谁呀?
  6 | baibian    |  19.8 | rehuo   |    |         |
(7 行记录)

# cross join 为全部交叉关联 (此时数据量很大,慎用)
mydb=# select * from users u cross join twitters t;
 id | nba_player | score |  team   | id | user_id |             content
----+------------+-------+---------+----+---------+----------------------------------
  1 | kuli       |  28.3 | yongshi |  1 |       1 | 今天又是大胜,克莱打的真好!
  2 | hadeng     |  30.2 | huojian |  1 |       1 | 今天又是大胜,克莱打的真好!
  3 | adu        |  25.6 | yongshi |  1 |       1 | 今天又是大胜,克莱打的真好!
  5 | shengui    |  31.3 | leiting |  1 |       1 | 今天又是大胜,克莱打的真好!
  6 | baibian    |  19.8 | rehuo   |  1 |       1 | 今天又是大胜,克莱打的真好!
  4 | azhan      |  29.1 | qishi   |  1 |       1 | 今天又是大胜,克莱打的真好!
  1 | kuli       |  28.3 | yongshi |  2 |       2 | 今晚我得了60分,哈哈!
  2 | hadeng     |  30.2 | huojian |  2 |       2 | 今晚我得了60分,哈哈!
  3 | adu        |  25.6 | yongshi |  2 |       2 | 今晚我得了60分,哈哈!
  5 | shengui    |  31.3 | leiting |  2 |       2 | 今晚我得了60分,哈哈!
  6 | baibian    |  19.8 | rehuo   |  2 |       2 | 今晚我得了60分,哈哈!
  4 | azhan      |  29.1 | qishi   |  2 |       2 | 今晚我得了60分,哈哈!
  1 | kuli       |  28.3 | yongshi |  3 |       3 | 获胜咱不怕,缺谁谁尴尬.
  2 | hadeng     |  30.2 | huojian |  3 |       3 | 获胜咱不怕,缺谁谁尴尬.
  3 | adu        |  25.6 | yongshi |  3 |       3 | 获胜咱不怕,缺谁谁尴尬.
  5 | shengui    |  31.3 | leiting |  3 |       3 | 获胜咱不怕,缺谁谁尴尬.
  6 | baibian    |  19.8 | rehuo   |  3 |       3 | 获胜咱不怕,缺谁谁尴尬.
  4 | azhan      |  29.1 | qishi   |  3 |       3 | 获胜咱不怕,缺谁谁尴尬.
  1 | kuli       |  28.3 | yongshi |  4 |       4 | 明年我也可能转会西部
  2 | hadeng     |  30.2 | huojian |  4 |       4 | 明年我也可能转会西部
  3 | adu        |  25.6 | yongshi |  4 |       4 | 明年我也可能转会西部
  5 | shengui    |  31.3 | leiting |  4 |       4 | 明年我也可能转会西部
  6 | baibian    |  19.8 | rehuo   |  4 |       4 | 明年我也可能转会西部
  4 | azhan      |  29.1 | qishi   |  4 |       4 | 明年我也可能转会西部
  1 | kuli       |  28.3 | yongshi |  5 |       5 | 我都双20+了,怎么球队就是不胜呢?
  2 | hadeng     |  30.2 | huojian |  5 |       5 | 我都双20+了,怎么球队就是不胜呢?
  3 | adu        |  25.6 | yongshi |  5 |       5 | 我都双20+了,怎么球队就是不胜呢?
  5 | shengui    |  31.3 | leiting |  5 |       5 | 我都双20+了,怎么球队就是不胜呢?
  6 | baibian    |  19.8 | rehuo   |  5 |       5 | 我都双20+了,怎么球队就是不胜呢?
  4 | azhan      |  29.1 | qishi   |  5 |       5 | 我都双20+了,怎么球队就是不胜呢?
  1 | kuli       |  28.3 | yongshi |  6 |       1 | 明年听说有条大鱼要来,谁呀?
  2 | hadeng     |  30.2 | huojian |  6 |       1 | 明年听说有条大鱼要来,谁呀?
  3 | adu        |  25.6 | yongshi |  6 |       1 | 明年听说有条大鱼要来,谁呀?
  5 | shengui    |  31.3 | leiting |  6 |       1 | 明年听说有条大鱼要来,谁呀?

更新および削除

  • update [tablename] set [field = newvalue、…] where…

  • [テーブル名]から削除…

見る

コンセプトを見る

ビューは、1つ以上のテーブルから派生したオブジェクトです。ビューはテーブルとは異なります。ビューは仮想テーブルです。つまり、ビューに対応するデータは実際には保存されません。データベースにはビューの定義のみが保存されます。ビューのデータを操作すると、システムはビューの定義に従って動作し、ビューに関連付けられます。基本的なテーブル。

簡単な理解

ビューはSELECTステートメントであり、ビジネスシステムで一般的に使用されるSELECTステートメントをテーブルに似たオブジェクトに簡略化します。これにより、読み取りと開発が容易になります。

  • ビューを作成…

  • ドロップビュー…

# 创建视图
mydb=# create view curry_twitters as select u.nba_player, t.content from users as u, twitters as t where u.id = t.user_id and u.id = 1;
CREATE VIEW

# 查询所有视图
mydb=# \dv
                  关联列表
 架构模式 |      名称      | 类型 |  拥有者
----------+----------------+------+----------
 public   | curry_twitters | 视图 | postgres
(1 行记录)

# 查看指定视图的定义
mydb=# \d curry_twitters;
                  视图 "public.curry_twitters"
    栏位    |          类型          | 校对规则 | 可空的 | 预设
------------+------------------------+----------+--------+------
 nba_player | character varying(100) |          |        |
 content    | character varying(255) |          |        |


mydb=# select * from curry_twitters;
 nba_player |          content
------------+----------------------------
 kuli       | 今天又是大胜,克莱打的真好!
 kuli       | 明年听说有条大鱼要来,谁呀?
(2 行记录)

mydb=# select * from twitters;
 id | user_id |             content
----+---------+----------------------------------
  1 |       1 | 今天又是大胜,克莱打的真好!
  2 |       2 | 今晚我得了60分,哈哈!
  3 |       3 | 获胜咱不怕,缺谁谁尴尬.
  4 |       4 | 明年我也可能转会西部
  5 |       5 | 我都双20+了,怎么球队就是不胜呢?
  6 |       1 | 明年听说有条大鱼要来,谁呀?
(6 行记录)

mydb=# update twitters set content = '变更后的值' where id = 1;
UPDATE 1

mydb=# select * from curry_twitters;
 nba_player |          content
------------+----------------------------
 kuli       | 明年听说有条大鱼要来,谁呀?
 kuli       | 变更后的值
(2 行记录)

# 删除视图
mydb=# drop view curry_twitters;
DROP VIEW

mydb=# \dv
没有找到任何关系.

事務

データベーストランザクション(データベーストランザクション)は、単一の作業論理単位として実行される一連の操作を指し、完全に実行されるか、まったく実行されないかのどちらかです。トランザクション処理では、トランザクション単位内のすべての操作が正常に完了しない限り、データ指向のリソースが永続的に更新されないようにすることができます。関連する一連の操作を、すべて成功またはすべて失敗するユニットに結合することで、エラー回復を簡素化し、アプリケーションの信頼性を高めることができます。論理作業単位がトランザクションになるためには、それがいわゆるACID(原子性、一貫性、分離、および耐久性)のプロパティを満たしている必要があります。トランザクションはデータベース操作における論理的な作業単位であり、DBMSのトランザクション管理サブシステムがトランザクション処理を担当します。

  • ベギン

  • コミット

  • ロールバック

mydb=# select * from users;
 id | nba_player | score |  team
----+------------+-------+---------
  1 | kuli       |  28.3 | yongshi
  2 | hadeng     |  30.2 | huojian
  3 | adu        |  25.6 | yongshi
  5 | shengui    |  31.3 | leiting
  6 | baibian    |  19.8 | rehuo
  4 | azhan      |  29.1 | qishi
(6 行记录)

# 开启事务
mydb=# begin;
BEGIN

mydb=# update users set  score = 50.0 where id = 1;
UPDATE 1
mydb=# update users set score = 60 where id = 2;
UPDATE 1

# 事务提交前查询 (可以查询到未提交读 - 与事务隔离级别有关)
mydb=# select * from users;
 id | nba_player | score |  team
----+------------+-------+---------
  3 | adu        |  25.6 | yongshi
  5 | shengui    |  31.3 | leiting
  6 | baibian    |  19.8 | rehuo
  4 | azhan      |  29.1 | qishi
  1 | kuli       |    50 | yongshi
  2 | hadeng     |    60 | huojian
(6 行记录)

# 事务回滚
mydb=# rollback;
ROLLBACK

# 再次查询,数据为原始数据
mydb=# select * from users;
 id | nba_player | score |  team
----+------------+-------+---------
  1 | kuli       |  28.3 | yongshi
  2 | hadeng     |  30.2 | huojian
  3 | adu        |  25.6 | yongshi
  5 | shengui    |  31.3 | leiting
  6 | baibian    |  19.8 | rehuo
  4 | azhan      |  29.1 | qishi
(6 行记录)

# 开始事务
mydb=# begin;
BEGIN

mydb=# update users set  score = 50.0 where id = 1;
UPDATE 1
mydb=# update users set score = 60 where id = 2;
UPDATE 1

# 提价事务
mydb=# commit;
COMMIT

mydb=# select * from users;
 id | nba_player | score |  team
----+------------+-------+---------
  3 | adu        |  25.6 | yongshi
  5 | shengui    |  31.3 | leiting
  6 | baibian    |  19.8 | rehuo
  4 | azhan      |  29.1 | qishi
  1 | kuli       |    50 | yongshi
  2 | hadeng     |    60 | huojian
(6 行记录)

おすすめ

転載: blog.csdn.net/weixin_44456263/article/details/108700835