相关推荐recommended
postgreSQL 操作 教程
作者:mmseoamin日期:2024-01-19

postgreSQL 操作 教程

  • 1. 建立数据库连接
  • 2. 访问数据库
      • 列出当前数据库所有表
      • 列出数据库名
      • 切换数据库
      • 查询数据库、表名
      • 内部命令
      • SQL命令通用如(标准化SQL语句):
          • 数据库
          • schema
            • 查看表
            • 操作表
            • 表删除
            • 表连接
            • 计算功能
            • VIEW 视图
            • Inheritance 继承
            • python连接

              1. 建立数据库连接

              psql -h IP地址 -p 端口 -U 数据库名
              psql -h IP -U user_name -p 1035 user_db
              

              2. 访问数据库

              \? help

              1、列举数据库:\l

              2、选择数据库:\c 数据库名

              3、查看该某个库中的所有表:\dt

              4、切换数据库:\c interface

              5、查看某个库中的某个表结构:\d 表名

              6、查看某个库中某个表的记录:select * from apps limit 1;

              7、显示字符集:\encoding

              8、退出psgl:\q

              列出当前数据库所有表

              \dt

              列出所有表名

              SELECT tablename FROM pg_tables;
              WHERE tablename NOT LIKE 'pg%'
              AND tablename NOT LIKE 'sql_%'
              ORDER BY tablename;
              

              列出数据库名

              \l

              SELECT datname FROM pg_database;
              

              切换数据库

              \c 数据库名

              查询数据库、表名

              1、通过命令行查询

              \d 数据库 —— 得到所有表的名字

              \d 表名 —— 得到表结构

              2、通过SQL语句查询

              select * from pg_tables"—— 得到当前db中所有表的信息(这里pg_tables是系统视图)

              select tablename from pg_tables where schemaname='public' —— 得到所有用户自定义表的名字(这里"tablename"字段是表的名字,"schemaname"是schema的名字。用户自定义的表,如果未经特殊处理,默认都是放在名为public的schema下)

              内部命令

              postgresql数据管理系统使用命令方式有两种:

              1. 内部命令,以反斜线开始 \ ,如: \l 显示所有数据库
              2. 标准SQL命令,以分号 ; 或 \g 结束,可以使用多行

              数据库的关键操作:

              启动服务

              登录

              建立数据库

              建立表

              插入记录到表中

              更新/删除/查询/修改操作

              退出

              停止服务

              设置字符集为 utf-8

              在windows7中安装的postgresql默认使用GBK字符集,经常不能使用显示中文的数据表,解决办法:

              注意:在windows 7下的postgresql中写操作时要使用GBK,读操作时要用UTF8;

              postgres=# \encoding utf-8 // 设置客户端的字元集

              postgres=# \encoding // 显示客户端的字元集

              postgres=# show client_encoding; // 显示客户端的字元集

              postgres=# show server_encoding; // 显示服务器的字元集

              启动服务:

              net start postgresql-9.5

              停止服务:

              net stop postgresql-9.5

              获取命令帮助:

              psql --help

              您正在使用psql, 这是一种用于访问PostgreSQL的命令行界面

              \h 显示 SQL 命令的说明

              \?显示 pgsql 命令的说明 (pgsql内部命令)

              \g 或者以分号(;)结尾以执行查询

              \q 退出注: 数据库名称区分大小写的。


              postgres=# \help // 获取SQL命令的帮助,同 \h

              postgres=# \quit // 退出,同 \q

              postgres=# \password dlf // 重新设置用户dlf的密码,然后需要 \q退出后才生效

              c:>psql exampledb < user.sql // 将user.sql文件导入到exampled数据库中

              postgres=# \h select // 精细显示SQL命令中的select命令的使用方法

              postgres=#\l // 显示所有数据库

              postgres=# \dt // 显示当前数据库中的所有表

              postgres=# \d [table_name] // 显示当前数据库的指定表的表结构

              postgres=# \c [database_name] // 切换到指定数据库,相当于use

              postgres=# \du // 显示所有用户

              postgres=# \conninfo // 显示当前数据库和连接信息

              postgres=# \e // 进入记事本sql脚本编辑状态(输入批命令后关闭将自动在命令行中执行)

              postgres=# \di // 查看索引(要建立关联)

              postgres=# \prompt [文本] 名称 // 提示用户设定内部变数

              postgres=# \encoding [字元编码名称] // 显示或设定用户端字元编码*可以将存储过程写在文本文件中aaa.sql,然后在psql状态下:

              postgres=# \i aaa.sql // 将aaa.sql导入(到当前数据库)

              postgres=# \df // 查看所有存储过程(函数)

              postgres=# \df+ name // 查看某一存储过程

              postgres=# select version(); // 获取版本信息

              postgres=# select usename from pg_user; // 获取系统用户信息

              postgres=# drop User 用户名 // 删除用户

              SQL命令通用如(标准化SQL语句):

              数据库

              --*创建数据库:
              create database [数据库名];
              --*删除数据库:
              drop database [数据库名]; 
              

              schema

              -- 选择 schema
              set search_path to test_schema;
              -- 删除 schema
              DROP schema test_2;
              --查看所有schema
              SELECT * FROM information_schema.schemata;
              

              查看表
              --获取当前db中所有的表信息
              select * from pg_tables;
              --用户自定义的表,如果未经特殊处理,默认都是放在名为public的schema下
               select tablename from pg_tables where schemaname='public';
               
              --列出某个数据库下的某个schema下面所有的表
              select * from pg_tables where schemaname = 'test_schema';
              --*显示表内容:
              select * from student;
              --计算数值
              SELECT city, (temp_lo+temp_hi)/2 AS temp_avg, date FROM weather;
              --选择查看
              SELECT * FROM weather WHERE city = 'San Francisco' AND prcp > 0.0;
              --排序
              SELECT * FROM weather ORDER BY city;
              SELECT * FROM weather ORDER BY city, temp_lo;
              --返回唯一值
              SELECT DISTINCT city FROM weather ORDER BY city;
              
              操作表
              --*创建表:
              -- create table ([字段名1] [类型1] ;,[字段名2] [类型2],......<,primary key (字段名m,字段名n,...)>;);
              CREATE TABLE cities (
              name       varchar(80),
              location   point
              );
              --添加列;*在已有的表里添加字段:
              -- alter table [表名] add column [字段名] [类型];
              ALTER TABLE weather ADD country varchar(80);
              --删除列
              ALTER TABLE weather DROP country;
              --*删除表中的字段:
              alter table [表名] drop column [字段名];
              --*在表中插入数据:
              -- insert into 表名 ([字段名m],[字段名n],......) values ([列m的值],[列n的值],......);
              INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
              INSERT INTO weather (date, city, temp_hi, temp_lo) VALUES ('1994-11-29', 'Hayward', 54, 37);
              --更新行
              UPDATE weather
              SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
              WHERE date > '1994-11-28';
              --删除行
              DELETE FROM weather WHERE city = 'Hayward';
              --*重命名一个表:
              alter table [表名A] rename to [表名B];
              *重命名一个字段: 
              alter table [表名] rename column [字段名A] to [字段名B];
              *给一个字段设置缺省值: 
              alter table [表名] alter column [字段名] set default [新的默认值];
              *去除缺省值: 
              alter table [表名] alter column [字段名] drop default;
               
              *修改表中的某行某列的数据:
              update [表名] set [目标字段名]=[目标值] where [该行特征];
              
              表删除
              --清空表
              DELETE FROM tablename;
              --*删除一个表:
              drop table [表名]; 
              --*删除表中某行数据:
              delete from [表名] where [该行特征];
              delete from [表名];    // 删空整个表
              
              表连接
              --表连接
              SELECT * FROM weather, cities WHERE city = name;
              SELECT city, temp_lo, temp_hi, prcp, date, location FROM weather, cities WHERE city = name;
              SELECT weather.city, weather.temp_lo, weather.temp_hi, weather.prcp, weather.date, cities.location FROM weather, cities WHERE cities.name = weather.city;
              --内连接
              SELECT * FROM weather INNER JOIN cities ON (weather.city = cities.name);
              --左外连接
              SELECT * FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);
              --右外连接
              SELECT * FROM weather RIGHT OUTER JOIN cities ON (weather.city = cities.name);
              SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high, W2.city, W2.temp_lo AS low, W2.temp_hi AS high FROM weather W1, weather W2 WHERE W1.temp_lo < W2.temp_lo AND W1.temp_hi > W2.temp_hi;
              SELECT * FROM weather w, cities c WHERE w.city = c.name;
              
              计算功能
              --计算功能
              --最大值
              SELECT max(temp_lo) FROM weather;
              --通过使用一个子查询来查询temp_lo的最大值所对应的城市
              SELECT city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
              SELECT city, max(temp_lo) FROM weather GROUP BY city;
              SELECT city, max(temp_lo) FROM weather GROUP BY city HAVING max(temp_lo) < 40;
              SELECT city, max(temp_lo) FROM weather WHERE city LIKE 'S%' GROUP BY city HAVING max(temp_lo) < 40;
              
              VIEW 视图
              --VIEW 视图
              CREATE VIEW myview AS
                  SELECT city, temp_lo, temp_hi, prcp, date, location
                      FROM weather, cities
                      WHERE city = name;
              --#给cities表中的name列添加 primary key
              zyw_test=> ALTER TABLE cities ADD PRIMARY KEY(name);
              --#给weather表创建一个限制在city列上的 foreign key
              zyw_test=> ALTER TABLE weather ADD FOREIGN KEY (city) REFERENCES cities(name);
              
              Inheritance 继承

              在PostgreSQL中,一个表可以从0个或多个表继承,一次查询可以查询到某个表中的所有行,或者这个表和这个表所有子表的所有行,默认为后者。

              –例如:下面第一个查询查到了city表中的所有行,包括capitals表中的所有行;第二个查询只查到了city表中的所有行,并不包括capitals表。

              --Inheritance 继承
              CREATE TABLE capitals (
                   state    char(2)
               ) INHERITS (city);
              --- 在PostgreSQL中,一个表可以从0个或多个表继承,一次查询可以查询到某个表中的所有行,或者这个表和这个表所有子表的所有行,默认为后者。
              --例如:下面第一个查询查到了city表中的所有行,包括capitals表中的所有行;第二个查询只查到了city表中的所有行,并不包括capitals表。
              SELECT name, elevation FROM city WHERE elevation > 500;
              SELECT name, elevation FROM ONLY city WHERE elevation > 500;
              

              python连接

              import sqlalchemy as db
              username = 'username '
              password = 'password '
              ip = 'IP'
              port = '1035'
              database_name = 'test_db'
              # Create engine. Scheme: "postgres+psycopg2://:@:/"
              engine = db.create_engine(f"postgresql+psycopg2://{username}:{password}@{ip}:{port}/{database_name}")
              # # 利用getpass传入数据库密码,终端不会显示输入的密码:
              # import getpass
              # pw = getpass.getpass("Please enter password:")
              # # create engine
              # engine = create_engine(f"postgres+psycopg2://{username}:{pw}@{ip}:{port}/{database_name}")
              conn = engine.connect()  #连接
              result = conn.execute('SELECT * FROM test_schema.weather')  #执行SQL语句
              print(result.fetchall())  #fetchall()返回所有元组,fetchone()返回一个元组
              print(result)
              conn.close()  #关闭连接
              

              参考

              https://www.postgresql.org/docs/15/tutorial-table.html

              PostgreSql内部命令

              https://www.geeksforgeeks.org/introduction-to-psycopg2-module-in-python/