MySQL数据库快速入门与Python连接实战:数据操作全面指南!
MySQL
前言
本文章主要是讲解怎么使用SQL命令以及怎么使用Python连接MySQL数据库,而不是在图形化的界面操作MySQL数据库
下载
点击进入官方下载地址
后续正在加快编写中…
验证是否安装成功
验证MySQL数据库是否安装成功有很多种方法,下面介绍其中的一种:
键盘上点击Win+R后,输入cmd
在弹出的黑窗口中输入:mysql –version 若安装成功则会显示对应的版本号,反之不会
数据库的操作
tip.该处讲解的是数据库的操作,而不是数据库表的操作,初学者一定要进行区分
在进行数据库操作之前需要先进入MySQL,命令如下(此命令有多种形式):
mysql -u用户名(一般为root)-p密码(自己设置的)
下面就可以在上述命令行中输入相关数据库命令了
(1)显示当前存在的所有数据库
命令:show databases;(注意命令的后面必须有一个分号 “;”)
(2)创建新的数据库
命令:create database 数据库名 charset=utf8; (charset=utf8表示指定编码格式)
(3)切换数据库(在进行SQL操作时要先切换至对应的数据库)
命令:use 数据库名;
(4)查看正在使用的数据库
命令:select database();
(5)删除数据库
命令:drop database 数据库名;
数据库表操作
(1)显示当前数据库中所有的表
命令:show tables;
(2)创建数据库表
命令1:create table 表名(
字段名 字段类型(不区分大小写)…,
xxx xxx,
…
);
命令2:create table if not exists 表名(
字段名 字段类型(不区分大小写)…,
xxx xxx,
…
);
示例
create table student(
student_id int auto_increment primary key, -- 学生ID,自增主键
first_name varchar(50) not null, -- 名字,不能为空
last_name varchar(50) not null, -- 姓氏,不能为空
gender enum('Male', 'Female'), -- 性别,枚举类型
date_of_birth date, -- 出生日期
email varchar(100) unique, -- 邮箱,唯一
phone_number varchar(15), -- 电话号码
address varchar(255), -- 地址
enrollment_date date default current_date, -- 入学日期,默认为当前日期
is_active boolean default true -- 是否在读,默认为true
);
(3)显示表结构
命令:desc 表名;
(4)删除表
命令:drop table 表名;
对数据库表中的数据进行增删改查(重要)
(1)增(insert)
插入单条数据
插入一条完整的学生记录
insert into students (
first_name, last_name, gender, date_of_birth, email, phone_number, address, enrollment_date, is_active
) values (
'John', 'Doe', 'Male', '2000-05-15', 'john.doe@example.com', '123-456-7890', '123 Main St, City, Country', '2023-09-01', TRUE
);
插入部分数据
如果某些字段有默认值或允许为空,可以只插入部分数据。
insert into students (
first_name, last_name, gender, date_of_birth, email
) values (
'Jane', 'Smith', 'Female', '2001-08-22', 'jane.smith@example.com'
);
插入多条数据
一次性插入多条学生记录
insert into students (
first_name, last_name, gender, date_of_birth, email, phone_number, address, enrollment_date, is_active
) values
('Alice', 'Johnson', 'Female', '1999-03-10', 'alice.j@example.com', '111-222-3333', '456 Elm St, City, Country', '2023-09-01', TRUE),
('Bob', 'Brown', 'Male', '2000-11-25', 'bob.brown@example.com', '444-555-6666', '789 Oak St, City, Country', '2023-09-01', TRUE),
('Charlie', 'Davis', 'Other', '2002-07-30', 'charlie.d@example.com', NULL, NULL, '2023-09-01', FALSE);
插入查询结果
可以从其他表(temp_students)中查询出数据并插入到 students 表中
insert into students (
first_name, last_name, gender, date_of_birth, email, phone_number, address
)
select
first_name, last_name, gender, date_of_birth, email, phone_number, address
from
temp_students;
(2)删(delete)
删除所有数据
删除 students 表中的所有数据,但保留表结构(自增字段也不会重置)
delete from students;
删除特定条件的数据
delete form students where students_id = 1;
删除多条数据
可以通过 where 子句结合逻辑运算符(如 and、or)删除多条数据
delete from students where last_name = 'Smith' and gender = 'Female';
清空表并重置自增主键
如果需要清空表并重置自增主键(如 student_id),可以使用 truncate table 语句,但值得注意的是该语句不能加where条件
truncate table students;
(3)改(update)
修改单条数据
update students
set email = ‘new.email@example.com’
where students_id = 1;
修改多个字段
可以同时修改同一行多个字段的值
update students
set last_name = 'Johnson',phone_number = '999-888-7777'
where students_id = 2;
修改多条数据
可以修改不同行的单个(或多个)字段的值
update students
set is_active = true
where gender = 'Female' and is_active = false;
修改所有数据
可以修改students表中所有行某个(或多个)字段的值
update students
set enrollment_date = '2023-10-01';
使用表达式修改数据
可以在 set 子句中使用表达式来修改数据
update students
set salary = salary * 1.10;
修改数据时使用子查询
update students
set email = 'john.doe@example.com'
where last_name = (
select last_name from students where student_id = 1
);
(4)查(select)
查询所有数据
select * from students;
查询特定字段
select first_name,last_name from students;
查询带条件的数据
# 查询 student_id 为 1 的学生
select * from students where student_id = 1;
# 查询出生日期在 2000 年之后的学生
select * from students where date_of_birth > '2000-01-01';
查询并排序
使用 order by 子句对查询结果进行排序(asc:升序,desc:降序)
# 按 first_name 升序排序
select *
from students
order by first_name asc;
# 按 date_of_birth 降序排序
select *
from students
order by date_of_birth dasc;
查询并限制结果数量
使用 limit 子句限制查询结果的数量
# 查询前 5 条记录
select * from students limit 5;
# 从第 6 条记录开始查询 5 条记录(分页查询)
select * from students limit 5 offset 5;
查询去重数据
使用 distinct 关键字去除重复数据。
# 查询所有不重复的姓氏
select distinct last_name from students;
查询并分组
使用 group by 子句对查询结果进行分组
# 按性别分组并统计每组的人数
select gender, count(*) as count
from students
group by gender;
查询并过滤分组结果
使用 having 子句对分组结果进行过滤
# 查询人数大于 1 的性别分组
select gender, count(*) as count
from students
group by gender
having count > 1;
查询并使用聚合函数
使用聚合函数(如 count、sum、avg、min、max)进行统计查询
# 查询学生的平均薪水
select avg(salary) as avg_salary
from students
# 查询学生的总人数
select count(*) as total_students
from students
查询并连接表
如果存在关联表,可以使用 join (内连接和外连接)进行连接查询
# 假设有一个 courses 表,查询学生及其选修的课程
select s.first_name,s.last_name,c.course_name
from students s
join courses c
on s.student_id = c.student_id
查询并使用别名
为表或字段设置别名,使查询结果更易读
select first_name as name, last_name as surname from students;
查询并组合结果
使用 union 或 union all 组合多个查询结果
# 查询姓氏为 Doe 或 Smith 的学生
select * from students where last_name = 'Doe'
union
select * from students where last_name = 'Smith';
Python和MySQL交互
下载pymysql模块
pip install pymysql
连接数据库
import pymysql
# 数据库配置项
try:
db_config = {
'host':'localhost', # 主机地址
'port':3306, # 端口号
'user':'root', # 用户名
'password':'12345678', # 密码
'db':'mysql_name', # 需要连接的数据库名
'charset':'utf8mb4', # 字符集(可选)
'cursorclass': pymysql.cursors.DictCursor # 返回字典格式的结果(可选)
}
# 建立连接对象
conn = pymysql.connect(**db_config) # ** 是用于解包字典的操作符
print("数据库连接成功!")
except pymysql.Error as err:
print(f"数据库连接失败: {err}")
创建游标(cursor)
在进行表的操作或者是数据的增删改查时都需要先创建游标,通过游标去实现
# 创建游标
cursor = conn.cursor()
创建表(table)
# 创建表的SQL语句
create_table_query = """
create table if not exists students (
student_id int auto_increment primary key,
first_name varchar(50) not null,
last_name varchar(50) not null,
gender enum('Male', 'Female', 'Other'),
date_of_birth date,
email varchar(100) unique,
phone_number varchar(15),
address varchar(255),
enrollment_date date default current_date,
is_active boolean default true
)
"""
# 通过游标corsor来创建表
try:
cursor.execute(create_table_query)
print("表创建成功!")
except pymysql.Error as err:
print(f"表创建失败: {err}")
增删改查
增(insert)
# 插入单条数据
insert_query = """
insert into students (first_name, last_name, gender, date_of_birth, email)
values (%s, %s, %s, %s, %s)
"""
data = ('John', 'Doe', 'Male', '2000-05-15', 'john.doe@example.com')
try:
cursor.execute(insert_query, data)
conn.commit() # 提交事务
print("数据插入成功!")
except pymysql.Error as err:
print(f"数据插入失败: {err}")
# 插入多条数据
insert_many_query = """
insert into students (first_name, last_name, gender, date_of_birth, email)
values (%s, %s, %s, %s, %s)
"""
data_many = [
('Jane', 'Smith', 'Female', '2001-08-22', 'jane.smith@example.com'),
('Alice', 'Johnson', 'Female', '1999-03-10', 'alice.j@example.com')
]
try:
cursor.executemany(insert_many_query, data_many)
conn.commit()
print("多条数据插入成功!")
except pymysql.Error as err:
print(f"多条数据插入失败: {err}")
删(delete)
# 删除数据
delete_query = "delete from students where student_id = %s"
data = (1,) # 删除 student_id 为 1 的记录
try:
cursor.execute(delete_query, data)
conn.commit()
print("数据删除成功!")
except pymysql.Error as err:
print(f"数据删除失败: {err}")
改(update)
# 更新数据
update_query = """
update students
set email = %s
where student_id = %s
"""
data = ('new.email@example.com', 1) # 将 student_id 为 1 的邮箱更新
try:
cursor.execute(update_query, data)
conn.commit()
print("数据更新成功!")
except pymysql.Error as err:
print(f"数据更新失败: {err}")
查(select)
# 查询所有数据
select_query = "select * from students"
try:
cursor.execute(select_query)
rows = cursor.fetchall() # 获取所有结果,是该查询结果的数据行数(即有多少条数据)
for row in rows:
print(row)
except pymysql.Error as err:
print(f"数据查询失败: {err}")
关闭数据库连接(释放连接)
# 关闭游标和连接
cursor.close()
conn.close()
print("数据库连接已关闭!")
作者:泡一杯爪哇岛的咖啡