01 SQL前言
无处不在的SQL
后续学习的铺垫
学到什么程度
黑马程序员MySQL知识精讲+mysql实战案例_零基础mysql数据库入门到高级全套教程_哔哩哔哩_bilibili
总结
02 数据库介绍
无处不在的数据库
数据库如何存储数据
数据库管理系统(数据库软件)
数据库和SQL的关系
总结
03 MySQL安装
下载地址:https://downloads.mysql.com/archives/installer
我个人更喜欢用Navicat:百度网盘 请输入提取码
配置环境变量
04 MySQL的入门使用(我这里使用Navicat进行演示)
在命令提示符内使用MySQL
这些命令行语句一样可以使用Navicat运行
-- show databases # 查看有哪些数据库
-- use mysql # 指定使用某个数据库
show tables # 查看数据库内有哪些表
使用图形化工具操作MySQL (如果安装了Navicat就不用管这个)
下载地址:https://dbeaver.io/download
DBeaver安装
DBeaver连接MySQL
05 SQL基础与DDL
SQL的概述
SQL语言的分类
SQL的语法特征
DDL - 库管理
DDL - 表管理
总结
06 SQL - DML
DML
数据插入 INSERT
演示:SQL的基本语句用法 搜索:INSERT
数据删除 DELETE
SQL的基本语句用法
演示: SQL的基本语句用法 搜索:DELETE
数据更新 UPDATE
演示: SQL的基本语句用法 搜索:UPDATE
总结
07 SQL - DQL
1)基础数据查询
演示: SQL的基本语句用法 搜索:SELECT
基础数据查询 - 过滤
演示: SQL的基本语句用法 搜索:WHERE
总结
2)分组聚合
分组聚合
演示
准备一个数据表,随便写点数据
-- 按照性别分组,并计算每组的平均值
SELECT gender as 姓别,avg(age) as 平均年龄 ,SUM(age) as 年龄的和,MIN(age) as 最小年龄,MAX(age) as 最大年龄,COUNT(id) as 行数(数量) FROM student GROUP BY gender
总结
3)排序分页
结果排序
演示
-- 按照年龄进行升序排序 (默认就是ASC升序排序)
-- SELECT * FROM student ORDER BY age ASC
-- 加限制条件,只排序年龄大于18的
-- SELECT * FROM student WHERE age > 18 ORDER BY age ASC
-- DESC 降序排序 ASC 升序排序
SELECT * FROM student WHERE age > 18 ORDER BY age DESC
结果分页限制
演示
-- limit ?,?' // ? 开始查询的索引 , ? 要查多少条数据
-- SELECT * FROM student WHERE age > 18 ORDER BY age LIMIT 3 # 年龄大于18的前3条数据
-- SELECT * FROM student ORDER BY age LIMIT 0,3 # 从第一条数据开始查3条数据
-- 查询年龄大于18 、按照年龄进行分组、按照年龄进行升序排序、只取前3条数据
SELECT * FROM student WHERE age > 18 GROUP BY age ORDER BY age LIMIT 3;
总结
08 Python 操作 MySQL
基础使用
pymysql
pip install pymysql
创建到MySQL的数据库链接
演示
"""
演示创建到MySQL的数据库链接
"""
from pymysql import Connect
# 获取到MySQL数据库的链接对象
conn =Connect(
host="localhost", # 主机名或ip地址
port=3306, # 端口,默认3306
user='root', # 账户名
password='207080' # 密码(这是我的账户名与密码要根据自己的实际情况改成自己的)
)
# 打印MySQL数据库软件信息
print(conn.get_server_info())
# 关闭到数据库的链接
conn.close()
执行SQL语句(查询、创建表)
演示
"""
演示创建到MySQL的数据库链接并执行SQL语句
"""
from pymysql import Connect
# 获取到MySQL数据库的链接对象
conn =Connect(
host="localhost", # 主机名或ip地址
port=3306, # 端口,默认3306
user='root', # 账户名
password='207080' # 密码(这是我的账户名与密码要根据自己的实际情况改成自己的)
)
# 打印MySQL数据库软件信息
print(conn.get_server_info())
# 获取游标对象
curses = conn.cursor()
# 先选择数据库
conn.select_db("my_db_01")
# 使用游标对象,执行SQL语句
curses.execute("SELECT gender as 姓别,avg(age) as 平均年龄 FROM student GROUP BY gender") # 按照性别分组,并计算每组的平均值
# 获取查询结结果,:tuple 类型注解标记这个results变量是个元组(不是强制性的,只看给我们开发者自己看的)
results:tuple = curses.fetchall()
print(results) # 元组内嵌套了元组,里面嵌套的每一个元组都是一行数据
for r in results:
print(f"性别:{r[0]},平均年龄:{r[1]}")
# 关闭到数据库的链接
conn.close()
总结
数据插入
commit提交
演示
"""
演示创建到MySQL的数据库链接并执行SQL语句
"""
from pymysql import Connect
# 获取到MySQL数据库的链接对象
conn =Connect(
host="localhost", # 主机名或ip地址
port=3306, # 端口,默认3306
user='root', # 账户名
password='207080' # 密码(这是我的账户名与密码要根据自己的实际情况改成自己的)
)
# 打印MySQL数据库软件信息
print(conn.get_server_info())
# 获取游标对象
curses = conn.cursor()
# 先选择数据库
conn.select_db("my_db_01")
# 使用游标对象,执行SQL语句
curses.execute("INSERT INTO student VALUES(6,'李银河','22','男')") # 插入数据
conn.commit() # 提交更改
# 关闭到数据库的链接
conn.close()
代码提交后到数据库中查看结果
自动commit
autocommit=True # 设置自动提交
总结
09 综合案例
案例需求
数据内容
DDL定义
实现步骤
演示
1)创建一个数据库- py_sql
2)创建数据表-orders
CREATE TABLE orders(
order_date DATE, # 存储日期字段
order_id VARCHAR(255), # 存储订单编号
money INT, # 销售金额
province VARCHAR(10) # 省份
);
3)基于面向对象的章节的案例代码(搜索:综合案例)基础上开始写SQL
将 main.py 替换成下面代码运行就能把数据存储到数据库了
from file_define import FileReader,TextFileReader,JsonFileReader # 从file_define文件中把刚才写好的类全部导入进来
from data_define import Record # 在data_define文件中把数据定义的类Record也导入进来
from pymysql import Connect
# 普通的文本文件
text_file_reader = TextFileReader("F:/案例数据/数据分析案例/2011年1月销售数据.txt") # 调用类创建类对象并把文件路径传给类的构造方法
# JSON文件
json_file_reader = JsonFileReader("F:/案例数据/数据分析案例/2011年2月销售数据JSON.txt")
# 有文件路径了,调用TextFileReader类的写(实现抽象方法)父类的方法read_data,返回格式处理后的数据
jan_data:list([Record]) = text_file_reader.read_data() # 一月的数据
feb_data:list([Record]) = json_file_reader.read_data() # 二月的数据
# 将2个月份的数据合并为1个list列表存储
all_data = jan_data + feb_data
# print(all_data)
# 获取到MySQL数据库的链接对象
conn =Connect(
host="localhost", # 主机名或ip地址
port=3306, # 端口,默认3306
user='root', # 账户名
password='207080', # 密码(这是我的账户名与密码要根据自己的实际情况改成自己的)
autocommit=True # 设置自动提交
)
# 打印MySQL数据库软件信息
print(conn.get_server_info())
# 获取游标对象
curses = conn.cursor()
# 先选择数据库
conn.select_db("py_sql")
for record in all_data: # 遍历all_data列表拿到每一个元素,然后添加到数据库
my_date = record.date # 日期
my_order_id = record.order_id # 订单id
my_money = record.money # 金额
my_province = record.province # 订单省份
sql = f"INSERT INTO orders \
VALUES('{my_date}','{my_order_id}','{my_money}','{my_province}')"
# 使用游标对象,执行SQL语句
# print(f"{my_date},{my_order_id},{my_money},{my_province}")
curses.execute(sql) # 插入数据
# 关闭到数据库的链接
conn.close()
查看数据库
练习
演示 - 在原来的main.py 文件的基础上改一下
from file_define import FileReader,TextFileReader,JsonFileReader # 从file_define文件中把刚才写好的类全部导入进来
from data_define import Record # 在data_define文件中把数据定义的类Record也导入进来
from pymysql import Connect
# 普通的文本文件
text_file_reader = TextFileReader("F:/案例数据/数据分析案例/2011年1月销售数据.txt") # 调用类创建类对象并把文件路径传给类的构造方法
# JSON文件
json_file_reader = JsonFileReader("F:/案例数据/数据分析案例/2011年2月销售数据JSON.txt")
# 有文件路径了,调用TextFileReader类的写(实现抽象方法)父类的方法read_data,返回格式处理后的数据
jan_data:list([Record]) = text_file_reader.read_data() # 一月的数据
feb_data:list([Record]) = json_file_reader.read_data() # 二月的数据
# 将2个月份的数据合并为1个list列表存储
all_data = jan_data + feb_data
# print(all_data)
# 获取到MySQL数据库的链接对象
conn =Connect(
host="localhost", # 主机名或ip地址
port=3306, # 端口,默认3306
user='root', # 账户名
password='207080', # 密码(这是我的账户名与密码要根据自己的实际情况改成自己的)
autocommit=True # 设置自动提交
)
# 打印MySQL数据库软件信息
print(conn.get_server_info())
# 获取游标对象
curses = conn.cursor()
# 先选择数据库
conn.select_db("py_sql")
# 插入数据到数据库
for record in all_data: # 遍历all_data列表拿到每一个元素,然后添加到数据库
my_date = record.date # 日期
my_order_id = record.order_id # 订单id
my_money = record.money # 金额
my_province = record.province # 订单省份
sql = f"INSERT INTO orders \
VALUES('{my_date}','{my_order_id}','{my_money}','{my_province}')"
# 使用游标对象,执行SQL语句
# print(f"{my_date},{my_order_id},{my_money},{my_province}")
# curses.execute(sql) # 插入数据
# 从数据库读取数据,报存在本地文件
f = open("F:/销售数据.txt", "a", encoding="UTF-8") # 定义文件的操作对象,a 如果文件存在就追加元素,不存在就创建
# 定义查询sql
sql = "SELECT * FROM orders"
# 使用游标对象,执行SQL语句
curses.execute(sql)
# 获取查询结结果,:tuple 类型注解标记这个results变量是个元组(不是强制性的,只看给我们开发者自己看的)
results:tuple = curses.fetchall()
# 遍历results元组把数据保存到本地文件
for i in results:
# 案例要求的数据格式是字典,这里把数据格式转换成字典:{'date:2011-02-28, order_id:7726afdc-c05e-4f4d-8f4d-376dc6d24522, money: 1920, province: 河南省'}
dict_item = {f"date:{i[0]}, order_id:{i[1]}, money: {i[2]}, province: {i[3]}"}
f.write(f'{dict_item}\n') # write() 文件写入,这个写入方法要求的数据格式是字符串, \n 让文件内容换行
f.close() # 关闭文件
# 关闭到数据库的链接
conn.close()