概述:
数据库是NetDevOps中不可或缺的一部分,而为了满足具体场景的需求,使用不同类型的数据库来存储信息也是必然之势。在NetDevOps中,常用的数据库有如下几种类型:
- 关系型数据库:PSQL、MYSQL
- 文档型数据库:MongoDB
- 时序型数据库:InfluxDB
- 搜索型数据库:ElasticSearch
文档型、时序型、搜索型等非关系型数据库,也被称为NoSQL数据库。术业有专攻,对于数据库领域相关的知识,网络工程师并不需要深入的学习,但是常用数据库的基本知识还是必要的。
注意:一般代码和数据库最好分开存储在不同的设备上。
PSQL:
PSQL快速安装请参考:
https://blog.csdn.net/tushanpeipei/article/details/115905946?spm=1001.2014.3001.5501
关系型数据库,也是最常用的数据库,在数据组织比较复杂时的首选。关系模型中常用的概念:
- 数据库: 数据库是一些关联表的集合。
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
- 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表(关系型数据库的精髓)。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
需要说明的是,在NetdevOps中,使用ORM将类和数据库进行映射(例如Django的ORM),然后使用程序语言进行数据库的操作更为常见和主流。
数据类型:
常用命令:
-
登陆psql:
Linux直接登陆:psql -U dbuser(用户名) -d exampledb(数据库名称) -h 192.168.0.166(数据库IP地址) -p 5432(PSQL默认端口)
psql图形化界面:使用pycharm等自带的图形化查看工具,或者专门查看psql的图形化工具pgadmin连接。
-
创建数据库:
CREATE DATABASE runoobdb(数据库名称);
-
删除数据库:
DROP DATABASE runoobdb(数据库名称);
-
创建数据库管理员,并赋予对应数据库的权限:
CREATE USER dev_dbuser WITH PASSWORD 'Cisc0123'; GRANT ALL ON DATABASE runoobdb TO dev_dbuser;
-
查看已经存在的数据库:
使用 \l 用于查看已经存在的数据库:
postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+-------+----------------------- postgres | postgres | UTF8 | C | C | runoobdb | postgres | UTF8 | C | C | template0 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres (4 rows)
-
进入对应数据库:
使用\c进入对应的数据库:postgres=# \c runoobdb You are now connected to database "runoobdb" as user "postgres". runoobdb=#
-
其他控制台命令:
\h:查看SQL命令的解释,比如\h select。
?:查看psql命令列表。
\d:列出当前数据库的所有表格。
\d [table_name]:列出某一张表格的结构。
\du:列出所有用户。
\e:打开文本编辑器。
\conninfo:列出当前数据库和连接的信息。
数据库操作:
-
创建表格:
CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
创建了一个表,表名为 COMPANY 表格,主键为 ID,NOT NULL 表示字段不允许包含 NULL 值。
-
删除数据库的表格:
drop table company;
-
在表格中插入数据:
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY,JOIN_DATE) VALUES (1, 'Paul', 32, 'California', 20000.00,'2001-07-13');
-
查询表格中数据:
查看表格中的所有信息:runoobdb=# SELECT * FROM company; ID NAME AGE ADDRESS SALARY JOIN_DATE ---- ---------- ----- ---------- ------- -------- 1 Paul 32 California 20000.0 2001-07-13 2 Allen 25 Texas 2007-12-13 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 2007-12-13 5 David 27 Texas 85000.0 2007-12-13
查看表格中的指定信息:
runoobdb=# SELECT ID,NAME FROM company; id | name ----+------- 1 | Paul 2 | Allen 3 | Teddy 4 | Mark 5 | David (5 rows)
读取 SALARY 字段大于 50000 的数据:
runoobdb=# SELECT * FROM COMPANY WHERE SALARY > 50000; id | name | age |address | salary ----+-------+-----+-----------+-------- 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 (2 rows)
读取 AGE 字段大于等于 25 且 SALARY 字段大于等于 6500 的数据:
runoobdb=# SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 6500; id | name | age | address | salary ----+-------+-----+-----------------------------------------------+-------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 (4 rows)
除了AND,其他逻辑运算符如下:
-
更新表格:
以下实例将更新 COMPANY 表中 id 为 3 的 salary 字段值:UPDATE COMPANY SET SALARY = 15000 WHERE ID = 3;
结果如下:
id | name | age | address | salary ----+-------+-----+------------+-------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall | 45000 7 | James | 24 | Houston | 10000 3 | Teddy | 23 | Norway | 15000
-
删除操作:
删除表格中的ID为2的一行:runoobdb=# DELETE FROM COMPANY WHERE ID = 2;
删除整个表格:
DELETE FROM COMPANY;
-
对表格进行排序:
按照age属性,升序:runoobdb=# SELECT * FROM COMPANY ORDER BY AGE ASC;
结果如下:
id | name | age | address | salary ----+-------+-----+----------------------------------------------------+-------- 6 | Kim | 22 | South-Hall | 45000 3 | Teddy | 23 | Norway | 20000 7 | James | 24 | Houston | 10000 4 | Mark | 25 | Rich-Mond | 65000 2 | Allen | 25 | Texas | 15000 5 | David | 27 | Texas | 85000 1 | Paul | 32 | California | 20000 (7 rows)
如果是降序排列,仅需将ASC修改为DESC。
-
对相同的数据进行分组:
GROUP BY 语句和 SELECT 语句一起使用,用来对相同的数据进行分组。GROUP BY 在一个 SELECT 语句中,放在 WHRER 子句的后面,ORDER BY 子句的前面。以如下数据为基础:
id | name | age | address | salary ----+-------+-----+--------------+-------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall | 45000 7 | James | 24 | Houston | 10000 8 | Paul | 24 | Houston | 20000 9 | James | 44 | Norway | 5000 10 | James | 45 | Texas | 5000
现在再根据 NAME 字段值进行分组,找出每个客户的工资总额:
runoobdb=# SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME ORDER BY NAME;
结果如下:
name | sum -------+------- Allen | 15000 David | 85000 James | 20000 Kim | 45000 Mark | 65000 Paul | 40000 Teddy | 20000 (7 rows)
可以看到,James的工资总额(sum)为10000+5000+5000 = 20000。Paul的工资总额为20000+20000=40000。由于其他的名字唯一,所以没有进行叠加。
-
筛选分组后的各组数据:
HAVING 子句可以让我们筛选分组后的各组数据。WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件。下面实例将找出根据 NAME 字段值进行分组,并且 name(名称) 字段的计数少于 2 数据:
SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) < 2;
结果为:
name ------- Teddy Paul Mark David Allen Kim James
-
psql约束:
NOT NULL:指示某列不能存储 NULL 值。CREATE TABLE COMPANY1( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
UNIQUE:确保某列的值都是唯一的。
CREATE TABLE COMPANY2( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL UNIQUE, ADDRESS CHAR(50), SALARY REAL DEFAULT 50000.00 );
PRIMARY Key:PRIMARY KEY 称为主键,是数据表中每一条记录的唯一标识。设置 UNIQUE 的列可能有多个,但是一张表只有一列可以设置 PRIMARY KEY。我们可以使用主键来引用表中的行,也可以通过把主键设置为其他表的外键,来创建表之间的关系。主键是非空约束和唯一约束的组合。入下述表:ID为主键。
CREATE TABLE COMPANY3( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
FOREIGN Key: FOREIGN KEY 即外键约束,指定列(或一组列)中的值必须匹配另一个表的某一行中出现的值。通常一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)。
如下是一个students表:CREATE TABLE STUDENTS( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, CLASS CHAR(50) NOT NULL, GRADE INT NOT NULL, );
COURSE使用了STUDENTS_ID作为外键,指向STUDENTS表的主键ID:
CREATE TABLE COURSE( ID INT PRIMARY KEY NOT NULL, COURSE_NAME TEXT NOT NULL, STUDENTS_ID INT references STUDENTS(ID) );
外键查询:
Left join:即左连接,是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。左连接全称为左外连接,是外连接的一种。
Right join:即右连接,是以右表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将右表所有的查询信息列出,而左表只列出ON后条件与右表满足的部分。右连接全称为右外连接,是外连接的一种。
举例:要查询选择了音乐课学生的情况,查询语句为:
SELECT * FROM STUDENTS LEFT JOIN COURSE ON STUDENTS.ID=COURSE.STUDENTS_ID WHERE COURSE.COURSE_NAME = 'music';
左外连接查询中左端表(STUDENTS表)中的所有元组的信息都得到了保留。
整理资料来源:
https://www.runoob.com/postgresql/postgresql-tutorial.html