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("数据库连接已关闭!")

作者:泡一杯爪哇岛的咖啡

物联沃分享整理
物联沃-IOTWORD物联网 » MySQL数据库快速入门与Python连接实战:数据操作全面指南!

发表回复