首页 > 数据库 >Postgresql数据库之Python连接数据库&查询练习

Postgresql数据库之Python连接数据库&查询练习

时间:2023-10-21 19:32:55浏览次数:32  
标签:rows Postgresql cur Python 数据库 emp deptno conn row

Task 1. 基于finalshell建立的SSH隧道,实现Python代码连接天翼云数据库

(1)给出finalshell的配置

如下图:

Postgresql数据库之Python连接数据库&查询练习_建表Postgresql数据库之Python连接数据库&查询练习_sql_02

为了登录安全起见,将ssh登录端口和数据库监听端口进行了修改。

(2)给出Python连接天翼云数据库的代码

Python代码如下:

import psycopg2
conn = psycopg2.connect( dbname = 'a2513210112',                        
						 user = '*******',                        
                        password = '*******',                        
                        host = '127.0.0.1',                        
                        port = 9929,                        
                        options = '-c search_path="S-T",public')
print("connection is ready")

为了数据库安全,将user和password进行了隐藏处理,连接时并指定连接“S-T”模式下。

(1)给出查询上次实验中建立的“S-T”模式中,student表中所有的数据,并在界面打印出来

Python代码如下:

import psycopg2

conn = psycopg2.connect(dbname = 'a2513210112',
                        user = '*******',
                        password = '*******',
                        host = '127.0.0.1',
                        port = 9929,
                        options = '-c search_path="S-T",public')

#print("connection is ready")

cur = conn.cursor()
cur.execute("SELECT * FROM student;")
rows = cur.fetchall()
for row in rows:
    print(row)
cur.close()
conn.close()


Postgresql数据库之Python连接数据库&查询练习_Python_03

Postgresql数据库之Python连接数据库&查询练习_建表_04



Task2 根据给定的excel表格中的表结构信息,建三个表,选择在S-Tschema下建表

--部门建表
CREATE TABLE dept 
(
deptno INT PRIMARY KEY,
dname VARCHAR(20),
loc VARCHAR(20)
);
--员工建表
CREATE TABLE emp
(
empno INT PRIMARY KEY,
ename VARCHAR(20),
job VARCHAR(20),
mgr INT,
hiredate DATE,
sal FLOAT(16),
comm FLOAT(16),
deptno INT,
FOREIGN KEY (deptno) REFERENCES dept(deptno)
);
CREATE TABLE salgrade
(
grade INT,
losal FLOAT(16),
hisal FLOAT(16)
);

Task3.写Python代码,嵌入SQL语句,将给的excel表格中的数据,导入数据库

(1)通过python连接云上数据库,并执行嵌入的sql脚本和完整可执行程序

import psycopg2

conn = psycopg2.connect(dbname = 'a2513210112',
                        user = '*******',
                        password = '*******',
                        host = '127.0.0.1',
                        port = 9929,
                        options = '-c search_path="S-T",public')

print("connection is ready")
cur = conn.cursor()#获取游标
#对部门表插入数据
sql="insert into dept values(%s,%s,%s)"
# 每一个值都作为一个元组,整个参数集作为一个元组
param=((10,'ACCOUNTING','NEW YORK'),
        (20,'RESEARCH','DALLAS'),
       (30,'SALES','CHICAGO'),
       (40,'OPERATIONS','BOSTON')
)
cur.executemany(sql,param)
# 提交


conn.commit()
conn.commit()
cur.execute("select * from dept")
rows = cur.fetchall()
for row in rows:
    print(row)

执行结果:

Postgresql数据库之Python连接数据库&查询练习_建表_05

#对员工表插入数据
sql = "insert into emp values(%s,%s,%s,%s,%s,%s,%s,%s)"
param =( (7369,'SMITH', 'CLERK',7902,'1980-12-17',800,None,20),
         (7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30),
         (7521,'WARD',  'SALESMAN',    7698,'1981-02-22',1250,500,30),
         (7566,'JONES', 'MANAGER', 7839,  '1981-04-02',2975,None,20),
         (7654,'MARTIN',    'SALESMAN',7698,'1981-09-28',1250,1400,30),
         (7698, 'BLAKE',   'MANAGER', 7839,  '1981-05-01',  2850,None,30),
         (7782, 'CLARK','MANAGER',7839 ,'1981-06-09', 2450,None,10),
         (7788, 'SCOTT','ANALYST', 7566,  '1987-07-13',  3000,None,20),
         (7839, 'KING',    'PRESIDENT',None,'1981-11-07', 5000,None,10),
         (7844, 'TURNER','SALESMAN',   7698,  '1981-09-08',  1500,  0, 30),
         (7876, 'ADAMS',   'CLERK',7788,  '1987-07-13',  1100,None,20),
         (7900, 'JAMES','CLERK',   7698,  '1981-12-03',950   ,None,30),
         (7902, 'FORD','ANALYST',7566, '1981-12-03',3000,None,20),
         (7934, 'MILLER','CLERK',7782,'1982-01-23',1300,None,10)
)
cur.executemany(sql,param)
# 提交
conn.commit()
cur.execute("select * from emp")
rows = cur.fetchall()
for row in rows:
    print(row)

Postgresql数据库之Python连接数据库&查询练习_sql_06

sql = "insert into salgrade values(%s,%s,%s)"
param = (
    (1, 700,   1200),
    (2, 1201,  1400),
    (3, 1401,  2000),
    (4, 2001,  3000),
    (5, 3001,  9999)
)
cur.executemany(sql,param)
# 提交
conn.commit()
cur.execute("select * from salgrade")
rows = cur.fetchall()
for row in rows:
    print(row)

Postgresql数据库之Python连接数据库&查询练习_Python_07

(2)查询结果

SELECT * FROM emp;
SELECT * FROM dept;
SELECT * FROM salgrade;

Postgresql数据库之Python连接数据库&查询练习_sql_08

Postgresql数据库之Python连接数据库&查询练习_Python_09

Postgresql数据库之Python连接数据库&查询练习_建表_10

Task 4. 根据问题,写SQL代码,实现相应的操作。

4.1列出与“SCOTT”从事相同工作的所有员工及部门名称,部门人数。

SELECT emp.ename,cn.dname, cn.部门人数
FROM emp 
JOIN (SELECT emp.deptno ,dname, COUNT(empno) "部门人数" 
					FROM emp , dept  
					WHERE emp.deptno = dept.deptno 
					GROUP BY emp.deptno, dept.dname) cn
ON  emp.deptno = cn.deptno AND job = (select job from emp where ename = 'SCOTT') AND emp.ename <> 'SCOTT'

Postgresql数据库之Python连接数据库&查询练习_建表_11

4.2列出薪金高于"在部门30工作的所有员工的薪金"的员工姓名和薪金、部门名称。

SELECT e.ename,e.sal,d.dname
FROM emp e
JOIN dept d
ON e.deptno = d.deptno 
WHERE sal > ALL(SELECT sal FROM emp WHERE deptno = 30);

Postgresql数据库之Python连接数据库&查询练习_Python_12

4.3列出每个部门的员工数量、平均工资和平均服务期限。

按年:

import psycopg2

conn = psycopg2.connect(dbname = 'a2513210112',
                        user = '*******',
                        password = '*******',
                        host = '127.0.0.1',
                        port = 9929,
                        options = '-c search_path="S-T",public')

print("connection is ready")
cur = conn.cursor()#获取游标
cur.execute("select deptno,COUNT(empno),avg(sal) as 平均薪资 ,avg(2023 - extract(year from hiredate))  from emp group by deptno ")
rows = cur.fetchall()
for row in rows:
     print(row)
cur.close()
conn.close()

Postgresql数据库之Python连接数据库&查询练习_sql_13

按天:

import psycopg2

conn = psycopg2.connect(dbname = 'a2513210112',
                        user = '*******',
                        password = '*******',
                        host = '127.0.0.1',
                        port = 9929,
                        options = '-c search_path="S-T",public')

print("connection is ready")
cur = conn.cursor()#获取游标
cur.execute("select deptno, COUNT(empno),AVG(sal) as 平均薪资, AVG(CURRENT_DATE - hiredate)  from emp group by deptno ")
rows = cur.fetchall()
for row in rows:
     print(row)
cur.close()
conn.close()

Postgresql数据库之Python连接数据库&查询练习_sql_14


4.4列出所有员工的姓名、部门名称和工资。

import psycopg2

conn = psycopg2.connect(dbname = 'a2513210112',
                        user = '*******',
                        password = '*******',
                        host = '127.0.0.1',
                        port = 9929,
                        options = '-c search_path="S-T",public')

print("connection is ready")
cur = conn.cursor()#获取游标
cur.execute("SELECT e.ename,d.dname,e.sal FROM emp e JOIN dept d ON e.deptno = d.deptno ")
rows = cur.fetchall()
for row in rows:
     print(row)
cur.close()
conn.close()

4.5列出所有部门的详细信息和部门人数。

import psycopg2

conn = psycopg2.connect(dbname = 'a2513210112',
                        user = '*******',
                        password = '*******',
                        host = '127.0.0.1',
                        port = 9929,
                        options = '-c search_path="S-T",public')

print("connection is ready")
cur = conn.cursor()
cur.execute("select d.*, b.cn from dept d  left join (select deptno , COUNT(*) cn from emp group by deptno) b on d.deptno = b.deptno")
rows = cur.fetchall()
for row in rows:
     print(row)
cur.close()
conn.close()

Postgresql数据库之Python连接数据库&查询练习_sql_15

4.6列出各种工作的最低工资及从事此工作的雇员姓名。

SELECT  e.job ,e.sal ,e.ename 
FROM emp e
WHERE sal IN  (SELECT min(sal) FROM emp GROUP BY job);

Postgresql数据库之Python连接数据库&查询练习_建表_16

4.7列出各个部门的MANAGER(经理)的最低薪金、姓名、部门名称、部门人数。

SELECT e.ename, d.dname,dc.cn,ms.min_sal 最低薪金
 FROM emp e
 JOIN dept d 
 ON d.deptno = e.deptno 
 JOIN (SELECT deptno, MIN(sal) min_sal FROM emp WHERE job = 'MANAGER' GROUP BY deptno) ms
 ON ms.deptno = e.deptno 
 JOIN (select deptno , COUNT(*) cn from emp group by deptno) dc
 ON e.deptno = dc.deptno  AND e.job = 'MANAGER'

Postgresql数据库之Python连接数据库&查询练习_sql_17

4.8列出所有员工的姓名以及其直接上级的姓名

SELECT e0.ename,e1.ename 上级
FROM emp e0
JOIN emp e1
ON e0.mgr =e1.empno

Postgresql数据库之Python连接数据库&查询练习_Python_18

4.9列出受雇日期早于其直接上级的所有员工的编号、姓名,部门名称

select e.empno , e.ename , d.dname
from emp e 
join dept d 
on e.deptno = d.deptno
left join emp e1 
on e.mgr = e1.empno
where e.hiredate < e1.hiredate;

Postgresql数据库之Python连接数据库&查询练习_建表_19

标签:rows,Postgresql,cur,Python,数据库,emp,deptno,conn,row
From: https://blog.51cto.com/u_15831056/7969356

相关文章

  • Python 循环
    Python有两个基本的循环命令:while循环for循环while循环使用while循环,我们可以在条件为真的情况下执行一组语句。示例,打印i,只要i小于6:i=1whilei<6:print(i)i+=1注意:记得增加i的值,否则循环将永远继续下去。while循环要求相关的变量已经准备好,例如在这个示......
  • Python 循环
    Python有两个基本的循环命令:while循环for循环while循环使用while循环,我们可以在条件为真的情况下执行一组语句。示例,打印i,只要i小于6:i=1whilei<6:print(i)i+=1注意:记得增加i的值,否则循环将永远继续下去。while循环要求相关的变量已经准备好,例如在这个示例......
  • OPNsense 系列十一:OPNsense Tools 写的一些 Python 小工具
    OPNsenseTools介绍基于OPNsense系统的Python小工具、小程序集,实现个人需要的功能。目前支持:liteip:终端网络信息获取小工具,实现域名、IPv4、IPv6、MAC更新的电子邮件通知。ping_subprocess:ping(IPv4)触发命令行指令。支持Windows7、Windows10、FreeB......
  • python技术栈之单元测试中mock的使用
    什么是mock?mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。mock的作用特别是开发过程中上下游未完成的工序导致当前无法测试,需要虚拟某些特定对象以便测试。unittest是python内置的单元测试库,在做接口测试时,如果......
  • 关系数据库的表设计规范:五范式
    第一范式(1NF):确保每个数据字段都是原子性的,即不可再分。每个字段只能包含一个值,不允许多个值或重复的数据。第二范式(2NF):在满足1NF的基础上,确保所有非主键字段完全依赖于整个主键,而不是部分主键。换句话说,每个非主键字段必须与主键相关,不能只与主键的一部分相关。第三范式(3N......
  • 小白学Python - 使用 Django 的天气应用程序
    使用Django的天气应用程序本文中我们将学习如何创建一个使用Django作为后端的天气应用程序。Django提供了一个基于PythonWeb框架的Web框架,允许快速开发和干净、务实的设计。基本设置cdweather启动服务器pythonmanage.pyrunserver要检查服务器是否正在运行,请转至Web......
  • 代码随想训练营第十天(Python)| 232.用栈实现队列 、 225. 用队列实现栈
    232.用栈实现队列classMyQueue:def__init__(self):self.stack_in=list()self.stack_out=list()defpush(self,x:int)->None:self.stack_in.append(x)defpop(self)->int:ifself.empty():......
  • 在Postgresql中,为表中的所有点提供100m缓冲区,其中有50M个条目
    我有一个表,有50米的纬度和经度条目,geom是我从QGIS导入时创建的。我试图通过调用jupyter笔记本中的表来为表中的所有点创建一个100m的缓冲区。我还尝试使用SRID:25832转换坐标系,以米为单位表示缓冲区,但在postgresql视图中看不到投影到正确位置的点。SELECT*FROMpublic."opera......
  • 数据库介绍
    数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进......
  • PgSql - PostGIS 在 PostgreSQL 中使用
    首先来介绍一下PostGIS是什么?PostGIS是PostgreSQL对象关系数据库的一个空间数据库扩展。它增加了对地理对象的支持,允许在SQL中运行位置查询。官方介绍:PostGIS:SpatialandGeographicobjectsforPostgreSQLPostGISisaspatialdatabaseextenderforPostgreSQLobject......