目录
1. 关系型数据库与非关系型数据:
2. 操作前须知:
3. 操作表数据:
4. 字段类型:
5. 添加表约束:
6. insert语句:
7. select语句:
8. where语句:
9. 数据抽出选项:
10. 统计抽出数据:
11. 方便的函数:
12. 更新与删除:
13. 变更表结构:
14. 操作多个表:
15. 使用试图:
16. 使用事务:
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
PostgreSQL中会默认创建【postgres】系统管理员,在操作数据库时需要切换到postgres后再进行数据库操作。
sudo su postgres # 切换到postgres
psql --version # 查看当前数据库版本
psql -l # 查看当前库表
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语句,文件可复用。
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 范围型
为表字段添加一些约束条件
约束条件:
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时间戳,默认取现在
);
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; # 查看表内容
先导入数据
#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字段数据
使用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 '阿_'; # 以阿 开头且限定后面只能跟一个字符
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可以搭配完成分页处理
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);
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; # 随机抽出一个数据
# 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;
# 更新表结构
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;
# 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;
概念:视图(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,方便于编码和管理。
数据库事务(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;