第38课:Python|数据库基础【MySQL安装配置与SQL语句零基础入门】

在这里插入图片描述


📖 开篇导读

在之前的课程中,我们学习了文件操作、JSON、CSV等数据持久化方式。但这些方式在处理大量结构化数据、复杂查询、多用户并发时显得力不从心。例如,你想要从一万条记录中快速找出年龄大于18岁的用户,并按照分数排序——如果使用文件操作,需要手动遍历、比较、排序,代码复杂且效率低下。

这时,就需要关系型数据库。数据库是专门用来存储和管理数据的软件,它提供了高效的数据检索、更新、并发控制、事务等功能。MySQL是世界上最流行的开源关系型数据库之一,被广泛应用于Web开发、数据分析、企业应用等领域。

💡 工作场景

  • Web应用:用户信息、商品订单、博客文章等核心数据都存储在数据库中。
  • 数据分析:从数据库中提取数据,进行统计和报表生成。
  • 数据仓库:作为数据存储中心,供BI工具使用。

本课是数据库的入门课,我们将学习:

  • 数据库的基本概念(表、行、列、主键、外键)
  • MySQL的安装与配置(Windows和Mac)
  • SQL语言基础:DDL(创建表、修改表)、DML(增删改)、DQL(查询)
  • 使用命令行客户端操作MySQL
  • 常用数据类型和约束

学完本课,你将能够独立安装MySQL,并使用SQL语句对数据库进行增删改查操作,为后续Python操作数据库打下坚实基础。


🎯 学习目标

目标编号具体掌握内容对应面试/工作价值
1️⃣理解关系型数据库的基本概念(数据库、表、行、列、主键、外键)面试基础
2️⃣完成MySQL的安装和环境配置(Windows/macOS)环境搭建能力
3️⃣掌握SQL语言的基础语法:DDL(CREATE、ALTER、DROP)和DML(INSERT、UPDATE、DELETE)数据定义与操作
4️⃣熟练掌握查询语句SELECT,包括条件、排序、分组、聚合函数数据查询核心
5️⃣理解数据类型约束(主键、非空、唯一、默认值)表结构设计
6️⃣能够使用MySQL命令行客户端或图形化工具(如Navicat)执行SQL日常开发必备

🔥 面试考点:“什么是主键?”“SQL中WHERE和HAVING的区别?”“INNER JOIN和LEFT JOIN的区别?”“如何设计数据库表?”


📚 知识点理论精讲

一、数据库基本概念

1.1 什么是数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。它提供了数据持久化、高效检索、安全控制、并发访问等功能。

1.2 关系型数据库

关系型数据库(RDBMS)使用(Table)来存储数据,表之间通过关系(如外键)连接。常用的关系型数据库有:MySQL、PostgreSQL、Oracle、SQL Server。

1.3 核心术语

术语含义类比
数据库(Database)数据的容器一个Excel文件
表(Table)特定类型数据的集合Excel中的一个Sheet
行(Row)表中的一条记录表格中的一行
列(Column)表的一个字段表格中的一列
主键(Primary Key)唯一标识每一行的列身份证号
外键(Foreign Key)关联其他表的列学生表的班级ID指向班级表

1.4 SQL语言

SQL(Structured Query Language)是操作关系型数据库的标准语言,分为三类:

  • DDL(Data Definition Language):定义数据结构,如CREATEALTERDROP
  • DML(Data Manipulation Language):操作数据,如INSERTUPDATEDELETE
  • DQL(Data Query Language):查询数据,如SELECT

二、MySQL安装与配置

2.1 Windows安装

  1. 从官网下载MySQL Community Server Installer(https://dev.mysql.com/downloads/mysql/)
  2. 运行安装程序,选择“Developer Default”
  3. 设置root密码(务必记住)
  4. 选择“MySQL Server”、“MySQL Workbench”等组件
  5. 完成后,配置环境变量:将C:\Program Files\MySQL\MySQL Server 8.0\bin添加到系统PATH

2.2 macOS安装

# 使用Homebrew安装
brew install mysql

# 启动服务
brew services start mysql

# 运行安全脚本(设置root密码)
mysql_secure_installation

2.3 验证安装

打开命令行(cmd或terminal),输入:

mysql -u root -p

输入密码后进入MySQL命令行,显示mysql>提示符。

2.4 图形化工具推荐

  • MySQL Workbench:官方工具,功能全面。
  • Navicat for MySQL:商业软件,界面友好。
  • DBeaver:开源通用数据库工具。

三、基础SQL语句

3.1 数据库操作

-- 查看所有数据库
SHOW DATABASES;

-- 创建数据库
CREATE DATABASE school;

-- 使用数据库
USE school;

-- 删除数据库(慎用)
DROP DATABASE school;

3.2 表操作

创建表
CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT,
    grade VARCHAR(20),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
查看表结构
DESC students;
SHOW CREATE TABLE students;
修改表
-- 添加列
ALTER TABLE students ADD COLUMN email VARCHAR(100);

-- 修改列类型
ALTER TABLE students MODIFY COLUMN age TINYINT;

-- 删除列
ALTER TABLE students DROP COLUMN email;

-- 重命名表
ALTER TABLE students RENAME TO pupil;
删除表
DROP TABLE students;

3.3 数据类型

类型说明示例
INT整数年龄、ID
VARCHAR(n)可变长度字符串,最大n个字符姓名、地址
TEXT长文本文章内容
DATE日期(YYYY-MM-DD)生日
DATETIME日期和时间创建时间
TIMESTAMP时间戳,自动更新最后修改
DECIMAL(m,d)定点数,m总位数,d小数位价格、金额
BOOLEAN布尔值,实际是TINYINT(1)是否删除

3.4 约束

约束说明
PRIMARY KEY主键,唯一且非空
FOREIGN KEY外键,引用其他表的主键
NOT NULL不能为空
UNIQUE值必须唯一
DEFAULT默认值
AUTO_INCREMENT自动递增(整数类型)

四、数据操作语言(DML)

4.1 插入数据(INSERT)

-- 插入所有列
INSERT INTO students (name, age, grade) VALUES ('张三', 18, '高一');

-- 插入多行
INSERT INTO students (name, age, grade) VALUES 
('李四', 19, '高二'),
('王五', 18, '高一');

-- 插入部分列(其他列使用默认值)
INSERT INTO students (name) VALUES ('赵六');

4.2 更新数据(UPDATE)

-- 更新所有行的grade
UPDATE students SET grade = '高三';

-- 条件更新
UPDATE students SET age = 20 WHERE name = '张三';

-- 多列更新
UPDATE students SET age = 21, grade = '毕业班' WHERE id = 1;

4.3 删除数据(DELETE)

-- 删除所有行(慎用)
DELETE FROM students;

-- 条件删除
DELETE FROM students WHERE id = 5;

-- 删除表中所有行,更快但无法回滚(不带WHERE的DELETE可以回滚)
TRUNCATE TABLE students;

五、数据查询语言(DQL)

5.1 基础查询

-- 查询所有列
SELECT * FROM students;

-- 查询指定列
SELECT name, age FROM students;

-- 使用别名
SELECT name AS 姓名, age AS 年龄 FROM students;

-- 去重
SELECT DISTINCT grade FROM students;

5.2 条件查询(WHERE)

-- 比较运算符
SELECT * FROM students WHERE age >= 18;
SELECT * FROM students WHERE name = '张三';

-- 逻辑运算符
SELECT * FROM students WHERE age > 18 AND grade = '高二';
SELECT * FROM students WHERE age < 18 OR grade = '高三';

-- 范围查询
SELECT * FROM students WHERE age BETWEEN 18 AND 20;
SELECT * FROM students WHERE name IN ('张三', '李四');

-- 模糊查询(LIKE)
SELECT * FROM students WHERE name LIKE '张%';   -- 以张开头的
SELECT * FROM students WHERE name LIKE '%三';   -- 以三结尾的
SELECT * FROM students WHERE name LIKE '%三%';  -- 包含三的

-- 空值判断
SELECT * FROM students WHERE grade IS NULL;
SELECT * FROM students WHERE grade IS NOT NULL;

5.3 排序(ORDER BY)

-- 升序(默认)
SELECT * FROM students ORDER BY age;

-- 降序
SELECT * FROM students ORDER BY age DESC;

-- 多列排序
SELECT * FROM students ORDER BY grade ASC, age DESC;

5.4 限制结果(LIMIT)

-- 前5条
SELECT * FROM students LIMIT 5;

-- 从第3条开始取2条(分页)
SELECT * FROM students LIMIT 2 OFFSET 2;
-- 等价写法
SELECT * FROM students LIMIT 2, 2;

5.5 聚合函数

函数作用
COUNT(*)统计行数
SUM(列)求和
AVG(列)平均值
MAX(列)最大值
MIN(列)最小值
SELECT COUNT(*) FROM students;
SELECT AVG(age) FROM students WHERE grade = '高一';
SELECT grade, COUNT(*) FROM students GROUP BY grade;

5.6 分组(GROUP BY)

-- 按年级分组,统计每级人数
SELECT grade, COUNT(*) AS 人数 FROM students GROUP BY grade;

-- 带条件的分组(使用HAVING筛选分组后结果)
SELECT grade, AVG(age) AS 平均年龄 
FROM students 
GROUP BY grade 
HAVING AVG(age) > 18;

WHERE vs HAVING:WHERE在分组前过滤,HAVING在分组后过滤。

5.7 多表查询(JOIN)

假设有两张表:

-- 学生表 students (id, name, class_id)
-- 班级表 classes (id, name)
内连接(INNER JOIN)
SELECT students.name, classes.name AS class_name
FROM students
INNER JOIN classes ON students.class_id = classes.id;
左连接(LEFT JOIN)

返回左表所有记录,右表没有匹配的为NULL。

SELECT students.name, classes.name
FROM students
LEFT JOIN classes ON students.class_id = classes.id;

六、索引与性能优化简介

索引是提高查询速度的数据结构,类似于书的目录。使用CREATE INDEX创建索引。

CREATE INDEX idx_name ON students(name);

注意:索引会加速查询,但会减慢增删改操作,占用额外空间,需要合理使用。


💻 代码案例实操

案例1:创建数据库和表

-- 1. 创建数据库
CREATE DATABASE school_db;
USE school_db;

-- 2. 创建学生表
CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT NOT NULL,
    gender ENUM('男', '女') DEFAULT '男',
    grade VARCHAR(20),
    created_at DATETIME DEFAULT NOW()
);

-- 3. 创建成绩表(关联学生)
CREATE TABLE scores (
    id INT AUTO_INCREMENT PRIMARY KEY,
    student_id INT NOT NULL,
    subject VARCHAR(50),
    score DECIMAL(5,2),
    FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE
);

-- 查看创建的表
SHOW TABLES;
DESC students;

案例2:插入与查询

-- 插入学生
INSERT INTO students (name, age, gender, grade) VALUES
('张三', 18, '男', '高一'),
('李四', 19, '女', '高一'),
('王五', 18, '男', '高二');

-- 插入成绩
INSERT INTO scores (student_id, subject, score) VALUES
(1, '数学', 85.5),
(1, '语文', 78.0),
(2, '数学', 92.0),
(2, '语文', 88.5),
(3, '数学', 76.0);

-- 查询所有学生信息
SELECT * FROM students;

-- 查询男生
SELECT * FROM students WHERE gender = '男';

-- 查询年龄大于18的学生
SELECT name, age FROM students WHERE age > 18;

-- 查询每个学生的平均分
SELECT s.name, AVG(sc.score) AS avg_score
FROM students s
JOIN scores sc ON s.id = sc.student_id
GROUP BY s.id;

案例3:更新与删除

-- 将高一学生的年级改为“高一(下)”
UPDATE students SET grade = '高一(下)' WHERE grade = '高一';

-- 删除成绩低于60分的记录(假设有)
DELETE FROM scores WHERE score < 60;

-- 删除学生张三(由于外键ON DELETE CASCADE,成绩也会自动删除)
DELETE FROM students WHERE name = '张三';

案例4:复杂查询——分组统计与排序

-- 按年级统计学生人数,并按人数降序
SELECT grade, COUNT(*) AS count
FROM students
GROUP BY grade
ORDER BY count DESC;

-- 查询平均分大于80的年级
SELECT s.grade, AVG(sc.score) AS avg_score
FROM students s
JOIN scores sc ON s.id = sc.student_id
GROUP BY s.grade
HAVING avg_score > 80;

案例5:使用索引优化

-- 为name列创建索引
CREATE INDEX idx_student_name ON students(name);

-- 查询使用索引
EXPLAIN SELECT * FROM students WHERE name = '李四';

-- 删除索引
DROP INDEX idx_student_name ON students;

⚠️ 易错点避坑总结

序号坑点描述后果解决方案
1忘记选择数据库(USE database)“No database selected”错误执行SQL前先USE database;
2字符串值忘记加引号语法错误字符串和日期用单引号包裹
3UPDATE/DELETE没有WHERE条件误操作所有行执行前先SELECT确认范围,或开启安全模式
4INT类型长度指定不必要混淆显示宽度与存储范围直接用INT,范围足够
5VARCHAR长度设置不合理过长浪费空间,过短数据被截断根据业务合理设置(如姓名20,地址255)
6外键约束导致删除失败无法删除有子记录的主表数据使用ON DELETE CASCADE或先删除子记录
7LIKE查询以%开头无法使用索引,性能差避免必要情况使用,或考虑全文索引
8HAVING和WHERE混淆逻辑错误WHERE在分组前,HAVING在分组后
9使用保留字作为表名/列名语法错误用反引号包裹,如`order`
10字符集不一致导致乱码中文显示为问号建库时指定CHARACTER SET utf8mb4

📝 课后实战练习题

第1题:创建数据库和表

创建数据库company,在其中创建employees表,包含以下字段:id(主键自增)、name(不为空)、age、department、salary(DECIMAL(10,2))、hire_date(DATE)。使用SQL语句完成。

第2题:插入数据

employees表中插入至少5条模拟数据,涵盖不同部门、不同年龄。

第3题:查询练习

编写以下查询:

  • 查询所有员工的姓名和工资。
  • 查询年龄大于30岁的员工。
  • 查询工资在5000到10000之间的员工。
  • 查询部门为“技术部”的员工按工资降序排列。
  • 统计每个部门的平均工资。

第4题:更新与删除

  • 将所有员工的工资增加10%。
  • 删除年龄大于60岁的员工。
  • 将“销售部”的员工部门名称改为“市场部”。

第5题:聚合与分组

  • 查询最高工资、最低工资、平均工资。
  • 按部门统计员工人数和平均工资,只显示平均工资大于8000的部门。

第6题:多表查询(创建两张关联表)

创建departments表(id, name),并在employees表中增加dept_id外键。插入部门数据,更新员工的外键。然后使用JOIN查询员工的姓名和部门名称。

第7题:索引与性能

employees表的name列创建索引,并使用EXPLAIN分析查询SELECT * FROM employees WHERE name = '张三';的执行计划。


🧠 知识点思维导图总结

第38课:MySQL基础与SQL入门

数据库概念

关系型数据库

表/行/列/主键/外键

MySQL安装

Windows/macOS

客户端连接

SQL分类

DDL(数据定义)

CREATE DATABASE/TABLE

ALTER

DROP

DML(数据操作)

INSERT

UPDATE

DELETE

DQL(数据查询)

SELECT

WHERE

ORDER BY

GROUP BY

HAVING

LIMIT

JOIN

数据类型

数值/字符串/日期时间

约束

PRIMARY KEY

FOREIGN KEY

NOT NULL

UNIQUE

DEFAULT

索引

创建/删除

加速查询

权衡

面试考点

主键与外键

WHERE vs HAVING

JOIN类型

SQL执行顺序


🔜 下节课预告

掌握了SQL基础后,我们就可以用Python来操作MySQL数据库了。下一节课我们将学习如何使用mysql-connector-python连接MySQL,执行增删改查,并封装数据库操作工具类。

第39课:Python操作MySQL:增删改查、事务处理与工具类封装

内容包括:

  • mysql-connector-python安装与连接
  • 执行DDL/DML/DQL
  • 参数化查询防SQL注入
  • 事务提交与回滚
  • 封装DB工具类
  • 连接池简介

数据库编程是后端开发的核心,学完后你将能够开发数据驱动的应用程序。

🌟 学习鼓励:数据库是程序员的必修课。本课内容较多,建议你一边学习一边在MySQL命令行中动手练习,不要只看不练。多写SQL语句,特别是SELECT的各种子句组合,以及多表连接。掌握好SQL,才能为后续的Python数据库编程打下坚实基础。


🔗《50节课 Python 从入门到精通》系列课程导航

去订阅

🌟 感谢您耐心阅读到这里!
💡 如果本文对您有所启发欢迎:
👍 点赞📌 收藏 📤 分享给更多需要的伙伴。
🗣️ 期待在评论区看到您的想法, 共同进步。
🔔 关注我,持续获取更多干货内容~
🤗 我们下篇文章见~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thomas.Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值