Python学习第十一章(SQL基础)

1、数据库

(1)定义:数据存储的库,可以组织数据并存储数据。

(2)数据库组织数据:

按照:库->表->数据 三个层级进行组织

(3)数据库和SQL关系

数据库(软件)提供数据组织存储的能力,SQL语句则是操作数据、数据库的工具语言。

2、MySQL入门

(1)在命令提示符内使用MySQL

打开:命令提示符,输入:mysql -uroot -p,然后回车后输入密码。

基础命令(SQL语言):

show databases;  (不能少;以及s) 查看有哪些数据库

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

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

exit;  退出MySQL的命令行环境

(2)SQL语言基于功能,可划分为4类:

·数据定义:DDL(Data Definition Language)

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

·数据操纵:DML  (Data Manipulation Language)

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

·数据控制:DCL  (Data Control Language)

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

·数据查询:DQL  (Data Query Language)

        ·基于需求查询和计算数据

(3)SQL的语法特征

·SQL语言,大小写不敏感

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

·SQL支持注释:

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

        ·单行注释:# 注释内容

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

3、DDL

(1)库管理

·查看数据库:

        SHOW DATABASES;

·使用数据库:

        USE 数据库名称;

·创建数据库:

        CREATE DATABASE 数据库名称  [CHARSET UTF8];(中括号表示可写可不写,但尽量写)

·删除数据库:

        DROP DATABASE 数据库名称;

·查看当前使用的数据库:

        SELECT DATABASE();

  (2)表管理

·查看有哪些表:

        SHOW TABLES;    注意:需要先选择数据库 

·创建表:

        CREATE TABLE 表名称(

                        列名称  列类型,

                        列名称  列类型,

                        ······

        );

--列类型有

int --整数

float --浮点数

varchar(长度) --文本,长度为数字,做最大长度限制

timestamp --时间戳类型

4.DML(数据操作语言)

用于对数据库中表的数据记录进行更新。

(1)数据插入INSERT

基础语法:

INSERT INTO 表 (列1,列2,········,列N)    VALUES(值1,值2,·····值N),(值1,值2,····值N),······,(值1,值2,·······,值N);

insert into student (id,name,age) values(1,'john',15),(2,'jimin',26)

注意:字符串的值,出现在SQL中,必须要用单引号包围起来。

(2)数据删除DELETE

基础语法:

DELETE FROM 表名称 WHERE 条件判断;

delete from student where id=1;

条件判断:列 操作符 值

操作符:= > < <= >= !=等

注意:如果不带WHERE 条件判断这后半句,那么会使得表的整个数据都删除了。

(3)数据更新 UPDATE

基础语法:

UPDATE 表名 SET 列=值 WHERE 条件判断;

update student set name='john',where id =1;

注意:如果不带WHERE 条件判断这后半句,那么会使得表的整个数据都更新了。

5、DQL

(1)基础数据查询

基础语法:

SELECT 字段列表|*  FROM

含义:从(FROM)表中,选择(SELECT)某些列进行展示,*表示所有列

select id,name,age from student;

基础数据查询--过滤

查询可带有指定条件,语法:

SELECT 字段列表|* FROMWHERE 条件判断;

# 查询id,name两个列,age<20
select id,name from student where age<20;
# 查询所有列,id=2
select id name,age from student where id=2;

(2)分组聚合

基础语法:

SELECT 字段|聚合函数 FROM WHERE 条件 GROUP BY

聚合函数有:(可出现多个聚合函数)

-SUM(列)求和

-AVG(列)求平均值

-MIN(列)求最小值

-MAX(列)求最大值

-COUNT(列|*)求数量

select gender,avg(age) from student group by gender;
# 得到两个数据(男生与女生的平均年龄)

注意:

GROUP BY 出现哪个列,哪个列才能出现在SELECT中的非聚合中。

                SELECT id,name,avg(age) from student group by name;

(3)排序分页

·结果排序

可以对查询的结果,使用ORDER BY 关键字,指定某个列进行排序。

基础语法:

SELECT 列|聚合函数|*  FROM 表  

WHERE ···  

GROUP BY···  

ORDER BY···[ASC (升序默认)|DESC(降序)]

ORDER BY  列 :排序规则

select * from student where age>21 order by age asc;

·结果分页限制

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

SELECT 列|聚合函数|* FROM

WHERE ···

GROUP BY···

ORDER BY···[ASC|DESC]

LIMIT n[,m]

select * from student limit 5;

结果:数据只输出5条

select * from student limit 10,5;
结果:从第10条开始,向后取5条
select age count(*) from student where age>20 group by age;

可以得知不同年龄的人有多少人。

select age count(*) from student where age>28 group by age order by age limit 3;

注意:

·WHERE、GROUP BY、ORDER BY、LIMIT均可按需求省略

·SELECT和FROM是必须写的

·执行顺序

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

6、Python&MySQL

(1)创建到MySQL的数据库链接

·from pymysql import Connection 导包

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

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

(注意:在运行前,需要cmd->登录打开数据库,不然会报错)

from pymysql import Connection
# 构建数据库连接
con = Connection(
    host = "localhost",  # 主机名
    port = 3306,         # 端口
    user = "root",       # 账户
    password = "mima"  # 密码
)
# 打印MySQL数据库软件信息
print(con.get_server_info())
# 关闭数据库的链接
con.close()

(2)演示、执行非查询性质的SQL语句:

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

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

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

注意:在代码运行前,需要先创建一个数据库‘test’。

from pymysql import Connection
# 构建数据库连接
con = Connection(
    host = "localhost",  # 主机名
    port = 3306,         # 端口
    user = "root",       # 账户
    password = "mima"  # 密码
)
print(con.get_server_info())
# 获取游标对象
cursor = con.cursor()
con.select_db("test")     #选择数据库
# 使用游标对象,执行sql语句
cursor.execute("CREATE TABLE test_pymysql(id INT,info VARCHAR(255))")

# 关闭链接
con.close()

结果:成功建立一个表。

执行查询性质的SQL语句:

from pymysql import Connection
# 构建数据库连接
con = Connection(
    host = "localhost",  # 主机名
    port = 3306,         # 端口
    user = "root",       # 账户
    password = "mima"  # 密码
)
print(con.get_server_info())
# 获取游标对象
cursor = con.cursor()
con.select_db("test")     #选择数据库
# 使用游标对象,执行sql语句
cursor.execute("select * from student")
# 获取查询结果
result = cursor.fetchall()
for r in result:
    print(r)

# 关闭链接
con.close()

(3)数据插入

1)commit提交

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

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

from pymysql import Connection
# 构建数据库连接
con = Connection(
    host = "localhost",  # 主机名
    port = 3306,         # 端口
    user = "root",       # 账户
    password = "mima"  # 密码
)
print(con.get_server_info())
# 获取游标对象
cursor = con.cursor()
con.select_db("test")     #选择数据库
# 使用游标对象,执行sql语句
cursor.execute("insert into student values(1,'tom',12)")
# 通过commit()确认
con.commit()
# 关闭链接
con.close()

2)自动提交

如不想手动commit确认,可以在构建链接对象时候,设置自动commit属性,即可自动提交无需手动commit了。

# 构建数据库连接
con = Connection(
    host = "localhost",  # 主机名
    port = 3306,         # 端口
    user = "root",       # 账户
    password = "mima",  # 密码
    autocommit = True    # 自动提交
)

(4)综合案例

使用Python语言,写入Mysql功能。

main.py:

from file_def import TextFileReader, JsonFileReader
from data_def 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()
feb_data:list[Record] = json_file_reader.read_data()

all_data: list[Record] = jan_data + feb_data

con = Connection(
    host="localhost",
    port=3306,
    user="root",
    password="123456",
    autocommit=True,
)

cursor = con.cursor()
con.select_db("py_sql")
for record in all_data:
    sql =f"insert into orders(order_date, order_id, money, province)"\
         f"values('{record.date}', '{record.order_id}',{record.money},'{record.province}')"
    # 执行SQL语句
    cursor.execute(sql)
con.close()

file_def.py:

import json

from data_def import Record


# 文件相关类定义
class FileReader:
    def read_data(self) -> list[Record]:
        # 读取文件数据,读到数据都转换为Record对象,再封装到list内
        pass

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] = []
        for line in f.readlines():
            line = line.strip()   # 去掉每行的\n
            data_list = line.split(",")
            record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])
            record_list.append(record)
        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)
            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 i in list1:
        print(i)

    for i in list2:
        print(i)


data_def.py:

class Record:

    def __init__(self, date, order_id, money, province):
        self.date = date
        self.order_id = order_id
        self.money = money
        self.province = province

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值