💡 摘要:你是否想学习数据库但不知从何开始?是否被SQL语句的复杂性吓到?是否想掌握当今最流行的开源数据库?
别担心,MySQL是世界上最流行的开源关系数据库,它强大、易用且完全免费。无论你是想开发Web应用、进行数据分析还是学习数据库技术,MySQL都是最佳选择。
本文将带你从MySQL的安装和配置开始,一步步教你搭建数据库环境。然后学习数据库和表的基本操作,掌握SQL语言的核心语法。最后通过实战案例完成你的第一个查询。从安装到配置,从创建表到复杂查询,让你轻松迈入数据库世界的大门。文末附常见问题解答和实用技巧,助你快速成为MySQL新手玩家。
一、MySQL安装与配置
1. 下载与安装
Windows系统安装:
- 访问MySQL官网(https://dev.mysql.com/downloads/mysql/)
- 选择MySQL Community Server
- 下载Windows (x86, 64-bit) MSI Installer
- 运行安装程序,选择"Developer Default"
- 设置root用户密码(牢记这个密码!)
macOS系统安装:
bash
# 使用Homebrew安装
brew install mysql
# 或者下载DMG安装包
# 访问MySQL官网下载macOS版本
Linux系统安装:
bash
# Ubuntu/Debian
sudo apt update
sudo apt install mysql-server
# CentOS/RHEL
sudo yum install mysql-server
sudo systemctl start mysqld
2. 初始配置
启动MySQL服务:
bash
# Windows
# 服务会自动启动,可以在服务管理中查看
# macOS
brew services start mysql
# Linux
sudo systemctl start mysql
sudo systemctl enable mysql # 设置开机启动
安全配置:
bash
# 运行安全安装脚本
sudo mysql_secure_installation
# 你会被问到以下问题:
# 1. 设置root密码(如果尚未设置)
# 2. 移除匿名用户?[Y/n] y
# 3. 禁止root远程登录?[Y/n] y
# 4. 移除测试数据库?[Y/n] y
# 5. 重新加载权限表?[Y/n] y
3. 连接MySQL
命令行连接:
bash
# 使用root用户登录
mysql -u root -p
# 输入之前设置的root密码
# 成功后会看到MySQL提示符:mysql>
验证安装:
sql
-- 查看MySQL版本
SELECT VERSION();
-- 显示当前时间
SELECT NOW();
-- 查看所有数据库
SHOW DATABASES;
二、数据库基本操作
1. 创建和管理数据库
创建数据库:
sql
-- 创建数据库
CREATE DATABASE school;
-- 创建数据库并指定字符集
CREATE DATABASE school
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 查看所有数据库
SHOW DATABASES;
-- 选择使用数据库
USE school;
-- 删除数据库(谨慎操作!)
-- DROP DATABASE school;
2. 数据表操作
创建表:
sql
-- 创建学生表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增长
name VARCHAR(50) NOT NULL, -- 学生姓名,不能为空
age INT, -- 年龄
gender ENUM('男', '女'), -- 性别枚举
email VARCHAR(100) UNIQUE, -- 邮箱,唯一约束
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 创建时间
);
-- 创建课程表
CREATE TABLE courses (
id INT PRIMARY KEY AUTO_INCREMENT,
course_name VARCHAR(100) NOT NULL,
teacher VARCHAR(50),
credit INT DEFAULT 1
);
-- 创建选课关系表
CREATE TABLE student_courses (
student_id INT,
course_id INT,
score DECIMAL(4,1),
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
查看表结构:
sql
-- 查看表结构
DESCRIBE students;
-- 查看建表语句
SHOW CREATE TABLE students;
-- 查看所有表
SHOW TABLES;
三、SQL基础语法
1. 数据操作语言(DML)
插入数据:
sql
-- 插入学生数据
INSERT INTO students (name, age, gender, email) VALUES
('张三', 20, '男', 'zhangsan@email.com'),
('李四', 19, '女', 'lisi@email.com'),
('王五', 21, '男', 'wangwu@email.com'),
('赵六', 20, '女', 'zhaoliu@email.com');
-- 插入课程数据
INSERT INTO courses (course_name, teacher, credit) VALUES
('数学', '张老师', 4),
('英语', '李老师', 3),
('编程', '王老师', 5),
('物理', '赵老师', 4);
-- 插入选课数据
INSERT INTO student_courses (student_id, course_id, score) VALUES
(1, 1, 85.5),
(1, 2, 90.0),
(2, 1, 92.5),
(2, 3, 88.0),
(3, 2, 76.5),
(3, 4, 95.0),
(4, 1, 89.5),
(4, 3, 91.5);
查询数据:
sql
-- 查询所有学生
SELECT * FROM students;
-- 查询指定列
SELECT name, age FROM students;
-- 条件查询
SELECT * FROM students WHERE age > 20;
SELECT * FROM students WHERE gender = '女';
-- 排序查询
SELECT * FROM students ORDER BY age DESC;
SELECT * FROM students ORDER BY created_at ASC;
-- 限制结果数量
SELECT * FROM students LIMIT 3;
SELECT * FROM students LIMIT 2, 3; -- 从第2条开始,显示3条
更新数据:
sql
-- 更新学生年龄
UPDATE students SET age = 22 WHERE name = '王五';
-- 更新多个字段
UPDATE students SET age = age + 1, email = 'new_email@example.com' WHERE id = 1;
-- 注意:一定要有WHERE条件,否则会更新所有记录!
删除数据:
sql
-- 删除特定记录
DELETE FROM students WHERE name = '赵六';
-- 清空表(谨慎操作!)
-- TRUNCATE TABLE students;
2. 数据查询语言(DQL)
基本查询:
sql
-- 去重查询
SELECT DISTINCT age FROM students;
-- 别名查询
SELECT name AS 姓名, age AS 年龄 FROM students;
-- 计算字段
SELECT name, age, age * 2 AS double_age FROM students;
条件查询:
sql
-- 比较运算符
SELECT * FROM students WHERE age > 20;
SELECT * FROM students WHERE age BETWEEN 18 AND 21;
-- 逻辑运算符
SELECT * FROM students WHERE age > 19 AND gender = '男';
SELECT * FROM students WHERE age < 20 OR gender = '女';
-- IN操作符
SELECT * FROM students WHERE age IN (19, 20, 21);
-- LIKE模糊查询
SELECT * FROM students WHERE name LIKE '张%'; -- 张开头
SELECT * FROM students WHERE name LIKE '%五'; -- 五结尾
SELECT * FROM students WHERE name LIKE '%李%'; -- 包含李
-- NULL值检查
SELECT * FROM students WHERE email IS NULL;
SELECT * FROM students WHERE email IS NOT NULL;
四、高级查询技巧
1. 连接查询(JOIN)
内连接:
sql
-- 查询学生选课信息
SELECT s.name, c.course_name, sc.score
FROM students s
INNER JOIN student_courses sc ON s.id = sc.student_id
INNER JOIN courses c ON c.id = sc.course_id;
-- 查询张三的所有课程
SELECT s.name, c.course_name, sc.score
FROM students s
INNER JOIN student_courses sc ON s.id = sc.student_id
INNER JOIN courses c ON c.id = sc.course_id
WHERE s.name = '张三';
左连接:
sql
-- 查询所有学生及其选课情况(包括没选课的学生)
SELECT s.name, c.course_name, sc.score
FROM students s
LEFT JOIN student_courses sc ON s.id = sc.student_id
LEFT JOIN courses c ON c.id = sc.course_id;
2. 聚合函数
常用聚合函数:
sql
-- 统计学生数量
SELECT COUNT(*) FROM students;
-- 统计女生数量
SELECT COUNT(*) FROM students WHERE gender = '女';
-- 计算平均年龄
SELECT AVG(age) FROM students;
-- 最大年龄和最小年龄
SELECT MAX(age), MIN(age) FROM students;
-- 年龄总和
SELECT SUM(age) FROM students;
分组查询:
sql
-- 按性别分组统计
SELECT gender, COUNT(*), AVG(age)
FROM students
GROUP BY gender;
-- 按年龄分组
SELECT age, COUNT(*) as count
FROM students
GROUP BY age
ORDER BY count DESC;
-- HAVING子句(分组后过滤)
SELECT age, COUNT(*) as count
FROM students
GROUP BY age
HAVING count > 1;
3. 子查询
各种子查询:
sql
-- 查询年龄最大的学生
SELECT * FROM students
WHERE age = (SELECT MAX(age) FROM students);
-- 查询没有选课的学生
SELECT * FROM students
WHERE id NOT IN (SELECT DISTINCT student_id FROM student_courses);
-- 查询每门课程的最高分
SELECT c.course_name,
(SELECT MAX(score) FROM student_courses WHERE course_id = c.id) as max_score
FROM courses c;
五、实战案例:学生管理系统
1. 复杂查询示例
多表联合查询:
sql
-- 查询每门课程的平均分
SELECT c.course_name, AVG(sc.score) as avg_score
FROM courses c
LEFT JOIN student_courses sc ON c.id = sc.course_id
GROUP BY c.id
ORDER BY avg_score DESC;
-- 查询每个学生的平均分
SELECT s.name, AVG(sc.score) as avg_score
FROM students s
LEFT JOIN student_courses sc ON s.id = sc.student_id
GROUP BY s.id
HAVING avg_score IS NOT NULL
ORDER BY avg_score DESC;
-- 查询分数超过90分的学生课程信息
SELECT s.name, c.course_name, sc.score
FROM students s
INNER JOIN student_courses sc ON s.id = sc.student_id
INNER JOIN courses c ON c.id = sc.course_id
WHERE sc.score > 90;
2. 数据修改操作
批量更新:
sql
-- 给所有学生年龄加1
UPDATE students SET age = age + 1;
-- 将编程课程的学分改为6
UPDATE courses SET credit = 6 WHERE course_name = '编程';
-- 将数学成绩低于60分的改为60分
UPDATE student_courses SET score = 60
WHERE course_id = (SELECT id FROM courses WHERE course_name = '数学')
AND score < 60;
六、MySQL实用技巧
1. 导入导出数据
导出数据:
bash
# 导出整个数据库
mysqldump -u root -p school > school_backup.sql
# 导出特定表
mysqldump -u root -p school students > students_backup.sql
# 只导出结构
mysqldump -u root -p -d school > school_structure.sql
导入数据:
bash
# 导入数据库
mysql -u root -p school < school_backup.sql
# 在MySQL中导入
SOURCE /path/to/school_backup.sql;
2. 常用函数
字符串函数:
sql
-- 字符串操作
SELECT CONCAT(name, '的年龄是', age) AS info FROM students;
SELECT UPPER(name), LOWER(email) FROM students;
SELECT LENGTH(name) AS name_length FROM students;
SELECT SUBSTRING(name, 1, 1) AS first_char FROM students;
日期函数:
sql
-- 日期操作
SELECT NOW(), CURDATE(), CURTIME();
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY);
SELECT DATEDIFF('2024-01-01', NOW());
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日');
七、常见问题解答
1. 安装问题
Q: 忘记root密码怎么办?
bash
# 1. 停止MySQL服务
sudo systemctl stop mysql
# 2. 跳过权限验证启动
sudo mysqld_safe --skip-grant-tables &
# 3. 重置密码
mysql -u root
UPDATE mysql.user SET authentication_string=PASSWORD('新密码') WHERE User='root';
FLUSH PRIVILEGES;
Q: 连接被拒绝怎么办?
bash
# 检查MySQL服务是否启动
sudo systemctl status mysql
# 检查防火墙设置
sudo ufw allow mysql
2. 操作问题
Q: 如何查看当前使用的数据库?
sql
SELECT DATABASE();
Q: 如何查看表的大小?
sql
SELECT table_name AS `Table`,
round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
FROM information_schema.TABLES
WHERE table_schema = "school"
ORDER BY (data_length + index_length) DESC;
八、学习资源推荐
1. 下一步学习建议
深入学习:
- 📚 索引优化:学习如何创建和使用索引提高查询性能
- 📚 事务处理:掌握ACID属性和事务控制
- 📚 存储过程和函数:学习服务器端编程
- 📚 性能调优:学习查询优化和服务器配置
实践项目:
- 🔨 个人博客系统
- 🔨 电子商务网站
- 🔨 学生信息管理系统
- 🔨 库存管理系统