PostgreSQL 关系型数据库入门

目录

1. 关系型数据库与非关系型数据:

2. 操作前须知:

3. 操作表数据:

4. 字段类型:

5. 添加表约束:

6. insert语句:

7. select语句:

8. where语句:

9. 数据抽出选项:

10. 统计抽出数据:

11. 方便的函数:

12. 更新与删除:

13. 变更表结构:

14. 操作多个表:

15. 使用试图:

16. 使用事务:


1. 关系型数据库与非关系型数据:

        Nosql指的是非关系型数据库,全称是Not Only Sql。

        常见的关系型数据库有:Oracle、MySql、SQLServer、PostgreSQL;

        常见的NoSql数据库:MongoDB、Redis、Memcache;

具体优劣可参考 博客:https://blog.csdn.net/jaryle/article/details/92806662

数据库特点可参考博客:https://blog.csdn.net/wyz0516071128/article/details/80877984

2. 操作前须知:

        PostgreSQL中会默认创建【postgres】系统管理员,在操作数据库时需要切换到postgres后再进行数据库操作。

sudo su postgres    # 切换到postgres
psql --version      # 查看当前数据库版本
psql -l             # 查看当前库表

3. 操作表数据:

A. 创建 / 删除数据库 基础操作

createdb aff        # 创建数据库
psql -l             # 查看当前库表
psql aff            # 1.进入psql命令行模式
                      2.同时open aff表
dropdb aff          # 删除数据库

B. 创建库表 基础操作

关系型数据库不仅有表,还有字段、函数、记录、存储过程、序列等等概念。

对库表操作不仅可以通过命令行直接操作,也可通过导入.sql文件进行操作,为命令行操作;

# 创建文章表,分为title和contnt字段,title为可变长度
create table posts (title varchar(255), content text);

\dt                                     # 查看当前数据库下所有表
\dt posts                               # 查看posts表具体信息
alter table posts rename to lalala;     # 对表进行更名操作,重命名为lalala
drop table lalala;                      # 删除表单
\q                                      # 退出

通过导入.sql文件进行操作

vim db.sql    # 创建表单的sql文件

# 文件内容
create table posts (title varchar(255), content text);

\i db.sql     # 导入(执行)sql语句,文件可复用。

4. 字段类型:

A. 数值型:int,real(float),serial(自动+1) 

B. 字符串型:char,varcahr,text(大文本)

C. 布尔型:boolean

D. 日期型:data,time,timestamp

E. 特色类型:Array 型(一个字段存一组数据),inet 网络地址型(支持存ip地址),Json 型,XML 型,BinaryData 型(支持存储图片),Geometric 图形型(支持存储points,Links,Paths等),Range types 范围型

5. 添加表约束:

为表字段添加一些约束条件

约束条件:

        not null  字段不可为空

        unique  表字段唯一存在

        check  自定义字段存在

        default  字段默认值

        primary key(not null, unique)  主键,不能为空,且不能重复

create table posts (
    id serial primary key,                         # id主键,序列类型,自动加一
    title varchar(255) not null,                   # title字段可变长度不可为空
    content text check(length(content) > 8),       # content字段必须大于8长度
    is_draft boolean default TRUE,                 # is_draft 布尔,默认True
    is_del boolean default FALSE,                  # is_del 布尔,默认False
    created_date timestamp default 'now'           # created_date时间戳,默认取现在
);

6. insert语句:

insert语句用法:
insert into [tablename] (field, ...) values (value, ...)

Ps:' '空string在postgrep中默认为非null

insert into posts (title, content) values ('', '');
# content字段未通过check校验

insert into posts (title, content) values (NULL, '');
# title,content都不符合表约束

insert into posts (title, content) values ('title1', 'content11');
# yes

insert into posts (title, content) values ('title2', 'content22');
# yes

insert into posts (title, content) values ('title3', 'content33');
# yes

select * from posts;    # 查看表内容

7. select语句:

先导入数据

#init.sql 

create table users (
    id serial primary key,
    player varchar(255) not null,
    score real,
    team varchar(255)
);

insert into users (player, score, team) values
('库里', 28.3, '勇士'),
('哈登', 30.2, '火箭'),
('阿杜', 25.6, '勇士'),
('阿詹', 27.8, '骑士'),
('神龟', 31.3, '雷霆'),
('白边', 19.8, '热火');
\i init.sql            # 插入数据
\dt                    # 查看所有库表
\d users               # 查看users库表
select * from users;   # 查看users表所有内容
\x                     # 展示内容过多时,由横向展示 ——> 纵向
select player, score from users;    # 只展示player,score字段数据

8. where语句:

使用where语句来设定select,update,delete语句数据抽出的条件。

select * from users;
select * from users where score > 20;
select * from users where score < 30;
select * from users where score > 20 and score < 30;
select * from users where team = '勇士';
select * from users where team != '勇士';
select * from users where player like '阿%';    # 以阿 开头即可
select * from users where player like '阿_';    # 以阿 开头且限定后面只能跟一个字符

9. 数据抽出选项:

select语句在抽出数据时,可以对语句设置更多的选项,已得到想要的数据。

order by asc / desc  升序 / 降序

limit  限制取出数据数量

offset  偏移量(从第几条开始)

select * from users order by score asc;
select * from users order by score desc;
select * from users order by team;
select * from users order by team, score;
select * from users order by team, score desc;
select * from users order by team desc, score desc;
select * from users order by score desc limit 3;
select * from users order by score desc limit 3 offset 1;
select * from users order by score desc limit 3 offset 2;
select * from users order by score desc limit 3 offset 3;

limit和offset可以搭配完成分页处理

10. 统计抽出数据:

distinct  去重

sum  求和  min/max  极值

group by/having  分组,分组后限制条件

select distinct team from users;
select sum(score) from users;
select max(score) from users;
select min(score) from users;
select * from users where score = (select max(score) from users);
select * from users where score = (select min(score) from users);
select team, max(score) from users group by team;
select team, max(score) from users group by team having max(score) >= 25;
select team, max(score) from users group by team having max(score) >= 25 order by max(score);

11. 方便的函数:

        length 求长度

        concat  连接两个string

        alias  别名

        substring  切割string

        random  随机数

select player, length(player) from users;
select player, concat(player, '/', team) from users;    # 用‘/’连接string
select player, concat(player, '/', team) as "球员信息" from users;
select substring(team, 1, 1) as "球队首文字" from users;
select concat('我', substring(team, 1, 1)) as "球队首文字" from users;
select random();
select * from users order by random();
select * from users order by random() limit 1;    # 随机抽出一个数据

12. 更新与删除:

# update语句用法
update [table] set [field=newvalue,...] where ...

# delete语句用法
delete from [table] where ...
update users set score = 29.1 where player = '阿詹';
update users set score = score + 1 where team = '勇士';
update users set score = score + 100 where team IN ('勇士', '骑士');
delete from users where score > 30;

13. 变更表结构:

# 更新表结构
alter table [tablename] ...

# 创建索引
create index ...
# 删除索引
drop index ...

# 字段加上索引后,检索速度呈指数级增长
\d users;
alter table users add fullname varchar(255);
alter table users drop fullname;
alter table users rename player to nba_player;
alter table users alter nba_player type varchar(100);

# 在users表中通过nba_player创建索引,索引名nba_player_index [B tree算法]
# 检索数据时加快速度,但是追加数据时会影响性能;
create index nba_player_index on users(nba_player);
# 删除索引
drop index nba_player_index;

14. 操作多个表:

# renew.sql

create table users (
    id serial primary key,
    player varchar(255) not null,
    score real,
    team varchar(255)
);
insert into users (player, score, team) values
('库里', 28.3, '勇士'),
('哈登', 30.2, '火箭'),
('阿杜', 25.6, '勇士'),
('阿詹', 27.8, '骑士'),
('神龟', 31.3, '雷霆'),
('白边', 19.8, '热火');

create table twitters (
    id serial primary key,
    user_id integer,
    content varchar(255) not null
);
insert into twitters (user_id, content) values
(1, '今天又是大胜,克莱打的真好!'),
(2, '今晚我得了60分,哈哈!'),
(3, '获胜咱不怕,缺谁谁尴尬.'),
(4, '明年我也可能转会西部'),
(5, '我都双20+了,怎么球队就是不胜呢?'),
(1, '明年听说有条大鱼要来,谁呀?');
createdb aff;
psql aff;
\i renew.sql
select * from users;
select * from twitters;
select users.player, twitters.content from users, twitters where users.id = twitters.user_id;

select u.player, t.content from users as u, twitters as t where u.id = t.user_id;

select u.player, t.content from users as u, twitters as t where u.id = t.user_id and u.id = 1;

15. 使用试图:

        概念:视图(View)是从一个或多个表导出的对象。视图与表不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。

        理解:视图就是一个SELECT语句,把业务系统中常用的SELECT语句简化成一个类似于表的对象,便于简单读取和开发。

# 创建视图
create view ...

# 删除视图
drop view ...


select u.player, t.content from users as u, twitters as t where u.id = t.user_id and u.id = 1;

# 取出库里的所有twitter发言,每次取时需要输入一长串sql语句,现在可以直接构成试图对象
# curry_twitters试图名
create view curry_twitters as select u.player, t.content from users as u, twitters as t where u.id = t.user_id and u.id = 1;
\dv                            # 查看试图描述
\d curry_twitters              # 查看试图具体字段
select * from curry_twitters;
drop view curry_twitters;
\dv

Tips:在自己项目中,为了提高数据查询速度,可在表中加入索引index。同时对于经常需要查询的语句,可以提前建立视图view,方便于编码和管理。

16. 使用事务:

        数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

# 原子性操作
begin        # 开始
commit       # 提交
rollback     # 回滚到更新前数据
select * from users;
begin;
update users set score = 50 where player = '库里';
update users set score = 60 where player = '哈登';
commit;
select * from users;
begin;
update users set score = 0 where player = '库里';
update users set score = 0 where player = '哈登';
rollback;
select * from users;

你可能感兴趣的:(工作后的学习笔记,=w=,postgresql,数据库,nosql,关系型数据库)