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 字段列表|* FROM 表 WHERE 条件判断;
# 查询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}"