Python二阶段第二章(python+mysql)

SQL入门和实战

无处不在的SQL

不管是何种开发语言,亦或是何种开发方向,SQL都是开发人员无法绕开的话题。

除了一门趁手的编程语言外,SOL语言也是开发人员人人必备的开发技能。

数据库介绍

无处不在的数据库

信息化社会,无处不在的就是数据。

数据库如何存储数据

我们先来看看,生活中,如何以Excel组织数据的存储

我们在来看看,数据库是如何组织数据的。

数据库管理系统(数据库软件)

那么如何实现这种数据库形式的数据管理呢?我们需要借助:数据库管理系统,也就是常说的数据库软件数据库软件是非常多的,常见的有:

数据库和SQL的关系

数据库是用来存储数据的,在这个过程中,会涉及到:

数据的新增

数据的删除

数据的修改

数据的查询

数据库、数据表的管理

等等

而SQL语言,就是一种对数据库、数据进行操作、管理、查询的工具

使用数据库软件去获得库->表->数据,这种数据组织、存储的能力

并借助SQL语言,完成对数据的增删改查等操作

MySQL的安装

MySQL的版本

针对不同的用户,MySQL分为两种不同的版本:

免费:

MysQL Community Server

社区版本,免费,但是Mysql不提供官方技术支持。

MysQL Cluster

集群版,开源免费,可将几个MySQL Server封装成一个Server。

收费:

MySQL Enterprise Edition

商业版,该版本是收费版本,可以试用30天,官方提供技术支持

MySQL Cluster CGE

高级集群版,需付费。

记得添加环境变量,从c盘的progrom file找mysql一直往下找到bin,复制路径到我的电脑里的属性的高级选项

点击path内部,新建然后粘贴刚才的那段路径即可

 

MySQL的入门使用

在MySQL的命令行环境下,可以通过:

show databases;查看有哪些数据库

use数据库名使用某个数据库

show tables 查看数据库内有哪些表

exit 退出MySQL的命令行环境

等基础命令

使用图形化工具操作MySQL

使用命令提示符进行MySQL的操作,不是太方便,一般开发者都会使用第三方的图形化工具进行使用可用于MySOL的图形化工具非常多,课程使用跨平台、开源、免费的图形化工具:DBeaver

下载地址: Download | DBeaver Community

我们选择免费的社区版 (DBeaver Community)选择适用自己电脑系统的安装包下载即可。

 

 

 

SQL的概述

SQL全称: Structured QueryLanguage,结构化查询语言,用于访问和处理数据库的标准的计算机语言

SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统SystemR上实现。

经过多年发展,SOL以成为数据库领域统一的数据操作标准语言,可以说几乎市面上所有的数据库系统都支持使用SQL语言来操作

简单来说,SQL语言就是操作数据库的专用工具。

SQL语言的分类

由于数据库管理系统(数据库软件)功能非常多,不仅仅是存储数据,还要包含:数据的管理、表的管理、库的管理账户管理、权限管理等等。

所以,操作数据库的SQL语言,也基于功能,可以划分为4类:

数据定义:DDL(Data Definition Language)

库的创建删除、表的创建制除等

数据操纵:DML (Data Manipulation Language)

新增数据、删除数据、修改数据等

数据控制: DCL(Data ControlLanquage)

新增用户、删除用户、密码修改、权限管理等.

数据查询: DQL(Data Query Language)

基于需求查询和计算数据

SQL的语法特征

在学习DDL、DQL等之前,我们先来了解SQL的语法特征

SQL语言,大小写不敏感(大写的SHOW 返回也是一样的东西)

SQL可以单行或多行书写,最后以;号结束

SQL支持注释:

单行注释:-- 注释内容(--后面一定要有一个空格)

单行注释:# 注释内容(# 后面可以不加空格,推荐加上)

多行注释:/*注释内容 */

DDL-库管理

查看数据库

SHOW DATABASES;

使用数据库

USE 数据库名称;

创建数据库

CREATE DATABASE 数据库名称 [CHARSET UTF8];

删除数据库

DROP DATABASE 数据库名称;

查看当前使用的数据库

SELECT DATABASEO;

图形化在使用的时候,也可以通过图形化来操作创建

SQL - DDL

 

创建表格

总结:

SQL语言是什么?有什么作用?

SQL:结构化查询语言,用于操作数据库,通用于绝大多数的数据库软

SQL的特征

大小写不敏感

需以;号结尾

支持单行、多行注释

SQL语言的分类

DDL数据定义

DML数据操作

DCL数据控制

DQL数据查询

SQL - DML

DML是指数据操作语言,英文全称是Data Manipulation Language,用来对数据库中表的数据记录进行更新

关键字:

插入INSERT

 

 

create database test;

show databases;

drop database test;

use world;

show tables;

create table student(

id int,

name varchar(10),

age int

);

#drop table student ;

insert into student(id) values (1),(2),(3);

select * from world.student;

insert into student(id,name,age) values(4,'奥特曼',21);

insert into student(id,name,age) values(5,'卫宫士郎',41);

 

删除DELETE

 

 

更新UPDATE

总结:

SQL - DQL

基础数据查询

基础数据查询-过滤

分组聚合

分组聚合应用场景非常多,如:统计班级中,男生和女生的人数这种需求就需要:

按性别分组

统计每个组的人数

这就称之为:分组聚合

条件限制:

总结:

结果排序

结果分页限制

同样,可以使用LIMIT关键字,对查询结果进行数量限制或分页显示,语法:

 

 

单纯limit后面只有数字的话,意思为单纯取多少数据。

关键字(order;where;group by都是有顺序的)

SFLECT 列|聚合的数FROM 表 WHERE ...GROUP BY  ...  LIMIT n[,m] ....ORDER BY ... [ASC I DESC]

总结:

截止到目前学习到的关键字,需注意

WHERE、GROUP BY、ORDER BY、LIMIT均可按需求省略,SELECT和FROM 是必写的

执行顺序:

FROM ->WHERE->GROUP BY和聚合函数->SELECT->ORDER BY->LIMIT

Python & MySQL

掌握Python执行SQL语句操作MySQL数据库软件

pymysql

除了使用图形化工具以外,我们也可以使用编程语言来执行SQL从而操作数据库。

在Python中,使用第三方库:pymysql来完成对MySQL数据库的操作。

创建到MySQL的数据库链接

返回版本号

# 演示Python pymysql库的装础操作

from pymysql import Connection

# 构建到mysql数据库的链接

conn = Connection(
    host="localhost", #主机名
    port = 3306, #端口
    user="root", #用户
    password="123456"  #密码
)


# print(conn.get_server_info()) #测试是否可以连入mysql
#执行非查询询性质SQL



#执行查询性质SQL


#关闭链接

conn.close()

执行SQL语句

#如果要在python中去操作数据库需要先构造一个游标对象

 

# 演示Python pymysql库的装础操作

from pymysql import Connection

# 构建到mysql数据库的链接

conn = Connection(
    host="localhost", #主机名
    port = 3306, #端口
    user="root", #用户
    password="123456"  #密码
)


# print(conn.get_server_info()) #测试是否可以连入mysql
#执行非查询询性质SQL
#如果要在python中去操作数据库需要先构造一个游标对象
cursor = conn.cursor()

#创建一个表
cursor.execute("create database test;")
conn.select_db("test") #选择数据库的操作 类似数据库中的use test;
#开始表的操作(创建)
cursor.execute("create table test_pymysql(id int); ")
#执行查询性质SQL


#关闭链接

conn.close()

执行查询性质的SQL语句:

# 演示Python pymysql库的装础操作

from pymysql import Connection

# 构建到mysql数据库的链接

conn = Connection(
    host="localhost", #主机名
    port = 3306, #端口
    user="root", #用户
    password="123456"  #密码
)


# print(conn.get_server_info()) #测试是否可以连入mysql
#执行非查询询性质SQL
#如果要在python中去操作数据库需要先构造一个游标对象
cursor = conn.cursor()
#创建一个表
# cursor.execute("create database test;")
conn.select_db("world") #选择数据库的操作 类似数据库中的use test;
#开始表的操作(创建)
# cursor.execute("create table test_pymysql(id int); ")
#执行查询性质SQL
cursor.execute("select * from student")
result = cursor.fetchall()
print(type(result))
for r in result:
    print(r)

#关闭链接

conn.close()

总结:

Python中使用什么第三方库来操作MySQL?如何安装?

使用第三方库为:pymysql

安装:pip install pymysql

如何获取链接对象?

from pymysql import Connection 导包

Connection(主机,端口,账户,密码)即可得到链接对象

链接对象.close()关闭和MySQL数据库的连接

如何执行SQL查询

通过连接对象调用cursor()方法,得到游标对象

游标对象.execute()执行SQL语句

游标对象.fetchall)得到全部的查询结果封装入元组内

commit提交

如图所示代码,经过执行是无法将数据插入到数据表student中的

这是为什么呢?

pymysql在执行数据插入或其它产生数据更改的SQL语句默认是需要提交更改的,即,需要通过代码“确认”这种更改行为。

通过链接对象.commit()即可确认此行为。

# 演示Python pymysql库的装础操作

from pymysql import Connection

# 构建到mysql数据库的链接

conn = Connection(
    host="localhost", #主机名
    port = 3306, #端口
    user="root", #用户
    password="123456"  #密码
)


# print(conn.get_server_info()) #测试是否可以连入mysql
#执行非查询询性质SQL
#如果要在python中去操作数据库需要先构造一个游标对象
cursor = conn.cursor()
#创建一个表
# cursor.execute("create database test;")
conn.select_db("world") #选择数据库的操作 类似数据库中的use test;
#开始表的操作(创建)
# cursor.execute("create table test_pymysql(id int); ")
#执行查询性质SQL
cursor.execute("insert into student values(10001,'卫宫士郎','22','男')")
#通过commit去确认要插入的内容才可以
conn.commit()

#关闭链接

conn.close()

如果没有commit是不能插入数据到数据库的;

自动commit

如果不想手动commit确认,可以在构建链接对象的时候,设置自动commit的属性。

# 演示Python pymysql库的装础操作

from pymysql import Connection

# 构建到mysql数据库的链接

conn = Connection(
    host="localhost", #主机名
    port = 3306, #端口
    user="root", #用户
    password="123456",  #密码
    autocommit = True #自动提交
)


# print(conn.get_server_info()) #测试是否可以连入mysql
#执行非查询询性质SQL
#如果要在python中去操作数据库需要先构造一个游标对象
cursor = conn.cursor()
#创建一个表
# cursor.execute("create database test;")
conn.select_db("world") #选择数据库的操作 类似数据库中的use test;
#开始表的操作(创建)
# cursor.execute("create table test_pymysql(id int); ")
#执行查询性质SQL
cursor.execute("insert into student values(10002,'远坂凛','22','女')")
#通过commit去确认要插入的内容才可以
# conn.commit()

#关闭链接

conn.close()

总结:

什么是commit提交?

pymysql库在执行对数据库有修改操作的行为时,是需要通过链接对象的commit成员方法来进行确认的。

只有确认的修改,才能生效。

如何自动提交呢?

上面有案例

综合案例

将此前的两个销售数据,通过python写入数据库

DDL定义

本次需求开发我们需要新建一个数据库来使用,数据库名称:py_sql

基于数据结构,可以得到建表语句:

实现步骤

create database py_sql ;

use py_sql;

CREATE TABLE orders(

order_date DATE,

order_id VARCHAR(255),

money INT,

province VARCHAR(10)

);

数据处理

"""
2. 设计一个抽象类,定义文件读服的相关功能,并使用子类实现具体功能
(为什么使用抽象类,因为有两个文本,但是文本不一样,一个csv一个json,那么就先定义一个标准父类做空实现只定义功能,具体再构造两个文本的子类)
"""
import json

#定义一个抽线类,做顶层设计,确定功能
from data_define import Record
class FileReader:

    def read_data(self) -> list[Record]: #这里如果不导包的话会报错,因为这里没有record的类
            #读文件的数据,读到的每一条数都转换为Record对象(Record层面已经使用了构造方法,直接成为了对象),将它们都封装ist内返回即可
            pass

#开始第一个子类,csv文本类
class TextFileReader(FileReader):

    def __init__(self,path):
        self.path = path #定义成员变量记录文件的路径

    #实现复写,也就是具体子类做事
    def read_data(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF-8")
        record_list:list[Record] = [] #搞一个新的列表,从txt文件内取到的值直接append到这里来
        for line in f.readlines():
            line = line.strip() #消除读到的每一行的 换行符
            data_list = line = line.split(',') #以逗号隔开
            #构建类对象,根据下标,传入4个参数
            record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])
            record_list.append(record)  #封装到了list里面

        f.close()
        return record_list

class JsonFileReader(FileReader):

    def __init__(self,path):
        self.path = path #定义成员变量记录文件的路径

    #实现复写,也就是具体子类做事
    def read_data(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF-8")
        record_list:list[Record] = []
        for line in f.readlines():
            data_dict = json.loads(line)  #json文件直接loads成为字典对象
            record = Record(data_dict['date'],data_dict['order_id'],int(data_dict['money']),data_dict['province'])
            record_list.append(record)

        f.close()
        return record_list





if __name__=='__main__':
    text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")
    json_file_reader=JsonFileReader("D:/2011年2月销售数据JSON.txt")
    list1 = text_file_reader.read_data()
    list2 = json_file_reader.read_data()

    for l in list1:
        print(l)
    for l in list2:
        print(l)

"""
数据定义的类
1. 设计一个类,可以完成数据的封奖
"""
class Record:
    #定义成员变量,看了一下文件有四列,所以我们定制4个成员变量,两种方法
    # date = None
    # order_id = None
    # money = None
    # province = None

    #第二种方法:构造方法!这个可以直接可以取值,推荐使用这个
    def __init__(self,date,order_id,money,province):
        self.date = date #订单日期
        self.order_id = order_id #订单id
        self.money = money #金额
        self.province = province #省份

    def __str__(self):
        return f"{self.date},{self.order_id},{self.money},{self.province}"

构建sql

"""
面向对象,数据分析案例,主业务逻辑代码
实现步骤:
1. 设计一个类,可以完成数据的封奖
2. 设计一个抽象类,定义文件读服的相关功能,并使用子类实现具体功能
(为什么使用抽象类,因为有两个文本,但是文本不一样,一个csv一个json,那么就先定义一个标准父类做空实现只定义功能,具体再构造两个文本的子类)
3.读取文件,生产数据对象
4. 进行数据需求的逻耕计第《计算每一天的销售额)
5,数据库综合案例
"""


#3.读取文件,生产数据对象
#导入之前所有的包
from file_define import FileReader,TextFileReader,JsonFileReader
from  data_define import Record
from pymysql import Connection
#生成数据对象
text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")
json_file_reader=JsonFileReader("D:/2011年2月销售数据JSON.txt")

jan_data :list[Record]= text_file_reader.read_data() #1月份的数据
feb_data :list[Record] = json_file_reader.read_data() #2月的数据

#现将两个月份的数据合并为一个list
all_data:list[Record] = jan_data + feb_data

#构建mysql链接对象
conn = Connection(
    host="localhost", #主机名
    port = 3306, #端口
    user="root", #用户
    password="123456",  #密码
    autocommit = True #自动提交
)
#创建游标对象
cursor = conn.cursor()
#选择数据库
conn.select_db("py_sql")
#组织sql语句
#注意在sql中字符串需要加单引号,但是数字可以不需要
for record in all_data:
    sql = f"insert into orders " \
          f"values('{record.date}','{record.order_id}',{record.money},'{record.province}')"
    #执行sql语句
    cursor.execute(sql)
#关闭sql对象
conn.close()

结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵唯一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值